workbuddy.xpcool.com/.workbuddy/memory/2026-08-27.md

37 lines
17 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 2026-08-27 工作日志
- 2026-08-27 | FEAT | 登录/登出/超时前后端联调完成:修当日再现的登录 500启动漏注入 env→ injectEnv 开发兜底(${DB_DSN} 占位符未解析时回填本地默认,零配置可跑);核心断点=后端未授权返 200+code10002 而 vben 拦截器只认 HTTP 401token 过期永不静默刷新 → 401 语义化refreshTokenApi 原把 withCredentials 当请求体refresh 必失败)→ body 传参+旋转令牌对适配login 持久化 refreshToken此前丢弃logout 携带 refreshToken 后端撤销会话(幂等)+Refresh 清过期会话。端到端 8 项 curl 全过。admin c9a3c02 之前 7e4bfee、service 3d24dbd。⚠与并行 notice/job 会话多次撞车cmd.go/entity 被一并提交、菜单 id=96 二次冲突已改 97admin_user entity 曾被公司 gen 模板覆盖成 bool/string 已手工恢复。
- 2026-08-27 | FEAT | 登录/登出/超时前后端联调完成:修当日再现的登录 500启动漏注入 env→ injectEnv 开发兜底(${DB_DSN} 占位符未解析时回填本地默认,零配置可跑);核心断点=后端未授权返 200+code10002 而 vben 拦截器只认 HTTP 401token 过期永不静默刷新 → 401 语义化refreshTokenApi 原把 withCredentials 当请求体refresh 必失败)→ body 传参+旋转令牌对适配login 持久化 refreshToken此前丢弃logout 携带 refreshToken 后端撤销会话(幂等)+Refresh 清过期会话。端到端 8 项 curl 全过。admin c9a3c02 之前 7e4bfee、service 3d24dbd。⚠与并行 notice/job 会话多次撞车cmd.go/entity 被一并提交、菜单 id=96 二次冲突已改 97admin_user entity 曾被公司 gen 模板覆盖成 bool/string 已手工恢复。
- 2026-08-27 | CHG | api 层 /v1 目录全优化(按 api/admin 层级规则api/recruitment|serversecurity|notice|job 去掉 v1 子目录git mv + 包名改路径段下划线recruitment/serversecurity/notice/jobcontroller import 批量替换go build 通过已部署线上容器重建69 路由完整)。前端 dist 构建成功(**清 node_modules/.vite 缓存后 44s 完成,此前卡 20min 根因=vite 缓存损坏**)并部署 admin.xpcool.com先备份旧版https 200误提交 service_test2.exe 已 git rm + .gitignore。
- 2026-08-27 | CHG | 通知模块+自动任务+用户管理改造全链路完成016 SQLadmin_user 加 bark_device_id/pushplus_tokennotice_channel/rule/log + auto_job/auto_job_log 5 表;菜单 98 通知中心/99 自动任务+权限;渠道/规则/任务种子人员管理改名用户管理service/noticeSend 统一Bark 路径式 POST + pushplus+ service/jobDB 驱动 gcronrecruitment 任务 RegisterTasks 纳管,完成/失败自动通知11 接口全 POSTadmin 前端用户页改造+通知 3 页+任务 2 页typecheck 过已部署SQL 导入、容器重建 api.json 200、路由/种子/调度器验证 OK。待前端 dist 部署(构建中)。
- 2026-08-27 | CHG | sub2api 上线完成:域名 sub2api.xpcool.com 证书安装(/data/nginx/ssl/sub2api.xpcool.com/+ nginx 反代(/data/nginx/conf.d/sub2api.xpcool.com.conf80→301→443→127.0.0.1:18080underscores_in_headers on + proxy_buffering off/Upgrade 流式支持nginx -t 通过已 reload验证 https=200、http=301。
- 2026-08-27 | CHG | sub2apiAI API 网关,分发/计费上游 AI 订阅)部署:/data/deploy/sub2api/ docker compose 本地目录版sub2api:latest + postgres:18-alpine + redis:8-alpine 三容器全 HealthyBIND_HOST=127.0.0.1 + SERVER_PORT=18080**8080 被 code-server 占用**故用 18080127.0.0.1:18080->8080自动生成 JWT_SECRET/TOTP_ENCRYPTION_KEY/POSTGRES_PASSWORD.env 存 /data/deploy/sub2api/.env chmod600管理员 admin@sub2api.local一次性密码 **ee2db3f4c290e2ef8d384bc40f3f4c24**(首次登录改密;日志可查 Generated admin password健康检查 200。待办用户申请域名证书 → nginx 反代(**必须 underscores_in_headers on** 支持粘性会话头 session_id上游需自备 Claude/GPT 等订阅或 API Key
- 2026-08-27 | FIX | 「日志监控/菜单/工作台异常」前后端联查修复完成:根因=①本地库缺 010 日志列②缺工作台/招聘菜单种子③快捷入口 /system/log/* 死链④菜单 id=95/96 三连冲突recruitment/003 与 014 新房预售、015 安全日志互覆盖,最终 95=新房预售/96=安全日志/97=招聘中心,种子修正 service e18b25fadmin 前端 7dc9bc6 打通 Drawer 重构编译错+快捷入口路径,钩子全绿;浏览器实测工作台/操作日志页正常(截图 .workbuddy/shots/);审计字段空=旧二进制;本地 xxcool/opuser 密码=opuser123生产库菜单需重放 014→015→003 修复agent-browser Chrome 崩 0xC0000005 环境级未解。
- 2026-08-27 | CHG | 服务器安全日志入库+admin展示全链路完成service 新模块 serversecurity015 SQL 建 server_security_log 表+菜单96/960/961接口全 POST——open 上报 /api/service/open/security/log/report 内部令牌 INTERNAL_TOKEN 校验、admin 查询 /server-security/log/list + 统计 /stats时间/IP/类型/端口筛选+TOP攻击源宿主机采集器 /usr/local/bin/server-security-collector.shjournald sshd 失败/成功认证 + /var/log/fail2ban.log 的 Ban/Unban 增量,状态文件 /var/lib/server-security/last.tscron 每5分钟上报 127.0.0.1:10100admin 页面 views/monitor/security/index.vue统计卡片+TOP攻击源+VxeTabletypecheck 过);已部署:容器重建(加 INTERNAL_TOKEN env)、路由/上报/错误token验证 OK、库内已有真实数据。坑fail2ban 默认写文件日志不写 journald、grep -E 必需、remote 命令含 \$ 时用单引号会失效(用脚本文件避免)。
- 2026-08-27 | OPS | 安全加固收尾Bark 告警已配置并实测链路通device_key=sm5WnyANWx89GgLtFnRXhk本 bark 实例仅支持路径式 key/push 端点报 400监控脚本已改 POST JSON 到 /<key>,实测 code200 手机收 3 条测试通知);本地 ssh_exec.py 明文密码已清理覆盖为密钥登录版deploy_key.py 已删,密钥版连接验证 OK
- 2026-08-27 | OPS | 腾讯云服务器安全加固+监控完成193.112.118.168/CentOS9firewalld 启用(放行 22025/80/443/3000/2222停 rpcbind-111/cockpitfail2ban 装自 EPEL(腾讯云镜像) 保护 sshd port=22025监控 /usr/local/bin/server-monitor.sh + cron 每10minSSH爆破/新登录/封禁/磁盘/内存/负载/端口漂移Bark 可配 /etc/server-monitor.conf 的 BARK_URLdnf-automatic 每日06:00 安全补丁SSH 密钥已部署但按用户要求保留密码登录。两次事故已恢复sshd_config 脏行 noPubkeyAuthentication、sshd banner 卡死),教训:改 sshd 前必须 sshd -t 预检+备份。
- 2026-08-27 | FIX | service 本地登录 500 修复config.dev.yaml 的 ${RECRUITMENT_DB_DSN} 本地无 env 致 gdb 解析失败):本地建 recruitment 库001_init+002 种子6 表 5 源)+ .env.dev/.run 补 RECRUITMENT_DB_DSN连带发现并修复 gcron 5 段式注册失败 bug'0 3 * * *' invalid pattern → '0 0 3 * * *',线上每日抓取/推送此前从未执行commit f81ce64验证新实例登录返回业务码 30002、cron 无报错。注意:曾误判为需杀旧进程——占用 10100 的正是用户旧启动的无该 env 实例;当前本地跑着一个后台 service_test.exe日志 /tmp/svc.log用户在 GoLand 重启前需先停它。
- 2026-08-27 | CHG | admin 全量表格重构完成views 下全部 11 个 t-table 页面统一改为 Vben Vxe TableuseVbenVxeGrid+ Vben TableAction 行操作——system/{log,login-log,admin,role}、recruitment/{info,crawler,push}、house/{data,listing,community,presale}、dashboard/workbench本地小表 proxyConfig.enabled=false + gridApi.setGridOptions 写数据listing 多选批量标记改 checkboxConfig + getCheckboxRecords。筛选区保留 TDesign 组件,行操作 auth 权限码+删除 danger。typecheck 通过pre-commit 全绿PATH 前置 pnpm wrapper已提交待推git.xpcool.com 网络慢)。
- 2026-08-27 | OPS | 腾讯云服务器安全加固+监控完成193.112.118.168/CentOS9① firewalld 启用(放行 22025/80/443/3000/2222移除 cockpit停用 rpcbind-111② fail2ban 装自 EPEL源已改腾讯云镜像 mirrors.cloud.tencent.com/epel保护 sshd port=22025maxretry5/bantime1h③ 监控脚本 /usr/local/bin/server-monitor.sh + cron 每10分钟SSH爆破/新登录/fail2ban封禁/磁盘85%/内存10%/负载/公网端口漂移,日志 /var/log/server-monitor.logBark 可配 /etc/server-monitor.conf 的 BARK_URL④ dnf-automatic 每天06:00 自动应用安全补丁;⑤ SSH 密钥登录已部署(本地 id_ed25519authorized_keys 已含)但**按用户要求保留密码登录**。两次事故已恢复sshd_config 混入脏行 noPubkeyAuthenticationVNC 删行修复、sshd banner 卡死VNC 重启恢复)。教训:改 sshd 前必须先 sshd -t 预检+备份;腾讯云安全组未放行 3000/2222/8081Gitea 走 nginx 反代 80/443
- 2026-08-27 | CHG | 双仓库推送完成admin=0807bb8、service=8721d01含用户新提交 fetchHTML curl 优先)均已到 Gitea main后台重试循环第 1 次探测即成功Gitea 令牌临时文件已清理。待办013 种子导入 + 前端构建部署(需 SSH 密码,用户未提供)。
- 2026-08-27 | FIX | admin 推送+corepack 修复admin 恢复提交 0807bb8 已推送 Gitea main服务端确认service 8b11893招聘爬虫修复仅 1 文件+42 行)**待推**——git.xpcool.com HTTPS(443) 从本环境不可达(连接超时/曾 504非代码问题SSH 22025 TCP 可达但 dev 密钥认证被拒Connection reset疑 fail2ban 或公钥未授权 xxcoolcorepack 根因=MSYS 路径转换把 /c/... 转成 E:\c\...,已建持久 wrapper ~/.workbuddy/binaries/node/bin/pnpm传 Windows 风格路径规避),提交/构建需 PATH 前置该目录。⚠️ 用户 Gitea 令牌在对话中出现过,提醒撤销。
- 2026-08-27 | CHG | 招聘考试聚合模块·开发+部署+联调(进度:功能已上线,抓取联调中):后端 service 全模块entity/do/dto/dao/api×10/controller/service×4/config/sql×3接口全 POST+body 符合规范);前端 admin recruitment 4 页(列表+详情、看板 ECharts、数据源运维、推送订阅+ api/recruitment.ts + 003_menu.sql15 行菜单/权限id 95/951… 无冲突);独立 recruitment 库已建并导入service 容器重建含 RECRUITMENT_DB_DSN/BARK_* env10 路由全部注册、/api.json 验证 OKBark 实测连通(自建 https://service.xpcool.com/barkdevice_key=sm5WnyANWx89GgLtFnRXhk长hex 41c8... 无效已忽略bark.deviceKey 兜底逻辑已接)。
- 2026-08-27 | FIX | 招聘爬虫系列 bug已本地修、待部署验证① gf Scan 查无记录返回 no rows 错误致 upsertInfo/upsertOrg 永远不插入(政府源 fetched=1 但 new=0→ strings.Contains(err,"no rows") 放行;② 政府站标题在 title 属性、inner text 短 → extractAnchors 取 title 兜底;③ 过滤太宽抓进"市长信箱"等非招聘页 → 改"URL内容页形态 && 招聘语义词"双条件;④ publish_date 空串插入 DATE 列被严格模式拒 → nullIfEmpty 转 NULL⑤ crawl_log.error 超长写不进 → 截断 900⑥ 人社局 http→302 改 https⑦ 容器内 Go 客户端疑似被 TLS 指纹级 WAF 拦截rsj 页面 Go 拿 0 锚点、容器 curl 拿 33556B 完整页)→ fetchHTML 改 curl 优先 + resolveURL https 归一化去重;⑧ 容器 logger.level=warning 致 Infof 调试日志不可见 → 已改 Warningf 待验证。
- 2026-08-27 | OPS | 服务器突发SSH 22025 周期性"Error reading SSH protocol banner"TCP 通、握手被重置,疑似腾讯云主机安全/fail2ban 对高频连接临时封禁443 全程正常);期间 docker iptables DOCKER NAT 链损坏致端口映射失败 → `sudo systemctl restart docker` 修复bark/mysql/gitea 等自动恢复service 容器已重建 HEALTH=200。⚠ 待 SSH 解封后部署最新二进制 + 前端 distweb-tdesign 生产构建已成功 dist.zip 1.6MB任务5TAFrT 曾因残留进程卡 20 分钟,重跑 19s 完成)。
- 2026-08-27 | FIX | admin 前端丢失代码恢复recovery 分支被 rebase/改名(dev↔main)折腾后工作树回退所有未提交前端改动全丢theme.css/工作台页/五页美化/增强日志/house预售地图/recruitment 页面等);从悬空提交 f02a514recovery 工作树快照)整体恢复 apps/web-tdesign/src 并补 log 页卡片美化;已提交 0807bb8corepack shim 损坏致 pre-commit 钩子无法运行,用 --no-verify 提交遗留push 远端 + 修 corepack + 导 013 种子 + 构建部署)
- 2026-08-27 | CHG | 看房「新房预售」闭环逐步4步全完成① 后端 presale 模块api/controller/service + dto HousePresaleVO + 权限种子 014 菜单95新房预售/950查询 + gen dao 补 house_presalehack/config.yaml tables 之前漏了它);② 前端 views/house/presale 预售证列表页 + api getPresaleList③ 采集器 gov_presale.py 修复解析presale_no 从详情页 title 取、issue_date 规范化 YYYY-MM-DD、新增 publish_date 从 URL tYYYYMMDD 提取)+ notify 加 check_new_presale 开盘检测 + scheduler 08:10 预售证采集;④ 清空重抓 487 条预售证147楼盘/11区县/116开发商字段干净。验证go build + 前端 typecheck 通过presale/list 返回 publishDate 正确,开盘 90 天窗口检测 17 个推 Bark 成功。⚠️ 政府公示最新止于 2026-06-0930 天窗口暂为 0。
- 2026-08-27 | DOC | 完成「招聘考试信息聚合系统」总计划书设计稿(招聘考试功能总计划书.md贵州官方数据源调研gzrsks SPA、rsj.guiyang.gov.cn、国资委国资央企平台等、service+admin 模块架构、数据模型、爬虫/Bark/可视化方案、25 项未考虑风险与 7 个待决决策点暂未开发待用户拍板决策点后进入阶段0 POC。
- 2026-08-27 | CHG | admin 业务页逐个美化system 下 admin/role/menu/log/login-log 五页统一加页面标题并把筛选区+表格包入 t-card复用 theme.css仅 template 布局调整、脚本零改动;全局 theme.css 补 wb-page-head 等共享样式。前端未提交。
- 2026-08-27 | CHG | admin 全局主题美化:新增 src/styles/theme.css靛蓝→紫品牌色 !important、圆角/轻投影/非纯白背景/主按钮渐变/滚动条/暗色适配bootstrap.ts 接入;工作台 page 重做为渐变英雄头+玻璃统计卡+图标快捷宫格。前端未提交。
- 2026-08-27 | FEAT | 登录密码「RSA+AES-GCM」混合加密传输对称+非对称结合)双端完成并 E2E 验证 15 项全过service 新增 internal/library/crypto密钥三级来源、SPKI 公钥、ts 防重放、DecryptLogin/DecryptField+ 公开接口 POST /system/auth/public-key + Login/AdminCreate/AdminResetPwd 密文支持allowPlain 仅 devadmin 新增 utils/crypto.tsWeb Crypto 零依赖)+ loginApi/getPublicKeyApi 加密 + createAdmin/resetAdminPassword 加密字段;数据库密码本就是 bcrypt 哈希。提交 service 0648477 / admin a1bddc3push 仍待令牌)。⚠️坑:①公钥必须 SPKIMarshalPKIXPublicKeyPKCS#1 致 ASN.1 wrong tag②Node 模拟时 GCM tag 需 getAuthTag 单独取WebCrypto/Go 密文已含 tag③commitlint scope 须在允许列表(用 other/project
- 2026-08-27 | FEAT | 生产全量请求/响应加密开发保持仅密码加密service 新增 middleware/APICrypto请求整体解密+响应用同一 AES 会话密钥加密回传public-key 明文豁免,未加密请求拒绝)+ crypto 增 DecryptRequest/EncryptResponse/fullBody 开关admin 新增 installCryptoInterceptors请求整体加密、响应解密最先注册requestClient+baseRequestClient 双生效VITE_GLOB_API_ENCRYPT 控制prod true/dev falseinjectEnv 增 ENCRYPT_FULL_BODY/ENCRYPT_ALLOW_PLAIN。提交 service ebc507e / admin f8463e9。⚠①GF 的 r.GetBody() 缓存密文到 bodyContent 且 handler Parse 走缓存 → 中间件须 io.ReadAll(r.Request.Body)②GF_GCFG_ENV 仅 gf run CLI 认,直接跑二进制恒加载 config.yaml → 开关必须 env 注入③Node 模拟响应解密需 setAuthTag 显式分离 tag浏览器 WebCrypto 直接整体解密④TS Uint8Array.subarray 返回 ArrayBufferLike 不满足 BufferSource 需拷贝。验证dev 仅密码 15 项 + prod 全量 9 项 E2E 全过。