Docker部署的GitLab-CE V16.5.1服务器端SSH密钥配置方法咨询
Docker部署的GitLab-CE V16.5.1服务器端SSH密钥配置方法咨询
嘿,我刚好处理过Docker部署的GitLab CE 16.x版本的SSH密钥配置问题,给你理清楚正确的步骤,解决你提到的旧版本教程失效和路径困惑的问题:
首先明确下,GitLab 14之后已经统一了密钥存储路径,不管是原生安装还是Docker部署,核心逻辑是一致的,只是Docker环境下要格外注意数据持久化,避免容器重启后配置丢失。我分两种核心场景给你说明:
场景1:配置GitLab服务器的SSH主机密钥(客户端连接时的服务器验证密钥)
GitLab 16在Docker容器首次启动时,会自动在/var/opt/gitlab/sshd/目录下生成默认的主机密钥(比如ssh_host_rsa_key、ssh_host_ed25519_key等)。如果你需要替换成自定义的主机密钥,按以下步骤操作:
- 进入运行中的GitLab容器
执行命令:docker exec -it <你的GitLab容器名称/ID> /bin/bash
比如容器名叫gitlab-ce,就是docker exec -it gitlab-ce /bin/bash
- 进入运行中的GitLab容器
- 准备自定义主机密钥(如果需要)
你可以在宿主机生成密钥后复制到容器,或者直接在容器内生成:ssh-keygen -t ed25519 -f /var/opt/gitlab/sshd/ssh_host_ed25519_key -N ""
- 准备自定义主机密钥(如果需要)
- 修正密钥权限(必须操作,否则SSH服务无法读取)
chown git:git /var/opt/gitlab/sshd/ssh_host_* chmod 600 /var/opt/gitlab/sshd/ssh_host_*- 重启SSH服务生效
gitlab-ctl restart sshd
- 重启SSH服务生效
- 持久化配置(关键)
为了避免容器重启后密钥丢失,启动GitLab容器时要挂载/var/opt/gitlab/sshd目录到宿主机:
比如启动命令里加上:-v /宿主机本地路径/gitlab-sshd:/var/opt/gitlab/sshd
- 持久化配置(关键)
场景2:配置GitLab服务器端git用户的SSH密钥(解决CI/CD流水线HTTP认证错误)
你提到的流水线出现HTTP Basic Access Denied错误,大概率是因为流水线用HTTPS拉取仓库时认证失败,改用SSH认证就需要给GitLab容器内的git用户配置SSH密钥(这个用户是GitLab服务的默认运行用户):
- 进入容器并切换到git用户
docker exec -it <容器名称/ID> /bin/bash su - git # 注意短横,确保加载git用户的环境变量- 准备ssh目录和密钥
如果.ssh目录不存在就创建:
把你的私钥内容复制到mkdir -p ~/.ssh && chmod 700 ~/.ssh~/.ssh/id_rsa(或你指定的密钥文件名),然后修正权限:
对应的公钥可以放到chmod 600 ~/.ssh/id_rsa~/.ssh/id_rsa.pub,权限设为chmod 644 ~/.ssh/id_rsa.pub- 准备ssh目录和密钥
- 可选:配置SSH简化认证(比如跳过主机密钥检查)
如果流水线需要连接外部Git仓库,可在~/.ssh/config里加以下内容:
然后给config文件设权限:Host * StrictHostKeyChecking no UserKnownHostsFile /dev/nullchmod 600 ~/.ssh/config- 可选:配置SSH简化认证(比如跳过主机密钥检查)
- 重启GitLab服务生效
切换回root用户后执行:gitlab-ctl restart
- 重启GitLab服务生效
- 持久化配置
同样要把/var/opt/gitlab/.ssh目录挂载到宿主机,启动容器时加上:-v /宿主机本地路径/gitlab-git-ssh:/var/opt/gitlab/.ssh
- 持久化配置
关键注意事项
- GitLab 16完全废弃了v14及之前的旧密钥路径(比如
/etc/gitlab/ssh),所有相关配置都统一到/var/opt/gitlab/下的对应目录,别再用旧教程里的路径了 - 所有密钥文件和目录的权限必须严格按要求设置,SSH服务对权限要求非常苛刻,权限不对直接导致认证失败
- 流水线里记得把仓库地址改成SSH格式(比如
git@<你的GitLab域名>:<项目路径>.git),而不是HTTPS格式,这样才会触发SSH认证
备注:内容来源于stack exchange,提问作者Factor Three




