services: campaign-service: build: context: . dockerfile: backend/campaign-service/Dockerfile restart: unless-stopped env_file: - path: .env required: false environment: USERS_DATABASE_URL: ${USERS_DATABASE_URL:-postgres://cm_campaign_app:devpassword@postgres:5432/cm_users} CAMPAIGN_DATABASE_URL: ${CAMPAIGN_DATABASE_URL:-postgres://cm_campaign_app:devpassword@postgres:5432/cm_campaign} JWT_SECRET: ${JWT_SECRET:-change-me-to-a-long-random-secret} PORT: ${CAMPAIGN_PORT:-3000} ports: - "3000:3000" networks: - dev-infra - internal content-service: build: context: . dockerfile: backend/content-service/Dockerfile restart: unless-stopped env_file: - path: .env required: false environment: CONTENT_DATABASE_URL: ${CONTENT_DATABASE_URL:-postgres://cm_content_app:devpassword@postgres:5432/cm_content} JWT_SECRET: ${JWT_SECRET:-change-me-to-a-long-random-secret} PORT: ${CONTENT_PORT:-3001} ports: - "3001:3001" networks: - dev-infra - internal web: build: context: . dockerfile: web/Dockerfile restart: unless-stopped env_file: - path: .env required: false environment: CAMPAIGN_API_BASE: ${CAMPAIGN_API_BASE:-http://campaign-service:3000/v1} CONTENT_API_BASE: ${CONTENT_API_BASE:-http://content-service:3001/v1} PORT: ${WEB_PORT:-5173} HOST: 0.0.0.0 ports: - "${WEB_PORT:-5173}:${WEB_PORT:-5173}" depends_on: - campaign-service - content-service networks: - internal networks: dev-infra: external: true internal: driver: bridge