PORT=3000 # App auth / storage / database DATABASE_URL=mysql://tennis:replace-with-db-password@db:3306/tennis_training_hub JWT_SECRET=replace-with-strong-secret VITE_APP_ID=tennis-training-hub OAUTH_SERVER_URL= OWNER_OPEN_ID= BUILT_IN_FORGE_API_URL= BUILT_IN_FORGE_API_KEY= VITE_OAUTH_PORTAL_URL= VITE_FRONTEND_FORGE_API_URL= VITE_FRONTEND_FORGE_API_KEY= LOCAL_STORAGE_DIR=/data/app/storage APP_PUBLIC_BASE_URL=https://te.hao.work/ # Compose MySQL MYSQL_DATABASE=tennis_training_hub MYSQL_USER=tennis MYSQL_PASSWORD=replace-with-db-password MYSQL_ROOT_PASSWORD=replace-with-root-password # LLM chat completion endpoint LLM_API_URL=https://one.hao.work/v1/chat/completions LLM_API_KEY=replace-with-llm-api-key LLM_MODEL=qwen3.5-plus LLM_VISION_API_URL=https://one.hao.work/v1/chat/completions LLM_VISION_API_KEY=replace-with-llm-api-key LLM_VISION_MODEL=qwen3-vl-235b-a22b LLM_MAX_TOKENS=32768 LLM_ENABLE_THINKING=0 LLM_THINKING_BUDGET=128 # Optional direct media URL override for browser builds VITE_MEDIA_BASE_URL=/media # Local app-to-media proxy for development or direct container access MEDIA_SERVICE_URL=http://127.0.0.1:8081 BACKGROUND_TASK_POLL_MS=3000 BACKGROUND_TASK_STALE_MS=300000