LibWRT 路由器部署记录
设备信息
- 设备:京东云亚瑟 AX1800 Pro(MT7981)
- 系统:LibWRT(OpenWrt 定制固件)
- 数据盘:/dev/mmcblk0p27(111GB EXT4),挂载到 /mnt/data_mmcblk0p27
- 引导:有 UBOOT,支持 uboot 刷机救砖
- 网络:192.168.1.1
当前运行服务
Docker 容器(2个)
| 容器 | 镜像 | 端口 | 数据目录 |
|---|---|---|---|
| 1Panel-ghost-ERXu | ghost:6.65.0 | 2368 | /mnt/data_mmcblk0p27/ghost |
| 1Panel-mysql-Xsby | mysql:8.4.11 | 3306 | /mnt/data_mmcblk0p27/mysql |
其他服务
- 1Panel:Web 管理面板,端口 10086,数据在 [PATH]
- cpolar:内网穿透,API 端口 9200,authtoken 已配置
- cloudflared:Cloudflare Tunnel,2026.9.1 安装,tunnel jinqiu(ID: 8c0476ac-…)
- ddnsto:内网穿透
- EasyTier:VPN 组网
存储架构
分区布局(mmcblk0)
p18: /rom(2GB squashfs 只读系统) p26: SWAP(512MB) p27: /mnt/data_mmcblk0p27(111GB EXT4 数据盘)Overlay 问题(⚠️ 已知问题)
- 系统 overlay(/overlay)基于 1.9GB loop 设备,受限于 squashfs 结构
- 当前已用 1.5GB,只剩 ~380MB
- 1Panel 升级需要更多空间,报空间不足
- [PATH]/mnt(559MB)是 bind mount 快照,正常现象,不能删
- [PATH]/usr(814MB)是 opkg 安装的软件
Docker 存储
- Docker>各服务关键配置
1Panel
- 地址:http://192.168.1.1:10086
- 账号:admin
- 密码:[REDACTED]
- 数据目录:[PATH]
- compose 文件:[PATH]/1panel/apps/hermes-agent/Hermes-Agent/docker-compose.yml
MySQL(Ghost 专用)
- 主机:192.168.1.1:3306
- 密码:[REDACTED]
- 数据库:ghost_k4djjj(Ghost 实际数据库)
- 容器名:1Panel-mysql-Xsby
- 数据目录:/mnt/data_mmcblk0p27/mysql
Ghost 导航门户
- 地址:http://192.168.1.1:2368
- 管理后台:/ghost/#/posts(左侧导航 Posts)
- 邮件配置:支持 Resend/Mailgun/SMTP(详见邮件配置章节)
- 加密文章:文章设置中选 “Password protected” 密码保护
cpolar → Ghost 同步脚本
- 路径:/tmp/sync_cpolar_links.js
- 触发:cron,每小时30分执行(
30 * * * *) - 功能:查询 cpolar API 获取 tunnel 列表,写入 Ghost 文章或自定义站点
- 注:Ghost 有 REST API 可用,后续可改为通过 Ghost API 同步,不再直接写数据库
cron 任务
30 * * * * /usr/bin/node /tmp/sync_cpolar_links.js >> /tmp/sync_cpolar_links.log 2>&1Mac mini 服务(attendance-portal-v2)
服务信息
- 地址:http://localhost:8767(Mac mini 本地)
- 外部访问:https://49380772.r7.cpolar.cn(cpolar 映射)
- 启动方式:launchd(plist 管理),crash 后自动重启
- plist:[PATH]ai.openclaw.attendance-portal-v2.plist
- 入口:~/ClaudeCode/attendance-portal-v2/app/server.py
- Token 缓存:~/ClaudeCode/attendance-portal-v2/data/ican_tokens/
- 会话存储:~/ClaudeCode/attendance-portal-v2/data/sessions/(加密 .json.enc)
数据源
- iCan:已屏蔽(公司永久关闭 2026-09-21)
- SAP:唯一数据源,走飞连 SPA 认证(Playwright 无头浏览器)
已知问题
- 飞连 SPA 有反爬检测,Playwright 自动化登录可能被拒
- 飞连拒绝 ≠ 登录失败(已登录时会拒绝),后端不应重试
- 已在 server.py 和 app.js 中做了防护,但极端情况仍可能失败
部署步骤(从零开始)
1. 基础环境
# 确认 SSH key 登录sshroot@192.168.1.1# 确认数据盘挂载df-h/mnt/data_mmcblk0p272. Docker 安装与配置
# 用 1Panel 安装 Docker,或手动安装# Docker>cat>/etc/docker/daemon.json<<'EOF' { "data-root": "[PATH]", "registry-mirrors": [ "https://docker.m.daocloud.io", "https://docker.1panel.live", "https://hub.1panel.dev", "https://docker.1ms.run" ] } EOF3. 安装 1Panel
# 从 1Panel 官网安装# 安装时选择数据盘目录# 安装完成后在 Web UI 里安装 MySQL(Ghost 专用数据库)4. MySQL 配置(1Panel 安装)
- 通过 1Panel 安装 MySQL 8.x
- 注意:删除 compose.yml 中的 /etc/localtime 挂载(与宿主机 symlink 冲突)
- 手动创建 ghost_k4djjj 数据库:
CREATE DATABASE ghost_k4djjj CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
5. Ghost 配置
- 通过 1Panel 安装,选择 ghost:6.65.0 镜像
- 数据库选 MySQL(刚装的 1Panel-mysql-Xsby)
- GHOST_URL 设为
http://192.168.1.1:2368(不要用 https,会导致 SSL 错误) - 装好后访问 /ghost/#/setup 完成初始化
- 管理后台 /ghost/#/posts 写文章,Settings → General → Publication language 改中文
6. cpolar 安装
# 下载 cpolarcurl-Lhttps://github.com/cpolar/cpolar/releases/download/v3.x.x/cpolar-linux-arm64-o/usr/bin/cpolarchmod+x /usr/bin/cpolar# 配置 authtokencpolar authtoken[YOUR_TOKEN]# 后台运行cpolar http8080&7. Mac mini attendance-portal-v2
# 安装依赖pip3installplaywright playwrightinstallchromium# 启动服务cd~/ClaudeCode/attendance-portal-v2 python3 app/server.py# 配置 launchd plist# 见 [PATH]ai.openclaw.attendance-portal-v2.plistlaunchctl load[PATH]ai.openclaw.attendance-portal-v2.plist8. cloudflared(可选,已放弃 DNS 映射)
# 安装curl-Lhttps://github.com/cloudflare/cloudflared/releases/download/2026.9.1/cloudflared-linux-arm64-o/usr/bin/cloudflaredchmod+x /usr/bin/cloudflared# 配置 tunnelcloudflared tunnel create jinqiu cloudflared tunnel route dns jinqiu attendance.trycloudflare.com# 注:DNS 映射不一定生效(已放弃,用 cpolar)坑与注意事项
1. overlay 系统分区空间
- /overlay 基于 1.9GB loop 设备,不是数据盘
- [PATH]/mnt 的 559MB 是 bind mount 快照,无法删除
- Docker 镜像在数据盘,不占用 overlay
- 1Panel 升级空间不足是系统 overlay 满了,不是镜像问题
2. Docker 与 nftables 混用
- Docker 默认写 iptables 规则,与 LibWRT 的 nftables 混用会弹警告
- 不影响功能,可以忽略
- 不要改 /etc/docker/daemon.json 的 iptables 选项,会破坏 1Panel 管理
3. Ghost 迁移锁问题
- Ghost 启动时崩溃 “Unable to acquire lock”,migrations_lock 表有残留锁
- 解决:TRUNCATE TABLE migrations_lock; DROP DATABASE ghost_k4djjj; 重建 Ghost
- 根因:路由器异常重启导致迁移锁未释放
4. Ghost SSL 问题
- GHOST_URL 设成 https://… 会导致 ERR_SSL_PROTOCOL_ERROR
- Ghost 6.65.0 内部在 2368 端口启用 SSL 但无证书
- 解决:GHOST_URL 改为 http://192.168.1.1:2368
5. Ghost 管理界面语言
- Ghost admin 管理界面始终英文,无法本地化
- 只有前台公开页面随 Publication language 切换中文
6. Ghost 资源占用
- Ghost(183MB) + MySQL(43MB) ≈ 226MB
- 比 emlog(19MB) + MariaDB(6MB) 高很多,但比 emlog+MariaDB+Hermes(325MB) 低
- Ghost 镜像 713MB,一次性存储
7. Ghost 邮件配置
- ghost-mailconfig 是宿主机工具,装在 Docker 容器里没用
- Ghost 邮件通过环境变量配(mailgun/resend/smtp)
- 新用户注册验证需要邮件服务
8. MySQL localtime 挂载冲突
- /etc/localtime 在宿主机是 symlink,docker-compose 挂载会冲突
- 解决:删除 compose.yml 中的 /etc/localtime 和 timezone 挂载行
- iCAN API 已于 2026-09-21 被公司永久关闭
- attendance-portal-v2 现在只能走 SAP 数据源
6. 飞连 SPA 反爬
- SAP 认证走飞连 SPA,Playwright 自动化可能被检测
- 飞连拒绝 ≠ 登录失败,已登录的 session 再次登录会被拒绝
- 不要在登录后频繁重试,会触发服务端异常检测
7. Mac mini v2 launchd
- v2 由 launchd 管理,不是 Hermes
- plist 路径:[PATH]ai.openclaw.attendance-portal-v2.plist
- 注意 WorkingDirectory 要指向项目根目录,不是 app 子目录
9. cpolar → Ghost 同步(待实现)
- Ghost 有 REST API 可用,后续可通过 API 同步,不再直接写数据库
- emlog 的 cpolar 同步脚本暂时失效,需要重写
10. iCan 已关闭
- 拉回来的 wdssmq/zblogphp-nginx:8.2 是 amd64 镜像,在 ARM 路由器上无法运行
- 如需 zblog,需要找 ARM64 版本或用 Docker 多架构构建
11. [PATH] 和 [PATH] 迁移到数据盘
- 问题:1Panel 升级检查 [PATH] 可用空间(要求 ≥500MB),[PATH] 在 overlayfs(1.9GB loop),空间不足报错
- 解决:bind mount 把 [PATH] 和 [PATH] 都指向数据盘 /dev/mmcblk0p27
- 操作步骤:
- mkdir [PATH]
- cp -a [PATH]/* [PATH]/
- fstab 添加:option=‘bind’, target=[PATH], uuid=数据盘UUID
- mkdir [PATH]
- cp -a [PATH]/* [PATH]/
- mount --bind [PATH] [PATH]
- fstab 添加:option=‘bind’, target=[PATH], uuid=数据盘UUID
- 重启验证 df -h [PATH] 显示数据盘(不是 loop 设备)
- 注意:df -h /overlay 永远显示 loop 设备大小,看 [PATH] 的挂载点才能确认真实存储位置
12. Hermes Dashboard 9119 不启动(pid:host 问题)
- 症状:Hermes Gateway(Bot)正常,但 9119 Dashboard 不监听
- 根因:compose.yml 中使用
pid: host,让 Hermes 进程跑在宿主机 PID 命名空间,读不到容器环境变量(包括 HERMES_DASHBOARD=1) - 修复:
- 删掉
pid: host - 添加只读挂载
/proc:/host/proc:ro(这样能看到宿主机进程,又不丢容器 env) - 重启容器:docker compose down && docker compose up -d
- 删掉
- 验证:curl localhost:9119 返回 HTTP 302(跳转登录页,即正常)
13. 1Panel 升级后容器全重启
- 正常现象,1Panel 升级会重启 Docker 服务,所有容器重新拉起
- 等 1-2 分钟容器稳定后再检查服务状态
14. /proc 挂载注意
- 用 :ro 只读挂载,不要读写模式,避免安全风险
- 容器内 /host/proc 是宿主机 /proc,容器内 /proc 是容器自己的