You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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换行格式再粘贴保存
  • 确认使用的私钥没有设置passphrase,如果之前设置过密码,直接重新生成一对无密码的密钥对,公钥通过dokku ssh-keys:add添加到Dokku服务端,私钥更新到GitHub Secrets即可
  • 如果是私钥格式兼容问题,本地执行以下命令生成RSA格式的兼容密钥对:
    ssh-keygen -t rsa -b 4096 -C "github-actions-dokku-deploy" -N "" -f ./dokku_deploy_key
    
    生成后将公钥添加到Dokku,私钥替换Secrets中原有内容即可
  • 以上步骤都验证后仍报错的话,可以临时在工作流中加调试步骤输出私钥内容做对比(调试完成后立刻删除该步骤,避免私钥泄露),确认运行器拿到的私钥没有被截断、没有被特殊字符转义

内容的提问来源于stack exchange,提问作者Alexander V

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 01:57:16