tutorial

124 Deployment gqlgen di Railway/Render dengan PostgreSQL

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/dbname
    
  • Catat 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 URL untuk digunakan pada env var DATABASE_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:

  1. Push ke GitHub: Pastikan project sudah di-push.
  2. 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.
  3. Cek logs & health: Railway memberi live logs dan health check.

7. Deploy ke Render

Langkah-langkah:

  1. Push ke GitHub.
  2. 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.
  3. 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

IssueRailway/RenderSolusi
App tidak bisa diaksesPort/ENV/Health check salahPastikan expo port 8080, HEALTHY
Gagal koneksi ke DBDATABASE_URL tak ter-set/tak benarCek env var, gunakan dari panel
“pq: SSL off” errorRender butuh sslmode=require di koneksiTambahkan ?sslmode=require
Build failDockerfile path/command keliruPeriksa working directory, path

10. Kelebihan Railway & Render untuk gqlgen+PostgreSQL

FiturRailwayRender
AutoscaleYa, by defaultOpsi paid
Database1-klik pluginWeb dashboard, granular config
Custom domainFreeFree
PriceFree plan → murahFree plan → murah
Deploy CI/CDGithub langsungGithub 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 👨‍💻🚀

comments powered by Disqus