version: '3' x-postgres: &postgres-common image: "ankane/pgvector:v0.5.1" user: postgres healthcheck: test: "exit 0" interval: 2s timeout: 12s retries: 3 services: postgres: <<: *postgres-common container_name: "omnivore-postgres" expose: - 5432 ports: - "5432:5432" environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres POSTGRES_DB: omnivore PG_POOL_MAX: 20 POSTGRES_HOST_AUTH_METHOD: "scram-sha-256\nhost replication all 0.0.0.0/0 md5" POSTGRES_INITDB_ARGS: --auth-host=scram-sha-256 command: | postgres -c wal_level=replica -c hot_standby=on -c max_wal_senders=10 -c max_replication_slots=10 -c hot_standby_feedback=on postgres-replica: <<: *postgres-common container_name: "omnivore-postgres-replica" expose: - 5433 ports: - "5433:5432" environment: PGUSER: replicator PGPASSWORD: replicator_password command: | bash -c " until pg_basebackup --pgdata=/var/lib/postgresql/data -R --slot=replication_slot --host=postgres --port=5432 do echo 'Waiting for primary to connect...' sleep 1s done echo 'Backup done, starting replica...' chmod 0700 /var/lib/postgresql/data postgres " depends_on: - postgres migrate: build: context: . dockerfile: ./packages/db/Dockerfile container_name: "omnivore-migrate" command: '/bin/sh ./packages/db/setup.sh' # Also create a demo user with email: demo@omnivore.app, password: demo_password environment: - PGPASSWORD=postgres - POSTGRES_USER=postgres - PG_HOST=postgres - PG_PASSWORD=app_pass - PG_DB=omnivore depends_on: postgres: condition: service_healthy api: build: context: . dockerfile: ./packages/api/Dockerfile container_name: "omnivore-api" ports: - "4000:8080" healthcheck: test: ["CMD-SHELL", "nc -z 0.0.0.0 8080 || exit 1"] interval: 15s timeout: 90s environment: - API_ENV=local - PG_HOST=postgres - PG_USER=app_user - PG_PASSWORD=app_pass - PG_DB=omnivore - PG_PORT=5432 - PG_POOL_MAX=20 - JAEGER_HOST=jaeger - IMAGE_PROXY_SECRET=some-secret - JWT_SECRET=some_secret - SSO_JWT_SECRET=some_sso_secret - CLIENT_URL=http://localhost:3000 - GATEWAY_URL=http://localhost:8080/api - CONTENT_FETCH_URL=http://content-fetch:8080/?token=some_token - REDIS_URL='redis://redis:6379' depends_on: migrate: condition: service_completed_successfully web: build: context: . dockerfile: ./packages/web/Dockerfile args: - APP_ENV=prod - BASE_URL=http://localhost:3000 - SERVER_BASE_URL=http://localhost:4000 - HIGHLIGHTS_BASE_URL=http://localhost:3000 container_name: "omnivore-web" ports: - "3000:8080" environment: - NEXT_PUBLIC_APP_ENV=prod - NEXT_PUBLIC_BASE_URL=http://localhost:3000 - NEXT_PUBLIC_SERVER_BASE_URL=http://localhost:4000 - NEXT_PUBLIC_HIGHLIGHTS_BASE_URL=http://localhost:3000 depends_on: api: condition: service_healthy content-fetch: build: context: . dockerfile: ./packages/content-fetch/Dockerfile container_name: "omnivore-content-fetch" ports: - "9090:8080" environment: - JWT_SECRET=some_secret - VERIFICATION_TOKEN=some_token - REST_BACKEND_ENDPOINT=http://api:8080/api - REDIS_URL=redis://redis:6379 depends_on: redis: condition: service_healthy api: condition: service_healthy redis: image: "redis:7.2.4" container_name: "omnivore-redis" ports: - "6379:6379" healthcheck: test: [ "CMD", "redis-cli", "--raw", "incr", "ping" ]