version: '3.8' services: # PostgreSQL Database db: image: postgres:15-alpine container_name: redirect-intelligence-db restart: unless-stopped environment: POSTGRES_DB: redirect_intelligence POSTGRES_USER: postgres POSTGRES_PASSWORD: ${DB_PASSWORD:-secure_password_change_me} volumes: - postgres_data:/var/lib/postgresql/data - ./packages/database/init.sql:/docker-entrypoint-initdb.d/init.sql ports: - "5432:5432" networks: - redirect-network # Redis for caching and job queues redis: image: redis:7-alpine container_name: redirect-intelligence-redis restart: unless-stopped command: redis-server --appendonly yes volumes: - redis_data:/data ports: - "6379:6379" networks: - redirect-network # API Server api: build: context: . dockerfile: apps/api/Dockerfile.prod container_name: redirect-intelligence-api restart: unless-stopped ports: - "3333:3333" environment: NODE_ENV: production PORT: 3333 DATABASE_URL: postgresql://postgres:${DB_PASSWORD:-secure_password_change_me}@db:5432/redirect_intelligence REDIS_URL: redis://redis:6379 JWT_SECRET: ${JWT_SECRET:-your-super-secret-jwt-key-here-change-me} CORS_ORIGIN: ${CORS_ORIGIN:-https://urltrackertools.com} depends_on: - db - redis networks: - redirect-network volumes: - ./apps/api/uploads:/app/uploads # Background Worker worker: build: context: . dockerfile: apps/worker/Dockerfile.prod container_name: redirect-intelligence-worker restart: unless-stopped environment: NODE_ENV: production DATABASE_URL: postgresql://postgres:${DB_PASSWORD:-secure_password_change_me}@db:5432/redirect_intelligence REDIS_URL: redis://redis:6379 depends_on: - db - redis networks: - redirect-network # Web Frontend web: build: context: . dockerfile: apps/web/Dockerfile.prod args: VITE_API_URL: ${VITE_API_URL:-https://urltrackertools.com} container_name: redirect-intelligence-web restart: unless-stopped ports: - "3000:80" networks: - redirect-network volumes: postgres_data: redis_data: networks: redirect-network: driver: bridge