Dokku Deploy GitHub Action 报Permission denied(publickey)错误
GitHub Actions触发Dokku部署私钥加载错误排查
问题现象
配置GitHub Actions自动化工作流,预期逻辑为向main分支提交的PR被合并时,自动触发Dokku部署。对应的.github/workflows/dokku.yml配置如下:
on: pull_request: branches: [main] types: - closed jobs: if_merged: if: github.event.pull_request.merged == true runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 with: fetch-depth: 0 - id: deploy name: Deploy to dokku uses: idoberko2/dokku-deploy-github-action@v1 with: ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }} dokku-host: '123.123.123.123' app-name: 'testapp' remote-branch: 'main'
工作流执行到Deploy to dokku步骤时报错,核心错误信息:
Error loading key "(stdin)": invalid format Warning: Permanently added '123.123.123.123' (ECDSA) to the list of known hosts. Permission denied (publickey). fatal: Could not read from remote repository.
完整执行日志:
Run idoberko2/dokku-deploy-github-action@v1 /usr/bin/docker run --name cd98f7e739ac6046d41c39b90a6cfa22a8060_137fd0 --label 4cd98f --workdir /github/workspace --rm -e INPUT_SSH-PRIVATE-KEY -e INPUT_DOKKU-HOST -e INPUT_APP-NAME -e INPUT_REMOTE-BRANCH -e INPUT_DOKKU-USER -e INPUT_GIT-PUSH-FLAGS -e HOME -e GITHUB_JOB -e GITHUB_REF -e GITHUB_SHA -e GITHUB_REPOSITORY -e GITHUB_REPOSITORY_OWNER -e GITHUB_RUN_ID -e GITHUB_RUN_NUMBER -e GITHUB_RETENTION_DAYS -e GITHUB_RUN_ATTEMPT -e GITHUB_ACTOR -e GITHUB_WORKFLOW -e GITHUB_HEAD_REF -e GITHUB_BASE_REF -e GITHUB_EVENT_NAME -e GITHUB_SERVER_URL -e GITHUB_API_URL -e GITHUB_GRAPHQL_URL -e GITHUB_REF_NAME -e GITHUB_REF_PROTECTED -e GITHUB_REF_TYPE -e GITHUB_WORKSPACE -e GITHUB_ACTION -e GITHUB_EVENT_PATH -e GITHUB_ACTION_REPOSITORY -e GITHUB_ACTION_REF -e GITHUB_PATH -e GITHUB_ENV -e GITHUB_STEP_SUMMARY -e RUNNER_OS -e RUNNER_ARCH -e RUNNER_NAME -e RUNNER_TOOL_CACHE -e RUNNER_TEMP -e RUNNER_WORKSPACE -e ACTIONS_RUNTIME_URL -e ACTIONS_RUNTIME_TOKEN -e ACTIONS_CACHE_URL -e GITHUB_ACTIONS=true -e CI=true -v "/var/run/docker.sock":"/var/run/docker.sock" -v "/home/runner/work/_temp/_github_home":"/github/home" -v "/home/runner/work/_temp/_github_workflow":"/github/workflow" -v "/home/runner/work/_temp/_runner_file_commands":"/github/file_commands" -v "/home/runner/work/test/test":"/github/workspace" 4cd98f:7e739ac6046d41c39b90a6cfa22a8060 "***" "dokku" "123.123.123.123" "testapp" "main" "" Agent pid 11 Error loading key "(stdin)": invalid format # 123.123.123.123:22 SSH-2.0-OpenSSH_8.2p1 Ubuntu-4ubuntu0.5 # 123.123.123.123:22 SSH-2.0-OpenSSH_8.2p1 Ubuntu-4ubuntu0.5 # 123.123.123.123:22 SSH-2.0-OpenSSH_8.2p1 Ubuntu-4ubuntu0.5 GIT_COMMAND=git push deploy 38f6c6ba47f4d40a7d19c5cf9a9b148ebb88996e:refs/heads/main Warning: Permanently added '123.123.123.123' (ECDSA) to the list of known hosts. Permission denied (publickey). fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists.
已完成排查项
- 本地环境执行
git push dokku可正常完成部署,无权限异常 - 已将对应SSH私钥添加到仓库GitHub Secrets配置中
- Dokku所在远程服务器执行
dokku ssh-keys:list可查询到已配置的admin公钥记录,返回结果如下:
dokku ssh-keys:list SHA256:T4rHySQTzDRguZ0t7d7NhN2DlkNF0+kBfkxMU/P0zAk NAME="admin" SSHCOMMAND_ALLOWED_KEYS="no-agent-forwarding,no-user-rc,no-X11-forwarding,no-port-forwarding"
根因定位
核心报错Error loading key "(stdin)": invalid format直接指向SSH私钥加载失败,后续的公钥权限拒绝是私钥未成功加载的连带问题,和Dokku服务端配置、工作流触发逻辑无关。
常见触发原因按概率从高到低排序:
- 私钥复制到GitHub Secrets时格式损坏:最常见的是漏了私钥首尾的标识行,或是复制时引入了多余空格、制表符、错误换行,从Windows系统复制时带入CRLF换行符也会导致Linux运行器无法识别私钥格式
- 使用的SSH私钥设置了passphrase密码:本次用的
idoberko2/dokku-deploy-github-action不支持加载带密码的私钥,会直接抛出格式错误 - 私钥本身存在格式兼容问题:使用过高版本OpenSSH生成的默认格式私钥,可能在Action的运行环境中无法识别
解决方案
按顺序操作排查即可:
- 重新核对GitHub Secrets中存储的
SSH_PRIVATE_KEY内容- 必须完整保留私钥首尾的标识行(OPENSSH格式为
-----BEGIN OPENSSH PRIVATE KEY-----/-----END OPENSSH PRIVATE KEY-----,RSA格式为-----BEGIN RSA PRIVATE KEY-----/-----END RSA PRIVATE KEY-----),缺一行都会加载失败 - 粘贴时不要带多余的前缀、后缀空格,所有换行要和本地可正常使用的私钥文件完全一致
- 如果是从Windows系统复制内容,先将私钥转为LF换行格式再粘贴保存
- 必须完整保留私钥首尾的标识行(OPENSSH格式为
- 确认使用的私钥没有设置passphrase,如果之前设置过密码,直接重新生成一对无密码的密钥对,公钥通过
dokku ssh-keys:add添加到Dokku服务端,私钥更新到GitHub Secrets即可 - 如果是私钥格式兼容问题,本地执行以下命令生成RSA格式的兼容密钥对:
生成后将公钥添加到Dokku,私钥替换Secrets中原有内容即可ssh-keygen -t rsa -b 4096 -C "github-actions-dokku-deploy" -N "" -f ./dokku_deploy_key - 以上步骤都验证后仍报错的话,可以临时在工作流中加调试步骤输出私钥内容做对比(调试完成后立刻删除该步骤,避免私钥泄露),确认运行器拿到的私钥没有被截断、没有被特殊字符转义
内容的提问来源于stack exchange,提问作者Alexander V
相关产品推荐
相关产品推荐

