services: genai2openai: build: context: . dockerfile: Dockerfile args: GENAI_BUILD_COMMIT: ${GENAI_BUILD_COMMIT:-} GENAI_BUILD_COMMIT_TIME: ${GENAI_BUILD_COMMIT_TIME:-} GENAI_BUILD_DIRTY: ${GENAI_BUILD_DIRTY:-0} restart: unless-stopped init: true stop_grace_period: 45s ports: - "${HOST_PORT:-5000}:${APP_PORT:-5000}" environment: APP_PORT: ${APP_PORT:-5000} GENAI_TOKEN: ${GENAI_TOKEN:-} KEYSTORE_PATH: ${KEYSTORE_PATH:-} TOKEN_CHECK_INTERVAL: ${TOKEN_CHECK_INTERVAL:-60} GENAI_MAX_RETRIES: ${GENAI_MAX_RETRIES:-10} GENAI_RETRY_BACKOFF: ${GENAI_RETRY_BACKOFF:-0.5} GENAI_MODEL_CACHE: ${GENAI_MODEL_CACHE:-/app/.cache/models/models.json} GENAI_TOKENIZER_CACHE: /opt/genai2openai/hf-assets GENAI_TOKENIZER_OFFLINE: "1" HF_HUB_OFFLINE: "1" API_KEY: ${PROXY_API_KEY:-} APP_DEBUG: ${APP_DEBUG:-0} CLAUDE_HAIKU_MODEL: ${CLAUDE_HAIKU_MODEL:-deepseek-chat} CLAUDE_SONNET_MODEL: ${CLAUDE_SONNET_MODEL:-chatglm} CLAUDE_OPUS_MODEL: ${CLAUDE_OPUS_MODEL:-chatglm} GUNICORN_WORKERS: ${GUNICORN_WORKERS:-2} GUNICORN_THREADS: ${GUNICORN_THREADS:-8} GUNICORN_TIMEOUT: ${GUNICORN_TIMEOUT:-180} GUNICORN_GRACEFUL_TIMEOUT: ${GUNICORN_GRACEFUL_TIMEOUT:-30} GUNICORN_KEEPALIVE: ${GUNICORN_KEEPALIVE:-10} GUNICORN_MAX_REQUESTS: ${GUNICORN_MAX_REQUESTS:-0} GUNICORN_MAX_REQUESTS_JITTER: ${GUNICORN_MAX_REQUESTS_JITTER:-0} volumes: - type: bind source: ${KEYSTORE_HOST_PATH:-./docker-deploy.keystore} target: /app/docker-deploy.keystore read_only: false - model-cache:/app/.cache/models command: - /bin/sh - -lc - | set -eu if [ -z "$${GENAI_TOKEN:-}" ] && [ -z "$${KEYSTORE_PATH:-}" ]; then echo "Either GENAI_TOKEN or KEYSTORE_PATH must be set." >&2 exit 1 fi if [ "$${APP_DEBUG:-0}" = "1" ]; then log_level=debug else log_level=info fi exec gunicorn \ --bind "0.0.0.0:$${APP_PORT}" \ --worker-class gthread \ --workers "$${GUNICORN_WORKERS:-2}" \ --threads "$${GUNICORN_THREADS:-8}" \ --timeout "$${GUNICORN_TIMEOUT:-180}" \ --graceful-timeout "$${GUNICORN_GRACEFUL_TIMEOUT:-30}" \ --keep-alive "$${GUNICORN_KEEPALIVE:-10}" \ --max-requests "$${GUNICORN_MAX_REQUESTS:-0}" \ --max-requests-jitter "$${GUNICORN_MAX_REQUESTS_JITTER:-0}" \ --log-level "$${log_level}" \ --access-logfile - \ --error-logfile - \ --capture-output \ genai_proxy.wsgi:app healthcheck: test: [ "CMD-SHELL", "python -c \"import os, urllib.request; urllib.request.urlopen(f'http://127.0.0.1:{os.environ.get(\\\"APP_PORT\\\", \\\"5000\\\")}/health', timeout=5)\"", ] interval: 30s timeout: 5s retries: 3 start_period: 20s volumes: model-cache: