跳转至

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 生产环境所需外部服务的完整集成指南,包括:

  1. 阿里云 OSS - 对象存储服务(图片、附件等)
  2. WhatsApp Business API - OTP 验证码发送
  3. 前端三端部署 - 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:登录阿里云控制台

  1. 访问 https://console.aliyun.com
  2. 使用阿里云账号登录

步骤 2:创建 OSS Bucket

  1. 左侧菜单点击 对象存储 OSS
  2. 点击 创建 Bucket 创建存储桶
  3. 填写信息:
  4. Bucket 名称: dip1-assets-prod(生产环境)或 dip1-assets-staging(测试环境)
  5. 地域: 选择最近区域(如香港 cn-hongkong)
  6. 读写权限: 选择「公共读」(便于静态资源公开访问)
  7. 点击 确定 创建

步骤 3:获取 AccessKey

  1. 点击右上角头像 → AccessKey 管理
  2. 点击 创建 AccessKey
  3. 创建后请立即保存以下信息:
  4. AccessKey ID(保存,仅显示一次)
  5. AccessKey Secret(保存,仅显示一次)

安全建议:建议创建 RAM 子用户并授予 OSS 读写权限(AliyunOSSFullAccess),避免直接使用主账号 AccessKey

步骤 4:获取 Endpoint

  1. 进入 对象存储 OSS → 选择对应 Bucket
  2. 概览 页面找到 Endpoint(外网访问域名)
  3. 记录 Endpoint 地址(如 https://oss-cn-hongkong.aliyuncs.com

步骤 5:配置公开访问域名(可选)

  1. 进入 Bucket → 传输管理绑定域名
  2. 添加自定义域名(如 assets.weavely.hk
  3. 在阿里云云解析 DNS 添加 CNAME 记录,指向 Bucket 默认域名
  4. 记录公开访问 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:检查阿里云控制台

  1. 访问 https://console.aliyun.com → 对象存储 OSS
  2. 选择 dip1-assets-prod bucket
  3. 查看 文件管理 列表确认文件已上传

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 开发者账号

  1. 访问 https://developers.facebook.com
  2. 使用 Facebook 账号登录(如无则新建)
  3. 完成安全验证(手机号验证)

步骤 2:创建 Business 账号

  1. 访问 https://business.facebook.com
  2. 点击 Create Business Account
  3. 填写业务信息:
  4. Business name: 织布鸟智居科技有限公司
  5. Business email: t***@weavely.hk
  6. Business phone: +852XXXXXXX
  7. 完成验证(邮箱/手机号)

步骤 3:申请 WhatsApp API 访问

  1. 访问 https://developers.facebook.com/apps
  2. 创建新 App:
  3. 选择 Business 类型
  4. 填写 App 名称:weavely-dip1
  5. 在 App Dashboard 左侧菜单找到 Add ProductsWhatsApp
  6. 点击 Set up 开始配置

步骤 4:配置 WhatsApp 产品

  1. 选择 WhatsApp Business Platform
  2. 创建新的产品实例
  3. 添加手机号:
  4. 点击 Add phone number
  5. 填写准备用于业务的手机号(需海外号码,如香港号码)
  6. 完成短信验证
  7. 记录以下信息:
  8. Phone Number ID(格式:123456789012345
  9. WABA ID(可选)

步骤 5:创建 Access Token

  1. 在 App Dashboard → SettingsBasic
  2. 找到 App Secret 并保存
  3. 生成 Access Token:
  4. 访问 https://developers.facebook.com/tools/explorer
  5. 选择你的 App 和 Page
  6. 生成 Access Token(需包含 whatsapp_business_messaging 权限)
  7. 重要:Access Token 有效期 60 天,需定期刷新

步骤 6:创建 OTP 模板

  1. 进入 App → WhatsAppManager
  2. 点击 TemplateCreate template
  3. 创建模板:
  4. Template name: otp_login
  5. Category: 选择 AuthenticationUtility
  6. Language: English(或添加中文支持)
  7. Body: Your verification code is {{1}}. Do not share this code.
  8. 变量 {{1}} 对应 OTP 验证码
  9. 提交审核(通常 1-2 个工作日)
  10. 审核通过后模板即可使用

步骤 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

  1. 自动刷新(建议长期运行时实现):
  2. 可实现定时任务,在 Token 过期前 7 天自动刷新
  3. 或监控 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,Caddy handle_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.94 SSH 隧道直达

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 端口,再由 Caddy handle /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 获取技术支持。