不能用http-proxy同步自建镜像源,因为http-proxy是composer客户端配置,镜像服务(如satis)不读取该配置,其同步行为由自身配置文件(如satis.json中的repositories列表)决定,且需镜像服务器直连上游源。

为什么不能用 http-proxy 同步自建镜像源
企业内网自建 Composer 镜像源(如基于 satis 或 Private Packagist)时,常见误区是给镜像服务本身配 http-proxy 让它“代理拉取外部包”。这行不通——http-proxy 是 Composer 客户端行为,不是镜像服务的同步机制。镜像服务启动后独立运行,它不读取你的 ~/.composer/config.json,也不走 https-proxy 配置。
真正决定同步行为的是镜像服务自身的配置文件:satis.json 里的 repositories 列表、或 Private Packagist 后台的 upstream 设置。这些地方填的是原始源 URL(如 https://packagist.org),而能否拉下来,取决于镜像服务器本身的网络环境和 TLS 能力。
- 镜像服务进程(如 PHP CLI 运行
satis build)必须能直连上游,否则同步失败 - 若上游启用了 mTLS(双向认证),镜像服务需显式加载 client cert + key,不是靠代理透传
-
curl -I https://packagist.org/packages.json在镜像服务器上能通,不代表satis build能通——PHP 的 OpenSSL 上下文可能没继承系统 CA 或没设openssl.cafile
satis.json 中 repositories 的写法陷阱
自建镜像的核心是 satis.json 里声明要同步哪些源。很多人直接复制官方示例,但漏掉关键字段导致静默跳过或元数据损坏:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 必须写
"type": "composer",不能省略或写成"type": "vcs"—— 否则 Satis 不识别为 Composer 源,不会抓packages.json - URL 必须带末尾斜杠:
"url": "https://packagist.org/"✅,"url": "https://packagist.org"❌(Satis 会拼出/packages.json变成//packages.json,404) - 如果上游是私有源且需 Basic Auth,不能把凭证塞进 URL(如
https://user:pass@private.example.com),应改用options.auth字段,避免被日志/监控泄露 - 多个源并存时,
require-all设为true才会递归抓取依赖链;设false(默认)只同步顶层声明的包
本地缓存路径对镜像构建的影响
Satis 构建过程本身不复用 Composer 的 cache-dir,但它会下载 ZIP 包并解压。如果你希望复用已有的 files/ 缓存(比如 CI 流水线中已有大量 .zip),得手动挂载:
- 修改
satis.json的archive配置,指定"directory": "/path/to/shared/files",让 Satis 把 dist ZIP 写到共享路径 - 确保该路径对运行
satis build的用户可读写,且 PHP 进程有权限访问(常见坑:Docker 容器里 UID 不匹配) - 不要依赖
cache-files-dir全局设置——Satis 不读这个配置,它只认自己配置里的archive.directory - 构建完成后,把生成的
dist/目录和packages.json一起发布到 Web 服务,客户端才能通过repo.packagist正常消费
如何验证镜像是否真正同步成功
别只看 satis build 命令返回 Build finished 就认为 OK。实际使用时发现包缺失或版本不对,往往是因为同步阶段已失败但未报错:
- 加
-v参数运行:php bin/satis build satis.json web/ -v,检查输出里是否有Skipping package xxx/yyy或Could not fetch类提示 - 构建后检查
web/packages.json文件大小——空文件或只有{}表明同步完全失败;正常应含数百 KB 的 JSON 数据 - 用
curl -s https://your-mirror.example.com/packages.json | jq '.packages | keys | length'确认包数量是否合理(阿里云镜像约 30 万+ 包,你同步的子集应有对应量级) - 客户端测试时,执行
composer clear-cache && composer require monolog/monolog:^3.0 -vvv,观察Downloading行是否指向你的内网域名,且返回状态码是200而非404
最易被忽略的是 TLS 证书校验:Satis 默认启用 verify_peer,如果内网镜像上游用了自签名证书,必须在 satis.json 加 "options": {"ssl": {"verify_peer": false}},否则静默跳过该源。










