如何在没有SSH权限的服务器上使用Composer安装私有仓库? (HTTPS与Token)

13次阅读

composer install 在无 ssh 权限时失败,因默认用 SSH 克隆私有仓库却缺少密钥;应改用 httpS+Token,并通过 auth.json 配置凭据、git config –global url..insteadOf 替换域名,同时确保文件权限为600且配置对运行用户生效。

如何在没有SSH权限的服务器上使用Composer安装私有仓库? (HTTPS与Token)

为什么 composer install 在无 SSH 权限时会失败?

因为 Composer 默认尝试用 SSH 协议克隆私有 Git 仓库(如 git@github.com:org/repo.git),而服务器没有 SSH key 或 ssh-agentgit clone 直接报错:Permission denied (publickey)。此时必须强制改用 https + 认证方式,且不能依赖交互式输入密码。

如何用 GitHub/gitlab Token 替换 SSH URL 并全局生效?

关键是在 composer.json 中把私有包的 repository 地址从 SSH 改为 HTTPS,并注入 Token;同时配置 Git 让它对目标域名自动带上凭据,避免 Composer 调用 git 时卡住。

  • 修改 composer.json 中的 repositories:将 "url": "git@github.com:org/private-package.git" 换成 "url": "https://YOUR_TOKEN@github.com/org/private-package.git"
  • 运行命令让 Git 记住凭据(避免每次 clone 都提示):
    git config --global url."https://YOUR_TOKEN@github.com/".insteadOf "https://github.com/"
  • GitLab 同理,把域名换成 gitlab.com 或你的自建地址

auth.json环境变量哪种方式更安全可靠?

优先用 auth.json(项目级),它比环境变量更稳定、不依赖 shell 初始化,也避免 Token 泄露到进程列表。但注意路径和权限:

  • auth.json 必须放在项目根目录或 COMPOSER_HOME 下(默认 ~/.composer/auth.json
  • 内容格式严格:
    {     "http-basic": {         "github.com": {             "username": "YOUR_TOKEN",             "password": ""         }     } }
  • 文件权限设为 600chmod 600 auth.json),否则 Composer 会拒绝读取
  • Token 类型:GitHub 用 classic token(勾选 repo scope),GitLab 用 Personal access Tokenread_repository

HTTPS 克隆失败的常见报错与绕过技巧

即使配了 Token,仍可能遇到 Could not fetch https://.../info/refs?service=git-upload-packssl 证书错误——这通常不是认证问题,而是网络或 Git 配置导致:

  • 确认 Git 版本 ≥ 2.9(旧版不支持 insteadOf 凭据注入):git --version
  • 禁用 SSL 验证(仅调试用,生产禁用):
    git config --global http.sslVerify false
  • 如果服务器 dns 不通 GitHub,可临时加 hosts:140.82.112.4 github.com
  • Composer v2+ 默认启用 secure-http,若私有 Git 服务用自签名 HTTPS,需在 composer.json 加:
    "config": {     "secure-http": false }

实际部署时最易忽略的是 auth.json 文件权限和 Git 的 insteadOf 配置是否对当前运行 Composer 的用户生效——尤其是用 www-data 或容器非 root 用户执行时,--global 配置可能没加载。

text=ZqhQzanResources