52 Men-deploy graphql-go ke Render/Vercel/Heroku
Catatan: “52” adalah nomor urut dalam seri tutorial saya. Jika Anda ingin tahu lebih banyak tentang berbagai proyek Go, silakan telusuri arsip saya di Medium!
Sebagai backend engineer, saya sering mendapat pertanyaan: “Kalau pakai Go dan framework graphql-go, gampang gak sih deploy ke cloud provider kayak Render, Vercel, atau Heroku?” Jawaban pendeknya: Gampang, asalkan paham mekanismenya! Di artikel ini, saya akan mengajak Anda men-deploy service GraphQL berbasis Go (graphql-go) ke tiga platform populer: Render, Vercel, dan Heroku. Saya akan bagikan contoh kode, simulasi skenario, hingga diagram alur deploy.
Setup Service GraphQL dengan graphql-go
Sebelum melakukan deployment, kita mesti punya service GraphQL sederhana dulu. Mari mulai dari hal paling fundamental.
Struktur Proyek
graphql-demo/
├── main.go
├── go.mod
├── schema.graphql
File schema.graphql
type Query {
hello: String!
}
File main.go
package main
import (
"context"
"log"
"net/http"
"github.com/graphql-go/graphql"
"github.com/graphql-go/handler"
)
func main() {
fields := graphql.Fields{
"hello": &graphql.Field{
Type: graphql.String,
Resolve: func(p graphql.ResolveParams) (interface{}, error) {
return "Hello world!", nil
},
},
}
rootQuery := graphql.ObjectConfig{Name: "RootQuery", Fields: fields}
schemaConfig := graphql.SchemaConfig{Query: graphql.NewObject(rootQuery)}
schema, err := graphql.NewSchema(schemaConfig)
if err != nil {
log.Fatalf("failed to create schema, error: %v", err)
}
h := handler.New(&handler.Config{
Schema: &schema,
Pretty: true,
GraphiQL: true,
})
port := getPort()
http.Handle("/graphql", h)
log.Printf("Server is running on port %s...", port)
log.Fatal(http.ListenAndServe(":"+port, nil))
}
// Mendapatkan port dari environment variable, default ke 8080.
func getPort() string {
port := os.Getenv("PORT")
if port == "" {
port = "8080"
}
return port
}
Catatan: Pastikan Anda sudah
go mod init graphql-demodan menginstall dua package utama:go get github.com/graphql-go/graphqlgo get github.com/graphql-go/handler
1. Deploy ke Render
Render adalah platform cloud yang cukup “developer friendly”, sangat populer di komunitas Go. Render otomatis build dari source code di repository (GitHub/GitLab) dan menjalankan perintah Anda.
Cara Kerja Deploy ke Render
flowchart TD
A[Push ke repo Github] --> B[Connect repo ke Render Web Service]
B --> C[Render build Go]
C --> D[Service jalan di subdomain Render]
Simulasi Deploy
- Push code ke repo GitHub.
- Daftar/login ke Render.
- Pilih
New Web Service→ connect ke repo. - Isi form:
- Environment: Go
- Build Command: kosongkan (Render otomatis jalankan
go build) - Start Command:
./graphql-demo(nama ini sesuai binary hasil build)
- Default port Render: variabel PORT (sudah kita handle di
main.go). - Klik deploy.
Tabel Konfigurasi Deploy
| Field | Value |
|---|---|
| Runtime | Go |
| Build Command | (kosongkan) |
| Start Command | ./graphql-demo |
| Port env | PORT (default:8080) |
| Service type | Web Service |
Testing:
Akses URL https://your-service-name.onrender.com/graphql, buka GraphiQL dan coba query:
query {
hello
}
2. Deploy ke Heroku
Heroku juga masih jadi favorit, apalagi buat prototyping. Kali ini, kita perlu buat Procfile di root project:
File Procfile
web: ./graphql-demo
Langkah Deploy Heroku
- Install Heroku CLI (jika belum ada).
heroku create graphql-go-demo- Set
GOFLAGSagar hasil build statik:heroku config:set GOFLAGS="-tags heroku" - Procfile menginstruksikan Heroku menjalankan binary hasil build.
- Jalankan:
git push heroku main - Tunggu build selesai – Heroku akan otomatis build dan run app.
Pastikan port memakai env PORT!
Query endpoint di:https://graphql-go-demo.herokuapp.com/graphql
Troubleshooting
Kadang Heroku menolak menjalankan binary Go jika tidak statik. Jika error, gunakan perintah build custom di Makefile:
build:
CGO_ENABLED=0 GOOS=linux go build -o graphql-demo main.go
Perbarui Procfile jika perlu.
3. Deploy ke Vercel
Vercel awalnya terkenal untuk frontend (Next.js), namun kini bisa serverless Go!
Bikin API Function di Vercel
Struktur folder harus sesuai Vercel:
/api/graphql/main.go
Isi api/graphql/main.go menggunakan handler HTTP, tapi gunakan vercel/go-api runtime:
package main
import (
"context"
"github.com/awslabs/aws-lambda-go-api-proxy/httpadapter"
"github.com/graphql-go/graphql"
"github.com/graphql-go/handler"
"github.com/vercel-community/go-api/api"
)
func main() {
fields := graphql.Fields{
"hello": &graphql.Field{
Type: graphql.String,
Resolve: func(p graphql.ResolveParams) (interface{}, error) {
return "Hello from Vercel!", nil
},
},
}
rootQuery := graphql.ObjectConfig{Name: "RootQuery", Fields: fields}
schemaConfig := graphql.SchemaConfig{Query: graphql.NewObject(rootQuery)}
schema, _ := graphql.NewSchema(schemaConfig)
h := handler.New(&handler.Config{
Schema: &schema,
Pretty: true,
GraphiQL: true,
})
httpHandler := httpadapter.NewV2(h)
api.HandleFunc(func(ctx context.Context, w http.ResponseWriter, r *http.Request) {
httpHandler.ServeHTTP(w, r)
})
}
File vercel.json
{
"version": 2,
"builds": [
{ "src": "api/graphql/main.go", "use": "@vercel/go" }
]
}
Cara Deploy
npm i -g vercel(install CLI).vercel loginvercel(follow wizard).
API endpoint tersedia di:https://your-project-name.vercel.app/api/graphql
Perbandingan Platform
| Fitur | Render | Heroku | Vercel (Serverless) |
|---|---|---|---|
| Free tier | Ada | Ada* | Ada |
| Proses build | Otomatis | Otomatis | Otomatis |
| Konfigurasi port | Gampang | Gampang | Otomatis |
| Persistent | Ya | Ya | Stateless, cold start |
| Skalabilitas | Mudah | Mudah | Terotomatisasi |
| GraphiQL Support | Ya | Ya | Ya |
*Heroku limited free tier sejak akhir 2022.
Kapan Pilih yang Mana?
- Render: Proyek Go production-ready, ingin full control, deploy mudah.
- Heroku: Cepat prototyping, integrasi database yang mudah.
- Vercel: Kebutuhan serverless, API function tanpa state.
Kesimpulan
Deploy graphql-go ke platform cloud ternyata sangat straightforward, asalkan kita memahami pola build & eksekusi service di masing-masing provider. Kuncinya: handle environment variable PORT, sediakan file startup (Procfile/vercel.json), dan manfaatkan fitur continuous deploy.
Silakan bereksperimen dan sesuaikan workflow Anda – semoga tidak ragu lagi men-deploy backend Go ke cloud modern!
Referensi Utama:
Sampai jumpa di artikel selanjutnya dalam seri 53!