services: db: container_name: ecospecies-db image: postgres:16-alpine restart: unless-stopped environment: POSTGRES_DB: ${ECOSPECIES_DB_NAME:-ecospecies} POSTGRES_USER: ${ECOSPECIES_DB_USER:-ecospecies} POSTGRES_PASSWORD: ${ECOSPECIES_DB_PASSWORD:?set ECOSPECIES_DB_PASSWORD} PGDATA: /var/lib/postgresql/data/pgdata healthcheck: test: ["CMD-SHELL", "pg_isready -U ${ECOSPECIES_DB_USER:-ecospecies} -d ${ECOSPECIES_DB_NAME:-ecospecies}"] interval: 5s timeout: 5s retries: 10 volumes: - postgres_data:/var/lib/postgresql/data importer: container_name: ecospecies-importer image: python:3.12-slim restart: "no" depends_on: db: condition: service_healthy working_dir: /workspace environment: ECOSPECIES_DATA_DIR: ${ECOSPECIES_DATA_DIR:-/workspace/input-data/InputFiles} ECOSPECIES_DATABASE_URL: postgresql+psycopg://${ECOSPECIES_DB_USER:-ecospecies}:${ECOSPECIES_DB_PASSWORD}@db:5432/${ECOSPECIES_DB_NAME:-ecospecies} ECOSPECIES_VENV_DIR: /workspace/.docker/venv PYTHONPATH: /workspace/apps/api/src command: ["/bin/sh", "-lc", "./scripts/bootstrap-python-env.sh && ./scripts/run-import.sh"] volumes: - ..:/workspace - ${ECOSPECIES_LEGACY_DATA_DIR:-../path-to-legacy-corpus}:/legacy-data:ro - python_venv:/workspace/.docker/venv - pip_cache:/root/.cache/pip api: container_name: ecospecies-api image: python:3.12-slim restart: unless-stopped depends_on: db: condition: service_healthy importer: condition: service_completed_successfully working_dir: /workspace environment: ECOSPECIES_DATA_DIR: ${ECOSPECIES_DATA_DIR:-/workspace/input-data/InputFiles} ECOSPECIES_DATABASE_URL: postgresql+psycopg://${ECOSPECIES_DB_USER:-ecospecies}:${ECOSPECIES_DB_PASSWORD}@db:5432/${ECOSPECIES_DB_NAME:-ecospecies} ECOSPECIES_HOST: 0.0.0.0 ECOSPECIES_PORT: "8000" ECOSPECIES_AUTH_TOKENS: ${ECOSPECIES_AUTH_TOKENS:-} ECOSPECIES_VENV_DIR: /workspace/.docker/venv PYTHONPATH: /workspace/apps/api/src command: ["/bin/sh", "-lc", "./scripts/bootstrap-python-env.sh && ./scripts/run-api.sh"] volumes: - ..:/workspace - ${ECOSPECIES_LEGACY_DATA_DIR:-/input-data}:/legacy-data:ro - python_venv:/workspace/.docker/venv - pip_cache:/root/.cache/pip web: container_name: ecospecies-web image: nginx:1.27-alpine restart: unless-stopped depends_on: api: condition: service_started labels: - "traefik.enable=true" - "traefik.docker.network=${TRAEFIK_NETWORK:-traefik-network}" - "traefik.http.routers.ecospecies-atlas.rule=Host(`${ECOSPECIES_HOSTNAME:?set ECOSPECIES_HOSTNAME}`) && PathPrefix(`${ECOSPECIES_BASE_PATH:-/}`)" - "traefik.http.routers.ecospecies-atlas.entrypoints=${TRAEFIK_ENTRYPOINTS:-websecure}" - "traefik.http.routers.ecospecies-atlas.tls.certresolver=${TRAEFIK_CERTRESOLVER:-myresolver}" - "traefik.http.services.ecospecies-atlas.loadbalancer.server.port=80" volumes: - ../apps/web:/usr/share/nginx/html:ro - ../apps/web/nginx.conf:/etc/nginx/conf.d/default.conf:ro networks: - default - traefik-network volumes: postgres_data: python_venv: pip_cache: networks: traefik-network: external: true name: ${TRAEFIK_NETWORK:-traefik-network}