版本: 2.0 | 日期: 2026-08-16 | 用途: 服务器冷启动/重建/新人接手时,按此文件可完整恢复“曼陀林”全部工作系统
服务器: 腾讯云轻量 lhins-1dai07vu | 公网IP: 82.156.85.124 | 系统: Ubuntu | 时区: Asia/Shanghai
域名: mandolinwu.site(ICP备案进行中;备案前外部访问用IP,备案后 dev./wiki. 子域名 HTTPS 全通)
站点品牌: 曼陀林(Halo博客“曼陀林”、Wiki“慧飞知识库”、域名 mandolinwu.site 均属此体系)
—
┌─ 曼陀林平台 (82.156.85.124) ────────────────────────────┐ │ Caddy(:80/:443 反代+HTTPS) │ │ ├─ dev.mandolinwu.site → /ctwing/* /game* → :13543 │ │ ├─ wiki.mandolinwu.site → :3000 (DokuWiki 慧飞知识库) │ │ │ │ │ ├─ :13543 Flask接收端(CTWing数据+H5工具+游戏) │ │ ├─ :3000 DokuWiki 知识库(Wiki) │ │ ├─ :8080 NocoDB 智能表格(员工日报) │ │ ├─ :8090 Halo 博客"曼陀林" │ │ ├─ :5672 RabbitMQ(CTWing MQ备用通道) │ │ └─ :3306 MySQL(huifei_daily日报库 + halo博客库) │ └─────────────────────────────────────────────────────────┘
访问地址:
| 服务 | 地址 |
| —— | —— |
| 设备数据查询 H5 | http://82.156.85.124/ctwing/h5(备案后 https://dev.mandolinwu.site/ctwing/h5) |
| Wiki 慧飞知识库 | http://82.156.85.124:3000(备案后 https://wiki.mandolinwu.site) |
| Halo 博客“曼陀林” | http://82.156.85.124:8090 |
| NocoDB | http://82.156.85.124:8080 |
| 我的世界3D / 佩奇游戏 | http://82.156.85.124/game/mc、/game |
| RabbitMQ管理台 | http://82.156.85.124:15672 |
设备(4G/NB/土壤) → AEP平台(iot.ctwing.cn) → 北向订阅(定源) → HTTP推送 → Flask接收端(:13543)
→ SQLite(ctwing.db) → 每日09:00日报 → MySQL(huifei_daily) → 微信推送
→ H5查询工具(图表/分析报告/设备台账管理)
| 组件 | 位置 | 说明 |
| —— | —— | —— |
| Flask接收端 | ~/projects/ctwing-2/receiver_server.py | 接收AEP推送+解析入库+H5 API+游戏 |
| systemd: ctwing-receiver | 端口13543 | 开机自启 |
| MQ消费端 | ~/projects/ctwing-2/mq_consumer.py | RabbitMQ备用通道 |
| AEP SDK | ~/projects/ctwing-2/aep_sdk/ | 官方Python SDK |
| AEP客户端 | ~/projects/ctwing-2/aep_api.py | 订阅管理(增删设备定源) |
| SQLite | ~/projects/ctwing-2/data/ctwing.db | device_data + monitored_devices |
| 日报脚本 | db_writer.py + ~/.hermes/scripts/ctwing_daily.sh | 09:00聚合写MySQL+微信推送 |
| cron | b3b717e6550f 每天09:00 | 设备日报 |
- 凭证(~/.hermes/.env,600权限):
- API域名: `https://2000455438.api.ctwing.cn`(租户ID.api.ctwing.cn) - 签名算法(血泪教训,不是MD5!):
code = "application:{AppKey}\ntimestamp:{毫秒}\n" + 参数行"名:值\n"(按key排序,空值也要) + body + "\n"
signature = Base64(HMAC-SHA1(key=AppSecret, msg=code))
- 订阅API: Create POST /subscription(20181031202018) / Delete DELETE /subscription(20181031202023) / List GET /subscribes(20220624163719) - AEP deviceId = 产品ID + SN - 设备管理原则:添加设备→建设备级订阅;删除设备→删该设备订阅。禁止产品级。删除只动 subUrl=http://82.156.85.124:13543/ctwing/receive 的订阅
- AEP推送信封: {“deviceId”:“…”,“payload”:{“APPdata”:“base64”}} - APPdata解码→SN(18位)+JSON数据体;类型按deviceId前缀: 17080670=valve 17070058=nb_valve 17197695=soil
- 页面/ctwing/h5 | API: /ctwing/api/manage /data /report - 台账表 monitored_devices(sn,name,device_type,product,aep_subscribed,aep_device_id,sub_id) - 功能: 增删设备(自动同步AEP定源) + 4图 + 一键分析报告
- 容器 halo(:8090) | Halo 2.25.4 | 主题 theme-hao | 后台/console 简体中文 - 管理员: mandolinwu(密码在 .env) - 数据库: MySQL halo库(R2DBC连接必须带 ANSI_QUOTES) - 升级/主题安装要点见 selfhosted-app-deployment 技能 references/halo.md
- 容器 wiki(:3000) | DokuWiki | 数据卷 /home/ubuntu/wiki/data(/storage) - 管理员: admin(密码 WIKI_ADMIN_PASSWORD 在 .env) - 权限: Public Wiki(公开读,注册写) - 页面存档: 曼陀林工作冷启动文件(本文件)
- 佩奇丛林大冒险 /game(联机竞速)、我的世界3D /game/mc(Three.js内嵌单文件零外链) - 游戏文件在 ~/games/,由接收端13543提供
- 研发日报: NocoDB(:8080) 员工表单填报 → 22:15汇总(cron edb89ca63fa5,暂停中) - 家务计划: 每天13:00汇总(cron dc2ba7d86ec2) - 球阀深度分析: ~/huifei/iot_full_report.py <SN> → PDF报告
- Docker容器: rabbitmq / huifei-mysql(:3306仅内网) / nocodb(:8080) / halo(:8090) / wiki(:3000) - Caddy: /etc/caddy/Caddyfile(dev/wiki 子域名反代+自动HTTPS) - 防火墙(轻量控制台): 已放行 22/80/443/13543/8080/8090/3000/5672 - 凭据集中存放: ~/.hermes/.env(600权限) - 二维码: /home/ubuntu/qrcodes/
sudo systemctl restart ctwing-receiver mq_consumer caddy sudo caddy reload --config /etc/caddy/Caddyfile docker ps / docker restart <name> tail -f ~/projects/ctwing-2/data/cron.log
| 症状 | 排查 |
| —— | —— |
| 域名打不开/跳备案页 | mandolinwu.site 未ICP备案,用IP访问或等备案通过 |
| 数据没流入 | curl localhost:13543/ctwing/health;查AEP订阅列表 |
| 添加设备报“deviceId不属于该productId” | SN未在AEP产品注册,先到控制台注册 |
| AEP签名401 | 时间戳偏差>5分钟?/echo校准;空值参数也要签名 |
| 微信打不开链接 | 用IP+系统浏览器;或二维码(/home/ubuntu/qrcodes/) |
1. Docker装容器: rabbitmq/huifei-mysql/nocodb/halo/wiki 2. 恢复代码: ~/projects/ctwing-2 + ~/games + ~/huifei + ~/docs 3. systemd: ctwing-receiver + mq_consumer 启用 4. Caddy配置 + 防火墙放行(22/80/443/13543/8080/8090/3000/5672) 5. cron: b3b717e6550f(09:00日报) dc2ba7d86ec2(13:00家务) edb89ca63fa5(22:15研发日报) 6. 验证: /ctwing/health → AEP订阅 → 数据入库 → H5 → Wiki → 博客