124 Deployment gqlgen di Railway/Render dengan PostgreSQL
Jika kamu pernah membangun backend GraphQL di Go menggunakan gqlgen, kemungkinan besar kamu ingin mendeploy aplikasimu dengan cepat dan mudah ke cloud. Railway dan Render adalah dua PaaS (Platform-as-a-Service) yang populer di kalangan developer karena setup yang simpel, support database yang mumpuni, serta integrasi continuous deployment dari GitHub. Pada artikel ini, saya akan membimbing kamu melewati proses deployment aplikasi gqlgen ke Railway dan Render, memanfaatkan PostgreSQL sebagai database utama. Kita akan cover: struktur folder, Dockerfile, pipeline CI/CD, hingga testing endpoint GraphQL secara online.
1. Gambaran Alur Deployment
Sebelum kita masuk ke teknis, mari kita lihat dulu workflow deployment ini menggunakan diagram alur mermaid:
flowchart TD
A[Lokasi project gqlgen di lokal] --> B[Push ke GitHub]
B --> C{Platform}
C --> |Railway| D[Railway mendeteksi perubahan]
C --> |Render| E[Render mendeteksi perubahan]
D --> F[Railway build dan deploy container]
E --> G[Render build dan deploy container]
F --> H[Aplikasi live di Railway]
G --> I[Aplikasi live di Render]
Pada dasarnya, project kita akan di-push ke GitHub, lalu Railway/Render akan membuild project tersebut menjadi container, konek ke PostgreSQL, dan expose endpoint GraphQL secara publik.
2. Struktur Project Sederhana gqlgen
Misal kita punya struktur project seperti berikut:
mygqlapp/
├── Dockerfile
├── go.mod
├── go.sum
├── gqlgen.yml
├── main.go
├── graph/
│ ├── resolver.go
│ ├── schema.graphqls
│ └── model/
└── pkg/
Untuk tutorial ini, contoh skema GraphQL sederhana:
# graph/schema.graphqls
type Todo {
id: ID!
text: String!
done: Boolean!
}
type Query {
todos: [Todo!]!
}
Dan resolver sederhana:
// graph/resolver.go
package graph
import "mygqlapp/graph/model"
type Resolver struct{}
func (r *queryResolver) Todos(ctx context.Context) ([]*model.Todo, error) {
// Di production, fetch dari DB PostgreSQL
return []*model.Todo{
{ID: "1", Text: "Belajar gqlgen", Done: false},
{ID: "2", Text: "Deployment di Railway/Render", Done: true},
}, nil
}
3. Setup PostgreSQL di Railway/Render
Railway
Masuk ke Railway → New Project → Add Plugin → PostgreSQL
Railway akan otomatis generate connection string seperti:
postgres://user:pass@host:port/dbnameCatat string ini untuk digunakan sebagai
DATABASE_URL.
Render
- Masuk ke Render Dashboard → Databases → Create a new PostgreSQL DB.
- Setelah database ready, klik pada DB, lihat di bagian Connection. Ambil
Internal Database URL/External Database URLuntuk digunakan pada env varDATABASE_URL.
4. Konfigurasi Environment Variable
Railway dan Render menyediakan panel Environment Variable. Untuk Go, cukup gunakan nama variabel DATABASE_URL.
Di Go, gunakan package os:
import (
"os"
"database/sql"
_ "github.com/lib/pq"
)
func dbConnect() (*sql.DB, error) {
db, err := sql.Open("postgres", os.Getenv("DATABASE_URL"))
if err != nil {
return nil, err
}
return db, nil
}
Tips:
- Railway secara otomatis inject env dari plugin PostgreSQL ke service.
- Render: Tambah key
DATABASE_URL, value dari dashboard DB.
5. Membuat Dockerfile
Kedua platform mendukung deployment container. Berikut contoh Dockerfile yang cocok untuk project gqlgen:
# Dockerfile
FROM golang:1.21-alpine as builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN go build -o server main.go
FROM alpine:latest
WORKDIR /app
COPY --from=builder /app/server .
EXPOSE 8080
CMD ["./server"]
Catatan: Kebanyakan tutorial memakai port 8080 untuk Go web. Railway/Render akan mengekspose port ini.
6. Deploy ke Railway
Langkah-langkah:
- Push ke GitHub: Pastikan project sudah di-push.
- Connect ke Railway
- New Project → Deploy from GitHub Repo → Pilih repo-mu.
- Railway akan mendeteksi Dockerfile, build, dan otomatis running.
- Tambahkan environment variable dari langkah 4.
- Cek logs & health: Railway memberi live logs dan health check.
7. Deploy ke Render
Langkah-langkah:
- Push ke GitHub.
- Buat Web Service
- Render → New → Web Service → From GitHub.
- Isi fields:
- Environment: Docker
- Build Command: kosongkan jika Dockerfile
- Start Command: otomatis dari Dockerfile
- Port: 8080
- Tambahkan environment variable.
- Konfirmasi build selesai → Webhook akan running dan endpoint kamu live.
8. Simulasi Deployment: Testing Endpoint
Setelah deploy sukses, kamu dapat test GraphQL Query dengan alat seperti [Postman], [Insomnia], atau curl:
curl -X POST \
-H "Content-Type: application/json" \
-d '{"query":"{ todos { id text done } }"}' \
https://mygqlapp-railway.up.railway.app/query
Contoh respons:
{
"data": {
"todos": [
{ "id": "1", "text": "Belajar gqlgen", "done": false },
{ "id": "2", "text": "Deployment di Railway/Render", "done": true }
]
}
}
9. Troubleshooting Umum
| Issue | Railway/Render | Solusi |
|---|---|---|
| App tidak bisa diakses | Port/ENV/Health check salah | Pastikan expo port 8080, HEALTHY |
| Gagal koneksi ke DB | DATABASE_URL tak ter-set/tak benar | Cek env var, gunakan dari panel |
| “pq: SSL off” error | Render butuh sslmode=require di koneksi | Tambahkan ?sslmode=require |
| Build fail | Dockerfile path/command keliru | Periksa working directory, path |
10. Kelebihan Railway & Render untuk gqlgen+PostgreSQL
| Fitur | Railway | Render |
|---|---|---|
| Autoscale | Ya, by default | Opsi paid |
| Database | 1-klik plugin | Web dashboard, granular config |
| Custom domain | Free | Free |
| Price | Free plan → murah | Free plan → murah |
| Deploy CI/CD | Github langsung | Github langsung |
11. Kesimpulan
Deployment aplikasi gqlgen di Railway atau Render benar-benar straightforward untuk engineer Go modern. Kita hanya perlu:
- Menyiapkan project dan Dockerfile.
- Setup database PostgreSQL via plugin/console.
- Khususkan env var
DATABASE_URL. - Push ke GitHub → platform akan build, deploy, dan expose endpoint GraphQL.
- Endpoint langsung online tanpa perlu ngatur VPS/manual CI.
Platform PaaS seperti Railway dan Render menghilangkan devops overhead, sehingga kamu dan tim bisa fokus membangun bisnis logic, bukan ngurus servernya!
12. Referensi
Semoga bermanfaat! Jangan ragu share pengalaman deployment-mu di kolom komentar 👨💻🚀