gouki
|
158679be3c
|
feat(deploy): update.sh 增加部署后健康闸门与自动回滚
restart 后轮询 /health 直到 commit 追平新 HEAD 且 status=ok,参数对齐
deploy-verification.md(间隔 15s / 单次 10s / 总超时 120s,可用 DEPLOY_HEALTH_* 覆盖)。
超时或 status≠ok 时 git reset --hard 回滚到 reset 前记录的 HEAD 并再次 restart,
经 .env 已配置渠道(Telegram/邮件)告警,并以 exit 1 结束让 systemd 记录失败。
- 期望哈希用 git rev-parse --short HEAD,与 app.main._read_git_commit 口径一致,避免长度不符误回滚
- 失败提交记入 .git/vps-manager-deploy-failed,阻止 timer 每分钟重复部署同一坏版本(抖动+告警轰炸)
- fetch_health 无 curl 时回退 Python urllib,避免取数工具缺失导致误判超时回滚好版本
- timer 触发方式与 sync_units 单元同步逻辑保持不变
|
2026-10-12 21:45:52 +00:00 |
|
gouki
|
46faadbcae
|
feat(multicloud): 补齐上线前的多云管理缺口(适配器/动作层/DNS/定时同步)
评估发现项目只有台账能力,缺失真正的多云管理链路。本次按缺口逐项补齐:
适配层
- 新增 aws / linode / namesilo 适配器,registry 登记;阿里云、腾讯云补
list_domains 与 get_account 余额
- NormalizedVPS 补 expiry_date + charge_type:此前云端同步进来的 VPS 拿不到
到期日,永远进不了续费提醒——而续费提醒正是这套台账存在的理由
- base.py 统一云端错误可读化(http_error_message / cloud_error_text):各厂商
把原因放的位置都不同(Linode errors[].reason、Cloudflare errors[].message、
腾讯 Response.Error.Message、AWS XML),此前直接 str(e) 会把 httpx 的多行文本
连同 MDN 链接弹给用户
动作层与 DNS
- 新增 /api/actions:实例启停/重启/续费,写操作全部二次确认 + 审计
- 新增 Cloudflare DNS 记录的增删改查
定时同步
- scripts/sync_all_assets.py + /api/sync/assets + vps-sync-assets.timer(08:30)
- 08:30 而非随机时刻:必须早于 09:00 的续费检查,否则提醒读到上一天的旧到期日
- sync_all_assets 修正计数:每一项子同步都失败时不再计为「成功」,否则凭证过期
会显示「成功 1」,用户以为数据拉到了、实际一条没有
数据一致性
- AssetRead 输出 external_id(只出不进):前端「云操作」「DNS」按钮靠它渲染,
缺了则所有按钮永远出不来
- import_assets 落库 external_id:导出带了去重键而导入丢弃,会让迁移后首次同步
把所有云端资产当新增再建一份
- _align_preset_providers 取代 _backfill_provider_services:库里声明但注册表未
实现的 sdk_type 清空(声明支持却不支持,比明说不支持更糟),services 只增量
补标签不覆盖,用户自建平台不动
前端如实展示
- cost 为 0 统一显示「未填」而非「0 USD」:0 既可能是没填、也可能是云端不返回
价格,而汇总处又把 0 当「无费用」排除,两处口径不一致
- 总览「本年支出」增加 year_cost_missing,把合计的覆盖缺口说出来
- DNS 弹窗补 MX/SRV 优先级与备注;列表请求失败时 provider 用资产自带 slug 兜底,
否则 Cloudflare 代理勾选框永远不出现
测试:257 -> 309 passed
|
2026-10-12 00:43:37 +00:00 |
|
gouki
|
f09c0f6e4b
|
fix(review): 处理全量审查剩余项(M4-M8/M11/M12 + 21 条 low)
后端
- asset_service: delete_asset 先清 subdomains/site_certs 子表(SQLite 不强制
FK 且 assets.id 无 AUTOINCREMENT,删最大 id 后新建会复用 rowid 导致孤儿误挂);
metrics.db 清理改 best-effort,不再让已成功的删除返回 500
- provider_service: slug 唯一约束竞态补 IntegrityError 兜底(与 account_service 一致)
- account_service/sync_service: raise HTTPException 补 from e,保留原始异常链
- sync_service: 删死代码 _load_config;新增 BalanceUnsupported,平台无余额接口时
计入 skipped 而不是静默当作失败;到期日写库前归一
- ai: 删掉 OpenAI 早已下线的 billing 余额接口实现,能力探测如实报「不支持」
- adapters/base: _overridden 改走 MRO,中间层基类实现的能力不再被误判为未实现
- core/timeutils: 删死代码 utcnow_iso(注释声称 Z 后缀,实际输出 +00:00)
- main: lifespan 退出时 await 被 cancel 的清理任务,避免 pending task 被销毁
- ssl_service: 写 site_certs/subdomains 前校验 asset_id 存在,杜绝悬空引用;
到期阈值贯穿 _judge_status/_apply_probe/check_one/check_all_site_certs
- routers/credentials、accounts: 明文密码 GET 补 Cache-Control: no-store
- routers/stats: /stats/expiring 的 Query 描述与实际语义对齐(不设下界,含已过期)
Agent
- collector: 解析 sshd_config 的 Include(含 sshd_config.d/*.conf,按 sshd 语义
「首次出现的值生效」),未显式配置的关键字按编译默认值判定,消除假 pass;
防火墙检测改用 iptables -S 统计 -A 规则行并读 INPUT 策略(-L -n 恒有链头输出)
- reporter: 4xx(除 429)不再重试直接退出,429 优先按 Retry-After 退避
安全与部署
- core/security: require_agent_key 改为对外 fail-closed——tailnet/本机放行,
外部来源未配 AGENT_KEY 时一律 401(此前全放行,而服务默认监听 0.0.0.0,
公网上任何人可伪造监控指标与安全检查结果)
- main: 启动时把「未配 API_KEY/AGENT_KEY 则外部来源不可用」打进日志
- run.sh: HOST/PORT 可用环境变量覆盖,并说明默认 0.0.0.0 的权衡
- deploy/setup.sh: 新装时自动生成随机 API_KEY/AGENT_KEY 并提示同步到各 VPS;
注册 vps-cert-check.timer
- deploy/vps-cert-check.{service,timer}: 新增每日 09:30 的站点证书到期探测
(此前 check_site_certs.py 没有任何 unit,证书提醒不会自动跑)
- deploy/update.sh: sync_units 对 timer 用 enable --now(新增 timer 只 restart
不会建开机自启软链),主服务 unit 变更后额外 restart;pip 安装失败不再被吞
- scripts/check_site_certs.py: threshold 参数真正生效并打印
- scripts/make_migration_bundle.py: 缺 assets.db 直接 abort;umask 077 + chmod 600
(包内含 .env 的 MASTER_KEY 与 escrow,不能默认 644 落在 /tmp)
- scripts/restore_migration_bundle.py: 校验之外补必备文件预检,缺文件在触碰
目标机状态之前就 abort
前端
- store: 拆分列表口径 assets 与统计口径 allAssets(无筛选时同源,不重复请求);
删除已无消费者的 expiring/loadExpiring(每次 loadAll 白发一个请求)
- dashboard/monitor/providers/subscriptions/modals: 统计与计数改用 allAssets,
资产页的筛选(含统计卡片点击跳转带的筛选)不再让其他视图的数字缩水
- modals: 账号同步后补 loadOverview;settings: 导入后改 loadAll
- api: countdownText 支持 unit/empty 选项,monitor/domains 各自的实现改为委托,
assets/domains/subscriptions 的到期列不再直出「(-3天)」
- servers: cpu/mem/disk 百分比统一判空,采样缺项不再渲染「null%」
- assets: 同步 AI 余额的结果提示区分 skipped(平台无余额接口)与 failed
- modals: 修正凭据库头注释——2FA 动态码是选填 + 可事后补验,与实现一致
测试
- 新增 tests/test_agent_collector.py(8 条)、tests/test_security.py(11 条)
- 全量 113 passed;改动 JS 均通过 node --check,deploy 脚本通过 bash -n
- 浏览器实测:筛选态下总览/监控中心/平台页/付费资产的统计仍为全量口径,
到期文案与 null 百分比渲染正确,console 零报错
|
2026-09-23 10:15:52 +00:00 |
|
gouki
|
6865bb7914
|
fix(backup): 备份链路纳入 master_key.escrow(覆盖式单份+S3)
escrow 是 MASTER_KEY 遗失恢复链的一环:整机丢失时仅有库备份+离线 RESTORE_KEY 仍无法恢复,缺的正是托管档。随 assets 周期备份,固定文件名覆盖(多版本无意义),未建立托管时 skip。
|
2026-09-05 23:10:46 +00:00 |
|
gouki
|
09a7b7aa42
|
test(deploy): timer注释标记,验证sync_units单元自动同步链路
|
2026-08-09 23:41:52 +00:00 |
|
gouki
|
88e7050cf0
|
fix(deploy): 版本比对统一用短哈希,修复永不匹配的bug
|
2026-08-09 23:08:39 +00:00 |
|
gouki
|
750a986821
|
fix(deploy): update.sh改用reset --hard同步远端,本地误改不再阻塞自动部署
|
2026-08-09 21:53:05 +00:00 |
|
gouki
|
e6323c5e46
|
fix(deploy): 恢复update.sh可执行位(755)
|
2026-08-09 21:28:55 +00:00 |
|
gouki
|
270ffc81f9
|
fix(deploy): 恢复update.sh可执行位;ExecStart改bash调用不再依赖可执行位
|
2026-08-09 21:18:27 +00:00 |
|
gouki
|
32a4e0da36
|
fix(deploy): 变量引用加花括号,避免多字节字符粘连导致unbound variable
|
2026-08-09 20:40:34 +00:00 |
|
gouki
|
e4a8cc68b4
|
feat(deploy): 零SSH自动化部署——update.sh自动同步systemd单元/更新timer缩至1分钟/新增deploy.sh一键部署验证脚本
|
2026-08-09 20:27:02 +00:00 |
|
gouki
|
a33a2b71de
|
feat: 版本号管理机制(VERSION文件+git哈希,部署/启动/UI/health均展示) + 平台账号管理(accounts表CRUD,资产所属账号候选联动,重命名同步引用)
|
2026-08-08 20:07:03 +00:00 |
|
gouki
|
1b7d4823c3
|
feat: 综合平台services多服务支持+SW网络优先缓存修复+适配层/定时任务完善
|
2026-08-05 11:57:17 +00:00 |
|
gouki
|
7f1268f508
|
feat: 数据库备份支持S3兼容对象存储(SigV4纯标准库实现,无配置时兼容原本地备份)
|
2026-08-05 11:57:17 +00:00 |
|
gouki
|
f3e700f3f4
|
feat: 一键部署脚本setup.sh(支持部署到新服务器,自动生成.env+配置全部timer)
|
2026-08-02 22:12:02 +00:00 |
|
gouki
|
99349875ae
|
feat: 续费提醒告警(Telegram/邮件多渠道+续费检查+每日定时+前端控制)
|
2026-08-02 18:55:18 +00:00 |
|
gouki
|
8ba58caaa8
|
feat: AI余额定时自动同步(CLI脚本+systemd每日timer+批量同步接口+前端按钮)
|
2026-08-02 17:43:46 +00:00 |
|
gouki
|
e672086b67
|
feat: 平台预设字典+凭证加密+分库备份+Agent采集+移动端优先前端重做
|
2026-08-01 23:10:31 +00:00 |
|
gouki
|
1dac5d8735
|
feat: 资产 CRUD API + 统计接口 + Vue3 管理前端(可选 API Key 鉴权)
|
2026-08-01 15:39:13 +00:00 |
|
gouki
|
c1116ae84f
|
feat: 添加自动更新脚本(Gitea 拉取 + 服务重启)
|
2026-08-01 13:50:19 +00:00 |
|
gouki
|
e6047e36d5
|
feat: 初始化 vps-manager 资产管理系统(Asset/VPSDetail/DomainDetail/AIAccount 模型 + FastAPI 骨架)
|
2026-08-01 13:18:04 +00:00 |
|