# AltDock full stack. Works locally with `docker compose up` and on Coolify, # where you override the `${VAR:-default}` values from the project's # Environment Variables / secrets panel. # # Coolify notes: # - All credentials are parameterized; set them in Coolify's env to avoid # the insecure local defaults. # - MinIO has a real healthcheck, so api/worker wait until it can serve. # - The API also creates the S3 bucket itself on startup (ensureBucket), # so the stack no longer depends on minio-init completing successfully. # - If you expose MinIO through a domain, set MINIO_SERVER_URL (public S3 API # origin) and MINIO_BROWSER_REDIRECT_URL (public console origin) so # presigned upload URLs and console redirects work from the browser. services: postgres: image: postgres:16-alpine environment: POSTGRES_DB: ${POSTGRES_DB:-altdock} POSTGRES_USER: ${POSTGRES_USER:-altdock} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-altdock} ports: - "5432:5432" volumes: - postgres-data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-altdock} -d ${POSTGRES_DB:-altdock}"] interval: 5s timeout: 5s retries: 10 minio: image: minio/minio:latest command: server /data --console-address ":9001" environment: MINIO_ROOT_USER: ${MINIO_ROOT_USER:-minioadmin} MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD:-minioadmin123} # Public origins, only needed when MinIO is behind a reverse proxy/domain. MINIO_SERVER_URL: ${MINIO_SERVER_URL:-} MINIO_BROWSER_REDIRECT_URL: ${MINIO_BROWSER_REDIRECT_URL:-} ports: - "9000:9000" - "9001:9001" volumes: - minio-data:/data healthcheck: test: ["CMD", "mc", "ready", "local"] interval: 5s timeout: 5s retries: 12 start_period: 10s # Optional belt-and-suspenders: pre-creates the bucket. The API does the # same on startup, so this can be removed without affecting functionality. minio-init: image: minio/mc:latest depends_on: minio: condition: service_healthy entrypoint: ["/bin/sh", "-c"] command: >- "until mc alias set local http://minio:9000 ${MINIO_ROOT_USER:-minioadmin} ${MINIO_ROOT_PASSWORD:-minioadmin123}; do sleep 1; done; mc mb --ignore-existing local/${S3_BUCKET:-altdock}" environment: MINIO_ROOT_USER: ${MINIO_ROOT_USER:-minioadmin} MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD:-minioadmin123} api: image: node:22-bookworm working_dir: /workspace command: sh -c "npm install --no-audit --no-fund && npm run dev:api" environment: NODE_ENV: development PORT: 4000 PUBLIC_BASE_URL: ${PUBLIC_BASE_URL:-http://localhost:4000} WEB_ORIGIN: ${WEB_ORIGIN:-http://localhost:3000} DATABASE_URL: postgres://${POSTGRES_USER:-altdock}:${POSTGRES_PASSWORD:-altdock}@postgres:5432/${POSTGRES_DB:-altdock} STORAGE_MODE: s3 # S3_ENDPOINT is the internal address; presigned URLs resolve via the # public MINIO_SERVER_URL when set. S3_ENDPOINT: ${S3_ENDPOINT:-http://minio:9000} S3_REGION: ${S3_REGION:-us-east-1} S3_BUCKET: ${S3_BUCKET:-altdock} S3_ACCESS_KEY_ID: ${MINIO_ROOT_USER:-minioadmin} S3_SECRET_ACCESS_KEY: ${MINIO_ROOT_PASSWORD:-minioadmin123} S3_FORCE_PATH_STYLE: "true" AUTH_MODE: ${AUTH_MODE:-demo} PROCESS_INLINE: "false" ports: - "4000:4000" volumes: - .:/workspace depends_on: postgres: condition: service_healthy minio: condition: service_healthy worker: image: node:22-bookworm working_dir: /workspace command: sh -c "npm install --no-audit --no-fund && npm run dev:worker" environment: NODE_ENV: development DATABASE_URL: postgres://${POSTGRES_USER:-altdock}:${POSTGRES_PASSWORD:-altdock}@postgres:5432/${POSTGRES_DB:-altdock} STORAGE_MODE: s3 S3_ENDPOINT: ${S3_ENDPOINT:-http://minio:9000} S3_REGION: ${S3_REGION:-us-east-1} S3_BUCKET: ${S3_BUCKET:-altdock} S3_ACCESS_KEY_ID: ${MINIO_ROOT_USER:-minioadmin} S3_SECRET_ACCESS_KEY: ${MINIO_ROOT_PASSWORD:-minioadmin123} S3_FORCE_PATH_STYLE: "true" AUTH_MODE: ${AUTH_MODE:-demo} PROCESS_INLINE: "false" volumes: - .:/workspace depends_on: postgres: condition: service_healthy minio: condition: service_healthy web: image: node:22-bookworm working_dir: /workspace command: sh -c "npm install --no-audit --no-fund && npm run dev -- --host 0.0.0.0" environment: NEXT_PUBLIC_API_BASE_URL: ${NEXT_PUBLIC_API_BASE_URL:-http://localhost:4000} ports: - "3000:3000" volumes: - .:/workspace depends_on: api: condition: service_started volumes: postgres-data: minio-data: