Laravel Forge:如何为单个Github仓库添加多个部署密钥
问题根因
你碰到的Key is already in use报错和staging部署权限问题,核心原因是Laravel Forge单台服务器默认会全局复用forge用户的同一套SSH密钥访问Git仓库。你在Forge面板看到的两个站点的Deploy Key存在显示缓存,实际staging站点拉代码时调用的SSH公钥,和你之前给生产站点添加的Deploy Key完全一致。Github规则不允许同一个公钥重复绑定到同一个仓库的Deploy Key列表,所以你加不上第二个密钥,staging站点拉代码时自然会报仓库无权限的错误。
方案1:修复双Deploy Key配置(适配服务器自主拉取代码的模式)
按以下步骤操作即可正常添加第二个独立Deploy Key:
- 登录Forge服务器,不要用面板自动生成的staging站点密钥,手动生成专属ED25519密钥对,执行命令:
ssh-keygen -t ed25519 -C "staging-site-deploy" -f /home/forge/.ssh/staging_id_ed25519 # 执行后直接回车两次,不要设置密钥密码 - 执行
cat /home/forge/.ssh/staging_id_ed25519.pub复制输出的公钥内容,到Github仓库Deploy Key页面添加,此时不会再报密钥重复错误。 - 编辑服务器上的SSH配置文件
/home/forge/.ssh/config,添加如下配置,给staging站点指定独立密钥:Host github-staging HostName github.com User git IdentityFile /home/forge/.ssh/staging_id_ed25519 IdentitiesOnly yes - 进入staging站点的根目录,修改
.git/config里的remote地址,把原有git@github.com:你的账号/仓库名.git替换为git@github-staging:你的账号/仓库名.git,保存后手动在staging目录执行一次git pull验证权限正常即可。
方案2:最优Github Actions配置(推荐)
这个方案不需要折腾服务器上的多密钥适配,维护成本更低,还能把CI校验流程和部署打通,避免问题代码上线,是目前这类分支对应环境部署场景的通用最优解:
- 先把两个站点在Forge面板里的「快速部署」功能关掉,避免重复触发。
- 在仓库的
.github/workflows目录下新建deploy.yml,写入以下配置,把两个环境的部署逻辑合并维护,不需要单独写两个工作流文件:
name: Forge Auto Deploy on: push: branches: [ main, develop ] jobs: deploy: runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4 # 按需添加CI校验步骤:依赖安装、单元测试、代码规范检查、前端资源构建等,校验不通过会直接终止部署 - name: Setup PHP uses: shivammathur/setup-php@v2 with: php-version: '8.2' # 替换为项目实际使用的PHP版本 - name: Install composer dependencies run: composer install --no-dev --prefer-dist --no-interaction - name: Build frontend run: | npm ci npm run build # 按触发分支匹配对应环境的部署钩子 - name: Deploy to production if: github.ref == 'refs/heads/main' run: curl -s ${{ secrets.FORGE_DEPLOYMENT_HOOK_PRODUCTION }} - name: Deploy to staging if: github.ref == 'refs/heads/develop' run: curl -s ${{ secrets.FORGE_DEPLOYMENT_HOOK_STAGING }}
- 彻底解决服务器拉代码权限问题:放弃SSH协议拉取,改用HTTPS+PAT鉴权,不需要配置任何Deploy Key:
- 生成一个仅勾选
repo:read权限的Github Personal Access Token,不要开通多余权限 - 进入Forge站点管理页面,把两个站点的Git仓库地址改成
https://你的PAT@github.com/你的账号/仓库名.git,分支分别对应main和develop即可,同一个PAT可以给两个站点复用,完全不会有密钥冲突问题。
- 生成一个仅勾选
注意:PAT只授予仓库读取的最小权限,定期轮换,避免泄露后产生安全风险。
内容的提问来源于stack exchange,提问作者Baspa
相关产品推荐
相关产品推荐

