Gitlab 7.10 安装没有创建正确的 ssh git 用户配置?

Gitlab 7.10 安装没有创建正确的 ssh git 用户配置?

我正在家庭 VM 实验室上设置 Gitlab 实例,并且对 Gitlab 中配置 SSH 的方式感到困惑,因此我希望了解我是否做错了什么或者 Gitlab 是否使用了我不知道的一些约定。

我刚刚在 ESXi 5.5 U2 下的 CentOS 7 上安装了 Gitlab 7.10 CE yum install gitlab-ce。在第一次重新配置 gitlab 之前,我进行了修改/etc/gitlab/gitlab.rb以使用外部 postgresql 数据库,定义外部 SMTP 服务器、外部端口和外部 git 存储库目录(来自我的 NAS 的 NFS 支持的目录)。

一切都运行顺利(gitlab-ctl reconfigure没有异常,gitlab-rake gitlab:check没有解决错误,我可以登录到实例,我可以创建项目,并且我看到更改传播到 NFS 支持的目录) - 直到我第一次尝试使用从项目网页生成的说明推送到 git 存储库(我正在使用 msysgit 推送到 git repo,如果这有一点点相关性的话)。

除了 gitlab 嵌入的实例/安装之外,服务器上没有其他实例/安装git- 官方说明中没有提到需要这样做,这听起来很合理;为什么我需要两个 git 实例?听起来很麻烦。

如果需要的话,我会gitlab-rake在这里发布检查输出作为更新,但我首先想减少帖子的大小。

客户端用户 ssh 密钥 -> 通过 Gitlab web UI 添加
服务器 git bin 路径 ->/opt/gitlab/embedded/bin/git
服务器 git home 目录 ->/var/opt/gitlab/
服务器 git shell -> sh
gitlab 项目组 ->algorithms

以下是我努力的时间表:

行动

$ git push -u origin master
Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

回复:将授权的密钥添加到git用户的.ssh目录中。

行动

$ git push -u origin master
sh: git-receive-pack: command not found
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

$ ssh [email protected] echo \$PATH
/usr/local/bin:/usr/bin

回复:将~git/.profile文件添加到git用户,并导出嵌入的 git 路径。将~git/.ssh/environment文件添加到用户,并导出嵌入的 git 路径(用于非交互式 shell 模式)。修改/etc/ssh/sshd_config以接受新配置。重新启动sshd

行动

$ ssh [email protected] echo \$PATH
/usr/local/bin:/usr/bin:/opt/gitlab/embedded/bin/

$ git push -u origin master
fatal: 'algorithms/sedgewick-book.git' does not appear to be a git repository
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

行动(动机所以帖子):即使我没有使用非标准端口,也添加了明确的AllowUsers <...> git指令。sshd

回复:无。错误消息与之前相同。

行动:我开始怀疑 SSH URL 中缺少某些内容,因此我开始使用远程存储库的完整路径,尽管我不应该这样做,而且 Gitlab 在初始项目设置期间也不会生成它。

$ git push origin master
Counting objects: 6, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (5/5), 520 bytes | 0 bytes/s, done.
Total 5 (delta 0), reused 0 (delta 0)
remote: GitLab: No such user or key
To [email protected]:/mnt/git/repositories/algorithms/sedgewick-book.git
 ! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to '[email protected]:/mnt/git/repositories/algorithms/sedgewick-book.git'

回复:无。请参阅上面的错误。


到了这一步,我必须承认失败了。我尝试过使用不同的 gitlab 命名空间(即我自己的用户名而不是项目组),我尝试过对齐确切地我的 gitlab 用户名与 SSH 密钥上使用的用户名相同,我尝试通过 Gitlab UI 在 origin/master 上创建提交,然后取消保护分支 - 最终结果总是一样的,出现上述错误。

我非常怀疑我应该指定存储库的绝对路径(客户端应该完全不知道存储库位于何处!)并且 Gitlab 组没有我能看到的任何元数据可能会干扰并在表下注入一些额外的数据(我将它们视为项目的简单便利容器)。

最后,这个所以帖子有一个与我非常相似的问题,但提出的解决方案没有多大意义 - 就好像我应该为每个组创建一个单独的 Gitlab 用户,这将是完全疯狂的,更不用说我已经尝试将存储库路径名与 Gitlab 用户名对齐,但无济于事(nota bene,这也是非常值得怀疑的,但我很绝望,所以我尝试了一下)。

错误表明 Gitlab 不知道如何找到我正在推送的(git)用户,但我不知道还能尝试什么——我已将 SSH 密钥添加到 Gitlab 用户,并尝试将 Gitlab 用户名与 git 客户端名称(用于 SSH 公钥本身)对齐。

我不知道还能尝试什么。有什么提示吗?

答案1

我能够做到这一点——我将添加解释,希望其他人可以避免像我一样经历这样的麻烦。

解决方案很简单,但报告的错误具有误导性,根本原因出乎意料。我只是偶然发现了关联准确地描述了原因和解决方案。

本质上,问题的根源在于我手动将客户端的授权 SSH 密钥添加到~git/.ssh/authorized_keys。Gitlab 非常不喜欢这种做法,因为它会将一些关于其存储库的额外元数据信息作为密钥本身的一部分插入 - 你应该将 SSH 密钥添加到用户的个人资料中独自通过 Web UI。

我首先选择手动添加 SSH 密钥的原因是,Permission denied (publickey,gssapi-keyex,gssapi-with-mic)尽管定义了 SSH 密钥,但我仍然收到错误,因此我选择了上述操作。

可以说,这可能是一个值得怀疑的设计选择,而且看起来像是一个 hack - 我完全不相信除了钥匙之外的任何东西明智的做法是authorized_keys:它似乎不是为保存元数据信息而设计的(人们本质上是在撒谎,因为除了密钥之外,它还保存了“其他东西”),并且它与现有的关于在文件中放置密钥的最佳实践相矛盾(这是我第一次看到这样的事情)。另一方面,有人可能会说 Gitlab 的git用户实际上是 Gitlab 的内部组件,你不需要也不希望手动篡改它。可以通过改进文档来解决这个问题。

相关内容