Skip to content

Docker 部署 server-python

镜像说明

  • Dockerfile:packages/server-python/Dockerfile
  • 基础镜像:python:3.11-slim
  • 监听:0.0.0.0:8000
  • 健康检查:GET /api/v1/health

数据库由你自行维护(已有 MySQL / RDS),本镜像只跑 API,不包含、不管理 MySQL。

构建与运行

在 monorepo 根目录:

bash
docker build -t xichen-server-python \
  -f packages/server-python/Dockerfile \
  packages/server-python

cp packages/server-python/.env.docker.example packages/server-python/.env
# 编辑 DB_HOST、DB_USER、DB_PASSWORD、JWT_SECRET、CORS_ORIGINS

docker run -d \
  --name xichen-api \
  -p 8000:8000 \
  --env-file packages/server-python/.env \
  --restart unless-stopped \
  xichen-server-python

环境变量

通过 --env-file-e 注入,不要.env 打进镜像。

变量说明
DB_HOST已有 MySQL 地址(IP 或域名)
DB_PORT3306
DB_NAME库名
DB_USER数据库用户
DB_PASSWORD数据库密码
JWT_SECRET生产必改
CORS_ORIGINS前端实际域名,逗号分隔
UPLOAD_PATH上传目录,镜像默认 /app/uploads(勿在 .env./uploads 覆盖)

模板:packages/server-python/.env.docker.example

上传目录挂载(可选)

bash
docker run -d \
  --name xichen-api \
  -p 8000:8000 \
  -v /data/xichen-uploads:/app/uploads \
  --env-file packages/server-python/.env \
  --restart unless-stopped \
  xichen-server-python

.env 中需 UPLOAD_PATH=/app/uploads

部署后需调用一次 数据库初始化接口POST /api/v1/system/database/init),写入默认 admin / admin123。若库中已有数据,该接口会 先删表再重建

容器在 init 之前也会正常启动;缺表时日志为 WARN 而非退出(与 启动容错 一致)。

验证

bash
curl http://localhost:8000/api/v1/health

curl -X POST http://localhost:8000/api/v1/system/database/init

curl -X POST http://localhost:8000/api/v1/auth/login \
  -H "Content-Type: application/json" \
  -d '{"username":"admin","password":"admin123"}'

更新发布

bash
git pull
docker build -t xichen-server-python -f packages/server-python/Dockerfile packages/server-python
docker stop xichen-api && docker rm xichen-api
docker run -d \
  --name xichen-api \
  -p 8000:8000 \
  --env-file packages/server-python/.env \
  --restart unless-stopped \
  xichen-server-python

Nginx 反代(可选)

nginx
location /api/ {
    proxy_pass http://127.0.0.1:8000/api/;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
}

前端 VITE_API_BASE_URL 指向 Nginx 域名即可。

相关文档

Xichen Full Stack 内部文档