services: web: build: context: . dockerfile: apps/web/Dockerfile args: VITE_API_URL: ${VITE_API_URL:-http://localhost:3001} ports: # 0.0.0.0 so a remote Caddy on your LAN can reach this host. Use 127.0.0.1 if Caddy is local. - "${WEB_HOST:-0.0.0.0}:${WEB_PORT:-8080}:8080" depends_on: api: condition: service_healthy restart: unless-stopped api: build: context: . dockerfile: apps/api/Dockerfile ports: - "${API_HOST:-0.0.0.0}:${API_PORT:-3001}:3001" env_file: - .env environment: # Fixed in-container port (healthcheck and API_PORT host mapping). PORT: 3001 # Container-to-container: always port 6379 on the redis service. # REDIS_PORT in .env only changes the host-published port, not this URL. REDIS_URL: redis://redis:6379 depends_on: redis: condition: service_healthy restart: unless-stopped redis: image: redis:7-alpine ports: - "${REDIS_PORT:-6379}:6379" volumes: - redis-data:/data healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 5s timeout: 3s retries: 10 restart: unless-stopped # Local S3 for self-hosting (or point S3_* in .env at external storage). minio: profiles: ["storage"] image: minio/minio:latest command: server /data --console-address ":9001" ports: - "${MINIO_API_PORT:-9000}:9000" - "${MINIO_CONSOLE_PORT:-9001}:9001" env_file: - .env environment: MINIO_ROOT_USER: ${MINIO_ROOT_USER:-minioadmin} MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD:-minioadmin} MINIO_API_CORS_ALLOW_ORIGIN: ${MINIO_API_CORS_ALLOW_ORIGIN:-http://localhost:8080,http://127.0.0.1:8080,http://localhost:5173,http://127.0.0.1:5173} volumes: - minio-data:/data restart: unless-stopped minio-init: profiles: ["storage"] image: minio/mc:latest depends_on: - minio env_file: - .env environment: MINIO_ROOT_USER: ${MINIO_ROOT_USER:-minioadmin} MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD:-minioadmin} S3_BUCKET: ${S3_BUCKET:-file-shares} entrypoint: > /bin/sh -c " until mc alias set local http://minio:9000 \"$$MINIO_ROOT_USER\" \"$$MINIO_ROOT_PASSWORD\"; do sleep 1; done; mc mb -p \"local/$$S3_BUCKET\" || true; exit 0; " restart: "no" volumes: redis-data: minio-data: