# Production Docker Compose Configuration # This file is for reference - actual deployment on Plesk will use individual containers version: '3.8' services: portal: build: context: . dockerfile: portal/Dockerfile container_name: customer-portal-frontend ports: - "3000:3000" environment: - NODE_ENV=production - NEXT_PUBLIC_API_BASE=${NEXT_PUBLIC_API_BASE} - NEXT_PUBLIC_APP_NAME=${NEXT_PUBLIC_APP_NAME} restart: unless-stopped depends_on: - bff networks: - app-network bff: build: context: . dockerfile: bff/Dockerfile container_name: customer-portal-backend ports: - "4000:4000" environment: - NODE_ENV=production - DATABASE_URL=${DATABASE_URL} - REDIS_URL=${REDIS_URL} - WHMCS_BASE_URL=${WHMCS_BASE_URL} - WHMCS_API_IDENTIFIER=${WHMCS_API_IDENTIFIER} - WHMCS_API_SECRET=${WHMCS_API_SECRET} - SF_LOGIN_URL=${SF_LOGIN_URL} - SF_CLIENT_ID=${SF_CLIENT_ID} - SF_PRIVATE_KEY_PATH=${SF_PRIVATE_KEY_PATH} - SF_USERNAME=${SF_USERNAME} - JWT_SECRET=${JWT_SECRET} - JWT_EXPIRES_IN=${JWT_EXPIRES_IN} - BCRYPT_ROUNDS=${BCRYPT_ROUNDS} - CORS_ORIGIN=${CORS_ORIGIN} - LOG_LEVEL=${LOG_LEVEL} - PORT=4000 volumes: - ./secrets:/app/secrets:ro restart: unless-stopped depends_on: - postgres - redis networks: - app-network postgres: image: postgres:17-alpine container_name: customer-portal-db environment: POSTGRES_DB: ${POSTGRES_DB:-portal_prod} POSTGRES_USER: ${POSTGRES_USER:-portal} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} volumes: - postgres_data:/var/lib/postgresql/data restart: unless-stopped networks: - app-network redis: image: redis:8-alpine container_name: customer-portal-cache volumes: - redis_data:/data restart: unless-stopped networks: - app-network volumes: postgres_data: redis_data: networks: app-network: driver: bridge