name: xpltd_promptlooper networks: promptlooper: driver: bridge ipam: config: - subnet: 172.33.0.0/24 services: promptlooper-db: image: postgres:16-alpine container_name: promptlooper-db restart: unless-stopped networks: - promptlooper ports: - "5434:5432" environment: POSTGRES_USER: ${POSTGRES_USER:-promptlooper} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?Set POSTGRES_PASSWORD in .env} POSTGRES_DB: ${POSTGRES_DB:-promptlooper} volumes: - /vmPool/r/services/promptlooper_db:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-promptlooper}"] interval: 10s timeout: 5s retries: 5 promptlooper-redis: image: redis:7-alpine container_name: promptlooper-redis restart: unless-stopped networks: - promptlooper volumes: - /vmPool/r/services/promptlooper_redis:/data healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 5s retries: 5 promptlooper-api: build: context: . dockerfile: docker/Dockerfile target: api container_name: promptlooper-api restart: unless-stopped networks: - promptlooper ports: - "8401:8401" # MCP server environment: DATABASE_URL: postgresql+asyncpg://${POSTGRES_USER:-promptlooper}:${POSTGRES_PASSWORD}@promptlooper-db:5432/${POSTGRES_DB:-promptlooper} REDIS_URL: redis://promptlooper-redis:6379/0 JWT_SECRET: ${JWT_SECRET:?Set JWT_SECRET in .env} DEFAULT_ENDPOINT_URL: ${DEFAULT_ENDPOINT_URL:-} DEFAULT_ENDPOINT_KEY: ${DEFAULT_ENDPOINT_KEY:-} MAX_CONCURRENT_RUNS: ${MAX_CONCURRENT_RUNS:-4} MAX_TOKENS_PER_SWEEP: ${MAX_TOKENS_PER_SWEEP:-0} MCP_ENABLED: ${MCP_ENABLED:-true} MCP_PORT: 8401 depends_on: promptlooper-db: condition: service_healthy promptlooper-redis: condition: service_healthy promptlooper-worker: build: context: . dockerfile: docker/Dockerfile target: api container_name: promptlooper-worker restart: unless-stopped networks: - promptlooper command: celery -A backend.worker:app worker --loglevel=info --concurrency=${MAX_CONCURRENT_RUNS:-4} environment: DATABASE_URL: postgresql+asyncpg://${POSTGRES_USER:-promptlooper}:${POSTGRES_PASSWORD}@promptlooper-db:5432/${POSTGRES_DB:-promptlooper} REDIS_URL: redis://promptlooper-redis:6379/0 DEFAULT_ENDPOINT_URL: ${DEFAULT_ENDPOINT_URL:-} DEFAULT_ENDPOINT_KEY: ${DEFAULT_ENDPOINT_KEY:-} MAX_CONCURRENT_RUNS: ${MAX_CONCURRENT_RUNS:-4} depends_on: promptlooper-db: condition: service_healthy promptlooper-redis: condition: service_healthy promptlooper-web: build: context: . dockerfile: docker/Dockerfile target: web container_name: promptlooper-web restart: unless-stopped networks: - promptlooper ports: - "8400:80" depends_on: - promptlooper-api