DIP1 生产环境外部服务集成指南¶
文档编号:DOC-D01-EXT
版本:V1.2(阿里云轻量 · IP 模式 · 9/9 E2E 验收)
创建日期:2026-08-11
最后更新:2026-08-15
目标读者:TL(技术负责人)/ 运维人员
前置要求:DIP1 后端服务已部署运行(服务器:8.218.165.94,阿里云轻量香港) 当前部署模式:IP 模式(无域名,直接通过http://8.218.165.94/路径代理访问)
概述¶
本文档提供 DIP1 生产环境所需外部服务的完整集成指南,包括:
- 阿里云 OSS - 对象存储服务(图片、附件等)
- WhatsApp Business API - OTP 验证码发送
- 前端三端部署 - OPR 管理后台 / WKR 师傅端 / CST 客户端(当前:IP 模式 + Caddy;未来:域名模式 + Cloudflare)
每项集成均包含: - ✅ 前置条件检查 - ✅ 逐步操作指令(可复制粘贴) - ✅ 验证方法 - ✅ 常见问题排查
生产环境状态速查(截至 2026-08-15)¶
| 集成项 | 状态 | 当前值 | 说明 |
|---|---|---|---|
| 部署方式 | ✅ 已部署 | 阿里云轻量 2C2G · IP 模式 | IP 8.218.165.94 |
| 三端 Web 访问 | ✅ 9/9 全通过 | Caddy :80 路径代理 + 重定向 | /admin/login /wkr/ /cst/ /dl/ 均正常渲染 |
| 根路径 / 重定向 | ✅ OK | 302 → /dl/ | 浏览器 E2E 实测跳转成功 |
| /admin → /admin/login | ✅ OK | 302 重定向 | 避免无登录态时 RSC 流式卡在"载入中…" |
| OPR-Admin 登录表单 | ✅ fixed(原卡载入中) | basePath="/admin" + handle /admin/* 保留前缀 |
Next.js 资源 URL 正确带 /admin 前缀 |
| FastAPI /docs | ✅ OK | http://8.218.165.94/docs | Swagger UI 正常加载 475+ refs |
| API /health | ✅ OK | http://8.218.165.94/health | {status:"ok",service:"weavely-dip1-api",version:"2.0.0",env:"prod",db:"ok"} |
| PostgreSQL 16 | ✅ healthy | Docker dip1-prod-postgres | 256m 限额 |
| Redis 7 | ✅ healthy | Docker dip1-prod-redis | 64m 限额 |
| API Docker healthy | ✅ fixed(原 unhealthy) | curl→python urllib fallback | python:slim 无 wget |
| 阿里云 OSS | ⏸️ 未启用 | 占位符 | 按需在 .env.prod 填入 ID/密钥 |
| WhatsApp Business | ⏸️ 未启用 | 占位符 | 需 Meta 资质申请(人类处理) |
| 域名模式 | ⏸️ 暂缓 | 用户决定不购域名 | 可无缝迁移,见附录 B |
| Expo EAS(原生 App) | ⏸️ 未构建 | 占位符 | 需 Expo 账号登录(人类处理) |
第一部分:阿里云 OSS 存储服务集成¶
1.1 前置条件¶
| 条件 | 说明 | 验证方式 |
|---|---|---|
| 阿里云账号 | 开通 OSS 服务 | 访问 https://console.aliyun.com |
| 已创建 OSS Bucket | 存储桶名称需与配置一致 | OSS 控制台查看 |
| AccessKey | 用于 API 认证 | RAM 控制台创建 AccessKey |
1.2 操作步骤¶
步骤 1:登录阿里云控制台¶
- 访问 https://console.aliyun.com
- 使用阿里云账号登录
步骤 2:创建 OSS Bucket¶
- 左侧菜单点击 对象存储 OSS
- 点击 创建 Bucket 创建存储桶
- 填写信息:
- Bucket 名称:
dip1-assets-prod(生产环境)或dip1-assets-staging(测试环境) - 地域: 选择最近区域(如香港 cn-hongkong)
- 读写权限: 选择「公共读」(便于静态资源公开访问)
- 点击 确定 创建
步骤 3:获取 AccessKey¶
- 点击右上角头像 → AccessKey 管理
- 点击 创建 AccessKey
- 创建后请立即保存以下信息:
- AccessKey ID(保存,仅显示一次)
- AccessKey Secret(保存,仅显示一次)
安全建议:建议创建 RAM 子用户并授予 OSS 读写权限(
AliyunOSSFullAccess),避免直接使用主账号 AccessKey
步骤 4:获取 Endpoint¶
- 进入 对象存储 OSS → 选择对应 Bucket
- 在 概览 页面找到 Endpoint(外网访问域名)
- 记录 Endpoint 地址(如
https://oss-cn-hongkong.aliyuncs.com)
步骤 5:配置公开访问域名(可选)¶
- 进入 Bucket → 传输管理 → 绑定域名
- 添加自定义域名(如
assets.weavely.hk) - 在阿里云云解析 DNS 添加 CNAME 记录,指向 Bucket 默认域名
- 记录公开访问 URL(如
https://assets.weavely.hk)
1.3 配置环境变量¶
编辑 .env.prod.local 文件,填写以下配置:
# 阿里云 OSS 配置
# 从阿里云控制台获取这些值
OSS_ACCESS_KEY_ID=<你的AccessKeyID> # Example: LTAI1234567890
OSS_ACCESS_KEY_SECRET=<你的AccessKeySecret> # Example: abc123def456...
OSS_ENDPOINT=<你的Endpoint> # Example: https://oss-cn-hongkong.aliyuncs.com
OSS_BUCKET=dip1-assets-prod # 与步骤 2 一致
OSS_PUBLIC_URL=https://assets.weavely.hk # 你的公开访问域名
1.4 部署生效¶
# 重新构建并启动 API 服务
cd dip1
docker compose -f docker-compose.prod.yml --env-file .env.prod.local up -d --build
1.5 验证集成¶
方法 1:API 测试¶
# 调用上传接口(需先登录获取 token)
# 1. 获取 token
curl -X POST "http://localhost:8000/api/v1/auth/login" \
-H "Content-Type: application/json" \
-d '{"user_id":"你的管理员账号","password":"密码"}'
# 2. 使用 token 上传文件
curl -X POST "http://localhost:8000/api/v1/files/upload" \
-H "Authorization: Bearer <token>" \
-F "file=@test.jpg"
方法 2:代码测试¶
# 在 API 容器内运行测试
docker exec -it dip1-api-1 python -c "
from app.infrastructure.storage import get_oss_client
oss = get_oss_client()
# 测试上传
result = oss.upload_file(
key='test/hello.txt',
file_bytes=b'Hello DIP1!',
content_type='text/plain'
)
print('上传成功:', result)
# 测试下载
content = oss.download_file('test/hello.txt')
print('下载内容:', content)
# 测试删除
oss.delete_file('test/hello.txt')
print('删除成功')
"
方法 3:检查阿里云控制台¶
- 访问 https://console.aliyun.com → 对象存储 OSS
- 选择
dip1-assets-prodbucket - 查看 文件管理 列表确认文件已上传
1.6 常见问题¶
| 错误 | 原因 | 解决方案 |
|---|---|---|
| 403 Access Denied | Access Key 权限不足 | 检查 Key 权限是否包含 Object Write |
| 404 Bucket Not Found | Bucket 名称错误 | 核对 OSS_BUCKET 变量 |
| 签名验证失败 | 时间戳偏差 | 同步服务器时间 |
| 超时无响应 | 网络问题 | 检查防火墙和代理设置 |
第二部分:WhatsApp Business API 集成¶
2.1 前置条件¶
| 条件 | 说明 | 验证方式 |
|---|---|---|
| Meta Business 账号 | 免费注册 | https://business.facebook.com |
| WhatsApp Business API 访问权限 | 需要申请 | Meta for Developers 后台 |
| 已验证的手机号 | 用于发送 OTP | 完成号码验证流程 |
| 模板审核通过 | OTP 模板需 Meta 审核 | 在 WhatsApp Manager 查看 |
2.2 操作步骤¶
步骤 1:创建 Meta 开发者账号¶
- 访问 https://developers.facebook.com
- 使用 Facebook 账号登录(如无则新建)
- 完成安全验证(手机号验证)
步骤 2:创建 Business 账号¶
- 访问 https://business.facebook.com
- 点击 Create Business Account
- 填写业务信息:
- Business name: 织布鸟智居科技有限公司
- Business email: t***@weavely.hk
- Business phone: +852XXXXXXX
- 完成验证(邮箱/手机号)
步骤 3:申请 WhatsApp API 访问¶
- 访问 https://developers.facebook.com/apps
- 创建新 App:
- 选择 Business 类型
- 填写 App 名称:
weavely-dip1 - 在 App Dashboard 左侧菜单找到 Add Products → WhatsApp
- 点击 Set up 开始配置
步骤 4:配置 WhatsApp 产品¶
- 选择 WhatsApp Business Platform
- 创建新的产品实例
- 添加手机号:
- 点击 Add phone number
- 填写准备用于业务的手机号(需海外号码,如香港号码)
- 完成短信验证
- 记录以下信息:
- Phone Number ID(格式:
123456789012345) - WABA ID(可选)
步骤 5:创建 Access Token¶
- 在 App Dashboard → Settings → Basic
- 找到 App Secret 并保存
- 生成 Access Token:
- 访问 https://developers.facebook.com/tools/explorer
- 选择你的 App 和 Page
- 生成 Access Token(需包含
whatsapp_business_messaging权限) - 重要:Access Token 有效期 60 天,需定期刷新
步骤 6:创建 OTP 模板¶
- 进入 App → WhatsApp → Manager
- 点击 Template → Create template
- 创建模板:
- Template name:
otp_login - Category: 选择 Authentication 或 Utility
- Language: English(或添加中文支持)
- Body:
Your verification code is {{1}}. Do not share this code. - 变量
{{1}}对应 OTP 验证码 - 提交审核(通常 1-2 个工作日)
- 审核通过后模板即可使用
步骤 7:配置环境变量¶
编辑 .env.prod.local 文件:
# WhatsApp Business API 配置
# 从 Meta Developer Portal 获取
WHATSAPP_ACCESS_TOKEN=<你的Access Token> # 从 Graph API Explorer 生成
WHATSAPP_PHONE_NUMBER_ID=<你的Phone Number ID> # 从 WhatsApp Manager 获取
WHATSAPP_API_VERSION=v18.0 # 最新稳定版本
2.3 部署生效¶
# 重新构建并启动 API 服务
cd dip1
docker compose -f docker-compose.prod.yml --env-file .env.prod.local up -d --build
2.4 验证集成¶
方法 1:Mock 模式测试(开发阶段)¶
# 在未配置真实凭据时,系统自动使用 Mock 模式
# 发送 OTP 请求
curl -X POST "http://localhost:8000/api/v1/auth/otp/send?phone=+85292230009&purpose=login"
# 查看容器日志,会显示 Mock 的验证码
docker logs dip1-api-1 --tail 20
# 输出示例: [MOCK WHATSAPP] OTP sent to 85292230009: 123456
方法 2:真实 API 测试¶
# 配置好真实凭据后,发送 OTP 请求
curl -X POST "http://localhost:8000/api/v1/auth/otp/send?phone=+8529XXXXXXXX&purpose=login"
# 检查响应
# 成功: {"status":"sent","message_id":"..."
# 失败: {"status":"error","error":"错误信息"}
方法 3:代码测试¶
# 在 API 容器内运行测试
docker exec -it dip1-api-1 python -c "
import asyncio
from app.infrastructure.otp import get_otp_provider
async def test():
provider = get_otp_provider()
# 发送 OTP
result = await provider.send_otp_code(
phone_number='+85292230009',
otp_code='123456'
)
print('发送结果:', result)
# 如果是 Mock 模式,会返回验证码
if hasattr(provider, 'otp_code'):
print('验证码:', result.get('otp_code'))
asyncio.run(test())
"
2.5 Access Token 刷新¶
Token 有效期:60 天
刷新方法:
1. 手动刷新:
- 访问 https://developers.facebook.com/tools/explorer
- 重新生成 Access Token
- 更新 .env.prod.local 中的 WHATSAPP_ACCESS_TOKEN
- 自动刷新(建议长期运行时实现):
- 可实现定时任务,在 Token 过期前 7 天自动刷新
- 或监控 API 返回的错误码,触发刷新流程
2.6 常见问题¶
| 错误 | 原因 | 解决方案 |
|---|---|---|
| 401 Invalid Token | Token 过期或无效 | 重新生成 Token |
| 404 Not Found | Phone Number ID 错误 | 核对 WHATSAPP_PHONE_NUMBER_ID |
| 400 Template Not Found | 模板名称错误或未审核 | 检查模板名称和审核状态 |
| 消息未送达 | 号码格式错误 | 使用 E.164 格式(国家代码+号码) |
| 频率限制 | 发送过于频繁 | 遵守 OTP_RATE_LIMIT_PER_HOUR 设置 |
第三部分:前端三端部署¶
3.1 整体架构(当前:IP 模式)¶
当前生产环境采用「单服务器 + Caddy :80 路径代理」方案,无需为三端单独购买域名或 CDN。 未来用户购入域名后,可无缝切换为「域名 + Cloudflare DNS + HTTPS」,无需改动业务代码。
┌─────────────────────────────────────────────────────────────┐
│ DIP1 前端三端部署 · IP 模式 (http://8.218.165.94) │
├─────────────────────────────────────────────────────────────┤
│ │
│ 入口:Caddy 反向代理,全部通过 http://8.218.165.94:80 │
│ ├── / → 302 /dl/ (下载中心) │
│ ├── /admin/* → :3100 OPR-Admin(Next.js) │
│ ├── /wkr/* → :3101 WKR-App(PWA 预览页) │
│ ├── /cst/* → :3102 CST-App(PWA 预览页) │
│ ├── /dl/* → :8080 下载中心静态页 │
│ ├── /api/* → :8000 FastAPI(仅本机 127.0.0.1) │
│ └── /health, /docs, /openapi.json │
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ OPR-Admin(运营后台) │ │
│ │ ├── 技术栈: Next.js 14 standalone + React + Tailwind│ │
│ │ ├── 启动: PM2 opr-admin (port 3100) │ │
│ │ ├── 访问: http://8.218.165.94/admin/ │ │
│ │ └── 用户: OL(运营) / TL(技术) / BO(业务) │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ WKR-App(师傅端) │ │
│ │ ├── 技术栈: React Native + Expo 51 + NativeWind │ │
│ │ ├── 现状: Web 预览页(pm2 wkr-app :3101) │ │
│ │ ├── 原生路线: EAS Build → App Store / Google Play │ │
│ │ ├── 访问: http://8.218.165.94/wkr/ │ │
│ │ └── 用户: FL(师傅) │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ CST-App(客户端) │ │
│ │ ├── 技术栈: React Native + Expo 51 + NativeWind │ │
│ │ ├── 现状: Web 预览页(pm2 cst-app :3102) │ │
│ │ ├── 原生路线: EAS Build → App Store / Google Play │ │
│ │ ├── 访问: http://8.218.165.94/cst/ │ │
│ │ └── 用户: Customer(客户) │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
3.2 环境依赖检查(已部署,作为溯源文档)¶
服务器已安装版本¶
| 工具 | 已安装版本 | 安装命令 | 验证命令 |
|---|---|---|---|
| Node.js | v20.20.2 LTS | nvm / apt nodesource | node --version |
| pnpm | 9.15.9 | npm i -g pnpm |
pnpm --version |
| pm2 | 7.0.3 | pnpm i -g pm2 |
pm2 --version |
| Docker Engine | 29.7.2 | apt (Docker 官方源) | docker --version |
| Docker Compose | v5.4.0 | docker compose 插件 | docker compose version |
| serve (静态页) | /usr/bin/serve | npm i -g serve |
which serve |
| Git | 系统默认 | apt | git --version |
Expo / EAS (如需构建原生 App)¶
| 工具 | 版本要求 | 安装命令 | 说明 |
|---|---|---|---|
| Expo CLI | >= 0.18.x | pnpm add -D expo(已 lockfile 锁定) |
React Native 开发工具 |
| EAS CLI | >= 13.x | npm i -g eas-cli |
Expo 云端构建(需登录 expo.dev 账号) |
| Xcode | >= 15.4 | Mac App Store | iOS 构建(仅 macOS) |
| Android Studio | Hedgehog+ | 官网下载 | Android 模拟器 / 签名 |
| Apple Developer | $99/年 | 注册账号 | App Store 发布 |
| Google Play Console | $25 一次性 | 注册账号 | Google Play 发布 |
3.3 OPR-Admin 部署(已上线:Next.js standalone + PM2)¶
当前 OPR-Admin 已通过
next build → output: "standalone"部署在 PM2,Caddyhandle_path /admin/*负责剥离路径前缀。
关键配置(服务器 /opt/weavely/src/dip1/frontend/apps/opr-admin/)
# next.config.mjs(已提交到 Git)
export default {
output: "standalone", // 启用独立产物(含 server.js)
// ...
}
启动命令(由 build-and-start.sh 生成)
cd /opt/weavely/src/dip1/frontend/apps/opr-admin
# 1. 生产构建(Node 16G 2C 限制 max-old-space=512)
NODE_OPTIONS='--max-old-space-size=512' pnpm build 2>&1 | tail -30
# 2. 把 public/ 和 .next/static/ 拷到 standalone 目录
cp -rf public .next/standalone/apps/opr-admin/public
cp -rf .next/static .next/standalone/apps/opr-admin/.next/static
# 3. PM2 启动(Next.js standalone 真实入口在 apps/opr-admin/server.js)
PORT=3100 NODE_OPTIONS='--max-old-space-size=256' \
pm2 start .next/standalone/apps/opr-admin/server.js \
--name opr-admin --env production
pm2 save
访问地址
- ✅ http://8.218.165.94/admin/ (Caddy 路径代理 → 3100,线上真实入口)
- (安全组关闭,仅供本地调试)
ssh -L 3100:127.0.0.1:3100 root@8.218.165.94SSH 隧道直达
Next.js 生产环境变量
# (当前:CORS 已放行 8.218.165.94 域名,默认调用同源 Caddy /api)
NEXT_PUBLIC_API_URL=http://8.218.165.94/api/v1
NEXT_PUBLIC_APP_NAME=织布鸟运营后台
NEXT_PUBLIC_ENV=production
📌 当前生产部署(IP 模式生效):OPR-Admin 通过
next build → output: standalone编译,由 PM2(opr-admin)守护在 3100 端口,再由 Caddyhandle /admin/*(保留完整前缀,与next.config.mjs basePath="/admin"配对)反代到公网。无需 Docker 容器化或 Vercel,运维命令详见管理员手册 V1.2 §2.3。🔮 未来域名模式备选方案(未启用):如需独立域名部署,可选用 A. Docker + Nginx(本机 3000 端口 + HTTPS)或 B. Vercel(Serverless 托管,绑定 admin.weavely.hk),两者仅为未来升级参考,当前不执行。
3.4 WKR-App 师傅端部署¶
前置条件¶
- Apple Developer 账号(iOS 发布)
- Google Play Console 账号(Android 发布)
- Expo EAS 账号
- 已配置 Google Services / Apple Sign In(如需要)
步骤 1:配置 EAS¶
# 进入师傅端目录
cd dip1/frontend/apps/wkr-app
# 登录 Expo
expo login
# 输入 Expo 账号凭据
# 配置 EAS 项目
eas build:configure
步骤 2:配置 eas.json¶
{
"cli": {
"version": ">= 13.0.0"
},
"build": {
"development": {
"developmentClient": true,
"distribution": "internal",
"env": {
"API_URL": "https://api.weavely.hk/api/v1"
}
},
"preview": {
"distribution": "internal",
"android": {
"buildType": "apk"
},
"ios": {
"simulator": true
},
"env": {
"API_URL": "https://api.weavely.hk/api/v1"
}
},
"production": {
"android": {
"buildType": "app-bundle"
},
"ios": {
"buildConfiguration": "Release"
},
"env": {
"API_URL": "https://api.weavely.hk/api/v1"
}
}
},
"submit": {
"production": {
"android": {
"serviceAccountKeyPath": "./google-services.json",
"track": "internal"
},
"ios": {
"appleId": "your-team-id@weavely.hk",
"ascAppId": "1234567890",
"appleTeamId": "YOUR_TEAM_ID"
}
}
}
}
步骤 3:构建 Android APK(内部测试)¶
# 构建 preview 版本(APK 格式,可直接安装)
eas build --platform android --profile preview
# 等待构建完成,下载 APK 文件
# 扫描二维码或点击下载链接获取 APK
步骤 4:构建 iOS IPA(内部测试)¶
# 构建 preview 版本
eas build --platform ios --profile preview
# 注意:iOS 构建需要 Apple 开发者账号配置
# 在 Apple Developer 添加测试设备 UDID
步骤 5:发布到 App Store / Google Play¶
# 1. 构建生产版本
eas build --platform all --profile production
# 2. 提交到商店
# Google Play
eas submit --platform android --profile production
# App Store
eas submit --platform ios --profile production
3.5 CST-App 客户端部署¶
步骤与 WKR-App 相同¶
# 进入客户端目录
cd dip1/frontend/apps/cst-app
# 配置 EAS
eas build:configure
# 构建 Android
eas build --platform android --profile preview
# 构建 iOS
eas build --platform ios --profile preview
# 发布
eas submit --platform all --profile production
3.6 部署验证清单¶
OPR-Admin 验证¶
| 检查项 | 验证方法 | 预期结果 |
|---|---|---|
| 页面加载 | 访问 https://admin.weavely.hk | 页面正常显示 |
| 登录功能 | 使用管理员账号登录 | 登录成功跳转首页 |
| API 连通 | 打开浏览器 DevTools 查看网络请求 | API 返回 200 |
| 样式正常 | 检查所有页面样式 | 无错位、无破损 |
WKR-App 验证¶
| 检查项 | 验证方法 | 预期结果 |
|---|---|---|
| App 安装 | 在师傅手机安装 APK/IPA | App 正常安装 |
| 登录功能 | 使用师傅账号登录 | 登录成功显示订单列表 |
| 接单功能 | 师傅点击接单 | 状态变更为"进行中" |
| 打卡功能 | L6 阶段打卡 | 上传照片成功 |
| 完成功能 | L8 阶段完成 | 订单状态变更为"已完成" |
CST-App 验证¶
| 检查项 | 验证方法 | 预期结果 |
|---|---|---|
| App 安装 | 在客户手机安装 APK/IPA | App 正常安装 |
| 注册功能 | 新客户手机号注册 | OTP 验证后注册成功 |
| 登录功能 | 使用客户账号登录 | 登录成功显示订单列表 |
| 询价功能 | 选择服务提交询价 | 询价单提交成功 |
| 查看订单 | 查看订单状态更新 | 实时显示师傅位置 |
| 评分功能 | 完成后评分 | 评分提交成功 |
3.7 常见问题¶
| 问题 | 原因 | 解决方案 |
|---|---|---|
| OPR-Admin 空白页 | API URL 配置错误 | 检查 NEXT_PUBLIC_API_URL |
| WKR/CST 无法登录 | API 域名不可达 | 检查 HTTPS 证书和 DNS |
| Expo 构建失败 | 依赖版本冲突 | 清理缓存后重试:expo doctor --fix |
| Google Play 提交失败 | 签名证书过期 | 生成新签名证书 |
| App Store 提交被拒 | 审核不符合规则 | 查看审核反馈并修改 |
附录¶
A. 完整环境变量清单¶
# ====== 基础配置 ======
ENV=prod
TZ=Asia/Hong_Kong
APP_VERSION=2.0.0
APP_SECRET_KEY=<强密钥>
# ====== CORS ======
CORS_ORIGINS=["https://admin.weavely.hk","https://wkr.weavely.hk","https://cst.weavely.hk"]
# ====== 数据库 ======
DATABASE_URL=postgresql+asyncpg://user:pass@host:5432/db
DB_POOL_SIZE=20
DB_MAX_OVERFLOW=40
# ====== Redis ======
REDIS_URL=redis://host:6379/0
# ====== 阿里云 OSS ======
OSS_ACCESS_KEY_ID=<access_key>
OSS_ACCESS_KEY_SECRET=<secret_key>
OSS_ENDPOINT=<endpoint>
OSS_BUCKET=dip1-assets-prod
OSS_PUBLIC_URL=https://assets.weavely.hk
# ====== WhatsApp Business API ======
WHATSAPP_ACCESS_TOKEN=<access_token>
WHATSAPP_PHONE_NUMBER_ID=<phone_number_id>
WHATSAPP_API_VERSION=v18.0
# ====== JWT 配置 ======
JWT_ALGORITHM=HS256
JWT_ACCESS_TOKEN_TTL_MIN=15
JWT_REFRESH_TOKEN_TTL_DAY=30
# ====== OTP 配置 ======
OTP_TTL_SECONDS=300
OTP_RATE_LIMIT_PER_HOUR=5
# ====== Expo/EAS ======
EXPO_USERNAME=weavely-dip1
EXPO_PROJECT_ID_WKR=<wkr_project_id>
EXPO_PROJECT_ID_CST=<cst_project_id>
# ====== 推送服务 ======
EXPO_PUSH_AUTH_TOKEN=<push_token>
# ====== 可观测性 ======
SENTRY_DSN=<sentry_dsn>
LOG_LEVEL=WARNING
B. 快速部署命令汇总¶
# 1. 克隆并配置
git clone <repo>/dip1.git
cd dip1
cp .env.prod.local .env.prod
# 编辑 .env.prod 填入真实凭据
# 2. 启动后端
docker compose -f docker-compose.prod.yml --env-file .env.prod up -d --build
# 3. 数据库迁移
docker exec dip1-api-1 alembic upgrade head
# 4. 种子数据
docker exec dip1-api-1 python -m app.infrastructure.db.seed.cli
# 5. 验证健康检查
curl http://localhost:8000/health
# 6. 部署 OPR-Admin(Docker)
cd frontend/apps/opr-admin
docker build -t weavely/opr-admin .
docker run -d -p 3000:3000 weavely/opr-admin
# 7. 构建 WKR-App
cd frontend/apps/wkr-app
eas build --platform android --profile preview
# 8. 构建 CST-App
cd frontend/apps/cst-app
eas build --platform android --profile preview
C. 文档索引¶
| 文档 | 路径 | 说明 |
|---|---|---|
| DIP1-ARC 架构设计 | docs/DIP1-ARC-架构设计.md |
系统架构、ADR 决策 |
| DIP1-P3 技术基础设施 | docs/DIP1-P3-技术基础设施.md |
开发环境、CI/CD |
| DIP1-OPS 管理员手册 | docs/DIP1-OPS-生产环境管理员操作手册.md |
运维操作指南 |
| DIP1-IMP 实施指南 | docs/DIP1-IMP-Code-Agent实施指南.md |
项目计划 |
修订记录¶
| 版本 | 日期 | 修订人 | 修订内容 |
|---|---|---|---|
| V1.2 | 2026-08-15 | DT | 9/9 浏览器 E2E 验收通过:修正 OPR-Admin 部署章节的残留 Dockerfile/Vercel 旧内容,替换为当前 PM2+standalone+basePath="/admin" 说明;更新生产环境状态速查表(9/9 全部 OK);新增 Caddy 重定向规则说明(/→/dl/、/admin→/admin/login) |
| V1.1 | 2026-08-15 | DT | 切换至阿里云轻量 2C2G · IP 模式;新增三端部署架构图与 Caddy 路径代理说明;更新 CORS、Node/PM2/Docker 版本清单 |
| V1.0 | 2026-08-11 | DT | 初始版本,集成 OSS/WhatsApp/前端三端部署 |
本指南为 DIP1 生产环境外部服务集成文档,由听写 DT 维护。
如有疑问请联系 TL 或 DT 获取技术支持。