Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # Example Docker Compose Configuration for Fullstack Typescript App
- #
- # ENVIRONMENT VARIABLES:
- # All ${VARIABLE_NAME} references expect values from your .env file.
- # Default values are provided only for localhost URLs and non-sensitive configs.
- # See .env.example for a complete list of required environment variables.
- #
- # Required services: postgres, valkey (OSS Redis fork)
- # Optional services: minio (object storage), drizzle-gateway (DB UI)
- name: server
- services:
- # Nginx reverse proxy for routing
- nginx:
- image: nginx:alpine
- profiles:
- - server
- ports:
- - '80:80'
- volumes:
- - ./nginx.conf:/etc/nginx/nginx.conf:ro
- restart: unless-stopped
- # Next.js frontend application
- frontend:
- image: frontend:latest
- profiles:
- - server
- build:
- context: .
- dockerfile: packages/frontend/Dockerfile
- target: runner
- args:
- # API configuration
- NEXT_PUBLIC_API_URL: ${NEXT_PUBLIC_API_URL:-http://localhost:4111}
- NEXT_PUBLIC_APP_URL: ${NEXT_PUBLIC_APP_URL:-http://localhost:3000}
- # Authentication (Privy)
- NEXT_PUBLIC_PRIVY_APP_ID: ${NEXT_PUBLIC_PRIVY_APP_ID}
- NEXT_PUBLIC_PRIVY_CLIENT_ID: ${NEXT_PUBLIC_PRIVY_CLIENT_ID}
- # Feature flags
- NEXT_PUBLIC_DISABLE_SUBSCRIPTION_GATE: 'false'
- environment:
- NODE_ENV: production
- # App configuration
- NEXT_PUBLIC_PRIVY_APP_ID: ${NEXT_PUBLIC_PRIVY_APP_ID}
- NEXT_PUBLIC_APP_URL: ${NEXT_PUBLIC_APP_URL:-http://localhost:3000}
- NEXT_PUBLIC_API_URL: ${NEXT_PUBLIC_API_URL:-http://localhost:4111}
- # Monitoring
- SENTRY_AUTH_TOKEN: ${SENTRY_AUTH_TOKEN}
- LMNR_PROJECT_API_KEY: ${LMNR_PROJECT_API_KEY}
- # Feature flags
- NEXT_PUBLIC_DISABLE_SUBSCRIPTION_GATE: false
- # AI Provider Keys
- OPENAI_API_KEY: ${OPENAI_API_KEY}
- ANTHROPIC_API_KEY: ${ANTHROPIC_API_KEY}
- GOOGLE_GENERATIVE_AI_API_KEY: ${GOOGLE_GENERATIVE_AI_API_KEY}
- # Database connections
- DATABASE_URL: postgresql://postgres:${POSTGRES_PASSWORD}@postgres:5432/x3k_frontend
- BACKEND_DATABASE_URL: postgresql://readonly_user:${READONLY_PASSWORD}@postgres:5432/x3k
- # External services
- HUGGINGFACE_API_KEY: ${HUGGINGFACE_API_KEY}
- # Cache configuration
- REDIS_HOST: valkey
- restart: unless-stopped
- # Hono backend API server
- server:
- image: backend:latest
- profiles:
- - server
- build:
- context: .
- dockerfile: packages/server/Dockerfile
- environment:
- NODE_ENV: production
- # Database configuration
- DATABASE_URL: postgresql://postgres:${POSTGRES_PASSWORD}@postgres:5432/x3k
- DATABASE_HOST: postgres
- DATABASE_PORT: 5432
- DATABASE_USER: postgres
- # Cache configuration
- REDIS_HOST: valkey
- # AI Provider Keys
- OPENAI_API_KEY: ${OPENAI_API_KEY}
- ANTHROPIC_API_KEY: ${ANTHROPIC_API_KEY}
- GOOGLE_GENERATIVE_AI_API_KEY: ${GOOGLE_GENERATIVE_AI_API_KEY}
- OPENROUTER_API_KEY: ${OPENROUTER_API_KEY}
- # External service APIs
- HUGGINGFACE_API_KEY: ${HUGGINGFACE_API_KEY}
- # Authentication (Privy)
- PRIVY_APP_ID: ${PRIVY_APP_ID}
- PRIVY_APP_SECRET: ${PRIVY_APP_SECRET}
- # Object storage (MinIO) configuration
- MINIO_ENDPOINT: minio
- MINIO_PORT: '9000'
- MINIO_USE_SSL: 'false'
- MINIO_ACCESS_KEY: ${MINIO_ROOT_USER:-minioadmin}
- MINIO_SECRET_KEY: ${MINIO_ROOT_PASSWORD}
- # Payment provider (Helio)
- HELIO_API_KEY: ${HELIO_API_KEY}
- HELIO_PUBLIC_KEY: ${HELIO_PUBLIC_KEY}
- HELIO_WEBHOOK_SECRET: ${HELIO_WEBHOOK_SECRET}
- # Job Scheduler Configuration
- # Uncomment and adjust cron expressions as needed
- # DISABLE_SCHEDULERS: 'true' # Set to true to disable all scheduled jobs
- # Cron expressions for scheduled jobs (using node-cron format)
- # SYNC_CONTENT_SCHEDULE: '0 0 5 * * *' # 5 AM daily
- # SYNC_USER_DATA_SCHEDULE: '0 0 4 * * *' # 4 AM daily
- # SYNC_CONNECTIONS_SCHEDULE: '0 0 * * * *' # Every hour
- # SYNC_PROFILES_SCHEDULE: '0 0 2 * * 3' # 2 AM Wednesday
- # SYNC_ANALYTICS_SCHEDULE: '0 0 6 * * 0' # 6 AM Sunday
- # SYNC_INTELLIGENCE_SCHEDULE: '0 0 6 * * *' # 6 AM daily
- # SYNC_REPUTATION_SCHEDULE: '0 0 3 * * 2' # 3 AM Tuesday
- restart: unless-stopped
- # PostgreSQL database with pgvector extension for embeddings
- postgres:
- restart: unless-stopped
- image: pgvector/pgvector:pg17
- environment:
- POSTGRES_DB: x3k
- POSTGRES_USER: postgres
- POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
- ports:
- - '5432:5432'
- volumes:
- - postgres_data:/var/lib/postgresql/data
- # Initialize multiple databases on first run
- - ./ops/postgres/init-databases.sql:/docker-entrypoint-initdb.d/01-init-databases.sql:ro
- healthcheck:
- test: ['CMD-SHELL', 'pg_isready -U postgres -d x3k']
- interval: 10s
- timeout: 5s
- retries: 5
- # Valkey (Redis fork) for caching and queue management
- valkey:
- restart: unless-stopped
- image: valkey/valkey:7.2-alpine
- ports:
- - '6379:6379'
- # MinIO object storage (S3-compatible)
- minio:
- restart: unless-stopped
- image: minio/minio:RELEASE.2025-07-23T15-54-02Z
- command: server /data --console-address ":9001"
- environment:
- MINIO_ROOT_USER: ${MINIO_ROOT_USER:-minioadmin}
- MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD}
- ports:
- - '9000:9000' # API endpoint
- - '9001:9001' # Web console
- volumes:
- - minio_data:/data
- healthcheck:
- test: ['CMD', 'curl', '-f', 'http://localhost:9000/minio/health/live']
- interval: 30s
- timeout: 20s
- retries: 3
- # Drizzle Studio - Database management UI (development only)
- drizzle-gateway:
- profiles: ['local'] # Only runs with --profile local
- image: ghcr.io/drizzle-team/gateway:latest
- container_name: drizzle-gateway
- ports:
- - '4983:4983'
- environment:
- PORT: 4983
- STORE_PATH: /app/data
- MASTERPASS: ${DRIZZLE_GATEWAY_PASSWORD}
- volumes:
- - drizzle-gateway-data:/app/data
- restart: unless-stopped
- # Named volumes for data persistence
- volumes:
- postgres_data:
- minio_data:
- drizzle-gateway-data:
Advertisement
Add Comment
Please, Sign In to add comment