tutorial

52 Men-deploy graphql-go ke Render/Vercel/Heroku

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-demo dan menginstall dua package utama:
go get github.com/graphql-go/graphql
go 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

  1. Push code ke repo GitHub.
  2. Daftar/login ke Render.
  3. Pilih New Web Service → connect ke repo.
  4. Isi form:
    • Environment: Go
    • Build Command: kosongkan (Render otomatis jalankan go build)
    • Start Command: ./graphql-demo (nama ini sesuai binary hasil build)
  5. Default port Render: variabel PORT (sudah kita handle di main.go).
  6. Klik deploy.

Tabel Konfigurasi Deploy

FieldValue
RuntimeGo
Build Command(kosongkan)
Start Command./graphql-demo
Port envPORT (default:8080)
Service typeWeb 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

  1. Install Heroku CLI (jika belum ada).
  2. heroku create graphql-go-demo
  3. Set GOFLAGS agar hasil build statik:
    heroku config:set GOFLAGS="-tags heroku"
    
  4. Procfile menginstruksikan Heroku menjalankan binary hasil build.
  5. Jalankan:
    git push heroku main
    
  6. 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

  1. npm i -g vercel (install CLI).
  2. vercel login
  3. vercel (follow wizard).

API endpoint tersedia di:
https://your-project-name.vercel.app/api/graphql


Perbandingan Platform

FiturRenderHerokuVercel (Serverless)
Free tierAdaAda*Ada
Proses buildOtomatisOtomatisOtomatis
Konfigurasi portGampangGampangOtomatis
PersistentYaYaStateless, cold start
SkalabilitasMudahMudahTerotomatisasi
GraphiQL SupportYaYaYa

*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!

comments powered by Disqus