Imagine: you deployed Directus via npx, quickly got an admin panel, but a month later, with increased traffic, the site went down due to lack of caching — and media files were lost on disk failure. It's exactly these situations that push you toward a production deployment with Docker, PostgreSQL, and S3. This article provides a proven setup template that we use in numerous projects, from corporate portals to high-load APIs. Directus is a headless CMS that provides REST and GraphQL APIs on the fly, without generation. According to tests, API response speed is 2–3 times higher than Strapi, thanks to the lack of ORM layers. For production we always use Docker — it guarantees isolation, reproducibility, and easy scaling.
Why Choose Directus for Production?
Directus is not just another CMS. It is a headless platform that provides REST and GraphQL APIs on the fly, without generation. You integrate it into any existing database — no data migration needed. According to reviews, development speed doubles compared to traditional CMS. We recently deployed Directus for a large online store with a catalog of 50,000 products. After migrating from WordPress to Directus, the catalog page load time dropped from 3 seconds to 400 ms thanks to Redis caching and SSR on Nuxt 3. That is a real example: API speed increased 3 times, and infrastructure costs decreased by abandoning the monolith. Get an engineer consultation on choosing a headless CMS for your project.
How to Deploy Directus to Production with Docker?
The process includes five mandatory steps:
- Task audit — determine load, content volume, API requirements.
- Stack selection — Docker + PostgreSQL + S3 (or Cloudflare R2 for cheap storage).
- Deployment — write
docker-compose.yml, configure Redis for caching, connect CDN. - Environment configuration — SECRET, CORS, email, storage variables.
- Turnkey handover — documentation, credentials, team training.
Quick Start: via npx
npx create-directus-project@latest my-directus # Questions: # Database: PostgreSQL # Host: localhost # Port: 5432 # Database name: directus # Username: directus # Password: ... # Admin email: [email protected] # Admin password: ... cd my-directus npx directus start This method is suitable for development, but not for production — no isolation, hard to scale.
Docker Deployment (Recommended)
Example ready docker-compose.yml:
version: '3' services: directus: image: directus/directus:10.latest restart: unless-stopped ports: - "8055:8055" volumes: - ./uploads:/directus/uploads - ./extensions:/directus/extensions environment: SECRET: ${SECRET} DB_CLIENT: pg DB_HOST: postgres DB_PORT: 5432 DB_DATABASE: ${DB_NAME} DB_USER: ${DB_USER} DB_PASSWORD: ${DB_PASSWORD} ADMIN_EMAIL: ${ADMIN_EMAIL} ADMIN_PASSWORD: ${ADMIN_PASSWORD} PUBLIC_URL: https://cms.example.com CORS_ENABLED: true CORS_ORIGIN: https://example.com CACHE_ENABLED: true CACHE_STORE: redis REDIS_HOST: redis REDIS_PORT: 6379 STORAGE_LOCATIONS: local STORAGE_LOCAL_DRIVER: local STORAGE_LOCAL_ROOT: /directus/uploads depends_on: postgres: condition: service_healthy postgres: image: postgres:15-alpine restart: unless-stopped environment: POSTGRES_DB: ${DB_NAME} POSTGRES_USER: ${DB_USER} POSTGRES_PASSWORD: ${DB_PASSWORD} volumes: - postgres_data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U ${DB_USER}"] interval: 10s redis: image: redis:alpine restart: unless-stopped volumes: postgres_data: How to Configure Storage and Cache?
S3 Storage
For production, always use external storage. Example variables:
STORAGE_LOCATIONS=s3 STORAGE_S3_DRIVER=s3 STORAGE_S3_KEY=ACCESS_KEY STORAGE_S3_SECRET=SECRET_KEY STORAGE_S3_BUCKET=my-bucket STORAGE_S3_REGION=eu-west-1 STORAGE_S3_ENDPOINT=https://s3.amazonaws.com # For Cloudflare R2: # STORAGE_S3_ENDPOINT=https://<account-id>.r2.cloudflarestorage.com # STORAGE_S3_REGION=auto Storage Comparison:
| Storage | Price (per 1 TB/month) | Performance | Geo-distribution |
|---|---|---|---|
| S3 | ~$23 | High | Yes |
| Cloudflare R2 | ~$0 (no egress) | High | Yes |
| Local disk | free | Low | No |
Order custom storage setup — we will choose the optimal option for your project.
Caching with Redis
Redis is mandatory for production: cache reduces database load by 60–80%. The configuration is already included in docker-compose.yml. Additionally, you can set CACHE_TTL (default 5 minutes). For high loads, use Redis Cluster. The cluster requires multiple nodes — this provides horizontal scaling and fault tolerance.
| Parameter | Value | Description |
|---|---|---|
| CACHE_TTL | 300 | Cache TTL in seconds |
| CACHE_STORE | redis | Storage type |
| REDIS_HOST | redis | Redis host |
What Problems Does Directus Solve?
Directus solves the problem of connecting backend to frontend by providing a flexible API. It is especially useful when you need to quickly launch a product with custom data structures. For example, for a marketplace with different product types, you don't need to write separate controllers — Directus generates endpoints automatically.
Common Directus Installation Mistakes
- Using npm without Docker — issues with scaling and updates.
- Skipping CORS configuration — CORS errors on frontend.
- Storing media in local filesystem — data loss on disk failure.
- No caching — slow API response at 100+ requests per second.
- Incorrect SECRET generation — vulnerability to CSRF attacks.
- No monitoring — performance issues go unnoticed.
What's Included in the Directus Setup Service?
As part of the service, you receive:
- Fully configured production stack: Docker, PostgreSQL, Redis, S3.
- Configuration tailored to your load (load balancing, CDN).
- Deployment and maintenance documentation.
- Admin panel access, API tokens.
- Team training (2 hours online).
- 2 weeks of support after launch.
This set covers 90% of typical projects. For non-standard ones, individual audit.
Timelines and Cost
Basic setup with Docker, PostgreSQL, S3, and basic configuration takes 2 to 4 hours. Complex projects (custom extensions, SSO, data migration) take 1 to 5 days. Cost is determined individually after audit. Get an engineer consultation — we'll evaluate your project in 1 day. Contact us to discuss details.







