私有composer仓库无内置备份能力,灾备必须外部实现;需分层备份satis.json配置、原始git仓库及packages.json等4类核心json文件,漏任一类将导致恢复失败。

私有 Composer 仓库本身不存备份能力,所有“灾备”必须靠外部机制实现——不是配个镜像 URL 就算容灾,而是得能秒级切换、数据可验证、恢复后元数据完整。
为什么直接 rsync /var/www/satis 目录不能当备份
因为 Satis 生成的是静态文件,但关键状态不在文件里:Git 仓库的 HEAD、标签、分支更新时间、包依赖图谱缓存(如 packages.json 中的 providers 块)都依赖构建时的上下文。只拷目录会导致:
- 恢复后
composer install报Could not resolve packages—— 因为providers-latest.json缺失或时间戳错乱 - 新提交的 Git tag 不被收录,
require指定dev-feature或v1.2.3直接 404 - 多个 Satis 实例间
packages.json的lastUpdated字段不一致,客户端缓存行为不可预测
真正可用的备份项只有这三类
必须按粒度分层备份,漏掉任何一类都会导致恢复失败:
-
satis.json配置文件:含repositories列表、require-all开关、output-dir路径 —— 它是重建逻辑的唯一入口 - 原始 Git 仓库(非 Satis 输出目录):比如
git@gitlab.internal:php/libs/payment.git,所有 tag/branch/commit 历史必须完整保留;Satis 只是它的只读视图 - 构建产物中的 4 个核心 JSON 文件:
packages.json、provider-*.json、includes/*.json、dist/下的 ZIP 元数据(如有启用 dist)
注意:dist/ 目录里的 ZIP 包本身可不备份(重下载快),但 ZIP 对应的 dist-url 和 shasum 必须从 JSON 里提取并落库,否则恢复后 composer install --prefer-dist 会降级走 source,拖慢部署。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
灾备切换时最常踩的三个坑
切换到备用仓库不是改个 DNS 就完事,客户端侧必须同步清理缓存、重写配置、验证路径:
-
composer config --unset repositories不生效?因为你没删composer.json里的repositories数组 —— 项目级配置永远压倒全局,必须手动编辑该文件或用脚本替换 - 备用源 URL 少了末尾
/(如写成https://satis-backup.internal而非https://satis-backup.internal/),Composer 会拼出/packages.json变成/packages.json→/packages.json错误路径,返回 404 后静默 fallback 到 packagist.org - 没禁用
"packagist.org": false,即使切到了备用源,Composer 仍会并发请求官方源,导致私有包命中率归零;错误日志里看不到报错,只看到Loading from cache然后卡住
自动化灾备脚本必须包含的四个动作
手动操作太慢,CI/CD 流水线或监控告警触发时,脚本要闭环完成:
- 用
curl -s -f -m 5 https://satis-backup.internal/packages.json -o /dev/null探活,只认 HTTP 200,超时/502/404 全部失败 - 执行
composer config repositories.0.url https://satis-backup.internal/(索引 0 是第一个源),再composer config --unset repositories.1-清掉多余源 - 强制清空
$(composer config --global cache-dir)/repo/https---satis-backup-internal/目录,避免坏缓存污染 - 运行
composer update --dry-run -v | head -n 10验证首行输出是否为备用源域名,而不是packagist.org或本地路径
真实生产环境里,最难的不是备份,是验证恢复后的包能否被正确解析依赖树——composer show vendor/package 返回 404 不代表源挂了,很可能是 providers-latest.json 里没写入该包的 provider 映射,这个细节 90% 的灾备方案都漏检。










