一、结论
当前服务器已经形成两套后端运行环境。
| 环境 | 用途 | 状态 |
|---|---|---|
| 正式生产 | 对外真实业务运行 | 已存在,继续使用 congcong-api |
| 预发 / 测试 | 开发联调、上线前验收 | 已创建并启动 congcong-staging-api |
预发环境不是复用正式数据库,而是复制正式库后使用独立数据库 congcong_staging,并使用独立 MySQL 用户、独立 Redis DB、独立 .venv 和独立 Supervisor 服务。
二、后端服务对比
| 项目 | 正式生产 | 预发 / 测试 |
|---|---|---|
| 代码目录 | /opt/congcong/backend | /opt/congcong-staging/backend |
| Supervisor 服务名 | congcong-api | congcong-staging-api |
| 本机监听端口 | 127.0.0.1:8000 | 127.0.0.1:8002 |
| 健康检查 | http://127.0.0.1:8000/health | http://127.0.0.1:8002/health |
| Gunicorn 配置 | /opt/congcong/deploy/gunicorn.conf.py | /opt/congcong-staging/deploy/gunicorn.conf.py |
| 日志目录 | /var/log/congcong | /var/log/congcong-staging |
| Python 虚拟环境 | /opt/congcong/backend/.venv | /opt/congcong-staging/backend/.venv |
.venv 关系 | 独立 | 独立,已不再软链正式环境 |
| 调度器 | 正常开启 | DISABLE_SCHEDULER=true,默认禁用 |
supervisorctl status congcong-staging-api
# congcong-staging-api RUNNING
curl -sS http://127.0.0.1:8002/health
# {"status":"ok"}
三、数据库对比
| 项目 | 正式生产 | 预发 / 测试 |
|---|---|---|
| MySQL 实例 | 同一台服务器 MySQL | 同一台服务器 MySQL |
| 数据库名 | congcong | congcong_staging |
| 连接用户 | congcong | congcong_staging |
| 连接地址 | 121.41.105.67:3306 / 线上配置 | 127.0.0.1:3306 |
| 数据来源 | 真实生产数据 | 从 congcong 全量复制 |
| 表数量核对 | 87 | 87 |
DATABASE_URL=mysql+aiomysql://congcong_staging:<staging_password>@127.0.0.1:3306/congcong_staging?charset=utf8mb4
- 预发库来自正式库全量复制,适合做接近真实场景的验收。
- 预发库不要回写正式库。
- 后续正式库结构有迁移时,预发环境也要执行
alembic upgrade head。 - 如需重新同步正式数据,应先备份或确认可以覆盖
congcong_staging。
四、Redis 对比
| 项目 | 正式生产 | 预发 / 测试 |
|---|---|---|
REDIS_URL | redis://127.0.0.1:6379/0 | redis://127.0.0.1:6379/6 |
CELERY_BROKER_URL | redis://.../1 | redis://127.0.0.1:6379/7 |
CELERY_RESULT_BACKEND | redis://.../2 | redis://127.0.0.1:6379/8 |
WS_DEVICE_REDIS_URL | redis://127.0.0.1:6379/15 | redis://127.0.0.1:6379/14 |
预发环境与正式环境 Redis DB 已隔离,避免 WebSocket 设备注册、Celery 任务结果、普通缓存互相污染。
五、部署方式对比
| 项目 | 正式生产 | 预发 / 测试 |
|---|---|---|
| 部署脚本 | /opt/congcong/deploy/deploy_backend.sh | /opt/congcong/deploy/deploy_backend_staging.sh |
| 管理前端发布方式 | /opt/congcong/deploy/deploy_frontend_v2.sh 或 frontend-v2 Webhook | 本地执行 frontend-v2/deploy/deploy_frontend_v2_staging_local.ps1 打包上传到 /www/wwwroot/staging.florist-saas.com |
| 默认分支 | main | main |
| 迁移命令 | .venv/bin/alembic upgrade heads | .venv/bin/alembic upgrade heads |
| 重启服务 | congcong-api | congcong-staging-api |
| 健康检查端口 | 8000 | 8002 |
ssh root@121.41.105.67 "bash /opt/congcong/deploy/deploy_backend.sh"
ssh root@121.41.105.67 "bash /opt/congcong/deploy/deploy_backend_staging.sh"
5.1 预发布前端部署
https://staging.florist-saas.com/ 是预发布前端访问域名;它对应的服务器静态部署目录是
/www/wwwroot/staging.florist-saas.com。
预发布前端不发布到 /opt/congcong-staging/backend,也不是只配置后端端口。前端 frontend-v2
本地打包后,把 dist/ 覆盖到 /www/wwwroot/staging.florist-saas.com,Nginx 再把同一域名下的
API/WS 请求转发到预发布后端。
| 项目 | 值 |
|---|---|
| 前端访问域名 | https://staging.florist-saas.com/ |
| 前端静态部署目录 | /www/wwwroot/staging.florist-saas.com |
| 推荐部署脚本 | frontend-v2/deploy/deploy_frontend_v2_staging_local.ps1 |
| 备用服务器构建脚本 | /opt/congcong/deploy/deploy_frontend_v2_staging.sh |
| API Base | https://staging.florist-saas.com/api/v1 |
| WebSocket events | wss://staging.florist-saas.com/ws/events |
| WebSocket device | wss://staging.florist-saas.com/ws/device |
cd D:\deliverables\flowerShop\frontend-v2
powershell -ExecutionPolicy Bypass -File .\deploy\deploy_frontend_v2_staging_local.ps1
5.2 前端部署对比
| 项目 | 正式生产前端 | 预发布前端 |
|---|---|---|
| 前端仓库 | frontend-v2 / congcong-admin.git | frontend-v2 / congcong-admin.git |
| 访问域名 | https://platform.florist-saas.com/ | https://staging.florist-saas.com/ |
| 静态部署目录 | /www/wwwroot/platform.florist-saas.com | /www/wwwroot/staging.florist-saas.com |
| 主要部署方式 | 服务器执行 /opt/congcong/deploy/deploy_frontend_v2.sh 或 frontend-v2 Webhook | 本地执行 frontend-v2/deploy/deploy_frontend_v2_staging_local.ps1 打包上传 |
| 备用部署方式 | 无需备用,按正式脚本从 git commit 构建 | 服务器执行 /opt/congcong/deploy/deploy_frontend_v2_staging.sh 从 git commit 构建 |
| 构建产物 | dist/ | dist/ |
| API Base | https://platform.florist-saas.com/api/v1 | https://staging.florist-saas.com/api/v1 |
| WebSocket events | wss://platform.florist-saas.com/ws/events | wss://staging.florist-saas.com/ws/events |
| WebSocket device | wss://platform.florist-saas.com/ws/device | wss://staging.florist-saas.com/ws/device |
| 后端转发目标 | 127.0.0.1:8000 | 127.0.0.1:8002 |
| 客户端路径策略 | 保持 /api/v1、/ws/... | 保持 /api/v1、/ws/...,只换域名 |
预发布前端的核心区别是“静态目录换成 /www/wwwroot/staging.florist-saas.com,后端转发换成 127.0.0.1:8002”。业务路径不改,避免客户端测试时还要改 URL path。
六、Webhook 对比
| 项目 | 正式生产 | 预发 / 测试 |
|---|---|---|
| 后端部署接口 | POST /api/v1/webhooks/deploy/backend | POST /api/v1/webhooks/deploy/backend-staging |
| 执行脚本配置项 | DEPLOY_BACKEND_SCRIPT | DEPLOY_BACKEND_STAGING_SCRIPT |
| Token | DEPLOY_WEBHOOK_TOKEN | 预发 .env 内独立生成 |
backend-staging 只用于区分“部署预发后端”的 Webhook,不是业务 API 或客户端 WebSocket 路由。业务侧预发访问仍保持与正式一致的路径,只需要把域名从 platform.florist-saas.com 换成 staging.florist-saas.com,例如 /api/v1/... 和 /ws/... 都不需要改路径。
七、服务器域名与 Nginx
7.1 部署服务器
| 项目 | 值 |
|---|---|
| 服务器公网 IP | 121.41.105.67 |
| SSH 登录 | root@121.41.105.67 |
| Nginx vhost 目录 | /www/server/panel/vhost/nginx |
| 正式后端本机地址 | 127.0.0.1:8000 |
| 预发后端本机地址 | 127.0.0.1:8002 |
7.2 正式生产已部署域名
| 域名 | 用途 | 静态目录 / 服务 | 后端转发 |
|---|---|---|---|
https://platform.florist-saas.com | 平台管理后台(当前权威入口) | /www/wwwroot/platform.florist-saas.com | /api/、/ws/、/docs、/redoc、/openapi.json 转发到 127.0.0.1:8000 |
https://admin.florist-saas.com | 历史 / 兼容后台入口 | /opt/congcong/frontend/dist | /api/、/ws/、/docs、/redoc、/health 转发到 congcong-api upstream,即 127.0.0.1:8000 |
https://b.florist-saas.com | 苁丛内容管家前端 | /www/wwwroot/congcong-content-managemen/dist-prod | /api/ 转发到 127.0.0.1:8000 |
https://c.florist-saas.com | 商家助手前端 | /www/wwwroot/c.florist-saas.com/current | /api/、/uploads/、/ws/ 转发到 127.0.0.1:8000 |
https://d.florist-saas.com | AI Agent / DeerFlow | 前端代理到 127.0.0.1:3000 | /api/、/api/langgraph/、/health 转发到 127.0.0.1:18001 |
https://florist-saas.com / https://www.florist-saas.com | 官网 / 首页 | /www/wwwroot/www.florist-saas.com | 当前未发现后端代理 |
https://a.florist-saas.com | 独立静态站点 | 宝塔 vhost:html_a.florist-saas.com.conf | 当前未发现后端代理 |
7.3 预发公网域名状态
| 域名 | 目标 | 当前状态 |
|---|---|---|
https://staging.florist-saas.com | 预发平台管理后台,/api/、/ws/、/uploads/、/health 转发到 127.0.0.1:8002 | 已配置 DNS / Nginx / HTTPS |
7.4 客户端路径保持一致
| 类型 | 正式生产 | 预发 / 测试 |
|---|---|---|
| API Base | https://platform.florist-saas.com/api/v1 | https://staging.florist-saas.com/api/v1 |
| WebSocket events | wss://platform.florist-saas.com/ws/events | wss://staging.florist-saas.com/ws/events |
| WebSocket device | wss://platform.florist-saas.com/ws/device | wss://staging.florist-saas.com/ws/device |
当前预发后端已经确认服务器本机与公网域名访问正常。正式域名和预发域名按 Nginx server_name 分流:正式 /api/、/ws/ 仍走 127.0.0.1:8000;只有 staging.florist-saas.com 走 127.0.0.1:8002,不存在端口冲突。
八、已实施事项
| 项目 | 状态 |
|---|---|
创建 /opt/congcong-staging/backend | 已完成 |
创建 congcong_staging 数据库 | 已完成 |
| 从正式库复制到预发库 | 已完成 |
创建独立 MySQL 用户 congcong_staging | 已完成 |
| 配置预发 Redis DB | 已完成 |
配置预发 .env | 已完成 |
| 创建预发 Supervisor 服务 | 已完成 |
| 创建预发 Gunicorn 配置 | 已完成 |
创建独立 .venv | 已完成 |
启动 congcong-staging-api | 已完成 |
| 健康检查 | 已通过 |
Nginx 预发域名 staging.florist-saas.com | 已完成 |
| 本地改动提交 git | 未完成 |
九、MCP 排查现状
| 检查项 | 结果 |
|---|---|
| Supervisor 中 MCP 服务 | 未发现 |
| systemd 中 MCP 服务 | 未发现 |
| Docker / pm2 中 MCP 服务 | 未发现 |
| 运行中的 MCP 进程 | 未发现 |
| AI Agent 目录 | /opt/congcong/congcong-ai-agent 存在 |
| MCP 文档 | /opt/congcong/congcong-ai-agent/backend/docs/MCP_SERVER.md 存在 |
| MCP 配置文件 | /opt/congcong/congcong-ai-agent/extensions_config.json 存在 |
"mcpServers": {}
示例配置中保留了 github 和 postgres 两个默认禁用的 MCP 配置。当前能确认的是:AI Agent 项目支持 MCP,但线上没有启用 MCP server,也没有发现独立 MCP 服务进程。
十、下一步建议
| 优先级 | 事项 | 说明 |
|---|---|---|
| P0 | 提交本地 staging 改动 | 保证脚本、文档、Webhook 代码和 Nginx 模板进入 git |
| P1 | 明确要恢复的 2 个 MCP 名称 | 当前只能看到示例 github / postgres |
| P1 | 恢复 MCP 配置 | 明确 MCP 名称和凭据后,写入 extensions_config.json 并重启 AI Agent |
| P2 | 定期刷新 staging 数据 | 根据测试节奏决定是否从正式库重新同步 |