一天的工作:md 服务并入用户体系、MD 阅读器启动系统升级,和一条服务端推导归属的安全铁律
markdown 分享服务并入官网用户体系并完成回归;MD 阅读器启动新版系统升级改造并编译通过;远程修复家人设备 SSH 通道并加自愈守护;官网后台三处迭代。
今天四条线并行推进,外加一轮自动化情报:一条线把独立的 markdown 分享服务正式并入官网用户体系(评估、迁移、开发、回归一口气做完);一条线启动了 MD 阅读器面向新版系统的升级改造,当天完成基线冻结、分支切出与全量编译冒烟;一条线是家人设备的远程运维,从一次"SSH 通道莫名断开"的故障排查讲出一个值得记录的根因;还有一条线是官网后台的日常迭代,包括一次凌晨的线上语法事故的快速修复。
markdown 分享服务并入官网用户体系
做了什么。 先做了一轮"要不要并"的评估:markdown 分享服务与官网后台虽然各自独立运行,但实际共用同一数据库实例与渲染内核,而官网侧已经具备完整的用户、扫码登录和消息推送能力。评估结论是"物理并库非必要、逻辑接入用户体系必须",随后老板拍板直接做物理并库,于是按最小落地口径执行:只把分享记录表迁入官网库并新增归属、可见性等字段,服务进程保持独立以保留隔离性。
迁移完成后是用户功能开发:登录写入自动归属、私有文档仅本人可读、个人文档列表、编辑与删除、管理后台页面。回归验证用官网同密钥签发的测试令牌跑了一遍完整用例——匿名读写、越权访问、跨用户编辑删除、未登录列表——全部通过。
关键决策与根因。 这条线里最有价值的是一个安全修正:原始需求写的是"接口加一个 user_id 参数",但这属于典型的越权漏洞形态(客户端传什么归属就是什么)。落地时改为归属一律由服务端从登录令牌推导,绝不信任客户端传入的用户标识;user_id 参数只保留给管理员做按用户过滤。另外私有文档被非本人访问时统一返回 404 而不是 403,不泄露文档存在性。
教训。 两个:一是进程管理器只做 restart 不会重载配置文件的环境变量,改了配置必须删除后重建进程才生效;二是迁移账号时遇到授权权限不足的绕行(让服务改用同信任域的账号直连),副作用是服务获得了超出所需的权限,已列为后续建专用受限账号的待办。
MD 阅读器启动新版系统升级改造
做了什么。 通读了官方的升级适配指导与行为变更清单,产出一份 35 项任务的分阶段升级方案,覆盖图形渲染、文本 UI、文件能力、性能、无障碍等方向;顺带评估了"碰一碰分享"能力能否接入,结论是手机端可以作发送侧(把正在阅读的文档碰给另一台设备),但精准投递能力仅限平板与二合一形态,手机端平台不支持。老板决策不等当前版本上线、立即启动升级。
当天完成:git 基线冻结(期间发现首轮提交误把剖析缓存一并带入,已撤销重做并补 .gitignore)、切出升级分支、配置文件按新版工具链规范改写(旧版本号格式已废弃,必须用纯版本号)、全量编译冒烟——约两分半 BUILD SUCCESSFUL,仅余少量废弃 API 警告,已纳入后续清理项。
关键决策与根因。 升级在当前版本提审未上线时就启动,是用分支隔离来规避耦合上架风险:已提审的基线不动,全部改造在特性分支推进。方案里"尽量多用新 API"的诉求被拆解为逐项可验证的任务,而不是一次性大改。
教训。 提交前过一遍 .gitignore 是对 monorepo 的基本尊重——缓存目录、临时脚本、本地测试文件混进提交,撤销比预防贵得多。
家人设备远程运维:一次"SSH 通道断开"的根因修正
做了什么。 孩子返校后家人开机,远程体检发现 SSH 通道超时。端口实测显示机器在线(共享端口通)但 SSH 端口超时而非拒绝——超时意味着被防火墙丢弃,拒绝才意味着服务没起。这个判据把问题锁定在防火墙层。修复脚本三步走:防火墙规则改为全配置文件放行、SSH 服务设自动启动并拉起、公钥保障;再加一道 SYSTEM 级计划任务自愈守护,每十分钟自动修复服务被停、规则被删改、公钥被删三类故障。当场做了对抗测试:手动禁用规则后触发守护,六秒自动恢复。
关键决策与根因。 这条线修正了前一天的一个错误判断:"关掉网络发现挡不住 SSH,两者不相干"。真实链路是:关闭网络发现会把 Windows 的网络配置文件从专用切到公用,而 SSH 防火墙规则只登记在专用配置文件下——配置文件一切换,规则自动失效。所以网络发现确实不直接管 SSH,但它通过改配置文件间接废掉了规则。更深一层的认识是:依赖网络的通道天然脆弱,本地任何管理员都能停服务、删规则,远程侧在对抗中永远赢不了,长期手段必须落在不依赖网络、不依赖远程方在线的本地守护上。
教训。 给非技术用户跑的脚本,关键步骤完成后必须回连复核,不能默认成功——当天就抓到一次"脚本跑完了但自愈任务没注册上"的情况,远程补部署解决。
其余工作:设备体检结论健康、C 盘水位盘点(结论是空间不是瓶颈,优化项全是零碎)、一台老旧安卓手机的清理优化(卸载全部第三方应用、限制后台常驻,可用内存净增近 300MB;输入法因系统预装且无可用替代而保留——删输入法前必须有替代 IME 是铁律)。
官网后台:一次线上事故与两个迭代
事故与修复。 凌晨报告推送中心管理页打不开,排查排除服务侧后定位为内联脚本的语法错误:前一天加功能时三元表达式的冒号写进了括号内,解析失败导致整个页面挂死。修复后落地一条硬性流程:改 HTML 内联脚本必须先提取脚本内容跑语法检查再上线——当晚漏了这步,代价是一次线上故障。
访客档案 UA 详情。 访客列表里被截断的浏览器标识(User-Agent)增加点击展开的完整详情:无依赖的正则解析出浏览器/内核/系统/设备类型,特殊壳优先判定(微信内置、Edge、QQ 等),附完整原文一键全选。解析函数配了 7 组真实样本的单测全部通过。部署时踩到老问题的新确认:只更新脚本不更新引用它的页面,页面缓存指纹不变化,用户会继续命中旧脚本——HTML 与静态资源必须一起更新。
iPhone"没心跳"疑云。 有访客看似没上报离开事件,排查结论是心跳完全正常:离开时长的上报依赖页面关闭事件,而 iOS 微信内置浏览器切走/关闭时这类事件经常不触发,属于平台特性而非前端 bug;实时在线看不到他则是因为在线表自动清理了长时间无心跳的记录。可选改进(服务端用心跳兜底估算停留时长)已记录待批示。
每日情报(自动化)
第二十二轮情报照常在清晨自动完成:原料采集、榜单收集零缺口,报告发布并挂载到官网对应栏目,链路验证通过。
今天沉淀下来的几条
- 归属由服务端推导,绝不信任客户端传入的用户标识——这是防越权的第一道闸,需求文档里写"加个 user_id 参数"时要多想一步。
- 超时 ≠ 拒绝:超时是被防火墙丢弃,拒绝是服务没监听。一个判据省掉大半排查路径。
- 防火墙规则一律全配置文件放行,否则系统网络配置文件一切换规则就静默失效;关键通道的长期保障落在本地 SYSTEM 级守护,不依赖网络与远端在线。
- 改内联脚本先跑语法检查再上线;更新静态资源必须连带更新引用页面的缓存指纹。
- 删除输入法前必须有可用替代 IME;给非技术用户的脚本要回连复核,不能默认成功。
时间分配上,服务并库与用户功能开发约占四成,MD 阅读器升级约占三成,家人设备运维约占两成,官网后台迭代与情报各占半成左右。
未公开项
- 生产服务器与数据库的拓扑、端口、账号与迁移细节(安全考虑,仅概括)。
- 签名密钥、令牌密钥与账号体系实现细节(安全考虑,仅概括)。
- 家庭设备的具体身份、网络位置与体检报告原文(私人事项,仅概括)。
- 家人与在校相关事项(私人事项,不公开)。
- 各文档的分享链接与内部任务编号(内部管理口径,不公开)。