version: '3' # workers must be split into two services to allow an optimal number of overall workers while limiting the number of # simultaneous offred ingestion processes, which have exceptionally-high memory requirements # these workers use a common base configuration and are differentiated by an environment variable that controls whether # they will pick up offred ingestion tasks or not x-mango-ingest-worker-common-env: &mango-ingest-worker-common-env DATA_ROOT: /data SOURCE_DATA_ROOT_SUBPATH: ${SOURCE_DATA_ROOT_SUBPATH} STAGED_DATA_ROOT_SUBPATH: ${STAGED_DATA_ROOT_SUBPATH} TSDB_HOST: TSDB_PORT: TSDB_PASSWORD: ${DB_PASSWORD} OFFRED_METADATA_FILEPATH: /sensitive/offred_fields_metadata.json x-mango-ingest-worker-base: &mango-ingest-worker-base build: . depends_on: mango-db: condition: service_healthy mango-ensure: condition: service_completed_successfully networks: - mango-backend restart: 'always' volumes: - $DATA_ROOT:/data - ${OFFRED_METADATA_FILEPATH}:/sensitive/offred_fields_metadata.json:ro user: root command: python /app/masschange/src/masschange/ingest/executor/main.py --loop services: mango-api: build: . depends_on: mango-db: condition: service_healthy mango-ensure: condition: service_completed_successfully networks: - mango-backend restart: 'always' ports: - 8000:8000 environment: - API_PROXY_HOST - API_ROOT_PATH - API_ENABLE_SSL - SOURCE_DATA_ROOT=${DATA_ROOT}/${SOURCE_DATA_ROOT_SUBPATH} - TSDB_HOST - TSDB_PORT - TSDB_PASSWORD=${DB_PASSWORD} volumes: - ${DATA_ROOT}/${SOURCE_DATA_ROOT_SUBPATH}:/input - ${SSL_CERT_FILE:-/dev/null}:/certs/ssl.crt:ro - ${SSL_KEY_FILE:-/dev/null}:/certs/ssl.key:ro user: root command: /app/masschange/start_api.sh mango-db: user: "${MANGO_UID}:${MANGO_GID}" image: 'timescale/timescaledb-ha:pg16' healthcheck: test: [ "CMD-SHELL", "pg_isready -U postgres" ] interval: 1s retries: 600 timeout: 10s networks: - mango-backend restart: always ports: - 5432:5432 environment: - POSTGRES_PASSWORD=${DB_PASSWORD} volumes: - $TSDB_PERSIST_ROOT:/home/postgres/pgdata/data mango-crawler: build: . depends_on: mango-db: condition: service_healthy mango-ensure: condition: service_completed_successfully networks: - mango-backend restart: 'always' environment: - DATA_ROOT=/data - SOURCE_DATA_ROOT_SUBPATH - STAGED_DATA_ROOT_SUBPATH - TSDB_HOST - TSDB_PORT - TSDB_PASSWORD=${DB_PASSWORD} volumes: - $DATA_ROOT:/data user: root command: python /app/masschange/src/masschange/ingest/crawler/main.py --src /input --dest /staging --remove-src-files --loop mango-ingest-worker: <<: *mango-ingest-worker-base environment: <<: *mango-ingest-worker-common-env deploy: mode: replicated replicas: 4 mango-ingest-worker-offred: <<: *mango-ingest-worker-base deploy: mode: replicated # offred ingest workers are exceptionally memory-intensive, so we limit the number of replicas to avoid overwhelming the host system replicas: 4 environment: <<: *mango-ingest-worker-common-env MAY_INGEST_OFFRED: 1 mango-ensure: build: . depends_on: mango-db: condition: service_healthy networks: - mango-backend environment: - TSDB_HOST - TSDB_PORT - TSDB_PASSWORD=${DB_PASSWORD} user: root command: python /app/masschange/src/masschange/db/ensure.py mango-regenerate-metadata: profiles: - regenerate-metadata build: . depends_on: mango-ensure: condition: service_completed_successfully networks: - mango-backend environment: - TSDB_HOST - TSDB_PORT - TSDB_PASSWORD=${DB_PASSWORD} user: root command: python /app/masschange/src/masschange/db/metadata/regenerate.py networks: mango-backend: driver: bridge ipam: config: - subnet: 172.18.0.0/16 driver_opts: com.docker.network.bridge.name: 'mango-backend'