services: api-backend: build: . image: han-chat/api-backend:local expose: - "8000" environment: HAN_SECRET_VARS: >- DATABASE_URL REDIS_URL REDIS_REALTIME_URL MESSAGE_SAFETY_SERVICE_TOKEN BITRIX_LOCAL_APP_INTERNAL_TOKEN BITRIX_API_INBOX_TOKEN KEYCLOAK_SETTINGS_BRIDGE_TOKEN SELECTEL_S3_ACCESS_KEY SELECTEL_S3_SECRET_KEY CURSOR_HMAC_SECRET DATABASE_URL_FILE: /run/secrets/api_database_url REDIS_URL_FILE: /run/secrets/api_redis_url REDIS_REALTIME_URL_FILE: /run/secrets/api_redis_realtime_url MESSAGE_SAFETY_SERVICE_TOKEN_FILE: /run/secrets/message_safety_service_token BITRIX_LOCAL_APP_INTERNAL_TOKEN_FILE: /run/secrets/bitrix_local_app_internal_token BITRIX_API_INBOX_TOKEN_FILE: /run/secrets/bitrix_api_inbox_token KEYCLOAK_SETTINGS_BRIDGE_TOKEN_FILE: /run/secrets/keycloak_settings_bridge_token SELECTEL_S3_ACCESS_KEY_FILE: /run/secrets/selectel_s3_access_key SELECTEL_S3_SECRET_KEY_FILE: /run/secrets/selectel_s3_secret_key CURSOR_HMAC_SECRET_FILE: /run/secrets/cursor_hmac_secret APP_ENV: ${APP_ENV} API_PORT: ${API_PORT:-8000} LOG_LEVEL: ${LOG_LEVEL:-INFO} KEYCLOAK_PUBLIC_URL: ${KEYCLOAK_PUBLIC_URL} KEYCLOAK_INTERNAL_URL: ${KEYCLOAK_INTERNAL_URL} KEYCLOAK_REALM: ${KEYCLOAK_REALM} KEYCLOAK_AUDIENCE: ${KEYCLOAK_AUDIENCE} MESSAGE_SAFETY_URL: ${MESSAGE_SAFETY_URL} MESSAGE_SAFETY_POST_TIMEOUT_SEC: ${MESSAGE_SAFETY_POST_TIMEOUT_SEC:-5} MESSAGE_SAFETY_TASK_POLL_INTERVAL_SEC: ${MESSAGE_SAFETY_TASK_POLL_INTERVAL_SEC:-2} MESSAGE_SAFETY_TASK_POLL_MAX_SEC: ${MESSAGE_SAFETY_TASK_POLL_MAX_SEC:-300} MESSAGE_SAFETY_CIRCUIT_FAILURE_THRESHOLD: ${MESSAGE_SAFETY_CIRCUIT_FAILURE_THRESHOLD:-5} MESSAGE_SAFETY_CIRCUIT_OPEN_SEC: ${MESSAGE_SAFETY_CIRCUIT_OPEN_SEC:-30} BITRIX_LOCAL_APP_BASE_URL: ${BITRIX_LOCAL_APP_BASE_URL} BITRIX_LOCAL_APP_HTTP_TIMEOUT_SEC: ${BITRIX_LOCAL_APP_HTTP_TIMEOUT_SEC:-20} BITRIX_LOCAL_APP_CIRCUIT_FAILURE_THRESHOLD: ${BITRIX_LOCAL_APP_CIRCUIT_FAILURE_THRESHOLD:-5} BITRIX_LOCAL_APP_CIRCUIT_OPEN_SEC: ${BITRIX_LOCAL_APP_CIRCUIT_OPEN_SEC:-30} SELECTEL_S3_ENDPOINT_URL: ${SELECTEL_S3_ENDPOINT_URL} SELECTEL_S3_BUCKET_DOCUMENTS: ${SELECTEL_S3_BUCKET_DOCUMENTS} SELECTEL_S3_BUCKET_ATTACHMENTS: ${SELECTEL_S3_BUCKET_ATTACHMENTS} SELECTEL_S3_BUCKET_QUARANTINE: ${SELECTEL_S3_BUCKET_QUARANTINE} OTEL_EXPORTER_OTLP_ENDPOINT: ${OTEL_EXPORTER_OTLP_ENDPOINT} secrets: - api_database_url - api_redis_url - api_redis_realtime_url - message_safety_service_token - bitrix_local_app_internal_token - bitrix_api_inbox_token - keycloak_settings_bridge_token - selectel_s3_access_key - selectel_s3_secret_key - cursor_hmac_secret healthcheck: test: - CMD - python - -c - "import urllib.request; urllib.request.urlopen('http://127.0.0.1:8000/health/live', timeout=2)" interval: 10s timeout: 3s retries: 5 restart: unless-stopped ulimits: core: {soft: 0, hard: 0} networks: - backend - observability networks: backend: observability: secrets: api_database_url: file: ${HAN_SECRETS_DIR:-/run/han-chat/secrets}/DATABASE_URL api_redis_url: file: ${HAN_SECRETS_DIR:-/run/han-chat/secrets}/REDIS_URL api_redis_realtime_url: file: ${HAN_SECRETS_DIR:-/run/han-chat/secrets}/REDIS_REALTIME_URL message_safety_service_token: file: ${HAN_SECRETS_DIR:-/run/han-chat/secrets}/MESSAGE_SAFETY_SERVICE_TOKEN bitrix_local_app_internal_token: file: ${HAN_SECRETS_DIR:-/run/han-chat/secrets}/BITRIX_LOCAL_APP_INTERNAL_TOKEN bitrix_api_inbox_token: file: ${HAN_SECRETS_DIR:-/run/han-chat/secrets}/BITRIX_API_INBOX_TOKEN keycloak_settings_bridge_token: file: ${HAN_SECRETS_DIR:-/run/han-chat/secrets}/KEYCLOAK_SETTINGS_BRIDGE_TOKEN selectel_s3_access_key: file: ${HAN_SECRETS_DIR:-/run/han-chat/secrets}/SELECTEL_S3_ACCESS_KEY selectel_s3_secret_key: file: ${HAN_SECRETS_DIR:-/run/han-chat/secrets}/SELECTEL_S3_SECRET_KEY cursor_hmac_secret: file: ${HAN_SECRETS_DIR:-/run/han-chat/secrets}/CURSOR_HMAC_SECRET