# image2api — one-command stack: PostgreSQL + Redis + RustFS (S3) + backend
# (built from source) + frontend/nginx (HTTP only on port 2000). Self-contained:
#   docker compose up -d --build
# No .env needed — all values are inline below. TLS + domain are handled by YOUR
# OWN reverse proxy in front of the web container (host port 2000).
# ⚠ Before exposing to production, change the passwords/keys (POSTGRES_PASSWORD,
#   RUSTFS_ACCESS_KEY/SECRET_KEY) and set CORS_ORIGINS to your real site origin.
services:
  postgres:
    image: postgres:16-alpine
    environment:
      POSTGRES_DB: vivid_ai
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: change-me-postgres
    volumes:
      - pgdata:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres -d vivid_ai"]
      interval: 5s
      timeout: 5s
      retries: 10
    restart: unless-stopped

  redis:
    image: redis:7-alpine
    command: ["redis-server", "--appendonly", "yes"]
    volumes:
      - redisdata:/data
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 5s
      timeout: 5s
      retries: 10
    restart: unless-stopped

  # RustFS — S3-compatible object storage. The backend talks plain S3 (v4-signed)
  # on port 9000. Media is served (cookie-authed) via the backend's /images
  # proxy, so the bucket stays private.
  rustfs:
    image: rustfs/rustfs:latest
    environment:
      RUSTFS_ACCESS_KEY: vividai
      RUSTFS_SECRET_KEY: vividai-secret-change-me
      RUSTFS_ADDRESS: ":9000"
      RUSTFS_VOLUMES: /data
    volumes:
      - rustfsdata:/data
    restart: unless-stopped

  # One-shot: wait for RustFS, create the bucket, then exit. mc (the MinIO client)
  # speaks S3 so it works against RustFS too.
  createbucket:
    image: minio/mc:latest
    depends_on:
      - rustfs
    entrypoint: >
      /bin/sh -c "
      until mc alias set s3 http://rustfs:9000 vividai vividai-secret-change-me; do
        echo 'waiting for rustfs...'; sleep 2;
      done;
      mc mb -p s3/vivid-ai || true;
      echo 'bucket ready';
      "
    restart: "no"

  backend:
    build:
      context: ./backend
    environment:
      APP_ENV: production
      APP_TITLE: image2api
      HTTP_ADDR: 0.0.0.0:6666
      POSTGRES_DSN: host=postgres user=postgres password=change-me-postgres dbname=vivid_ai port=5432 sslmode=disable TimeZone=Asia/Shanghai
      REDIS_ADDR: redis:6379
      REDIS_PASSWORD: ""
      REDIS_DB: "0"
      RUSTFS_ENDPOINT: http://rustfs:9000
      RUSTFS_BUCKET: vivid-ai
      RUSTFS_ACCESS_KEY: vividai
      RUSTFS_SECRET_KEY: vividai-secret-change-me
      # Set to the URL your reverse proxy serves the site on (comma-separated).
      CORS_ORIGINS: http://localhost:2000
      # true only if your reverse proxy serves HTTPS; false for plain HTTP.
      COOKIE_SECURE: "false"
    volumes:
      - generated:/app/data/generated
    depends_on:
      postgres:
        condition: service_healthy
      redis:
        condition: service_healthy
      createbucket:
        condition: service_completed_successfully
    healthcheck:
      test: ["CMD", "wget", "-qO-", "http://127.0.0.1:6666/health"]
      interval: 10s
      timeout: 5s
      retries: 10
    restart: unless-stopped

  web:
    build:
      context: ./frontend
    # nginx serves the SPA + proxies the API on container port 2000 (HTTP only).
    # Point your own reverse proxy at host:2000.
    ports:
      - "2000:2000"
    depends_on:
      - backend
    restart: unless-stopped

volumes:
  pgdata:
  redisdata:
  rustfsdata:
  generated:
