如何在GitHub创建组织级deploy key?规避Machine User席位占用问题
解决GitHub组织级Deploy Key替代方案(无需Machine User席位)
我来给你分享几个适配你场景的实用方案,完美解决从Bitbucket迁移后,GitHub没有组织级Deploy Key的问题,还不用占用团队席位:
方案1:批量配置仓库级Deploy Key(最直接高效)
虽然GitHub没有组织级Deploy Key,但我们可以用脚本批量给目标仓库添加服务器的密钥,避免手动重复操作:
- 先给每台服务器生成独立的SSH密钥对:
# 给服务器1生成密钥,一路回车即可 ssh-keygen -t ed25519 -C "server1-deploy@your-org.com" # 服务器2同理 ssh-keygen -t ed25519 -C "server2-deploy@your-org.com" - 安装并配置GitHub CLI(
gh),确保已经登录并有权限操作组织内的仓库 - 编写一个简单的bash脚本,批量给3个仓库添加服务器的公钥:
# 替换成你的组织名和仓库列表 ORG_NAME="your-org" REPOS=("repo-a" "repo-b" "repo-c") # 服务器1的公钥路径 SERVER1_PUB_KEY="/path/to/server1_id_ed25519.pub" # 服务器2的公钥路径 SERVER2_PUB_KEY="/path/to/server2_id_ed25519.pub" # 给所有仓库添加服务器1的deploy key(--write参数如果需要部署时推送代码,否则去掉) for repo in "${REPOS[@]}"; do gh repo deploy-key add "$SERVER1_PUB_KEY" --repo "$ORG_NAME/$repo" --write done # 同理添加服务器2的deploy key for repo in "${REPOS[@]}"; do gh repo deploy-key add "$SERVER2_PUB_KEY" --repo "$ORG_NAME/$repo" --write done - 运行脚本后,两台服务器的密钥就都能访问这3个仓库了,全程不用创建额外用户,也不占席位。
方案2:用GitHub Actions + 组织级Secrets实现自动化部署
如果你的部署流程可以自动化,这个方案更优雅:
- 给每台服务器生成SSH密钥对,将公钥添加到服务器的
~/.ssh/authorized_keys文件中,确保GitHub Actions能通过SSH连接服务器 - 登录GitHub组织后台,进入
Settings > Secrets and variables > Actions,添加以下组织级Secrets:SERVER1_SSH_KEY:服务器1的私钥内容SERVER1_HOST:服务器1的IP或域名SERVER2_SSH_KEY:服务器2的私钥内容SERVER2_HOST:服务器2的IP或域名
- 在每个仓库的
.github/workflows/deploy.yml中编写部署流程,示例:name: Deploy to Servers on: push: branches: [ main ] jobs: deploy: runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4 - name: Deploy to Server 1 uses: appleboy/ssh-action@v1.0.3 with: host: ${{ secrets.SERVER1_HOST }} username: your-server-username key: ${{ secrets.SERVER1_SSH_KEY }} script: | cd /path/to/deploy-dir git pull origin main # 这里添加你的部署命令,比如重启服务等 - name: Deploy to Server 2 uses: appleboy/ssh-action@v1.0.3 with: host: ${{ secrets.SERVER2_HOST }} username: your-server-username key: ${{ secrets.SERVER2_SSH_KEY }} script: | cd /path/to/deploy-dir git pull origin main # 部署命令 - 这样每次代码推送到main分支,Actions会自动把代码部署到两台服务器,所有密钥都存在组织级Secrets里,不用每个仓库单独配置,也不占席位。
方案3:GitHub App替代Machine User(最规范安全)
如果你追求长期的规范性和安全性,GitHub官方推荐用GitHub App替代Machine User,而且不占用团队席位:
- 在GitHub组织后台创建一个新的GitHub App,配置权限:给仓库分配
Contents的读写权限(根据你的部署需求),并启用“Repository permissions” - 生成App的私钥,下载到本地
- 在服务器上编写脚本,用私钥生成短期的访问令牌(有效期最长1小时),然后用HTTPS方式拉取代码:
# 这里需要用脚本生成令牌,比如用Python或Node.js,以Python为例: # 安装PyGitHub库:pip install PyGitHub from github import GithubIntegration import os APP_ID = "your-app-id" PRIVATE_KEY_PATH = "/path/to/app-private-key.pem" ORG_NAME = "your-org" REPO_NAME = "your-repo" integration = GithubIntegration(APP_ID, open(PRIVATE_KEY_PATH).read()) token = integration.get_access_token(integration.get_installation(ORG_NAME, REPO_NAME).id).token # 然后用令牌拉取代码 os.system(f"git clone https://x-access-token:{token}@github.com/{ORG_NAME}/{REPO_NAME}.git") - 这个方案的优势是令牌短期有效,比长期SSH密钥更安全,而且App不占用团队席位,是企业级场景的最佳实践。
总结
- 如果只是需要快速实现服务器访问仓库,方案1最直接,几分钟就能搞定
- 如果想实现自动化部署,方案2更省心,一劳永逸
- 如果追求规范和安全,方案3是长期最优解
内容的提问来源于stack exchange,提问作者Luiz
相关产品推荐
相关产品推荐

