更新部署工作了

This commit is contained in:
吕新雨
2026-02-03 00:23:48 +08:00
parent 2ddee6b8f8
commit 4d70f16b69
9 changed files with 604 additions and 25 deletions

View File

@@ -23,5 +23,10 @@ COPY alembic.ini /app/alembic.ini
EXPOSE 8000
# 注意:
# - 镜像内不会打包 `.env.dev/.env.prod`(避免把敏感信息烘焙进镜像)
# - 运行容器时请通过 `--env-file` 或 `-e` 注入 DATABASE_URL / REDIS_URL / CELERY_BROKER_URL
# - 参考文档server/README.md
# 生产镜像默认不开启 reload
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]

View File

@@ -82,6 +82,11 @@ CELERY_BROKER_URL=redis://dev_user:devpassword@127.0.0.1:6379/0
`.env.prod` 同理,替换为生产环境地址与密钥即可。
补充:
- 仓库内提供了一个不包含真实值的模板文件 `server/env.example`,可复制为 `.env.dev/.env.prod` 后再填写。
- **Docker 不会自动读取 `.env.*`**,容器运行时需要通过 `--env-file``-e` 注入环境变量(见下方 Docker 运行)。
### 1.1 MySQL 命名与 dev/pro 区分(约定)
- **生产库prod**`mindfulness`
@@ -146,6 +151,38 @@ uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload
- OpenAPI 文档:`/docs`
- ReDoc`/redoc`
## Docker 运行
后端启动至少需要以下 3 个环境变量:
- `DATABASE_URL`
- `REDIS_URL`
- `CELERY_BROKER_URL`
### 方式 A使用 env 文件(推荐)
1) 在宿主机准备 `server/.env.prod`(或 `.env.dev`),内容为 `KEY=value`
- 可从 `server/env.example` 复制后填写
2) 运行容器时通过 `--env-file` 注入:
```bash
docker run --rm -p 8000:8000 \
--env-file server/.env.prod \
mindfulness-server:latest
```
### 方式 B直接用 -e 注入
```bash
docker run --rm -p 8000:8000 \
-e DATABASE_URL="mysql+aiomysql://用户名:密码@mysql:3306/mindfulness?charset=utf8mb4" \
-e REDIS_URL="redis://:密码@redis:6379/0" \
-e CELERY_BROKER_URL="redis://:密码@redis:6379/0" \
mindfulness-server:latest
```
## 数据库迁移Alembic
> 若你采用 Alembic建议把迁移脚本放在 `server/alembic/`,并在 `alembic.ini` 中配置数据库连接(或从环境变量读取)。

View File

@@ -4,6 +4,7 @@ from functools import lru_cache
from pathlib import Path
from typing import Literal, Optional
from pydantic import ValidationError
from pydantic_settings import BaseSettings, SettingsConfigDict
@@ -67,5 +68,41 @@ def get_settings() -> Settings:
env = os.getenv("APP_ENV", "dev").strip() or "dev"
env_file = _guess_env_file(env)
return Settings(_env_file=env_file)
try:
return Settings(_env_file=env_file)
except ValidationError as e:
# 给出更可执行的错误信息,避免只看到一串校验栈。
missing_fields: list[str] = []
for err in e.errors():
if err.get("type") == "missing":
loc = err.get("loc") or ()
if loc:
missing_fields.append(str(loc[0]))
# 将字段名映射为常见的环境变量名(默认规则:字段名大写)
missing_env_keys = [f.upper() for f in missing_fields] if missing_fields else []
env_file_hint = env_file or f".env.{env}(未找到,已回退到系统环境变量)"
required_hint = (
"".join(missing_env_keys)
if missing_env_keys
else "DATABASE_URL、REDIS_URL、CELERY_BROKER_URL"
)
msg = (
"应用启动失败:缺少必填配置。\n\n"
f"- 当前 APP_ENV{env}\n"
f"- 期望读取的 env 文件:{env_file_hint}\n"
f"- 缺少的环境变量:{required_hint}\n\n"
"修复方式(任选其一):\n"
"1) 直接注入环境变量(推荐):\n"
" - DATABASE_URL=...\n"
" - REDIS_URL=...\n"
" - CELERY_BROKER_URL=...\n"
"2) 使用 env 文件:在 `server/` 下准备 `.env.dev` 或 `.env.prod`KEY=value 格式),\n"
" 本地可通过 `server/run.sh --env dev|prod` 自动加载Docker 运行可用 `--env-file` 传入。\n"
)
# 不附带原始 ValidationError 的异常上下文,减少日志噪音;
# msg 已包含缺失项与修复方式,足够定位问题。
raise RuntimeError(msg) from None

View File

@@ -1,3 +1,34 @@
# 说明:
# - 这是后端环境变量模板,请复制为 `.env.dev` 或 `.env.prod` 再填写真实值
# - 请勿把包含真实账号密码/Token 的 `.env.*` 提交到仓库
#
# 用法示例:
# - 本地:`./run.sh --env dev`
# - Docker`docker run --env-file server/.env.prod ...`
# 运行环境
APP_ENV=dev
APP_NAME=mindfulness-server
APP_HOST=0.0.0.0
APP_PORT=8000
# 数据库SQLAlchemy 异步连接串)
# MySQL 示例aiomysql
# DATABASE_URL=mysql+aiomysql://用户名:密码@127.0.0.1:3306/mindfulness_dev?charset=utf8mb4
DATABASE_URL=
# Redis缓存/任务队列)
# 示例:
# REDIS_URL=redis://:密码@127.0.0.1:6379/0
REDIS_URL=
# Celery建议先只配 broker如需结果存储可另配 CELERY_RESULT_BACKEND
# 示例:
# CELERY_BROKER_URL=redis://:密码@127.0.0.1:6379/0
CELERY_BROKER_URL=
# 可选Celery 结果存储
# CELERY_RESULT_BACKEND=redis://:密码@127.0.0.1:6379/0
# 运行环境dev 或 prod
APP_ENV=dev