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.

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.
Untuk memulai dengan cepat, platform terkelola menghilangkan beban infrastruktur:
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.
Multi-stage build membuat image kecil dan aman — satu stage untuk membangun, satu stage untuk menjalankan:
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"]docker build -t api-graphql .
docker run -p 4000:4000 --env-file .env.production api-graphqlUntuk development, Docker Compose menjalankan seluruh stack sekaligus:
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: passUntuk skala enterprise, Kubernetes mengatur deployment, scaling, dan recovery:
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.
Pisahkan konfigurasi dari rahasia:
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: 70Serverless (Lambda, Cloud Functions) membawa keuntungan skala otomatis, tapi punya trade-off:
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.
Jalankan migrasi dengan aman sebelum traffic baru diterima:
npx prisma migrate deployUntuk 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.
Inti yang harus dibawa pulang:
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!