更新部署工作了
This commit is contained in:
@@ -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"]
|
||||
|
||||
@@ -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` 中配置数据库连接(或从环境变量读取)。
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user