51 Konfigurasi GraphQL Server untuk Production
GraphQL kini menjadi salah satu tulang punggung utama dalam membangun API yang skalabel dan fleksibel. Namun, mengoperasikan GraphQL server pada lingkungan production memerlukan perhatian ekstra, terutama terkait konfigurasi. Banyak tim berakhir mengalami downtime, kebocoran data, atau performa lambat, karena kurang maksimalnya konfigurasi GraphQL saat deployment production.
Di artikel ini, saya akan mengulas 51 konfigurasi yang wajib Anda perhatikan, lengkap dengan best-practices, contoh kode, serta trik-trik dari pengalaman pribadi dan teman-teman di komunitas.
1. Aktifkan Query Depth Limiting
Batasi kedalaman query untuk mencegah serangan DoS akibat nested query berlebihan.
const depthLimit = require('graphql-depth-limit');
app.use(
'/graphql',
graphqlHTTP({
schema,
validationRules: [depthLimit(5)],
}),
);
2. Batasan Query Complexity
Cegah over-fetching data dengan pembatasan “berat” query.
const { createComplexityRule } = require('graphql-validation-complexity');
app.use(
'/graphql',
graphqlHTTP({
schema,
validationRules: [
createComplexityRule({
maximumComplexity: 1000,
estimators: [...],
}),
],
}),
);
3. Disable Playground/GraphiQL di Production
Pastikan endpoint tools development tidak aktif.
const isProd = process.env.NODE_ENV === 'production';
app.use(
'/graphql',
graphqlHTTP({
schema,
graphiql: !isProd,
}),
);
4. Implementasi Persisted Queries
Hanya allow query yang sudah didaftarkan.
// With Apollo Server
const apq = require("apollo-server-plugin-persisted-queries");
const server = new ApolloServer({
schema,
plugins: [apq()],
});
5. Custom Error Masking
Jangan expose stack trace di response.
const formatError = (err) => {
if (process.env.NODE_ENV === 'production') {
return new Error('Internal server error');
}
return err;
}
// Gunakan formatError di Apollo/Express
6. Limit Req Size
Jangan biarkan request body terlalu besar.
app.use(express.json({ limit: '1mb' }));
7. Rate Limiting
Prevent brute-force via API.
const rateLimit = require('express-rate-limit');
app.use('/graphql', rateLimit({
windowMs: 60 * 1000,
max: 20,
}));
8. CORS Policy Strict
Pastikan origin yang boleh akses.
app.use(cors({ origin: ['https://mydomain.com'], credentials: true }));
9. Implementasi Dataloader
Batching dan caching data request.
const DataLoader = require('dataloader');
const userLoader = new DataLoader(userIds => batchGetUsers(userIds));
10. Disable Introspection di Production
Kecuali benar-benar diperlukan.
const { NoSchemaIntrospectionCustomRule } = require('graphql');
app.use('/graphql', graphqlHTTP({
validationRules: [NoSchemaIntrospectionCustomRule],
}));
11. Tracing & Monitoring
Integrasi dengan APM seperti Datadog, Sentry, atau Prometheus.
import { ApolloServerPluginUsageReporting } from "apollo-server-core";
const server = new ApolloServer({
plugins: [ApolloServerPluginUsageReporting()],
});
12. Authentication Wajib
Aktifkan JWT, OAuth, atau sesi sebelum resolvers.
13. Authorization Granular
Gunakan directive misal @auth(role: ADMIN)
di typeGraphQL/Apollo.
14. Disable HTTP GET untuk mutation
Mutasi sebaiknya hanya POST.
15. Compress Response
Gunakan gzip/brotli untuk response besar.
16. Implement Cache Layer
Cache di resolver, untuk data read-heavy.
17. Error Logging
Integrasi dengan Winston, Bunyan, atau ELK stack.
18. Set Query Timeout
Jangan biarkan query jalan lama.
// Pseudo code:
const TIMEOUT = 5 * 1000;
await Promise.race([resolveQuery(), wait(TIMEOUT)]);
19–25: Advanced Security & Isolation
# | Fitur | Catatan |
---|---|---|
19 | Helmet.js Headers | Tambahkan HTTP sec headers |
20 | Disable ‘X-Powered-By’ | Hindari expose tech |
21 | Content Security Policy | Hindari XSS |
22 | IP Allowlist | Restriksi akses tertentu |
23 | Secure Cookies | Gunakan Secure+HttpOnly |
24 | Input Validation | Gunakan Joi/Yup |
25 | Sanitize Inputs | Cegah injeksi |
26–30: Schema Management
- Schema Registry: Gunakan Apollo/Hasura schema registry.
- Versioning: Tanda versi encoder di header.
- Deprecation: Tandai field & types deprecated.
- Documentation Otomatis: Integrasi dengan GraphQL Voyager/SpectaQL.
- Schema Diff Monitoring: Integrasi schema diff dari Github Action.
31–35: Observability
- Custom Metrics: Implement counter untuk jumlah tiap operation.
- Distributed Tracing: Gunakan OpenTelemetry.
- Audit Log: Catat siapa akses apa dan kapan.
- Ops Dashboard: Visualisasi performa & error rate.
- Alerting: Setup threshold alert di Grafana/Prometheus.
36–39: Production Infra & Deployment
- Readiness/Liveness Probes: K8S health check endpoint.
- Rolling Update: Tidak down saat deploy.
- Auto Scaling: Berdasar rate QPS.
- Blue/Green Deployment: Cegah downtime dan mitigasi rollback.
40–43: CDN dan Edge Cache
- Cache Dokumentasi & Introspection
- Stale-While-Revalidate di Proxy
- Edge Rate Limiting: di CDN (Cloudflare/Akamai)
- GraphQL CDN Routing: Misal di Cloudflare Workers untuk geo-routing.
44–46: Environment Separation
- Strict ENV File: Jangan campur config production dan staging/dev.
- Sensitive Secret Management: Gunakan vault, jangan letakkan API secret di codebase.
- Config Auditing: Regularly review config change.
47–48: Testing Strategy
- Contract Test: Gunakan GraphQL Faker/Mock untuk client.
- Load Test: Dengan Artillery atau k6.
49–50: Performance Optimization
- Resolver: Avoid N+1: Selalu gunakan Dataloader atau aggregate SQL query.
- Schema Stitching & Federation: Untuk microservices breakdown.
51: Graceful Shutdown
Handle signal seperti SIGINT agar request berjalan selesai sebelum proses mati.
process.on('SIGINT', () => {
server.stop().then(() => {
process.exit(0);
});
});
Alur Diagram Konfigurasi Deployment
flowchart LR A[Start Development] B[Review Config] C[Automated Deployment] D{Environment?} E[Pre-prod Checks] F[Production Checks] G[Run Health Probe] H[Launch] A-->B B-->C C-->D D-->|Staging|E D-->|Production|F E-->|Pass|G F-->|Pass|G G-->H
Kesimpulan
Men-deploy GraphQL server di production bukan sekedar menekan tombol deploy. Ada banyak aspek konfigurasi yang jika dilewatkan, bisa merugikan bisnis—dan nama baik engineering tim Anda.
Kuncinya:
- Batasi eksplorasi query (introspection dan nesting),
- Proteksi endpoint dengan security layer,
- Monitoring untuk observability,
- Pengelolaan schema yang disiplin,
- Dan, deployment pipeline yang solid.
Checklist ini tidak hanya mencegah error dan kebocoran, tapi juga membantu tim fokus pada value delivery dan ekspansi bisnis. Apakah Anda sudah siap membawa GraphQL server ke production-level yang sesungguhnya? Selalu revisi, diskusikan dengan tim, dan pastikan checklist ini menjadi bagian wajib di pipeline CI/CD Anda.
Pro Tips:
Cek juga awesome-graphql-security untuk update tools terbaru yang bisa langsung Anda integrasikan!
Jika ada tambahan pengalaman konfigurasi, silakan share di komentar. Happy scaling GraphQL! 🚀
Artikel Terhangat
50 Role-based Authorization di GraphQL
08 Aug 2025
72. Generate Swagger/OpenAPI dari Protobuf
08 Aug 2025
49 Autentikasi Resolver Berdasarkan Context
08 Aug 2025
48 Menyimpan dan Mengecek Token JWT
08 Aug 2025

50 Role-based Authorization di GraphQL

72. Generate Swagger/OpenAPI dari Protobuf

49 Autentikasi Resolver Berdasarkan Context
