services: llama-cpp: image: ghcr.io/ggerganov/llama.cpp:server-latest container_name: llama-cpp-server restart: unless-stopped ports: - "8080:8080" volumes: - ./llama-models:/models environment: - MODEL=/models/llama-3-8b-instruct.Q4_K_M.gguf - HOST=0.0.0.0 - PORT=8080 - N_CTX=4096 - N_GPU_LAYERS=28 - N_BATCH=512 - N_THREADS=8 command: --model ${MODEL} --host ${HOST} --port ${PORT} --ctx-size ${N_CTX} --n-gpu-layers ${N_GPU_LAYERS} --batch-size ${N_BATCH} --threads ${N_THREADS} healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8080/health"] interval: 30s timeout: 10s retries: 5 start_period: 60s labels: - "traefik.enable=true" - "traefik.http.routers.llama-cpp.rule=Host(`${HOST_NAME}`) && PathPrefix(`/v1/llama`)" - "traefik.http.routers.llama-cpp.entrypoints=web" - "traefik.http.services.llama-cpp-service.loadbalancer.server.port=8080" traefik: image: "traefik:v2.10.4" container_name: "traefik" command: - "--log.level=ERROR" - "--providers.docker=true" - "--providers.docker.exposedByDefault=false" - "--entrypoints.web.address=:80" ports: - "80:80" - "9090:8080" volumes: - "/var/run/docker.sock:/var/run/docker.sock:ro" postgres: image: postgres:13 restart: always volumes: - ./postgres/data:/var/lib/postgresql/data - ./initdb.d:/docker-entrypoint-initdb.d:ro environment: POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-secretpgpassword} POSTGRES_USERNAME: ${POSTGRES_USERNAME} healthcheck: test: ["CMD", "pg_isready", "-U", "${POSTGRES_USERNAME}", "-d", "postgres"] interval: 5s timeout: 5s retries: 5 ports: - "5432:5432" supertokens: image: registry.supertokens.io/supertokens/supertokens-postgresql:6.0 depends_on: postgres: condition: service_healthy expose: - 3567 environment: POSTGRESQL_CONNECTION_URI: ${SUPERTOKENS_POSTGRESQL_CONNECTION_URI} POSTGRESQL_TABLE_NAMES_PREFIX: Supertokens restart: unless-stopped labels: - "traefik.enable=true" - "traefik.http.routers.auth.rule=Host(`${HOST_NAME}`) && PathPrefix(`/v1/auth`)" - "traefik.http.routers.auth.entrypoints=web" - "traefik.http.services.auth-service.loadbalancer.server.port=3567" healthcheck: test: ["CMD", "curl", "-f", "http://localhost:3567/hello"] interval: 30s timeout: 10s retries: 3 start_period: 30s postgraphile: image: graphile/postgraphile:4 depends_on: postgres: condition: service_healthy restart: always ports: - "5000:5000" environment: DATABASE_URL: postgres://${POSTGRES_USERNAME}:${POSTGRES_PASSWORD:-secretpgpassword}@postgres:5432/postgres PGRAPHILE_WATCH_PG: "true" PGRAPHILE_JWT_SECRET: ${HASURA_GRAPHQL_JWT_SECRET} PGRAPHILE_JWT_PG_ROLE: public PGRAPHILE_PG_DEFAULT_ROLE: public PGRAPHILE_ENABLE_GRAPHIQL: "true" healthcheck: test: [ "CMD-SHELL", "curl -f http://localhost:5000/graphql?query={__typename} || exit 1", ] interval: 30s timeout: 10s retries: 3 start_period: 30s mongo: image: mongo:5.0 container_name: mongo restart: unless-stopped ports: - "27017:27017" volumes: - mongo-data:/data/db functions: build: ../../frontend-nextjs/project/functions container_name: "functions" depends_on: - minio - optaplanner - postgres - postgraphile - mongo environment: BASIC_AUTH: ${BASIC_AUTH} FUNCTION_SERVER_URL: ${FUNCTION_SERVER_URL} OPENAI_API_KEY: ${OPENAI_API_KEY} GOOGLE_CLIENT_ID_ATOMIC_WEB: ${GOOGLE_CLIENT_ID_ATOMIC_WEB} GOOGLE_CLIENT_SECRET_ATOMIC_WEB: ${GOOGLE_CLIENT_SECRET_ATOMIC_WEB} HASURA_GRAPHQL_ADMIN_SECRET: ${HASURA_GRAPHQL_ADMIN_SECRET} POSTGRAPHILE_GRAPHQL_URL: http://postgraphile:5000/graphql # PYTHON_API_SERVICE_BASE_URL: ${PYTHON_API_SERVICE_BASE_URL:-http://python-agent:5000} # Removed: python-agent service deprecated LLAMA_CPP_URL: http://llama-cpp:8080 DOMAIN: ${DOMAIN} S3_ENDPOINT: http://minio:8484 S3_BUCKET: nhost S3_ACCESS_KEY: ${STORAGE_ACCESS_KEY} S3_SECRET_KEY: ${STORAGE_SECRET_KEY} HOST_IP: ${HOST_IP} HANDSHAKE_URL: http://${HOST_NAME}/v1/handshake ZOOM_PASS_KEY: ${ZOOM_PASS_KEY} ZOOM_CLIENT_ID: ${ZOOM_CLIENT_ID} ZOOM_SALT_FOR_PASS: ${ZOOM_SALT_FOR_PASS} ZOOM_IV_FOR_PASS: ${ZOOM_IV_FOR_PASS} OPTAPLANNER_URL: http://optaplanner:8081 OPTAPLANNER_USERNAME: ${OPTAPLANNER_USERNAME} OPTAPLANNER_PASSWORD: ${OPTAPLANNER_PASSWORD} GOOGLE_AUTH_REDIRECT_URL: http://${HOST_NAME}/v1/oauth/google-calendar-handshake/oauth2callback APP_CLIENT_URL: ${APP_CLIENT_URL} labels: - "traefik.enable=true" - "traefik.http.routers.functions.rule=Host(`${HOST_NAME}`) && PathPrefix(`/v1/functions/`)" - "traefik.http.routers.functions.entrypoints=web" - "traefik.http.services.functions-service.loadbalancer.server.port=3000" healthcheck: test: ["CMD", "curl", "-f", "http://localhost:3000/healthz"] interval: 30s timeout: 10s retries: 3 start_period: 60s restart: always expose: - 3000 ports: - 3030:3030 volumes: - ../../frontend-nextjs/project/functions:/app - functions_node_modules:/app/node_modules - ../../frontend-nextjs/project/functions/logs:/app/logs minio: image: minio/minio:RELEASE.2021-09-24T00-24-24Z entrypoint: sh command: -c 'mkdir -p /data/nhost && /opt/bin/minio server --console-address :9001 --address :8484 /data' environment: MINIO_ROOT_USER: ${STORAGE_ACCESS_KEY} MINIO_ROOT_PASSWORD: ${STORAGE_SECRET_KEY} ports: - ${MINIO_PORT:-8484}:8484 - 9001:9001 volumes: - ./data/minio:/data live-meeting-worker: build: context: ../python-api/live_meeting_worker dockerfile: Dockerfile container_name: live-meeting-worker environment: - OPENAI_API_KEY=${OPENAI_API_KEY} - NOTION_API_KEY=${NOTION_API_KEY} - DATABASE_URL=/app/data/live_meeting_tasks.db volumes: - ./worker_data:/app/data ports: - "8001:8001" restart: always healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8001/list_audio_devices"] interval: 30s timeout: 10s retries: 3 start_period: 30s labels: - "traefik.enable=true" - "traefik.http.routers.live-meeting-worker.rule=Host(`${HOST_NAME}`) && PathPrefix(`/v1/live-meeting-worker`)" - "traefik.http.routers.live-meeting-worker.entrypoints=web" - "traefik.http.services.live-meeting-worker-service.loadbalancer.server.port=8001" optaplanner: image: atomic-scheduler:latest restart: always depends_on: postgres: condition: service_healthy environment: QUARKUS_DATASOURCE_JDBC_URL: jdbc:postgresql://postgres:5432/postgres QUARKUS_DATASOURCE_USERNAME: ${POSTGRES_USERNAME} QUARKUS_DATASOURCE_PASSWORD: ${POSTGRES_PASSWORD} QUARKUS_DATASOURCE_DB-KIND: postgresql USERNAME: admin PASSWORD: ${API_TOKEN} ports: - 8081:8081 healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8081/q/health"] interval: 30s timeout: 10s retries: 3 start_period: 60s app: build: context: ../app_build_docker args: HASURA_GRAPHQL_ADMIN_SECRET: ${HASURA_GRAPHQL_ADMIN_SECRET} POSTGRAPHILE_GRAPHQL_URL: http://postgraphile:5000/graphql NEXT_PUBLIC_POSTGRAPHILE_GRAPHQL_URL: http://localhost:5000/graphql NEXT_PUBLIC_EVENT_TO_QUEUE_AUTH_URL: http://${HOST_NAME}/v1/functions/schedule-event/publisherScheduleEvent/schedule-event-auth NEXT_PUBLIC_EVENT_TO_QUEUE_SHORT_AUTH_URL: http://${HOST_NAME}/v1/functions/schedule-event/publisherScheduleShortEvent/schedule-short-event-auth NEXT_PUBLIC_CALENDAR_TO_QUEUE_AUTH_URL: http://${HOST_NAME}/v1/functions/schedule-assist/publisherScheduleMeeting/schedule-meeting-to-queue-auth NEXT_PUBLIC_FEATURES_APPLY_TO_EVENTS_AUTH_URL: http://${HOST_NAME}/v1/functions/features-apply/publish-to-features-worker/features-worker-to-queue-auth NEXT_PUBLIC_METHOD_TO_SEARCH_INDEX_AUTH_URL: http://${HOST_NAME}/v1/functions/events-search/eventsSearch/events-search-auth NEXT_PUBLIC_GOOGLE_OAUTH_ATOMIC_WEB_API_START_URL: http://${HOST_NAME}/api/google/start-oauth NEXT_PUBLIC_GOOGLE_OAUTH_ATOMIC_WEB_REDIRECT_URL: http://${HOST_NAME}/api/google/oauth-callback GOOGLE_CLIENT_ID_ATOMIC_WEB: ${GOOGLE_CLIENT_ID_ATOMIC_WEB} GOOGLE_CLIENT_SECRET_ATOMIC_WEB: ${GOOGLE_CLIENT_SECRET_ATOMIC_WEB} NEXT_PUBLIC_DELETE_ZOOM_CONFERENCE_URL: http://${HOST_NAME}/v1/functions/zoom-meeting/delZoomMeet/delete-zoom-meet-auth NEXT_PUBLIC_GOOGLE_CALENDAR_SYNC_URL: http://${HOST_NAME}/v1/functions/google-calendar-sync/googleCalendarSync/google-calendar-sync-auth NEXT_PUBLIC_SELF_GOOGLE_CALENDAR_WATCH_URL: http://${HOST_NAME}/v1/functions/google-calendar-sync/googleCalendarWatch/google-calendar-watch-auth NEXT_PUBLIC_GOOGLE_OAUTH_START_URL: http://${HOST_NAME}/Auth/google/oauth-start NEXT_PUBLIC_CHAT_WS_API_URL: ws://localhost:3030 NEXT_PUBLIC_GOOGLE_PEOPLE_SYNC_URL: http://${HOST_NAME}/v1/functions/google-calendar-sync/googlePeopleSync/google-contact-sync-auth NEXT_PUBLIC_ADD_DAILY_FEATURES_AUTOPILOT_URL: http://${HOST_NAME}/v1/functions/autopilot/addDailyFeatures/add-daily-features-to-event-auth NEXT_PUBLIC_DELETE_SCHEDULED_EVENT_URL: http://${HOST_NAME}/v1/functions/autopilot/deleteScheduledEvent/delete-scheduled-event-auth NEXT_PUBLIC_ZOOM_CREATE_MEETING_URL: http://${HOST_NAME}/v1/functions/zoom-meeting/createZoomMeet/create-zoom-meet-auth NEXT_PUBLIC_ZOOM_UPDATE_MEETING_URL: http://${HOST_NAME}/v1/functions/zoom-meeting/updateZoomMeet/update-zoom-meet-auth NEXT_PUBLIC_ZOOM_DELETE_MEETING_URL: http://${HOST_NAME}/v1/functions/zoom-meeting/delZoomMeet/delete-zoom-meet-auth NEXT_PUBLIC_ZOOM_OAUTH_START_URL: http://${HOST_NAME}/zoom/oauth-start NEXT_PUBLIC_LIVE_MEETING_WORKER_URL: http://live-meeting-worker:8001 container_name: app depends_on: - supertokens - live-meeting-worker labels: - "traefik.enable=true" - "traefik.http.routers.app.rule=Host(`${HOST_NAME}`)" - "traefik.http.routers.app.entrypoints=web" - "traefik.http.services.app-service.loadbalancer.server.port=3000" healthcheck: test: ["CMD", "curl", "-f", "http://localhost:3000/"] interval: 30s timeout: 10s retries: 3 start_period: 45s ports: - "3000:3000" environment: NEXT_PUBLIC_LIVE_MEETING_WORKER_URL: http://live-meeting-worker:8001 # PYTHON_API_SERVICE_BASE_URL: ${PYTHON_API_SERVICE_BASE_URL:-http://python-agent:5000} # Removed: python-agent service deprecated LLAMA_CPP_URL: http://llama-cpp:8080 # python-agent: # NOTE: Service removed - python_agent_build_docker directory deleted (2025-02-03) # Reason: Duplicate functionality exists in backend/integrations/ # To restore, uncomment and restore python_agent_build_docker directory # python-agent: # build: # context: ../python_agent_build_docker # dockerfile: Dockerfile # container_name: python-agent # environment: # - NOTION_API_TOKEN=${NOTION_API_TOKEN} # - NOTION_NOTES_DATABASE_ID=${NOTION_NOTES_DATABASE_ID} # - DEEPGRAM_API_KEY=${DEEPGRAM_API_KEY} # - NOTION_RESEARCH_PROJECTS_DB_ID=${NOTION_RESEARCH_PROJECTS_DB_ID} # - NOTION_RESEARCH_TASKS_DB_ID=${NOTION_RESEARCH_TASKS_DB_ID} # - OPENAI_API_KEY=${OPENAI_API_KEY} # - LANCEDB_URI=/lancedb_data/atom_core_db # - LANCEDB_TABLE_NAME=${LANCEDB_TABLE_NAME:-meeting_transcripts_embeddings} # - PYTHONUNBUFFERED=1 # - ENCRYPTION_KEY=${ENCRYPTION_KEY} # volumes: # - .:/app/project # - ${LANCEDB_HOST_PATH:-./lance_db_data_shared}:/lancedb_data # tty: true # stdin_open: true ingestion-pipeline-service: build: context: ../python-api/ingestion_pipeline dockerfile: Dockerfile container_name: ingestion-pipeline-service restart: unless-stopped environment: - NOTION_API_KEY=${NOTION_API_KEY} - NOTION_TRANSCRIPTS_DATABASE_ID=${NOTION_TRANSCRIPTS_DATABASE_ID} - OPENAI_API_KEY=${OPENAI_API_KEY} - LANCEDB_URI=/lancedb_data/atom_core_db - ATOM_USER_ID_FOR_INGESTION=${ATOM_USER_ID_FOR_INGESTION:-default_atom_user_pipeline} - PROCESSING_MODE=${PROCESSING_MODE:-incremental} - LOG_LEVEL=${LOG_LEVEL:-INFO} - PYTHONUNBUFFERED=1 volumes: - ${LANCEDB_HOST_PATH:-./lance_db_data_shared}:/lancedb_data ports: - "8002:8002" healthcheck: test: [ "CMD-SHELL", "curl -f http://localhost:8002/ingestion-status || exit 1", ] interval: 60s timeout: 10s retries: 3 start_period: 60s volumes: project_node_modules: functions_node_modules: mongo-data: {} llama-models: