version: '3' services: api_server: image: danswer/danswer-backend:latest build: context: ../../backend dockerfile: Dockerfile command: > /bin/sh -c "alembic upgrade head && echo \"Starting Danswer Api Server\" && uvicorn danswer.main:app --host 0.0.0.0 --port 8080" depends_on: - relational_db - vector_db - search_engine restart: always ports: - "8080:8080" environment: - POSTGRES_HOST=relational_db - QDRANT_HOST=vector_db - TYPESENSE_HOST=search_engine - TYPESENSE_API_KEY=${TYPESENSE_API_KEY:-local_dev_typesense} - LOG_LEVEL=${LOG_LEVEL:-info} - DISABLE_AUTH=${DISABLE_AUTH:-True} - GOOGLE_OAUTH_CLIENT_ID=${GOOGLE_OAUTH_CLIENT_ID:-} - GOOGLE_OAUTH_CLIENT_SECRET=${GOOGLE_OAUTH_CLIENT_SECRET:-} - DISABLE_GENERATIVE_AI=${DISABLE_GENERATIVE_AI:-} volumes: - local_dynamic_storage:/home/storage - file_connector_tmp_storage:/home/file_connector_storage background: image: danswer/danswer-backend:latest build: context: ../../backend dockerfile: Dockerfile command: /usr/bin/supervisord depends_on: - relational_db - vector_db restart: always environment: - POSTGRES_HOST=relational_db - QDRANT_HOST=vector_db - TYPESENSE_HOST=search_engine - TYPESENSE_API_KEY=${TYPESENSE_API_KEY:-local_dev_typesense} - DANSWER_BOT_SLACK_APP_TOKEN=${DANSWER_BOT_SLACK_APP_TOKEN:-} - DANSWER_BOT_SLACK_BOT_TOKEN=${DANSWER_BOT_SLACK_BOT_TOKEN:-} volumes: - local_dynamic_storage:/home/storage - file_connector_tmp_storage:/home/file_connector_storage web_server: image: danswer/danswer-web-server:latest build: context: ../../web dockerfile: Dockerfile args: - NEXT_PUBLIC_DISABLE_STREAMING=${NEXT_PUBLIC_DISABLE_STREAMING:-false} depends_on: - api_server restart: always environment: - INTERNAL_URL=http://api_server:8080 - DISABLE_AUTH=${DISABLE_AUTH:-True} relational_db: image: postgres:15.2-alpine restart: always environment: - POSTGRES_USER=${POSTGRES_USER:-postgres} - POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-password} ports: - "5432:5432" volumes: - db_volume:/var/lib/postgresql/data vector_db: image: qdrant/qdrant:v1.3.0 restart: always environment: - QDRANT__TELEMETRY_DISABLED=true ports: - "6333:6333" volumes: - qdrant_volume:/qdrant/storage search_engine: image: typesense/typesense:0.24.1 restart: always environment: - TYPESENSE_API_KEY=${TYPESENSE_API_KEY:-local_dev_typesense} - TYPESENSE_DATA_DIR=/typesense/storage ports: - "8108:8108" volumes: - typesense_volume:/typesense/storage nginx: image: nginx:1.23.4-alpine restart: always depends_on: - api_server - web_server environment: - DOMAIN=localhost ports: - "80:80" - "3000:80" # allow for localhost:3000 usage, since that is the norm volumes: - ../data/nginx:/etc/nginx/conf.d command: > /bin/sh -c "envsubst '$$\{DOMAIN\}' < /etc/nginx/conf.d/app.conf.template.dev > /etc/nginx/conf.d/app.conf && while :; do sleep 6h & wait $${!}; nginx -s reload; done & nginx -g \"daemon off;\"" volumes: local_dynamic_storage: file_connector_tmp_storage: # used to store files uploaded by the user temporarily while we are indexing them db_volume: qdrant_volume: typesense_volume: