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

Docker部署GitLab遇双重登录及SSH密钥失效问题求助

问题分析与解决

环境配置信息

GitLab容器启动命令

sudo docker run --detach --hostname example.com --publish 4433:443 --publish 8080:80 --publish 2222:22 --name gitlab --restart always --volume /data/gitlab/config:/etc/gitlab --volume /data/gitlab/logs:/var/log/gitlab --volume /data/gitlab/data:/var/opt/gitlab gitlab/gitlab-ce:latest

(注:example.com为实际使用域名)

Nginx反向代理配置

server {
  server_name example.com;
  client_max_body_size 50m;
  location / {
    proxy_pass http://127.0.0.1:8080/;
    proxy_set_header Host $http_host;
    proxy_http_version 1.1;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Real-IP $remote-addr;
  }
  listen 443 ssl;
  ssl_certificate [MY PATH TO THE .pem FILE];
  ssl_certificate_key [OTHER PATH];
  include /etc/letsencrypt/options-ssl-nginx.conf;
  ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}

server {
  if ($host = example.com) {
    return 301 https://$host$request_uri;
  }
}

GitLab核心配置(gitlab.rb)

external_url 'https://example.com'

遇到的问题

  • HTTPS克隆/推送仓库时,需两次输入账号密码
  • SSH克隆仓库(如git clone git@example.com:myuser/myproject.git)时,仍要求输入密码(已确认GitLab端SSH密钥配置正确)

问题原因及解决方法

1. SSH要求输入密码的原因

GitLab容器的22端口被映射到了宿主机的2222端口,但Git默认会用22端口发起SSH连接,此时实际连接的是宿主机本身的SSH服务(而非GitLab容器内的SSH服务),所以会要求输入宿主机的SSH密码,而非使用你配置的GitLab SSH密钥。

解决方式(三选一):

  • 调整容器端口映射,将宿主机22端口直接指向容器22端口(需确保宿主机自身SSH服务未占用22端口),修改启动命令的端口参数为--publish 22:22
  • 克隆时指定端口,命令改为:git clone ssh://git@example.com:2222/myuser/myproject.git
  • 在本地~/.ssh/config中添加规则,让Git自动识别端口:
Host example.com
  HostName example.com
  Port 2222
  User git

配置完成后即可正常使用git clone git@example.com:myuser/myproject.git命令。

2. HTTPS两次输入密码的原因

你的Nginx 80端口server块缺少listen 80;指令,导致HTTP请求的重定向逻辑异常,触发额外的认证校验;同时GitLab未正确识别反向代理的转发头,导致认证流程出现重复校验。

解决步骤:

  1. 补全Nginx 80端口的server配置:
server {
  if ($host = example.com) {
    return 301 https://$host$request_uri;
  }
  listen 80;
  server_name example.com;
}

修改后重启Nginx服务。

  1. 在gitlab.rb中添加反向代理适配配置:
external_url 'https://example.com'
nginx['listen_port'] = 80
nginx['listen_https'] = false
gitlab_rails['trusted_proxies'] = ['127.0.0.1'] # 反向代理服务器IP,此处为本地Nginx
gitlab_rails['rack_attack_git_basic_auth'] = {
  'enabled' => true,
  'ip_whitelist' => ['127.0.0.1'],
  'maxretry' => 10,
  'findtime' => 60,
  'bantime' => 3600
}
  1. 重新配置并重启GitLab容器:
sudo docker exec -it gitlab gitlab-ctl reconfigure
sudo docker exec -it gitlab gitlab-ctl restart

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 17:55:59