Dokku git push 时要求输入 Git 用户密码怎么排查?
【免费下载链接】dokkuA docker-powered PaaS that helps you build and manage the lifecycle of applications项目地址: https://gitcode.com/GitHub_Trending/do/dokku
在 Dokku 服务器上通过git push部署应用时,如果你在本地机器上执行 push 命令后,终端没有直接进入 SSH 免密连接,而是停下来要求你输入 Git 用户的密码,说明 Dokku 期望的 SSH 密钥认证没有走通。Dokku 的推送认证设计上是基于 SSH 公钥/私钥对的,被要求输入密码本身就是一个明确的故障信号,而不是正常的认证流程。这篇内容基于 Dokku 官方文档,说明这个现象的原因和对应的排查步骤。
症状识别
Dokku 故障排查文档中记录了这一场景。push 时可能出现类似如下的报错(文档示例):
fatal: 'NAME' does not appear to be a git repository fatal: Could not read from remote repository.随后 git 会要求输入用户密码。注意区分另一种容易混淆的现象:Connection closed by <host> port 22加Could not read from remote repository,文档将其归因于dokku用户被系统的/etc/security/access.conf禁用了 SSH 访问,与"要求输入密码"不是同一条排查路径,不要混在一起处理。
原因
文档给出的结论是:被要求输入密码,是因为 SSH 找不到你的私钥(SSH secret key)。
具体机制是:你把公钥添加到了 Dokku 服务器,但如果与这对公钥对应的私钥不在 SSH 默认查找的位置~/.ssh/id_rsa,SSH 客户端就不会使用它,认证回退到密码提示。
排查步骤
1. 确认公钥已注册在 Dokku 服务器上
SSH 登录到 Dokku 主机,列出当前已配置的公钥:
dokku ssh-keys:list文档示例输出(示例结果):
SHA256:ABC123ABC123+abc123abc123Zabc123abcZ123abc NAME="admin" SSHCOMMAND_ALLOWED_KEYS="no-agent-forwarding,no-user-rc,no-X11-forwarding,no-port-forwarding"输出包含密钥指纹、KEY_NAME和 SSH 选项列表。如果你的密钥不在列表中,需要先添加。新版本使用ssh-keys插件,旧版本使用sshcommand二进制:
dokku ssh-keys:add KEY_NAME path/to/id_rsa.pubpath/to/id_rsa.pub是公钥文件在服务器上的路径,路径中的特殊字符(如~)按dokku用户上下文解析;命令成功后会输出该密钥的指纹。也可以把公钥内容通过管道传入:
cat path/to/id_rsa.pub | dokku ssh-keys:add KEY_NAME2. 确认本地 git remote 的用户名是 dokku
Dokku 部署文档明确要求:远程用户名必须是dokku,否则 push 会失败。SSH(Git)用户固定是dokku,这是dokku二进制执行所有操作时使用的系统用户。
# from your local machine # the remote username *must* be dokku or pushes will fail git remote add dokku dokku@dokku.me:ruby-getting-started其中dokku.me应替换为你的 Dokku 服务器域名或 IP,ruby-getting-started替换为你的应用名。文档同时说明:部分工具不支持这种短写法,需要改为ssh://dokku@dokku.me:ruby-getting-started形式。
3. 让 SSH 指向正确的私钥
这是修复"要求输入密码"的关键步骤。如果你的私钥不在默认位置~/.ssh/id_rsa,需要在本机的~/.ssh/config中为对应的主机指定私钥路径:
Host DOKKU_HOSTNAME IdentityFile "~/.ssh/KEYNAME"其中DOKKU_HOSTNAME替换为你的 Dokku 服务器域名或 IP,KEYNAME替换为私钥的实际路径。这里的占位符是文档原文写法,需要你按实际环境替换后保存。
另外,部署文档提示:本地开发环境中私钥应注册到ssh-agent。如果 push 时遇到permission denied报错,可以用下面的方式注册私钥:
ssh-add -k ~/<your private key>其中<your private key>替换为你的私钥实际路径。
验证
- 运行
dokku ssh-keys:list,确认你的公钥指纹出现在列表中; - 在本地仓库重新执行
git push dokku main(分支名按你的仓库实际使用),此时不应再出现密码提示,push 直接进入 Dokku 的构建输出(如-----> Building <app> from herokuish...,最终输出=====> Application deployed:及应用 URL,见部署文档示例输出)。
如果 push 不再要密码但仍然被拒绝(例如出现! [remote rejected] master -> master (pre-receive hook declined)),那属于部署流程内部的其他故障,Dokku 故障排查文档建议先开启 trace 模式(dokku trace:on)收集完整日志再定位,与本节的认证问题是独立的两件事。
适用边界
- 本文仅覆盖 push 时"要求输入 Git 用户密码"这一症状;
Connection closed by <host> port 22(/etc/security/access.conf禁用了 dokku 用户访问)和pre-receive hook declined(部署流程内部失败)在文档中是单独的条目,不要套用本节的IdentityFile配置去解决。 - 旧版本 Dokku 用
sshcommand acl-add添加公钥,文档说明新版改用ssh-keys插件管理密钥,排查前先用dokku ssh-keys:list确认服务器版本对应的管理方式。
参考文档:故障排查、用户管理(SSH 密钥)、应用部署。
【免费下载链接】dokkuA docker-powered PaaS that helps you build and manage the lifecycle of applications项目地址: https://gitcode.com/GitHub_Trending/do/dokku
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考