运维架构
Docker/Portainer、Traefik、Cloudflare 隧道、三宿主 162 个生产容器、备份与监控——我最硬核、实操最深的领域。
本分类共 34 篇文章
-
当降低 CRF 毫无效果:视频转码中 -maxrate 封顶与 SSIM 质量门禁的死锁
为什么将 CRF 下调 5 档仅让 SSIM 微升 0.00003:深度拆解高吞吐视频转码管线中 -maxrate 码率天花板与客观质量门禁之间的数学死锁与两档放行解法。
-
PHP2Shell:我管的每台机器,PHP 运行时全都中了
CVE-2026-109618 与 CVE-2026-109619 是 PHP 语言本身的未授权远程代码执行,披露前就已被利用。这篇记录我在自己管理的系统上实测到的版本、先修哪里,以及真正把它关掉的那几条命令。
-
Docker 报告退出码 0,内核却早已执行 OOM-Kill
NAS 上的一个容器反复异常退出,Docker 却上报 exit 0 与 OOMKilled=false。真实的证据在 dmesg 里:六次 cgroup OOM-kill。
-
每个播放器都在同一个视频上卡顿,而文件本身是无辜的
同一个 HEVC 文件,在 VLC、Chrome 和 iPad 上(离线)都出现同样的周期卡顿。容器层时间轴完美无缺,画面却不是——NVDEC 的旧版 AV1 包装器返回了错误时间点的帧。
-
它报告了成功,可实际上什么都没变
网络挂载盘对我的转换流水线撒的三种谎:一次 403 MB 的写入悄悄停在 12.5 MB、一次从未真正落地的重命名(元数据却言之凿凿)、以及一个和坏拷贝达成一致的字节数检查。
-
公开的埋点与要 SSO 的仪表盘,怎么共用一个域名
埋点必须公开,仪表盘绝不能公开。我用 authentik 的 proxy provider 加路径放行规则,把两者放在同一个域名上——不用第二个子域,也不用第二个证书。
-
给另一台机器上的数据库配一个 NocoDB 只读看板
把 NocoDB 直接指向另一台机器上的 MySQL/MariaDB,一行数据都不用复制 —— 以及我踩到的 Docker SNAT 源 IP 陷阱和两个 API 陷阱。
-
如何在押注前验证一个开源依赖:我用的六项检查
六项检查,专门抓出「文档说得漂亮、代码里其实没有」的仓库:用 grep 找功能、读文档头部标注的目标分支、看清付费档位门槛,以及收款通道在不在你的国家能用。
-
为什么容器里的 Chrome 会忘记标签页 —— 以及我是怎么修好的
Chrome 的「继续上次浏览」在 Docker 容器里根本不会生效:三次失败的尝试、真正的原因,以及最后管用的 70 行守护脚本。
-
一个字符让我的 authentik CSS 静默失效
我的 authentik 自定义 CSS 看起来完全正确,也匹配到了目标元素,却毫无效果。原因是一个 > 字符被 authentik 转义成了无效文本。
-
当数据库客户端对你撒谎:为 MariaDB 修补 Workbench 26
MySQL Workbench 26.7.0 能连上 MySQL 8.4,却在 MariaDB 上报出一个毫无意义的 TypeError。三处修补,以及为什么版本号不再能说明它是什么引擎。
-
用 IPBan 替换 RDPGuard:没人写出来的三个坑
我把付费的 RDPGuard 7.8.7 换成了开源的 IPBan 4.1.0,踩到三个没有文档的坑——其中一个卸载程序会悄悄放走 12 个正在攻击的 IP。
-
n8n v1 升级到 v2:一个日志文件里的七项废弃警告
我的自建 n8n 从 1.x 升级到 2.40.1,一次性暴露出七处静默失效——包括一个被 schema 校验拒绝的遥测事件、废弃的 webhook 变量,以及一个悄悄把 AI 沙盒关掉的数据库覆盖值。
-
换了不同的硬盘,同样的损坏又来了——真凶是 TRIM,不是 SSD
两周前 btrfs RAID1 阵列在看似健康的 NVMe 盘上静默损坏数据,两周后同一个全零校验和出现在完全不同的硬盘上。真凶是 Seagate IronWolf 110 上的队列化 TRIM(NCQ)——FreeBSD 早就拉黑了这个固件缺陷,Linux 却一直没有。我是怎么抓到它、以及修复方法的全过程。
-
SMART 显示健康,RAID 却在悄悄损坏数据
两块看起来完全健康的 NVMe 组成的 btrfs RAID1 阵列,静默地把 Windows 虚拟机喂成了全零字节。靠的是一个校验和取证——每次失败都落在 found 一侧的全零块 CRC32C——以及两周后终于坐实的根因:异步 TRIM,既不是硬盘,也不是转接卡。
-
我差点把这颗 SSD 送修——真正坏的是 SATA 数据线
一颗 Seagate IronWolf 110 SSD 疯狂报 WRITE FPDMA 超时、mkfs 报 'superblock magic doesn't match'、然后读写静默——教科书般的坏盘。我只换了一根 SATA 线,它就干净格式化、零报错。动手判死刑前,先这样排查。
-
Unraid 停止阵列时卡死的真相:Swapfile 锁住挂载点 — 附修复方案
Unraid 停止阵列时一直卡在卸载磁盘:btrfs RAID1 上的 8GB swapfile 通过 loop 设备锁住 /mnt/cache。根因分析、/boot/config/stop 陷阱、两个 User Scripts 彻底修复。
-
Authentik 从 2025.8 升级到 2026.8:那些没人提醒你会坏掉的部分
一年份的 authentik 大版本升级踩坑记录:存储挂载变更、RBAC 会话清理、可信代理,以及 authorization_flow 与 authentication_flow 搞混导致 SSO 彻底瘫痪。
-
不用界面管理 CyberPanel:逆向一个没有文档的 v2 API
CyberPanel v2 砍掉了有文档的 JSON API,只留下 Angular 界面自己调用的 session + CSRF 端点。这篇文章讲清确切的认证流程,以及我怎么从页面背后挖出真正的函数。
-
验证完全正确的 Forward-Auth 网关——其实并未上线
我的 authentik forward-auth 网关在宿主机上返回了干净的 302 跳转到登录页,公网 URL 却仍然直接服务应用。这个主机名有两条入口层,而我只改了其中一条。
-
Home Assistant 容器版跨版本升级:四阶安全平跳十三期迭代
把容器化部署的 Home Assistant 从 2025.9 一跃升级到 2026.10 往往会导致 SQLite 数据库损坏与反代配置失效。剖析如何通过四阶梯级跳方案安全保留全部 259 个实体与配置。
-
Prometheus 明明有数据,Grafana 面板却全是 No data 的原因
所有 target 都是 up、数据就在 Prometheus 里、面板表达式也没错——41 个面板却全部 No data。原因是 Grafana 变量过滤了自己,而我的验证方式恰好掩盖了它。
-
Telegram 机器人通知为什么发不出去:IPv6、DNS 和一个追查了一整天的 400
一次排障记录:一个跑在 Docker 里的 Telegram 监控机器人,sendPhoto 一直返回 nginx/1.30.1 的 400,但 getMe 却正常——根因是只返回 IPv6 的 DNS 应答、一个写错的 extra_hosts IP,以及一个用 join 拼接破坏了 JPEG 二进制数据的 multipart body。
-
Passbolt 界面反复卡死——一个缺失的配置文件引发的三种故障模式
自托管的 Passbolt 连续几周返回 504:GPG 指纹为空卡住邮件投递,重建容器抹掉了修复,代理后面的 ssl.force 又造成无限重定向。
-
用 CDP 自动化上传百兆视频到 YouTube:跨越 DevTools 内存墙的 Docker 归档法
了解如何使用 Docker Archive API 将大型视频直接送入容器文件系统,再通过 CDP 秒级挂载,彻底避免将百兆文件经由 WebSocket 慢速传输挤爆浏览器。
-
Synology 电子表格 API 是一个容器,不是一个 API 端点
如何在 Synology Office 电子表格上做自动化:官方的 spreadsheet-api 容器,以及四个陷阱——一个假的"未安装"、凭据正确却报 401、永远无法通过认证的 2FA,还有一堵权限墙。
-
Docker 级联故障复盘:NocoDB 内存溢出如何拖垮整套 n8n 自动化栈
容器配置的 768 MB 限制导致 NocoDB 频繁触发 JavaScript 堆内存溢出崩溃,进而引发依赖该数据源的大量 n8n 工作流报错 ECONNREFUSED。通过对齐 max-old-space-size 与清理孤儿任务彻底根治。
-
六个 Chrome 容器打崩存储 NAS:CPU 软解 WebGL、Btrfs D 状态死锁与核显架构迁移
在无核显的 4 核嵌入式 NAS 上跑 6 个 Chrome 桌面容器,软解 WebGL 将系统负载推过 27,并引发 Btrfs 事务陷入 D 状态死锁。将浏览器集群迁移至 Intel 核显节点后,释放了 7.5 GB 提交内存,负载回落至 6.8。
-
为什么你的 CDP 点击会静默失效:平滑滚动、最小化窗口与 JS 派发事件
Chrome DevTools Protocol 点击报告成功却毫无反应的三个原因:平滑滚动导致的过期坐标、最小化窗口被丢弃的坐标输入、以及页面收到了点击但拒绝了它。