# Public self-hosting compose file.
#
# Uses pre-built images from the GitHub Container Registry.
# No source code or build tooling required. This is the file distributed to self-hosters.
#
# To start the full stack:
#
#   docker compose -f docker-compose.public.yml up -d
#
# To upgrade to the latest release:
#
#   docker compose -f docker-compose.public.yml pull
#   docker compose -f docker-compose.public.yml up -d
#
# See https://docs.collabdt.org/docs/deployment/self-hosting/ for full setup 
# instructions including environment variable configuration, DNS setup, and reverse proxy configuration.

version: "3.9"

services:
  minio:
    image: minio/minio:latest
    restart: unless-stopped
    command: server /data --console-address ":9001"
    environment:
      MINIO_ROOT_USER: ${MINIO_ROOT_USER}
      MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD}
    ports:
      - "9000:9000"   # API access
      - "9001:9001"   # MinIO console
    volumes:
      - minio_data:/data:Z

  minio-init:
    image: minio/mc
    environment:
      MINIO_ROOT_USER: ${MINIO_ROOT_USER}
      MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD}
    entrypoint: >
      /bin/sh -c "
      until mc alias set local http://minio:9000 $MINIO_ROOT_USER $MINIO_ROOT_PASSWORD; do
        echo 'Waiting for local MinIO...';
        sleep 2;
      done;
      mc mb --ignore-existing local/org-logos;
      mc anonymous set download local/org-logos;
      exit 0;
      "

  postgres:
    image: postgis/postgis:15-3.4
    restart: unless-stopped
    environment:
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      POSTGRES_DB: ${POSTGRES_DB}
    ports:
      - "5433:5432"
    volumes:
      - postgres_data:/var/lib/postgresql/data:Z
    # Write the PostGIS init SQL inline — no external file needed.
    # Only runs on first startup when the data directory is empty.
    entrypoint:
      - /bin/bash
      - -c
      - |
          { echo 'CREATE EXTENSION IF NOT EXISTS postgis;'
            echo 'CREATE EXTENSION IF NOT EXISTS postgis_topology;'
            echo 'CREATE EXTENSION IF NOT EXISTS postgis_raster;'
          } > /docker-entrypoint-initdb.d/01_postgis.sql
          exec docker-entrypoint.sh postgres
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
      interval: 10s
      timeout: 5s
      retries: 5

  # Runs "prisma migrate deploy" on startup to apply any pending database
  # schema migrations. One shot service that exits when done.
  migrate:
    image: ghcr.io/carleton-immersive-media-studio/cdt-migrate:latest
    working_dir: /app
    depends_on:
      postgres:
        condition: service_healthy
    environment:
      DATABASE_URL: ${DATABASE_URL}
    command:
      - dockerize
      - -wait
      - tcp://postgres:5432
      - -timeout
      - 60s
      - yarn
      - prisma
      - migrate
      - deploy

  cdt:
    image: ghcr.io/carleton-immersive-media-studio/cdt-image:latest
    restart: unless-stopped
    depends_on:
      migrate:
        condition: service_completed_successfully
    ports:
      - "6012:3000"
    env_file:
      - .env
    environment:
      # MinIO Configuration
      MINIO_URL: ${MINIO_URL}
      MINIO_REGION: ${MINIO_REGION}
      MINIO_ENDPOINT: ${MINIO_ENDPOINT}
      MINIO_USE_SSL: ${MINIO_USE_SSL}

      S3_ACCESS_KEY: ${S3_ACCESS_KEY}
      S3_ACCESS_SECRET: ${S3_ACCESS_SECRET}

      # Auth.js
      AUTH_SECRET: ${AUTH_SECRET}
      AUTH_TRUST_HOST: ${AUTH_TRUST_HOST}
      AUTH_URL: ${AUTH_URL}

      # MinIO Public URLs (for server-side config)
      MINIO_BUCKET_URL: ${MINIO_BUCKET_URL}

      # Geocoding Service
      GEOCODE_EARTH_API_KEY: ${GEOCODE_EARTH_API_KEY}
      GEOCODER_URL: ${GEOCODER_URL}
      PHOTON_URL: ${PHOTON_URL}
      NOMINATIM_URL: ${NOMINATIM_URL}

      # reCAPTCHA
      RECAPTCHA_SITE_KEY: ${RECAPTCHA_SITE_KEY}
      RECAPTCHA_SECRET_KEY: ${RECAPTCHA_SECRET_KEY}

      # Email / SMTP
      EMAIL_HOST: ${EMAIL_HOST}
      EMAIL_PORT: ${EMAIL_PORT}
      EMAIL_FROM: ${EMAIL_FROM}
      EMAIL_USER: ${EMAIL_USER}
      EMAIL_PASS: ${EMAIL_PASS}

      # Google OAuth
      AUTH_GOOGLE_ID: ${AUTH_GOOGLE_ID}
      AUTH_GOOGLE_SECRET: ${AUTH_GOOGLE_SECRET}

      # Postgres
      DATABASE_URL: ${DATABASE_URL}

      PORT: ${PORT}
      SELF_HOSTED: "true"
    command: >
      dockerize
      -wait tcp://postgres:5432
      -wait tcp://minio:9000
      -timeout 90s
      node server.js
    volumes:
      - ./logs:/app/logs
    healthcheck:
      test: ["CMD", "wget", "-qO-", "http://localhost:3000/"]
      interval: 15s
      timeout: 5s
      retries: 6

volumes:
  minio_data:
  postgres_data:
