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未正确识别反向代理的转发头,导致认证流程出现重复校验。
解决步骤:
- 补全Nginx 80端口的server配置:
server { if ($host = example.com) { return 301 https://$host$request_uri; } listen 80; server_name example.com; }
修改后重启Nginx服务。
- 在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 }
- 重新配置并重启GitLab容器:
sudo docker exec -it gitlab gitlab-ctl reconfigure sudo docker exec -it gitlab gitlab-ctl restart
内容的提问来源于stack exchange,提问作者djcaesar9114
相关产品推荐
相关产品推荐

