From c76d05edb4eef3a03d005de291079a39b0740b94 Mon Sep 17 00:00:00 2001 From: "mula.liu" Date: Mon, 13 Apr 2026 17:46:10 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E4=BA=86=E9=83=A8=E7=BD=B2?= =?UTF-8?q?=E8=84=9A=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.example | 6 +++--- DOCKER_README.md | 3 +++ backend/.dockerignore | 2 ++ backend/app/api/endpoints/hot_words.py | 2 +- backend/app/core/config.py | 13 +++++++++---- backend/app/services/async_transcription_service.py | 2 +- 6 files changed, 19 insertions(+), 9 deletions(-) diff --git a/.env.example b/.env.example index 201e867..3f34216 100644 --- a/.env.example +++ b/.env.example @@ -1,9 +1,9 @@ # ==================== 部署模式说明 ==================== # 1. 默认 Docker 一体化部署(./start.sh / docker-compose.yml): -# 使用下方 MYSQL_* / REDIS_* 初始化内置 MySQL、Redis。 +# 只使用当前文件(根目录 .env)和 Docker Compose 注入的环境变量,不读取 backend/.env。 # 2. 直接运行后端或外接中间件部署: -# 后端现在也兼容读取当前文件中的 MYSQL_HOST / REDIS_HOST, -# 也可以使用 backend/.env 中的 DB_* / REDIS_* 配置。 +# 后端可读取当前文件中的 MYSQL_HOST / REDIS_HOST, +# 也可改用 backend/.env 中的 DB_* / REDIS_* 配置。 # ==================== 数据库配置 ==================== # MySQL 初始化参数(Docker 内置 MySQL)。 diff --git a/DOCKER_README.md b/DOCKER_README.md index 66fdc1a..d20369e 100644 --- a/DOCKER_README.md +++ b/DOCKER_README.md @@ -46,6 +46,9 @@ vim .env # 配置 BASE_URL、密码等 ./start.sh ``` +说明: +- 完整 Docker 一体化部署不会读取 `backend/.env` + 脚本会自动完成: - ✅ 检查Docker依赖 - ✅ 创建必要目录 diff --git a/backend/.dockerignore b/backend/.dockerignore index 0dbba8d..731b80b 100644 --- a/backend/.dockerignore +++ b/backend/.dockerignore @@ -41,6 +41,8 @@ htmlcov/ logs/ # 环境变量 +.env +.env.* .env.local .env.*.local diff --git a/backend/app/api/endpoints/hot_words.py b/backend/app/api/endpoints/hot_words.py index c3c4bdc..aab77dc 100644 --- a/backend/app/api/endpoints/hot_words.py +++ b/backend/app/api/endpoints/hot_words.py @@ -17,7 +17,7 @@ def _resolve_dashscope_api_key() -> str: audio_config = SystemConfigService.get_active_audio_model_config("asr") or {} api_key = str(audio_config.get("api_key") or "").strip() if not api_key: - raise HTTPException(status_code=500, detail="未配置 DashScope API Key") + raise HTTPException(status_code=500, detail="未在启用的 ASR 模型配置中设置 DashScope API Key") return api_key diff --git a/backend/app/core/config.py b/backend/app/core/config.py index f7ab33b..9188cc9 100644 --- a/backend/app/core/config.py +++ b/backend/app/core/config.py @@ -19,15 +19,20 @@ VOICEPRINT_DIR = USER_DIR AVATAR_DIR = USER_DIR +def _is_running_in_docker() -> bool: + return Path("/.dockerenv").exists() + + def _load_env_file(dotenv_path: Path) -> None: if dotenv_path.exists(): load_dotenv(dotenv_path=dotenv_path, override=False) -# 优先读取仓库根目录 .env,再读取 backend/.env; -# 已存在的环境变量(例如 Docker Compose 注入)保持最高优先级。 -_load_env_file(REPO_DIR / ".env") -_load_env_file(BASE_DIR / ".env") +# 非 Docker 本地运行时,兼容读取仓库根目录 .env 与 backend/.env; +# Docker 容器内只使用显式注入的环境变量,避免意外读取镜像内的开发配置。 +if not _is_running_in_docker(): + _load_env_file(REPO_DIR / ".env") + _load_env_file(BASE_DIR / ".env") def _get_env(*names: str, default: str | None = None, allow_blank: bool = True) -> str | None: diff --git a/backend/app/services/async_transcription_service.py b/backend/app/services/async_transcription_service.py index 9769f39..6b22815 100644 --- a/backend/app/services/async_transcription_service.py +++ b/backend/app/services/async_transcription_service.py @@ -56,7 +56,7 @@ class AsyncTranscriptionService: if isinstance(api_key, str): api_key = api_key.strip() if not api_key: - raise Exception("未配置 DashScope API Key") + raise Exception("未在启用的 ASR 模型配置中设置 DashScope API Key") return api_key def _build_dashscope_request_options(self, audio_config: Optional[Dict[str, Any]] = None) -> Dict[str, Any]: