DIP1 生产环境管理员操作手册¶
文档编号:DOC-D01-OPS
版本:V1.2(阿里云轻量 · IP 模式 · E2E 验证版)
创建日期:2026-08-11
最后更新:2026-08-15
维护人:TL / DT
适用范围:DIP1 阿里云轻量应用服务器 · 生产环境运维管理
服务器 IP:8.218.165.94
SSH 登录:ssh root@8.218.165.94(免密已配置)
一、系统架构概述¶
1.1 云服务商与硬件规格¶
| 项 | 值 |
|---|---|
| 云服务商 | 阿里云轻量应用服务器 (Simple Application Server) |
| 地域 | 香港 (cn-hongkong) |
| 规格 | 2 vCPU / 2 GiB 内存 (ecs.t6.large 同规格) |
| 带宽 | 200 Mbps 峰值(按流量计费) |
| 系统盘 | 40 GB ESSD PL0 |
| 操作系统 | Ubuntu 22.04 LTS (Jammy) |
| Swap | 1 GiB 文件型 swap (/swapfile) |
| 安全组放行 | TCP 22 (SSH) / 80 (HTTP) / 443 (HTTPS,预留) |
| 已关闭端口(安全原因) | 5432 / 6379 / 8000 / 3100-3102 / 8080(仅本机可访问) |
1.2 服务架构图(Docker Compose + PM2 + Caddy)¶
Internet (阿里云安全组 TCP 80/22)
│
▼
┌───────────────────────────┐
│ Caddy :80 反向代理 │ ← Docker 容器,host network
│ ├── / → 302 /dl/
│ ├── /admin/* → :3100 OPR-Admin (Next.js)
│ ├── /wkr/* → :3101 WKR App (serve)
│ ├── /cst/* → :3102 CST App (serve)
│ ├── /dl/* → :8080 DL Center (serve)
│ ├── /api/* → :8000 FastAPI (docker hostport 127.0.0.1)
│ ├── /health → :8000 FastAPI /health
│ ├── /docs → :8000 FastAPI Swagger UI
│ ├── /openapi.json → :8000 FastAPI schema
│ └── /redoc → :8000 FastAPI Redoc UI
└─────────────┬─────────────┘
│
┌─────────────────┴──────────────────────┐
│ │
▼ ▼
┌──────────────────────┐ ┌──────────────────────────┐
│ PM2 (Node 进程守护) │ │ Docker Compose 容器网络 │
│ 4 processes (host) │ │ weavely_dip1-prod-network │
│ ├── opr-admin :3100 │ │ ├── dip1-prod-postgres │
│ ├── wkr-app :3101 │ │ ├── dip1-prod-redis │
│ ├── cst-app :3102 │ │ └── dip1-prod-api :127.0.0.1:8000│
│ └── dl-weavely :8080 │ └──────────────────────────┘
└──────────────────────┘
1.3 端口分配(真实生效)¶
| 端口 | 绑定 | 服务 | 进程/容器 | 外部放行 |
|---|---|---|---|---|
| 22 | 0.0.0.0 | SSH | sshd | ✅ 安全组 |
| 80 | 0.0.0.0 | Caddy 反向代理 | dip1-prod-caddy (host net) | ✅ 安全组 |
| 5432 | 127.0.0.1 | PostgreSQL | dip1-prod-postgres | ❌ 仅本机 |
| 6379 | 127.0.0.1 | Redis | dip1-prod-redis | ❌ 仅本机 |
| 8000 | 127.0.0.1 | FastAPI 后端 | dip1-prod-api | ❌ 仅本机 |
| 3100 | 0.0.0.0 | OPR Admin Next.js | PM2 opr-admin | ❌ 仅本机 (Caddy 代理) |
| 3101 | 0.0.0.0 | WKR PWA 静态页 | PM2 wkr-app | ❌ 仅本机 (Caddy 代理) |
| 3102 | 0.0.0.0 | CST PWA 静态页 | PM2 cst-app | ❌ 仅本机 (Caddy 代理) |
| 8080 | 0.0.0.0 | 下载中心 | PM2 dl-weavely | ❌ 仅本机 (Caddy 代理) |
1.4 服务器目录结构¶
/opt/weavely/ # 部署根目录
├── .env.prod # ⚠️ 生产密钥(DB密码/APP_SECRET等)
├── docker-compose.yml # Docker Compose 编排
├── Caddyfile # Caddy 反向代理配置
├── deploy/ # 运维脚本
│ ├── server-init.sh # 服务器初始化(apt/Docker/Node/swap)
│ ├── build-and-start.sh # 三端构建 + 启动 + DB 迁移 + 种子
│ ├── optimize-memory.sh # 2C2G 内存优化脚本
│ ├── e2e.sh # 端到端验证脚本
│ ├── .env.prod.template # 密钥模板
│ └── site/dl/index.html # 下载中心首页
├── src/
│ └── dip1/ # 解压后的源码(tar包)
│ ├── backend/ # FastAPI 源码
│ └── frontend/ # Next.js + Expo 源码
├── data/
│ ├── web-wkr/ # WKR-App 静态资源
│ ├── web-cst/ # CST-App 静态资源
│ └── caddy/ # Caddy 证书/缓存
└── logs/
└── weavely-init.log / build.log
二、运维入口速查¶
2.1 快速连接(TL / 管理员专用)¶
# SSH 连接(免密已配置)
ssh root@8.218.165.94
# 或通过 PowerShell 主部署脚本(本地)
cd d:\AC\TF\hk2026\ops\deploy
.\deploy-aliyun-prod.ps1 -ServerIp "8.218.165.94" -RootPassword '<root密码>'
2.2 公网访问地址(交付给业务/用户)¶
| 名称 | 地址(当前生效:IP 模式) | 说明 |
|---|---|---|
| 下载中心(首页默认跳转) | http://8.218.165.94/ → 302 → /dl/ | 三端统一入口 |
| 运营后台 | http://8.218.165.94/admin/ | OPR-Admin,电脑端 Chrome/Edge |
| 师傅端 Web | http://8.218.165.94/wkr/ | 手机浏览器,可加至主屏幕 |
| 客户端 Web | http://8.218.165.94/cst/ | 手机浏览器,可加至主屏幕 |
| API 健康检查 | http://8.218.165.94/health | 返回 {status:"ok", env:"prod", db:"ok"} |
| API 文档(Swagger) | http://8.218.165.94/docs | 交互式 API 调试 |
| OpenAPI 模式 | http://8.218.165.94/openapi.json | JSON schema |
| API 业务路由 | http://8.218.165.94/api/v1/… | CORS 已放行公网IP域名 |
2.3 常用运维命令(一步到位)¶
# ================ Docker ================
# 查看容器状态(健康检查)
ssh root@8.218.165.94 'docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"'
# API 日志(实时)
ssh root@8.218.165.94 'docker logs -f --tail 100 dip1-prod-api'
# DB/Redis 日志
ssh root@8.218.165.94 'docker logs --tail 50 dip1-prod-postgres'
ssh root@8.218.165.94 'docker logs --tail 20 dip1-prod-redis'
# 重启 Docker 三层(PG+Redis+API)
ssh root@8.218.165.94 'cd /opt/weavely && docker compose restart'
# 重建 API 容器(例如修改 healthcheck 后)
# 容器名:dip1-prod-api dip1-prod-postgres dip1-prod-redis dip1-prod-caddy
ssh root@8.218.165.94 'cd /opt/weavely && set -a && source ./.env.prod && set +a && docker compose up -d --force-recreate --no-deps api'
# ================ PM2 ================
# 前端进程列表 + 状态
ssh root@8.218.165.94 'pm2 list'
# 前端日志(运营后台为例)
ssh root@8.218.165.94 'pm2 logs opr-admin --lines 50'
ssh root@8.218.165.94 'pm2 logs wkr-app --lines 30'
# 重启全部前端
ssh root@8.218.165.94 'pm2 restart all && pm2 save'
# ================ Caddy ================
# Caddy 日志
ssh root@8.218.165.94 'tail -60 /var/log/caddy/access.log'
ssh root@8.218.165.94 'docker logs --tail 30 dip1-prod-caddy'
# Caddy 重载配置(注意:Caddy 不在 docker compose 服务清单中,直接 docker restart)
# 配置文件 bind 挂载:/opt/weavely/Caddyfile → /etc/caddy/Caddyfile (ro)
ssh root@8.218.165.94 'docker restart dip1-prod-caddy'
# 紧急:若 Caddy 容器被误删除,用以下命令重建(80 端口必须由它监听)
ssh root@8.218.165.94 'docker run -d --name dip1-prod-caddy --restart always --network host --memory 64m --cpus 0.2 -v /opt/weavely/Caddyfile:/etc/caddy/Caddyfile:ro -v /opt/weavely/data/caddy:/data -v /var/log/caddy:/var/log/caddy caddy:2-alpine caddy run --config /etc/caddy/Caddyfile --adapter caddyfile'
# ================ OPR-Admin Next.js 运维要点 ================
# 部署形态:next build → output: standalone,basePath="/admin",由 PM2 监听 3100
# 关键:Caddy 用 `handle /admin/*`(不剥离前缀,保留 /admin/* 给 Next.js),与 basePath 配合
# - 若改用 `handle_path /admin/*`(剥离前缀),Next.js 会收到 /login /orders 等路径,导致 404
# - 若修改 next.config.mjs 去掉 basePath,则必须同步把 Caddy 改回 handle_path 并重新构建
# 重新构建 OPR-Admin(next.config.mjs 或源码变更后执行):
ssh root@8.218.165.94 'cd /opt/weavely/src/dip1/frontend/apps/opr-admin && NODE_OPTIONS="--max-old-space-size=512" pnpm build 2>&1 | tail -10 && cp -rf .next/static .next/standalone/apps/opr-admin/.next/static && pm2 restart opr-admin && pm2 save'
# ================ DB ================
# 连接 psql
ssh root@8.218.165.94 "docker exec -it dip1-prod-postgres psql -U dip1_prod -d dip1_prod"
# 手动 Alembic 迁移(仅 build-and-start.sh 失败时使用)
ssh root@8.218.165.94 "docker exec dip1-prod-api alembic upgrade head"
# ================ 健康 ================
# 一键 6 端口 HTTP 检查
ssh root@8.218.165.94 'for p in 8000 3100 3101 3102 8080 80; do echo -n "port $p -> HTTP "; curl -sSo /dev/null -w "%{http_code}\n" --max-time 5 http://localhost:$p/; done'
# 端到端 E2E(含公网回环测试,可能超时,仅作参考)
ssh root@8.218.165.94 'bash /opt/weavely/deploy/e2e.sh 8.218.165.94'
# 内存/磁盘监控
ssh root@8.218.165.94 'free -h; echo "---"; df -h /opt /swapfile; echo "---"; docker stats --no-stream --format "table {{.Name}}\t{{.MemUsage}}\t{{.CPUPerc}}"'
三、环境变量配置¶
3.1 环境变量清单(真实部署)¶
文件位置:/opt/weavely/.env.prod(服务器本地,不在 Git 中)
⚠️ 严禁提交 .env.prod 到 Git。部署时由 server-init.sh 随机生成 DB_PASSWORD 与 APP_SECRET_KEY 并写入该文件。
# ====== 服务器基础 ======
SERVER_IP=8.218.165.94 # 公网IP,用于下载中心QR、CORS白名单
ENV=prod
TZ=Asia/Hong_Kong
APP_VERSION=2.0.0
# ====== 安全密钥(部署时自动生成,请勿修改)======
APP_SECRET_KEY=<32字节随机密钥 base64> # JWT/Session/CSRF
DB_PASSWORD=<数据库密码 16+ 字节>
# ====== CORS 白名单(生产环境严格限制)======
CORS_ORIGINS=["http://8.218.165.94","https://8.218.165.94","http://localhost:3000","http://localhost:3100","http://localhost:8081","http://localhost:8082"]
# ====== PostgreSQL ======
DATABASE_URL=postgresql+asyncpg://dip1_prod:${DB_PASSWORD}@postgres:5432/dip1_prod
DB_POOL_SIZE=8 # 2C2G 缩小为 8(原20)
DB_MAX_OVERFLOW=10 # 2C2G 缩小为 10(原40)
# ====== Redis ======
REDIS_URL=redis://redis:6379/0
# ====== JWT / OTP ======
JWT_ALGORITHM=HS256
JWT_ACCESS_TOKEN_TTL_MIN=15
JWT_REFRESH_TOKEN_TTL_DAY=30
JWT_ACCESS_TTL_SECONDS=900
JWT_REFRESH_TTL_SECONDS=2592000
OTP_TTL_SECONDS=300
OTP_RATE_LIMIT_PER_HOUR=5
BIOMETRIC_REQUIRED=false
# ====== Expo / EAS(原生App推送用,目前为占位)======
EXPO_USERNAME=weavely-dip1
EXPO_PROJECT_ID_WKR=
EXPO_PROJECT_ID_CST=
EAS_PROJECT_ACCOUNT=weavely-dip1
EXPO_PUSH_AUTH_TOKEN=
# ====== 可观测性(未配置不启用)======
R2_ACCOUNT_ID=
R2_ACCESS_KEY_ID=
R2_SECRET_ACCESS_KEY=
R2_BUCKET=
R2_PUBLIC_URL=
SENTRY_DSN=
LARK_WEBHOOK_ALERT=
OTEL_EXPORTER_OTLP_ENDPOINT=
# ====== 日志 ======
LOG_LEVEL=WARNING
3.2 密钥管理规范¶
- JWT 密钥
- 长度:32 字节
- 存储:环境变量,禁止提交到 Git
- 轮换:每 90 天轮换一次
-
生成:
python -c "import secrets,base64; print(base64.b64encode(secrets.token_bytes(32)).decode())" -
数据库密码
- 长度:>= 16 字符
- 组成:大小写字母 + 数字 + 特殊字符
- 存储:环境变量
-
轮换:每 180 天轮换一次
-
R2 存储密钥
- 来源:阿里云控制台
- 权限:最小权限原则(仅读写 dip1-assets-prod bucket)
- 轮换:每 90 天轮换一次
四、数据库管理¶
4.1 数据库连接¶
# 连接 PostgreSQL
docker exec -it dip1-prod-postgres psql -U dip1_prod -d dip1_prod
# 或从 API 容器连接(容器名:dip1-prod-api)
docker exec -it dip1-prod-api python -c "
import asyncio
from sqlalchemy.ext.asyncio import create_async_engine
engine = create_async_engine('postgresql+asyncpg://dip1_prod:\${DB_PASSWORD}@postgres:5432/dip1_prod')
print('数据库连接成功')
"
4.2 常用 SQL 查询¶
-- 查看用户数量
SELECT count(*) as user_count FROM sys_users;
-- 查看角色权限
SELECT r.role_id, r.role_name, count(rp.permission_key) as perm_count
FROM sys_roles r
LEFT JOIN sys_role_permissions rp ON r.role_id = rp.role_id
GROUP BY r.role_id, r.role_name;
-- 查看师傅信息
SELECT worker_id, display_name, rating, jobs_completed
FROM mds_wpl_workers
WHERE status = 'active';
-- 查看最近订单
SELECT order_id, customer_name, status, created_at
FROM cpt_orders
ORDER BY created_at DESC
LIMIT 20;
-- 查看系统参数版本
SELECT version_id, version, is_active, updated_at
FROM qsv_param_versions
ORDER BY updated_at DESC;
4.3 数据库迁移¶
# 查看当前迁移版本
docker exec dip1-prod-api alembic current
# 查看迁移历史
docker exec dip1-prod-api alembic history
# 升级到最新版本
docker exec dip1-prod-api alembic upgrade head
# 回滚一个版本(⚠️ 谨慎使用)
docker exec dip1-prod-api alembic downgrade -1
# 回滚到初始状态(⚠️ 危险,会删除所有表)
docker exec dip1-prod-api alembic downgrade base
4.4 种子数据¶
# 插入基础种子数据(角色、权限、管理员、品类)
docker exec dip1-prod-api python -m app.infrastructure.db.seed.cli
# ⚠️ 注意:种子数据幂等,可重复执行不会产生重复数据
4.5 数据备份与恢复¶
备份:
# 全量备份
docker exec dip1-prod-postgres pg_dump -U dip1_prod dip1_prod > backup_$(date +%Y%m%d_%H%M%S).sql
# 仅结构备份
docker exec dip1-prod-postgres pg_dump -U dip1_prod --schema-only dip1_prod > schema_backup.sql
# 仅数据备份
docker exec dip1-prod-postgres pg_dump -U dip1_prod --data-only dip1_prod > data_backup.sql
恢复:
# 恢复全量备份
cat backup_20260811_150000.sql | docker exec -i dip1-prod-postgres psql -U dip1_prod -d dip1_prod
# ⚠️ 恢复前请备份当前数据
定时备份(crontab 示例):
# 每天凌晨 3 点自动备份
0 3 * * * cd /path/to/dip1 && docker compose -f docker-compose.prod.yml exec -T postgres pg_dump -U dip1_prod dip1_prod > /backup/dip1_$(date +\%Y\%m\%d).sql
五、日志管理¶
5.1 查看日志¶
# API 服务日志
docker logs dip1-prod-api --tail 200 # 最近 200 行
docker logs -f dip1-prod-api # 实时追踪
docker logs --since 1h dip1-prod-api # 最近 1 小时
docker logs --since "2026-08-11T10:00:00" dip1-prod-api
# PostgreSQL 日志
docker logs dip1-prod-postgres --tail 100
# Redis 日志
docker logs dip1-prod-redis --tail 100
5.2 日志级别¶
生产环境默认 LOG_LEVEL=WARNING,可选值:
| 级别 | 说明 | 生产环境建议 |
|---|---|---|
| DEBUG | 详细调试信息 | ❌ 禁用 |
| INFO | 常规运行信息 | ❌ 禁用 |
| WARNING | 警告信息 | ✅ 默认 |
| ERROR | 错误信息 | ✅ 始终启用 |
临时调整日志级别(无需重建镜像):
# 进入容器
docker exec -it dip1-prod-api bash
# 临时修改配置
# 方法1: 修改环境变量后重启
# 方法2: 直接修改代码中的日志配置
5.3 日志持久化¶
生产环境建议配置日志持久化,可使用以下方案之一:
- 文件日志(推荐)
- 修改
docker-compose.prod.yml添加日志驱动配置 -
使用
json-file驱动,自动轮转 -
集中日志(可选)
- 接入 ELK Stack / Loki / Datadog
- 通过 OpenTelemetry 导出
Docker 日志配置示例:
# 在 docker-compose.prod.yml 中添加
services:
api:
logging:
driver: json-file
options:
max-size: "100m"
max-file: "5"
六、健康检查与监控¶
6.1 健康检查端点¶
GET /health
响应示例:
{
"status": "ok", // ok / error
"service": "weavely-dip1-api",
"version": "2.0.0",
"env": "prod", // prod / staging / dev
"db": "ok" // ok / error(数据库连接状态)
}
各字段含义:
| 字段 | 说明 | 异常处理 |
|---|---|---|
| status | 服务状态 | error → 立即检查 |
| db | 数据库状态 | error → 检查数据库连接 |
6.2 监控建议¶
| 监控项 | 阈值 | 告警级别 |
|---|---|---|
| API 响应时间 | > 500ms | WARNING |
| 数据库连接数 | > 80% 最大连接 | WARNING |
| API 错误率 | > 1% | ERROR |
| 内存使用 | > 80% | WARNING |
| 磁盘使用 | > 85% | WARNING |
| CPU 使用 | > 80% | WARNING |
6.3 告警通知¶
生产环境可配置以下告警通道:
- 飞书 Webhook(
LARK_WEBHOOK_ALERT) - Sentry(错误追踪 + 邮件通知)
- 邮件通知(可选)
七、故障排查¶
7.1 常见问题诊断¶
| 问题 | 诊断命令 | 可能原因 | 解决方案 |
|---|---|---|---|
| API 无法访问 | curl http://localhost:8000/health |
容器未启动 | docker compose up -d |
| 数据库连接失败 | docker logs dip1-prod-api |
密码/网络错误 | 检查 DATABASE_URL |
| Redis 连接失败 | docker logs dip1-prod-api |
服务未启动 | docker compose start redis |
| 认证失败 | docker logs dip1-prod-api |
JWT 密钥问题 | 检查 APP_SECRET_KEY |
| 端口冲突 | docker ps |
端口被占用 | 停止旧容器或修改端口 |
7.2 故障恢复流程¶
1. 发现异常
└── 通过监控告警 / 用户反馈
2. 诊断问题
├── 查看健康检查: curl http://localhost:8000/health
├── 查看容器状态: docker compose -f docker-compose.prod.yml ps
└── 查看日志: docker logs dip1-prod-api --tail 100
3. 执行恢复
├── 临时恢复: docker compose -f docker-compose.prod.yml restart
├── 根本修复: 修改配置 / 代码后重新部署
└── 数据恢复: 从备份恢复数据库
4. 验证恢复
├── 健康检查通过
├── 核心接口测试通过
└── 监控指标恢复正常
5. 记录与复盘
└── 记录故障时间、原因、解决方案
7.3 紧急恢复命令¶
# 紧急重启所有服务
docker compose -f docker-compose.prod.yml restart
# 紧急重建 API
docker compose -f docker-compose.prod.yml up -d --build --force-recreate api
# 紧急数据恢复
# 1. 停止 API
docker compose -f docker-compose.prod.yml stop api
# 2. 恢复数据
cat backup.sql | docker exec -i dip1-prod-postgres psql -U dip1_prod -d dip1_prod
# 3. 启动 API
docker compose -f docker-compose.prod.yml start api
# 完全重置(⚠️ 仅限测试环境)
docker compose -f docker-compose.prod.yml down -v
docker compose -f docker-compose.prod.yml up -d --build
docker exec dip1-prod-api alembic upgrade head
docker exec dip1-prod-api python -m app.infrastructure.db.seed.cli
八、安全规范¶
8.1 访问控制¶
- API 访问
- 所有 API 必须通过 HTTPS 访问
- 管理后台仅允许内网 / VPN 访问
-
实施 IP 白名单(可选)
-
数据库访问
- 仅允许 API 容器内网访问
- 禁止公网暴露数据库端口
-
使用强密码,定期轮换
-
Redis 访问
- 仅允许 API 容器内网访问
- 生产环境设置密码认证
8.2 密钥安全¶
- 存储
- 所有密钥存储在环境变量,禁止硬编码
.env.prod文件加入.gitignore-
使用密钥管理服务(如 AWS Secrets Manager / HashiCorp Vault)
-
轮换
- JWT 密钥:每 90 天
- 数据库密码:每 180 天
-
R2 存储密钥:每 90 天
-
审计
- 记录所有密钥变更操作
- 变更前备份旧密钥,支持过渡期间双密钥
8.3 数据安全¶
- 备份
- 每日自动备份
- 异地存储(可选)
-
保留最近 30 天备份
-
加密
- 传输层:TLS 1.2+
- 存储层:敏感字段加密(如手机号、地址)
-
应用层:JWT Token 签名验证
-
审计日志
- 记录所有敏感操作(登录、数据修改、权限变更)
- 保留至少 1 年
九、更新与升级¶
9.1 版本更新流程¶
1. 准备阶段
├── 代码合并到 main 分支
├── 运行完整测试
└── 生成新版本号
2. 构建阶段
├── 构建新镜像: docker compose -f docker-compose.prod.yml build
├── 推送镜像仓库(如 Docker Hub / 私有仓库)
└── 镜像打标签
3. 部署阶段
├── 数据库迁移: docker exec dip1-prod-api alembic upgrade head
├── 更新容器: docker compose -f docker-compose.prod.yml up -d --no-deps
└── 健康检查: curl http://localhost:8000/health
4. 验证阶段
├── 核心功能冒烟测试
├── 性能回归测试
└── 监控指标验证
5. 回滚方案(如验证失败)
└── docker compose -f docker-compose.prod.yml up -d --no-deps (使用旧镜像标签)
9.2 数据库变更¶
# 创建新迁移
cd dip1/backend
alembic revision -m "描述变更内容"
# 编写迁移脚本(修改 upgrade/downgrade 函数)
# 部署时执行
docker exec dip1-prod-api alembic upgrade head
# 回滚(如迁移失败)
docker exec dip1-prod-api alembic downgrade -1
9.3 配置变更¶
# 1. 修改 .env.prod
# 2. 重启 API 服务使配置生效
docker compose -f docker-compose.prod.yml up -d --no-deps api
# ⚠️ 注意:仅修改环境变量无需重建镜像
十、附录¶
10.1 常用命令速查¶
| 操作 | 命令 |
|---|---|
| 启动所有服务 | docker compose -f docker-compose.prod.yml --env-file .env.prod up -d |
| 停止所有服务 | docker compose -f docker-compose.prod.yml down |
| 查看服务状态 | docker compose -f docker-compose.prod.yml ps |
| 查看 API 日志 | docker logs dip1-prod-api --tail 100 |
| 重启 API | docker compose -f docker-compose.prod.yml restart api |
| 健康检查 | curl http://localhost:8000/health |
| 数据库迁移 | docker exec dip1-prod-api alembic upgrade head |
| 种子数据 | docker exec dip1-prod-api python -m app.infrastructure.db.seed.cli |
| 数据库备份 | docker exec dip1-prod-postgres pg_dump -U dip1_prod dip1_prod > backup.sql |
| 清理所有容器 | docker compose -f docker-compose.prod.yml down -v |
10.2 端口清单¶
| 服务 | 端口 | 内部访问 | 外部访问 |
|---|---|---|---|
| API | 8000 | ✅ | ✅(需 HTTPS 代理) |
| PostgreSQL | 5432 | ✅ | ❌ |
| Redis | 6379 | ✅ | ❌ |
10.3 服务账户¶
| 账户 | 用途 | 权限 |
|---|---|---|
| dip1_prod | API 访问数据库 | SELECT, INSERT, UPDATE, DELETE |
| TL 角色 | 管理员角色 | 全部权限 |
| OL 角色 | 运营角色 | 业务权限 |
| WKR 角色 | 师傅角色 | 订单权限 |
| CST 角色 | 客户角色 | 查看权限 |
10.4 文档索引¶
| 文档 | 路径 | 说明 |
|---|---|---|
| DIP1-ARC 架构设计 | docs/DIP1-ARC-架构设计.md |
系统架构、ADR 决策 |
| DIP1-P2 一线操作系统 | docs/DIP1-P2-一线操作系统设计.md |
API 设计、数据模型 |
| DIP1-P3 技术基础设施 | docs/DIP1-P3-技术基础设施.md |
开发环境、CI/CD |
| DIP1-SPEC 需求规格 | docs/DIP1-SPEC-需求规格说明书.md |
功能需求、用户故事 |
| DIP1-IMP 实施指南 | docs/DIP1-IMP-Code-Agent实施指南.md |
项目计划、验收标准 |
| 生产部署报告 | docs/worklog/20260811_08_生产环境部署完成报告.md |
部署记录 |
修订记录¶
| 版本 | 日期 | 修订人 | 修订内容 |
|---|---|---|---|
| V1.2 | 2026-08-15 | DT | 9/9 E2E 验收通过版:修正 OPR-Admin basePath="/admin" 与 Caddy handle /admin/*(不剥离前缀)路由组合;添加 /admin/ → /admin/login、/ → /dl/ 重定向;统一容器命名前缀 dip1-prod-*;新增 Caddy 容器紧急重建命令与 OPR-Admin 重构建命令 |
| V1.1 | 2026-08-15 | DT | 迁移至阿里云轻量应用服务器 2C2G 香港(8.218.165.94),切换 IP 模式(无域名);新增 PM2 前端三端进程管理与 Caddy 反向代理端口分配;API healthcheck 改为 curl+python urllib fallback(python:slim 无 wget) |
| V1.0 | 2026-08-11 | DT | 初始版本,生产环境管理员操作手册 |
本手册为 DIP1 生产环境运维文档,由听写 DT 维护。
技术支持:TL / DT
最后更新:2026-08-15 · V1.2 · 9/9 浏览器 E2E 验证通过