You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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_keyssh_host_ed25519_key等)。如果你需要替换成自定义的主机密钥,按以下步骤操作:

    1. 进入运行中的GitLab容器
      执行命令:docker exec -it <你的GitLab容器名称/ID> /bin/bash
      比如容器名叫gitlab-ce,就是docker exec -it gitlab-ce /bin/bash
    1. 准备自定义主机密钥(如果需要)
      你可以在宿主机生成密钥后复制到容器,或者直接在容器内生成:
      ssh-keygen -t ed25519 -f /var/opt/gitlab/sshd/ssh_host_ed25519_key -N ""
    1. 修正密钥权限(必须操作,否则SSH服务无法读取)
    chown git:git /var/opt/gitlab/sshd/ssh_host_*
    chmod 600 /var/opt/gitlab/sshd/ssh_host_*
    
    1. 重启SSH服务生效
      gitlab-ctl restart sshd
    1. 持久化配置(关键)
      为了避免容器重启后密钥丢失,启动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服务的默认运行用户):

    1. 进入容器并切换到git用户
    docker exec -it <容器名称/ID> /bin/bash
    su - git  # 注意短横,确保加载git用户的环境变量
    
    1. 准备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
    1. 可选:配置SSH简化认证(比如跳过主机密钥检查)
      如果流水线需要连接外部Git仓库,可在~/.ssh/config里加以下内容:
    Host *
      StrictHostKeyChecking no
      UserKnownHostsFile /dev/null
    
    然后给config文件设权限:chmod 600 ~/.ssh/config
    1. 重启GitLab服务生效
      切换回root用户后执行:gitlab-ctl restart
    1. 持久化配置
      同样要把/var/opt/gitlab/.ssh目录挂载到宿主机,启动容器时加上:
      -v /宿主机本地路径/gitlab-git-ssh:/var/opt/gitlab/.ssh

关键注意事项

  1. GitLab 16完全废弃了v14及之前的旧密钥路径(比如/etc/gitlab/ssh),所有相关配置都统一到/var/opt/gitlab/下的对应目录,别再用旧教程里的路径了
  2. 所有密钥文件和目录的权限必须严格按要求设置,SSH服务对权限要求非常苛刻,权限不对直接导致认证失败
  3. 流水线里记得把仓库地址改成SSH格式(比如git@<你的GitLab域名>:<项目路径>.git),而不是HTTPS格式,这样才会触发SSH认证

备注:内容来源于stack exchange,提问作者Factor Three

火山引擎 最新活动