Summary: - Implement WechatService (314 lines, push notifications) - Implement WechatCallbackController (501 lines, async reply mode) - Complete iit_quality_check Worker with WeChat notifications - Configure WeChat routes (GET + POST /wechat/callback) - Configure natapp tunnel for local development - WeChat URL verification test passed Technical Highlights: - Async reply mode to avoid 5-second timeout - Message encryption/decryption using @wecom/crypto - Signature verification using getSignature - natapp tunnel: https://iit.nat100.top - Environment variables configuration completed Technical Challenges Solved: - Fix environment variable naming (WECHAT_CORP_SECRET) - Fix @wecom/crypto import (createRequire for CommonJS) - Fix decrypt function parameters (2 params, not 4) - Fix Token character recognition (lowercase l vs digit 1) - Regenerate EncodingAESKey (43 chars, correct format) - Configure natapp for internal network penetration Test Results: - WeChat developer tool verification: PASSED - Return status: request success - HTTP 200, decrypted 23 characters correctly - Backend logs: URL verification successful Documentation: - Add Day3 WeChat integration development record - Update MVP development task list (Day 2-3 completed) - Update module status guide (v1.2 -> v1.3) - Overall completion: 35% -> 50% Progress: - Module completion: 35% -> 50% - Day 3 development: COMPLETED - Ready for end-to-end testing (REDCap -> WeChat)
16 KiB
16 KiB
🚀 AI临床研究平台 - 阿里云SAE最新真实状态记录
文档用途:记录阿里云SAE服务器最新真实状态 + 每次部署记录
最后更新:2026-01-01 14:00
维护人员:开发团队
说明:本文档准确记录SAE上所有应用的当前状态,包括内网地址、镜像版本、用户名密码等关键资源信息
📊 一、当前部署状态一览
| 服务名称 | 部署状态 | 镜像版本 | 部署位置 | 最后更新时间 |
|---|---|---|---|---|
| PostgreSQL数据库 | ✅ 运行中 | PostgreSQL 15 | RDS | 2025-12-24 |
| 前端Nginx服务 | ✅ 运行中 | v1.2 | SAE | 2026-01-01 |
| Python微服务 | ✅ 运行中 | v1.0 | SAE | 2025-12-24 |
| Node.js后端 | ✅ 运行中 | v1.3 | SAE | 2025-12-25 |
| Dify AI服务 | ⏳ 未部署 | - | - | - |
🔑 二、阿里云资源信息
2.1 ACR容器镜像仓库
基本信息:
- 命名空间:
ai-clinical - Registry地址(公网):
crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com - Registry地址(VPC):
crpi-cd5ij4pjt65mweeo-vpc.cn-beijing.personal.cr.aliyuncs.com - 用户名:
gofeng117@163.com - 密码:
fengzhibo117
镜像仓库列表:
| 仓库名称 | 最新版本 | 镜像大小 | VPC地址 |
|---|---|---|---|
| python-extraction | v1.0 | 1.12GB | crpi-cd5ij4pjt65mweeo-vpc.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/python-extraction:v1.0 |
| ai-clinical_frontend-nginx | v1.2 | ~50MB | crpi-cd5ij4pjt65mweeo-vpc.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/ai-clinical_frontend-nginx:v1.2 |
| backend-service | v1.3 | 838MB | crpi-cd5ij4pjt65mweeo-vpc.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/backend-service:v1.3 |
2.2 VPC网络与NAT网关
VPC信息:
- VPC ID:
vpc-2ze055cptkew9c38w4r06 - VPC名称:
ai-clinical-vpc - 网段:
172.17.0.0/16 - 地域:华北2(北京)
- 交换机1:
vsw-2zevacop039bxrmj6yc0c(可用区F) - 交换机2:
vsw-2zehoeyw9ldncymcyvfwq(可用区A) - 安全组ID:
sg-2zedk6fi8sgmmcwdu7tu
NAT网关信息:
- NAT网关名称:
NAT_airesearch - NAT网关ID:
ngw-2zeec9ulzgw7ywvx1pst6 - 公网IP(EIP):
182.92.176.14 - SNAT表ID:
stb-2zesszmzx1qpwf1cb2bry
2.3 RDS PostgreSQL数据库
实例信息:
- 实例ID:
pgm-2zex1m2y3r23hdn5 - 规格:2核4GB(pg.n2.2c.1m)
- 存储空间:100GB(SSD云盘)
- PostgreSQL版本:15.0
- 内网地址:
pgm-2zex1m2y3r23hdn5.pg.rds.aliyuncs.com:5432 - 外网地址:
pgm-2zex1m2y3r23hdn5.pg.rds.aliyuncs.com(⚠️ 已关闭) - 最大连接数:400
- 时区:Asia/Shanghai
- 白名单:172.17.0.0/16(VPC网段)
数据库配置:
- 数据库名:
ai_clinical_research - 用户名:
airesearch - 密码:
Xibahe@fengzhibo117 - 字符集:UTF8
- 排序规则:en_US.utf8
连接字符串:
postgresql://airesearch:Xibahe%40fengzhibo117@pgm-2zex1m2y3r23hdn5.pg.rds.aliyuncs.com:5432/ai_clinical_research
⚠️ 注意:密码中的 @ 需要URL编码为 %40
Schema架构(11个业务Schema):
| Schema名称 | 功能模块 | 表数量 | 说明 |
|---|---|---|---|
platform_schema |
平台核心 | 8 | 用户、权限、任务队列(pg-boss) |
asl_schema |
系统文献筛查 | 6 | 项目、文献、筛查记录 |
aia_schema |
AI智能摘要 | 5 | AI项目、摘要任务 |
dc_schema |
数据清洗 | 6 | 工具A/B/C数据处理 |
pkb_schema |
个人知识库 | 5 | 文献管理、笔记 |
iit_schema |
IIT Manager Agent | 5 | IIT项目、待审核动作、任务运行 |
admin_schema |
系统管理 | 0 | 预留 |
rvw_schema |
文献回顾 | 0 | 预留 |
ssa_schema |
智能统计分析 | 0 | 预留 |
st_schema |
统计工具 | 0 | 预留 |
common_schema |
公共模块 | 0 | 预留 |
2.4 SAE Serverless应用
命名空间:
- 命名空间ID:
cn-beijing:test-airesearch - 地域:华北2(北京)
已部署应用列表:
| 应用名称 | 状态 | 规格 | 实例数 | 端口 | 内网地址 | 镜像版本 |
|---|---|---|---|---|---|---|
| python-extraction-test | ✅ 运行中 | 1核2GB | 1 | 8000 | http://172.17.173.66:8000 |
v1.0 |
| nodejs-backend-test | ✅ 运行中 | 1核2GB | 1 | 3001 | http://172.17.173.73:3001 |
v1.3 |
| frontend-nginx-service | ✅ 运行中 | 0.5核1GB | 1 | 80 | http://172.17.173.80:80 |
v1.2 |
环境变量配置:
Node.js后端(nodejs-backend-test):
NODE_ENV=production
PORT=3001
DATABASE_URL=postgresql://airesearch:Xibahe%40fengzhibo117@pgm-2zex1m2y3r23hdn5.pg.rds.aliyuncs.com:5432/ai_clinical_research?connection_limit=18&pool_timeout=10
# Python微服务地址
EXTRACTION_SERVICE_URL=http://172.17.173.66:8000
# OSS配置
OSS_ACCESS_KEY_ID=LTAI5tB2Dt3NdvBL3G7nYGv7
OSS_ACCESS_KEY_SECRET=1iSN9k39RkApP93QjUhC1DcPIeMG4V
OSS_BUCKET=ai-clinical-research
OSS_ENDPOINT=oss-cn-beijing-internal.aliyuncs.com
OSS_REGION=cn-beijing
# JWT密钥
JWT_SECRET=8a3f9e7c2d1b5a4e6f8c9d0a3b5e7f1c2a4b6c8d0e2f4a6b8c0d2e4f6a8b0c2d4
JWT_EXPIRES_IN=7d
# LLM API Keys
DEEPSEEK_API_KEY=sk-7f8cc37a79fa4799860b38fc7ba2e150
DASHSCOPE_API_KEY=sk-75b4ff29a14a49e79667a331034f3298
# CloseAI配置
CLOSEAI_API_KEY=sk-cu0iepbXYGGx2jc7BqP6ogtSWmP6fk918qV3RUdtGC3Ed1po
CLOSEAI_OPENAI_BASE_URL=https://api.openai-proxy.org/v1
CLOSEAI_CLAUDE_BASE_URL=https://api.openai-proxy.org/anthropic
# Dify配置
DIFY_API_URL=http://localhost/v1
DIFY_API_KEY=dataset-mfvdiKvQ213NvxWm7RoYMN3c
# Postgres-Only架构
QUEUE_TYPE=pgboss
CACHE_TYPE=postgres
# 企业微信配置
WECHAT_CORP_ID=ww6ab493470ab4f377
WECHAT_AGENT_ID=1000002
WECHAT_CORP_SECRET=AZIVxMtoLb0rEszXS81e4dBRl-I9kgTjygIS0cFfENU
前端Nginx(frontend-nginx-service):
BACKEND_SERVICE_HOST=172.17.173.73
BACKEND_SERVICE_PORT=3001
Python微服务(python-extraction-test):
LOG_LEVEL=INFO
TEMP_DIR=/tmp/extraction_service
2.5 OSS对象存储
Bucket信息:
- Bucket名称:
ai-clinical-research - 地域:华北2(北京)
- 存储类型:标准存储
- 访问控制:私有
- 存储冗余类型:同城冗余存储
- 内网Endpoint:
oss-cn-beijing-internal.aliyuncs.com - 公网Endpoint:
oss-cn-beijing.aliyuncs.com - Bucket域名(内网):
ai-clinical-research.oss-cn-beijing-internal.aliyuncs.com - 创建时间:2025-12-16 20:22
RAM用户访问凭证:
- RAM用户名:
oss-bucket-put-object@1991407246109125.onaliyun.com - AccessKeyId:
LTAI5tB2Dt3NdvBL3G7nYGv7 - AccessKeySecret:
1iSN9k39RkApP93QjUhC1DcPIeMG4V - UID:
203256565888301026 - 创建时间:2025-12-16 20:31:41
⚠️ 安全警告:AccessKey是敏感信息,请勿提交到公开Git仓库!
存储用途:
/uploads/pdfs/- PDF文件上传/uploads/docx/- Word文档上传/uploads/txt/- 文本文件上传/exports/- 导出文件临时存储
2.6 CLB负载均衡器
公网访问地址:
- 公网IP:
8.140.53.236 - 访问地址:
http://8.140.53.236/ - 域名绑定:
https://iit.xunzhengyixue.com/(已备案) - 后端服务器:
172.17.173.80:80(前端Nginx) - 监听端口:80(HTTP)
📦 三、已部署服务详情
3.1 PostgreSQL数据库
- 部署时间:2025-12-24
- 部署方式:
pg_dump全量导出 → RDS导入 - 数据迁移时长:约12秒(90MB SQL文件)
- 验证状态:✅ Schema完整、数据一致、关系正确
- 备份文件:
AIclinicalresearch/rds_init_20251224_154529.sql(90MB) - RDS自动备份:每日凌晨2点(保留7天)
3.2 前端Nginx服务
当前部署版本:v1.2
镜像信息:
- 仓库名称:
ai-clinical_frontend-nginx - 镜像版本:
v1.2✅(当前部署版本) - 镜像大小:约50MB
- 基础镜像:
nginx:alpine - 构建时间:2026-01-01
- 镜像摘要:sha256:1b444d3d04e0e0e62a50009f165991b7d0192d7e21804aa9a3b3558e5aec7961
部署状态:
- ✅ 已成功部署到SAE(2026-01-01)
- ✅ 服务运行正常(内网地址:http://172.17.173.80:80)
- ✅ 企业微信域名验证文件已部署(WW_verify_YnhsQBwI0ARnNoG0.txt)
v1.2版本更新内容:
- ✅ 修复Windows换行符问题(docker-entrypoint.sh CRLF→LF)
- ✅ 添加企业微信域名验证文件
- ⚠️ 部署后内网地址已变更:172.17.173.72 → 172.17.173.80
Git文件结构:
AIclinicalresearch/frontend-v2/
├── Dockerfile ✅ 已提交Git(多阶段构建)
├── .dockerignore ✅ 已提交Git(优化构建上下文)
├── nginx.conf ✅ 已提交Git(Nginx配置)
├── docker-entrypoint.sh ✅ 已提交Git(启动脚本,Unix换行符)
└── public/
└── WW_verify_YnhsQBwI0ARnNoG0.txt ✅ 企业微信域名验证文件
3.3 Node.js后端服务
当前部署版本:v1.3
镜像信息:
- 仓库名称:
backend-service - 镜像版本:
v1.3✅(已部署) - 镜像大小:838MB (压缩后 ~186MB)
- 基础镜像:
node:22-alpine - 构建时间:2025-12-25 18:43
- 构建策略:改进版方案B(本地编译+Docker打包)
- 镜像摘要:sha256:a4ffb61c15af1cd1ed9de187b4464a1aab773918e5b41b4df5b8ad96514f9941
技术架构:
- Node.js版本:22.x
- Prisma版本:6.17.0
- ORM:Prisma(支持多Schema)
- Web框架:Fastify
- 队列系统:pg-boss(Postgres-Only架构)
- 缓存系统:PostgreSQL(替代Redis)
部署状态:
- ✅ 已成功部署到SAE(2025-12-25 18:55)
- ✅ 服务运行正常(内网地址:http://172.17.173.73:3001)
- ✅ 健康检查通过
Git文件结构:
AIclinicalresearch/backend/
├── Dockerfile ✅ 已提交Git(改进版方案B:本地编译+Docker打包)
├── .dockerignore ✅ 已提交Git(优化构建上下文)
├── prisma/schema.prisma ✅ 已同步RDS(32个模型+30+关系字段)
└── tsconfig.json ✅ 已优化(排除测试文件)
3.4 Python微服务
当前部署版本:v1.0
镜像信息:
- 仓库名称:
python-extraction - 镜像版本:
v1.0 - 镜像大小:1.12GB
- 基础镜像:
python:3-slim - 构建时间:2025-12-24
功能模块:
- ✅ PDF文本提取:PyMuPDF 1.26.7
- ✅ Docx文档提取:Mammoth + python-docx
- ✅ 数据清洗(DC工具):pandas 2.0+ / numpy 1.24+ / polars 0.19+
- ✅ 语言检测:langdetect
- ❌ Nougat OCR:已移除(减小镜像1.5GB)
部署状态:
- ✅ 已部署到SAE(2025-12-24)
- ✅ 应用运行正常(2个worker进程)
- ✅ 内网访问地址:
http://172.17.173.66:8000 - ✅ 健康检查通过
Git文件结构:
AIclinicalresearch/extraction_service/
├── Dockerfile ✅ 已提交Git(多阶段构建 + 阿里云源)
├── .dockerignore ✅ 已提交Git(优化构建上下文)
└── requirements-prod.txt ✅ 已提交Git(精简依赖列表)
🔄 四、部署历史记录
2026-01-01(前端v1.2部署 - 企业微信域名验证)✅
部署背景
- 目的:为企业微信接入配置可信域名,需要在前端根目录部署域名验证文件
- 域名:https://iit.xunzhengyixue.com/
- 验证文件:WW_verify_YnhsQBwI0ARnNoG0.txt
部署过程与问题修复
-
问题发现:前端v1.1部署失败,容器启动后立即退出
- ❌ 现象:SAE日志为空,容器状态显示"崩溃或退出"
- ❌ 错误:
exec /docker-entrypoint.sh: no such file or directory
-
根本原因分析:
- 🔍
docker-entrypoint.sh使用了Windows换行符(CRLF\r\n) - 🔍 Linux容器的bash解释器无法识别CRLF格式的脚本
- 🔍 这是一个典型的跨平台开发问题
- 🔍
-
解决方案:
- ✅ 将
docker-entrypoint.sh转换为Unix换行符(LF\n) - ✅ 使用PowerShell命令批量转换
- ✅ 本地Docker测试验证通过
- ✅ 将
-
镜像构建与推送:
- ✅ 重新构建镜像标记为v1.2(23.7秒)
- ✅ 推送到ACR成功(digest: 1b444d3d...)
- ✅ 镜像包含企业微信验证文件
-
SAE部署成功:
- ✅ 部署镜像版本:v1.2
- ✅ 环境变量配置:
BACKEND_SERVICE_HOST=172.17.173.73,BACKEND_SERVICE_PORT=3001 - ✅ 容器启动正常,健康检查通过
- ✅ 新内网地址:
http://172.17.173.80:80 - ⚠️ IP地址变化:172.17.173.72 → 172.17.173.80
技术要点总结
-
Windows换行符问题:
- 原因:Git在Windows上默认转换为CRLF
- 解决:使用
.gitattributes或手动转换 - 验证:
(Get-Content file -Raw) -match "\r`n"`
-
容器调试技巧:
- 本地测试:
docker run --rm -e KEY=VALUE image:tag - 查看日志:
docker logs container_name - 进入容器:
docker exec -it container sh
- 本地测试:
-
SAE部署最佳实践:
- 环境变量必须配置完整
- 本地先验证镜像可正常运行
- 部署后IP可能变化,需要更新依赖服务的配置
部署结果
- ✅ 前端服务v1.2部署成功
- ✅ 企业微信验证文件可访问
- ✅ 系统整体运行正常
- ⚠️ 需要注意:内网地址已更新,依赖前端的服务需要调整配置
2025-12-25(完整部署成功日)🎉
上午:Node.js后端部署
- ✅ Node.js后端成功部署到SAE(v1.3)
- ✅ 修复Alpine Linux bash路径问题(/bin/bash → /bin/sh)
- ✅ 修复config目录缺失问题(Dockerfile补充COPY config)
- ✅ 修复pino-pretty生产环境问题(条件启用)
- ✅ 修复healthCheck ES Module兼容性(require → import)
- ✅ 生成强JWT密钥(64位十六进制)
中午:前端Nginx部署
- ✅ 前端Nginx成功部署到SAE(v1.0)
- ✅ 前端服务运行正常(内网地址:http://172.17.173.72:80)
- ✅ 前端到后端代理验证通过
- ✅ 完整链路测试通过(前端→后端→数据库)
下午:环境变量修复与CLB配置
- ✅ 发现工具C的7大功能报错(connect ECONNREFUSED 127.0.0.1:8000)
- ✅ 排查并修复关键问题:环境变量名错误
- 代码使用:
EXTRACTION_SERVICE_URL - 错误配置:
PYTHON_SERVICE_URL - 正确配置:
EXTRACTION_SERVICE_URL=http://172.17.173.66:8000
- 代码使用:
- ✅ Node.js后端重新部署,IP地址更新为:http://172.17.173.73:3001
- ✅ 更新前端Nginx环境变量:BACKEND_SERVICE_HOST=172.17.173.73
- ✅ 配置CLB负载均衡器,获得公网访问地址:http://8.140.53.236/
- ✅ 工具C的7大功能全部测试通过
- ✅ 文献筛查模块测试通过
- ✅ 完整系统部署成功验证 🎉
2025-12-24(初始部署)
- ✅ PostgreSQL数据库部署完成
- ✅ 前端Nginx Docker镜像构建并推送至ACR
- ✅ Python微服务Docker镜像构建并推送至ACR
- ✅ Python微服务成功部署到SAE(内网地址:172.17.173.66:8000)
- ✅ 解决ACR镜像拉取权限问题(配置镜像仓库认证)
- ✅ Node.js后端Prisma反向同步完成(32个模型,手动补全30+关系字段)
- ✅ Node.js后端TypeScript编译修复完成(修复200+错误→0错误)
- ✅ Node.js后端Docker镜像构建成功(838MB,改进版方案B)
- ✅ Node.js后端镜像推送至ACR(v1.0)
提示:本文档记录SAE服务器的最新真实状态,每次部署后必须更新!
最后更新:2026-01-01 14:00
当前版本:前端v1.2 | 后端v1.3 | Python v1.0 | PostgreSQL 15