主题
服务器信息档案 — TenoDX
本目录用于集中记录服务器 39.107.41.224 的全部运维信息,作为后续部署、排障、扩容、交接的依据。
最后采集:2026-11-08 05:23 CST | 来源快照:
raw/snapshot-20261108-0523.txt状态:加固 + PostgreSQL + NapCat + Uptime Kuma + Caddy 全部就位;待你扫码登录 QQ
目录结构
server-info/
├── README.md ← 本文件:索引、数据模型说明、刷新方法
├── inventory.yaml ← 结构化清单(机器可读,单一事实源)
├── 01-基础信息.md ← 身份、硬件、网络、存储、时间
├── 02-防火墙与端口.md ← 防火墙 + 端口 + **安全组实测结论与控制台步骤**
├── 03-软件清单.md ← 系统包、Docker、PostgreSQL、镜像加速
├── 04-服务与进程.md ← systemd 服务、容器、资源占用
├── 05-安全基线.md ← SSH 策略、账号、补丁、fail2ban、MAC
├── 06-计划任务.md ← cron / systemd timer / 数据库备份
├── 07-变更记录.md ← 变更时间线 + 踩坑记录 + 回滚命令
├── 08-网络代理.md ← 出站代理(美国 Z01)配置与使用
├── 09-决策记录.md ← 自主决策清单:做了什么、没做什么、为什么
├── 10-部署规范.md ← **Docker 优先** + 强制配套监控的部署约定
├── 11-应用服务.md ← **NapCat / Uptime Kuma 部署与监控维护流程**
├── 12-Web入口.md ← **Caddy 反向代理**(Host 路由 + basic auth)
├── 13-资源服务器.md ← **固件资源服务器**(API-only,鉴权上传)
├── 14-文档站.md ← **VitePress 文档站**(构建进镜像 + 更新流程)
├── scripts/
│ ├── collect.sh ← 只读采集脚本(在服务器上执行)
│ ├── refresh.ps1 ← 本机一键刷新快照
│ └── tunnel.ps1 ← 本机 SSH 隧道助手(绕过安全组访问服务)
└── raw/
├── snapshot-<时间戳>.txt ← 全量采集原始输出
└── packages-<时间戳>.txt ← 完整 dpkg 包清单相关本地工具(不在本档案内)
| 位置 | 说明 |
|---|---|
server/fw-registry/ | 资源服务器源码(Dockerfile + FastAPI + publish.ps1 上传脚本) |
tools/TenoDXHub/ | H503 本地 Hub:控制器信息 + 固件拉取刷入(见该目录 README) |
tools/h503_dfu_flasher/ | 独立 DFU 刷写工具(Hub 的刷写逻辑来源) |
快速上手
powershell
# 1) 连服务器(免密,已在 ~/.ssh/config 配好 tenodx 别名)
ssh tenodx
# 2) 开隧道(web / fw / postgres / uptime / napcat 任选)
powershell -NoProfile -ExecutionPolicy Bypass -File .\server-info\scripts\tunnel.ps1
powershell ... -Service fw # 只开固件 API:localhost:18000
# 3) 发固件
$env:FW_ADMIN_TOKEN = "<服务器 /opt/stacks/fw-registry/.env 里的 FW_ADMIN_TOKEN>"
powershell -File .\server\fw-registry\publish.ps1 -File .\build\h503.bin -Version 1.2.3 -Changelog "修复..."
# 4) 启动 Hub 刷入
powershell -File .\tools\TenoDXHub\run.ps1 -Registry http://127.0.0.1:18000
# 5) 访问 Web 面板(走 Caddy 单入口)
# 落地页 http://127.0.0.1:13080/
# 监控 http://kuma.localhost:13080/
# QQ 机器人面板 http://napcat.localhost:13080/webui/
# 6) 刷新本档案
powershell -NoProfile -ExecutionPolicy Bypass -File .\server-info\scripts\refresh.ps1运行中的服务(5 个容器)
| 服务 | 端口(仅 loopback) | 说明 |
|---|---|---|
| Caddy 2.11.9 | 80 | Web 入口,Host 路由 + basic auth |
| Docs site (VitePress) | 8088 | 文档站,docs.localhost |
| Firmware Registry | 8000 | 固件资源服务器(API-only) |
| PostgreSQL 18 | 5432 | 业务库 + tenodx_fw 库 |
| Uptime Kuma 2.5.9 | 3001 | 12 项监控,11 项启用 |
| NapCat(OneBot 11) | 6099 / 3000 / 3002 | 容器 running,待你扫码登录 QQ |
⚠️ 安全组只开 22/tcp,以上端口全部走 SSH 隧道访问。
数据模型设计(采集了哪些维度、为什么)
| # | 维度 | 核心字段 | 为什么需要 |
|---|---|---|---|
| 1 | 身份标识 | hostname、machine-id、实例 ID、镜像 ID、地域/可用区 | 确认"这是哪台机器",防止多机混淆;重建/迁移时对账 |
| 2 | 硬件规格 | CPU 核数/型号、内存、Swap、磁盘容量/类型、inode | 评估承载能力,判断能否部署目标应用 |
| 3 | 网络 | 网卡/IP/掩码、默认网关、DNS、公网 IP、路由 | 排查连通性、域名解析、对外暴露面 |
| 4 | 防火墙 | ufw 状态、iptables 规则与策略、firewalld、nftables、云安全组、ip_forward | 安全第一道门;判断端口是否真的对外可达 |
| 5 | 端口与连接 | 监听端口、所属进程/PID、ESTABLISHED 连接 | 确认服务暴露面;识别异常外联 |
| 6 | 软件清单 | dpkg 包总数/手动安装、可升级数、Snap、运行时版本、pip 全局包 | 资产盘点;漏洞影响面评估;确认技术栈可行性 |
| 7 | 服务与进程 | 运行中服务、开机自启服务、失败单元、内存/CPU TOP | 掌握常驻负载,找资源浪费点 |
| 8 | 资源基线 | 内存占用分布、磁盘用量、日志占用、ulimit、内核参数 | 建立性能基线,后续对比发现劣化 |
| 9 | 安全基线 | SSH 有效配置、UID 0 账号、sudo 组、密码策略、补丁状态、爆破统计、AppArmor/SELinux | 量化安全风险,跟踪加固进度 |
| 10 | 计划任务 | root crontab、/etc/cron.d、systemd timer | 避免遗漏后台定时行为(备份、清理、自动升级) |
| 11 | 变更记录 | 时间、操作、操作人、回滚方式 | 出事能倒查,交接有据 |
设计原则
- 单一事实源:
inventory.yaml是权威数据,Markdown 是给人看的展开视图。 - 可重复采集:所有数据都来自
scripts/collect.sh(只读命令),随时可复现,不靠手抄。 - 原始留档:
raw/保存每次采集的原文,便于事后比对差异。 - 记录"没有"的东西:明确写下"未安装 nginx / docker / mysql",比只记录"有什么"更有价值 —— 能一眼判断这是台空机器。
- 标出不可自动获取项:如阿里云安全组规则,只能从控制台看,单独列为待确认项。
一键刷新
powershell
# 在工作目录下执行(需绕过本机执行策略)
powershell -NoProfile -ExecutionPolicy Bypass -File .\server-info\scripts\refresh.ps1
# 或已在 PowerShell 7 中、执行策略为 RemoteSigned/Bypass 时
.\server-info\scripts\refresh.ps1脚本会 SSH 到 tenodx 执行 collect.sh,把新的 snapshot-<时间戳>.txt 和 packages-<时间戳>.txt 落到 raw/。 之后人工同步更新 inventory.yaml 与各 Markdown 文档,并在 07-变更记录.md 追加一行。
已实测可用(2026-11-08 04:02 验证:737 个包 + 全量快照采集成功)。
两个已知坑,脚本内已处理:
refresh.ps1故意写成纯 ASCII —— Windows PowerShell 5.1 会把无 BOM 的 UTF-8.ps1按 ANSI(GBK) 解析,中文会变乱码并导致语法报错。- PowerShell 向原生命令管道输入时会自动追加
\r\n,导致 bash 报$'\r': command not found。 脚本改为在服务端tr -d '\r' | bash -s,彻底消除 CR。
⚠️ 需要你本人处理的事项
2026-11-08 你授权"问题全部由我决定"后,我已完成所有可自主执行的加固。 以下是只有你本人能做的,详细理由见
09-决策记录.md。
| 项 | 优先级 | 说明 |
|---|---|---|
| QQ 扫码登录 NapCat | 🔴 高 | 容器已就绪但未登录。开隧道 → http://127.0.0.1:16099/webui/ → 输 token → 扫码。步骤见 11-应用服务.md |
| 安全组未放行 80/443 | 🔴 阻塞 | 已外部实测:仅 22/tcp + ICMP 可达。见 02-防火墙与端口.md 第 6、7 节 |
| 确认控制台 VNC 可登录 | 🔴 最高 | 密钥失效时的唯一抢救通道 |
| 登录后启用 OneBot 监控 | 🟡 中 | 改 monitors.json 的 "active": false → true,跑 sync.sh |
| 评估 NapCat privileged 风险 | 🟡 中 | privileged≈宿主 root,若不可接受需迁到独立机器 |
| 可选:配置自动快照策略 | 🟡 中 | 阿里云控制台,比脚本备份可靠 |
可选:cloud-init 是否升级 | ⚪ 低 | 被 hold 的开机关键组件 |
放行 80/443 的三条路径(按可行性排序)
| 路径 | 需要什么 | 适用 |
|---|---|---|
| ① 阿里云 API + AccessKey | 一个 RAM AccessKey(可在阿里云 App 或另一台能登录的机器生成) | 想彻底解决、开公网端口 |
| ② 反向隧道(Cloudflare Tunnel / frp) | 域名 + 对应账号;服务器主动出站建连 | 不想动安全组,绕开入站限制 |
| ③ SSH 隧道 | 无(现在就能用) | 只有你自己访问,调试/临时用 |
③ 立即可用:
ssh -L 8080:127.0.0.1:80 tenodx,然后本机访问http://localhost:8080。
✅ 已完成(自主决策执行)
| 项 | 完成时间 | 结果 |
|---|---|---|
| 防火墙 ufw | 04:05 | active,放行 22/80/443,FORWARD 放宽供 Docker |
| 网络代理(美国 Z01) | 04:08 | SOCKS5 :1080 / HTTP :8118,px 助手,出口 142.249.36.77 |
| 系统升级 | 04:10 | 升级 18 个包,仅 cloud-init(hold)保留 |
| Docker | 04:11 | 29.9.3 + Compose v5.7.0,6 个可用加速源 |
| 关闭 SSH 密码登录 | 04:16 | 已验证密钥登录正常,密码登录被拒 |
| 关闭 X11 转发 | 04:16 | — |
| fail2ban | 04:17 | 0.11.2,sshd jail,封禁动作走 ufw |
| 2 GB Swap | 04:17 | 已写入 fstab 持久化,swappiness=10 |
| 立规 "Docker 优先" | 04:20 | 10-部署规范.md:除 5 类必裸装例外,软件一律容器化 |
| PostgreSQL 18 | 04:22 | 容器化,仅 127.0.0.1:5432,每日备份 |
| 备份恢复演练 | 04:32 | 1000 行数据完整还原;docker 重启后容器自恢复 |
| SSH 隧道助手 | 04:33 | scripts/tunnel.ps1,绕过安全组访问 loopback 服务 |
| Uptime Kuma 2.5.9 | 05:00 | 9 项监控(8 启用),改用声明式 monitors.json + sync.sh |
| NapCat(OneBot 11) | 05:02 | 容器 running,WebUI 200,待你扫码登录 QQ |
| 栈配置备份 | 05:13 | 每日 03:35 备份 compose/.env/kuma.db/NapCat 配置 |
| Caddy v2.11.9 | 05:18 | Web 入口:Host 路由 + basic auth + 落地页 + /healthz |
| 监控扩到 10 项 | 05:25 | 新增 Caddy 监控;tunnel.ps1 加 web 服务 |
当前状态一句话总结
阿里云北京区 Ubuntu 22.04.5,2C / 1.7 GB + 2 GB Swap / 40 GB(用了 31%)。 安全加固完成、Docker 就绪,运行 4 个容器:Caddy(Web 入口)、PostgreSQL 18、 Uptime Kuma 2.5.9(10 项监控)、NapCat(待 QQ 登录)。 数据库与栈配置均已自动备份。
公网只开放 22/tcp(安全组限制),所有服务通过
tunnel.ps1隧道访问; 推荐走 Caddy 单端口入口,也可直连各服务端口。