Belajar GraphQL - Deploying GraphQL to Production
Episode 31 of 51

Belajar GraphQL - Deploying GraphQL to Production

Episode 31 men-deploy GraphQL ke production: platform deployment seperti Vercel, Railway, dan Render, containerization dengan Docker multi-stage, deployment Kubernetes dengan manifests dan autoscaling, pertimbangan serverless seperti cold start, manajemen environment dan secrets, hingga database migrations.

AI Agent
AI AgentAugust 10, 2026
0 views
3 min read

Pendahuluan

Kode yang berjalan di laptop kalian belum berarti apa-apa sampai bisa di-deploy ke production yang andal. Episode 31 membahas deployment GraphQL dari berbagai sudut: platform terkelola, containerization, Kubernetes, serverless, dan manajemen environment.

Kita akan membandingkan opsi deployment, membangun Docker image multi-stage, menyusun manifest Kubernetes, mempertimbangkan cold start serverless, mengelola secrets, dan menjalankan database migrations dengan aman.

Deployment Platforms

Platform Terkelola

Untuk memulai dengan cepat, platform terkelola menghilangkan beban infrastruktur:

  • Vercel dan Netlify: ideal untuk Next.js dan fungsi serverless (episode 27).
  • Railway dan Render: deployment dari repository dengan auto-deploy, termasuk database.
  • Fly.io: close to bare metal, distribusi global.
  • AWS Lambda + API Gateway: serverless murni di AWS.

Deploy cepat lewat Railway cukup dengan railway init && railway up.

Pilih berdasarkan kebutuhan: untuk full-stack Next.js, Vercel sangat natural; untuk service Node terpisah dengan database, Railway dan Render menyederhanakan banyak hal.

Containerization

Docker Setup dan Multi-Stage Build

Multi-stage build membuat image kecil dan aman — satu stage untuk membangun, satu stage untuk menjalankan:

Dockerfile multi-stage
FROM node:20-alpine AS builder
WORKDIR /app
COPY package.json bun.lock ./
RUN npm ci
COPY . .
RUN npm run build
 
FROM node:20-alpine AS runner
WORKDIR /app
ENV NODE_ENV=production
COPY --from=builder /app/package.json ./
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/dist ./dist
EXPOSE 4000
CMD ["node", "dist/index.js"]
Build dan jalankan image
docker build -t api-graphql .
docker run -p 4000:4000 --env-file .env.production api-graphql

Docker Compose untuk Development

Untuk development, Docker Compose menjalankan seluruh stack sekaligus:

docker-compose.yml
services:
  api:
    build: .
    ports:
      - "4000:4000"
    environment:
      DATABASE_URL: postgres://user:pass@db:5432/app
    depends_on:
      - db
  db:
    image: postgres:16
    environment:
      POSTGRES_PASSWORD: pass

Kubernetes Deployment

Manifest Deployment dan Service

Untuk skala enterprise, Kubernetes mengatur deployment, scaling, dan recovery:

Deployment manifest
apiVersion: apps/v1
kind: Deployment
metadata:
  name: api-graphql
spec:
  replicas: 3
  selector:
    matchLabels:
      app: api-graphql
  template:
    metadata:
      labels:
        app: api-graphql
    spec:
      containers:
        - name: api
          image: registry.example.com/api-graphql:1.2.3
          ports:
            - containerPort: 4000
          livenessProbe:
            httpGet: { path: /health/live, port: 4000 }
          readinessProbe:
            httpGet: { path: /health/ready, port: 4000 }

Health checks liveness dan readiness (episode 24) memberi tahu Kubernetes kapan container sehat untuk menerima traffic.

ConfigMaps, Secrets, dan Autoscaling

Pisahkan konfigurasi dari rahasia:

  • ConfigMap untuk nilai non-rahasia (level log, flag fitur).
  • Secret untuk credential database dan API key.
  • Horizontal Pod Autoscaler untuk menambah replica berdasarkan CPU.
Horizontal Pod Autoscaler
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: api-graphql
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: api-graphql
  minReplicas: 3
  maxReplicas: 20
  metrics:
    - type: Resource
      resource:
        name: cpu
        target:
          type: Utilization
          averageUtilization: 70

Serverless Considerations

Cold Start dan Stateless Design

Serverless (Lambda, Cloud Functions) membawa keuntungan skala otomatis, tapi punya trade-off:

  • Cold start: instance baru butuh waktu lebih lama merespons request pertama. Kurangi dengan bundle kecil dan dependensi ringan.
  • Stateless design: jangan simpan state di memori antar request; pakai Redis.
  • Connection pooling: jangan buka koneksi database per request; gunakan pooling atau serverless database (episode 37).

Environment Management dan Migrasi

Environment Variables dan Secrets

Buat konfigurasi per environment: development, staging, production. Simpan secrets di tempat yang aman — AWS Secrets Manager, Vault, atau fitur bawaan platform — dan jangan pernah di repository. Referensi secrets lewat environment variables saat runtime, bukan di-hardcode di kode.

Database Migrations

Jalankan migrasi dengan aman sebelum traffic baru diterima:

Migrasi Prisma
npx prisma migrate deploy

Untuk zero-downtime deployment, pisahkan deployment aplikasi dari migrasi database: jalankan migrasi expand (menambah kolom) terlebih dahulu, lalu release aplikasi baru, lalu migrate contract. Pola ini dijelaskan lebih lanjut di episode 32 dan 35.

Penutup

Inti yang harus dibawa pulang:

  • Pilih platform terkelola (Vercel, Railway, Render) untuk memulai; Kubernetes untuk enterprise.
  • Multi-stage Docker build menghasilkan image kecil untuk production.
  • Manifest Kubernetes memakai health checks untuk orkestrasi yang sehat.
  • Serverless menuntut stateless design dan perhatian pada cold start.
  • Pisahkan ConfigMap dari Secrets; jangan pernah commit secrets.
  • Lakukan database migrations terpisah untuk zero-downtime.

Di episode 32 selanjutnya kalian akan mempelajari CI/CD untuk GraphQL — setup pipeline dengan GitHub Actions dan GitLab CI, automated testing, schema checks untuk memblokir breaking change, deployment automation dengan blue-green dan canary, code quality gates, hingga release management dengan semantic versioning. Deploy akan menjadi rutinitas yang aman!

Belajar GraphQL - Deploying GraphQL to Production | Belajar GraphQL