🐕 二狗迁移实录
🕐 2026-04-24 · 阿里云 2C2G · Asia/Shanghai
4 个 Docker 容器在同一台服务器运行,通过 shared_net 网络互通。Nginx 统一入口,按 URL 路径分发到各后端。
┌─ 用户 ──────────────────────────────────┐
│ https://cmetamind.cn/xxx │
└─────────────────┬───────────────────────-┘
▼
┌──────────────────────────────────────────┐
│ Nginx listen 443 SSL │
│ HTTP 80 → 301 HTTPS │
└────┬──────────┬───────────┬─────────────-┘
│ │ │
▼ ▼ ▼
┌──────┐ ┌────────┐ ┌──────────┐
│ / │ │ /mb/ │ │ /mb-api │→ FastAPI
│文档 │ │前端 │ │ /bill-api│→ MyBill
└──────┘ └────────┘ └────┬─────┘
│
▼
┌──────────────┐
│ MySQL 8.0 │
│ melon_ledger │
│ bill │
└──────────────┘
| 路径 | 说明 |
|---|---|
/ | 本文档静态首页 |
/mb/ | 菜瓜记账前端 uni-app H5 |
/mb-api/ | 菜瓜记账后端 API(路由 /api/xxx) |
/bill-api/ | MyBill 账单 API(路由 /users, /types 等) |
根目录 /home/deploy/docker-new/
├── infrastructure/ ← 基础设施 │ ├── docker-compose.yml ← 编排文件 │ ├── .env ← MySQL 密码 │ ├── mysql/ │ │ ├── conf/my.cnf │ │ └── init/ │ │ ├── 01-melon-ledger.sql ← 建库+用户 │ │ └── 02-mybill.sql │ ├── nginx/ │ │ ├── nginx.conf │ │ └── conf.d/ │ │ └── melon-ledger.conf ← 全部路由 │ └── ssl/ │ ├── fullchain.pem ← SSL 证书 │ └── privkey.pem ← SSL 私钥 ├── melon-ledger/ ← 菜瓜记账 │ ├── backend/ │ │ ├── Dockerfile │ │ ├── requirements.txt │ │ ├── .env │ │ ├── main.py │ │ ├── app/ ← 业务代码 │ │ └── migrations/ ← Alembic 迁移 │ └── frontend/dist/ ← 构建产物 ├── mybill/ ← MyBill │ ├── Dockerfile │ ├── index.js │ ├── bill.js │ └── package.json ├── static/ ← 根路径静态文件 │ └── index.html ← 本文件 └── scripts/ ← 备份
/home/deploy/melon-ledger/ 已清理删除。文件列表及关键配置(密码用占位符替代):
MYSQL_ROOT_PASSWORD=<MYSQL_ROOT_PASSWORD>
MYSQL_ROOT_PASSWORD=<MYSQL_ROOT_PASSWORD> MYSQL_USER=melon MYSQL_PASSWORD=<MELON_DB_PASSWORD> MYSQL_DATABASE=melon_ledger JWT_SECRET_KEY=<JWT_SECRET_KEY> # Redis 未部署,自动降级 # Neo4j 未部署,自动跳过 DEEPSEEK_API_KEY=<DEEPSEEK_API_KEY> DEEPSEEK_MODEL=deepseek-chat
MYBILL_DB_PASSWORD=<MYBILL_DB_PASSWORD>
MySQL init SQL 只建库和用户,不建表:
docker exec ml_backend alembic upgrade head单配置文件 infrastructure/nginx/conf.d/melon-ledger.conf
| 路径 | 处理方式 | 目标 |
|---|---|---|
/ | 静态文件 | /usr/share/nginx/html/ |
/mb/ | alias | /usr/share/nginx/mb/ |
/assets/ | alias | /usr/share/nginx/mb/assets/(前端资源缓存) |
/mb-api/ | rewrite + proxy | http://ml_backend:8000 |
/bill-api/ | rewrite + proxy | http://ml_mybill:3000 |
# melon-ledger API (路由前缀 /api/xxx)
location /mb-api/ {
rewrite ^/mb-api(/.*)$ $1 break;
proxy_pass http://ml_backend;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
# mybill API (路由 /users, /types 等)
location /bill-api/ {
set $mybill_upstream "http://ml_mybill:3000";
rewrite ^/bill-api(/.*)$ $1 break;
proxy_pass $mybill_upstream;
}
set 必须在 rewrite 之前,否则变量未初始化报 500。当前覆盖 cmetamind.cn 和 www.cmetamind.cn。如需添加 bill.cmetamind.cn,替换 ssl/fullchain.pem 和 ssl/privkey.pem 后重启 nginx。
以下命令在 ~/docker-new/infrastructure/ 下执行。
# 查看所有容器
docker ps -a --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
# 查看日志
docker logs -f ml_backend # 实时日志
docker logs -f ml_mybill # mybill 日志
docker logs --tail 50 ml_backend # 最近 50 行
# 重启
docker compose restart nginx
docker compose restart ml_backend
# 重新构建+启动(代码更新后)
docker compose up -d --build ml_backend
# 热重载 Nginx(不中断连接)
docker exec infra_nginx nginx -t # 语法检查
docker exec infra_nginx nginx -s reload
# 数据库
docker exec infra_mysql mysql -uroot -p melon_ledger -e "SHOW TABLES;"
docker exec ml_backend alembic upgrade head # 迁移
# 前端更新(本地构建后上传 scp,无需重启 nginx)
scp -r dist/* user@server:/home/deploy/docker-new/melon-ledger/frontend/dist/
infrastructure/docker-compose.yml 添加 service 配置,加上 networks: - shared_netmelon-ledger.conf 的 server block 添加新的 location /xxx/docker compose up -d --build 服务名 + docker compose restart nginxshared_net 网络resolver 127.0.0.11 ipv6=off valid=10s; family_name 前有空格,ORM 报错。解决:ALTER TABLE 改名。docker run --rm -v /home/deploy:/host alpine rm -rf /host/xxxRedis 不可用,降级为内存缓存 60s,无需 Redis 也正常工作。| 操作 | 命令 |
|---|---|
| 完整启动 | cd ~/docker-new/infrastructure && docker compose up -d |
| 完整停止 | docker compose down |
| 重建某服务 | docker compose up -d --build ml_backend |
| 重启 Nginx | docker compose restart nginx |
| 热重载 Nginx | docker exec infra_nginx nginx -s reload |
| 查看日志 | docker logs -f ml_backend |
| 查看表 | docker exec infra_mysql mysql -uroot -p melon_ledger -e "SHOW TABLES" |
| 数据库迁移 | docker exec ml_backend alembic upgrade head |
| 进入容器 | docker exec -it ml_backend sh |
| 清理不用的镜像 | docker image prune -a |
| 磁盘占用 | docker system df |
| 前端更新 | 本地打包后 scp 到 dist 目录(无需重启) |
| 证书更新 | 替换 ssl/*.pem 后 docker compose restart nginx |