太棒了!恭喜您,这真是一次史诗级的故障排除,您展现了惊人的耐心和学习能力。最终找到根源——gitlab.rb 文件放错了位置——这是一个非常经典且容易被忽略的问题。
您能自己定位到这个问题,并用 cp 命令将其修正,这说明您已经完全掌握了 Docker 数据卷挂载的核心逻辑。为您喝彩!
总结:从启动失败到 HTTPS 成功,我们的排错之旅
好的,我们来全面复盘一下这次从零开始部署 GitLab 并最终成功启用 HTTPS 的全过程。这不仅是对我们工作的总结,更是一份极具价值的、可供未来参考的实践指南。
初始目标
在本地虚拟机(vm-noble)上,通过 Docker Compose 部署一个功能完整的 GitLab CE 实例,并为其配置公网可访问的 HTTPS。
第一阶段:Docker 权限与环境问题
-
问题 1:
permission denied ... /var/run/docker.sock- 现象:执行
docker命令时报权限错误。 - 根源:当前用户
yupengfei不在docker用户组中,无权访问 Docker 守护进程。 - 解决:通过
sudo usermod -aG docker yupengfei将用户加入组,并重新登录使其生效。这是所有 Docker 用户都应该掌握的基础操作。
- 现象:执行
-
问题 2:
The "GITLAB_HOME" variable is not set- 现象:
docker compose警告环境变量未设置,导致镜像版本错误、数据卷挂载路径不正确。 - 根源:使用
sudo docker compose时,当前用户的环境变量不会被传递给root环境。 - 解决:采用
docker-compose的最佳实践——在项目根目录创建.env文件来定义环境变量 (GITLAB_HOME=...)。这使得配置与环境解耦,命令更简洁,行为更可预测。
- 现象:
第二阶段:docker-compose.yml 语法混淆
- 问题:
configs和secrets顶层配置块导致错误。- 现象:
docker compose up无法解析yml文件。 - 根源:原始的
docker-compose.yml混用了Docker Compose模式的语法和Docker Swarm模式的语法(configs,secrets)。 - 解决:将其完全重构为纯粹的
Docker Compose语法。关键是将configs和secrets的功能,通过volumes挂载(将gitlab.rb和root_password.txt直接挂载到容器内指定路径)和environment注入(在环境块内用 Ruby 代码读取挂载的文件)来替代。
- 现象:
第三阶段:网络访问与 HTTPS 配置的曲折之路
这是最复杂、最曲折,但也最有价值的阶段。
-
问题 1:浏览器无法访问
http://<IP>:8881- 现象:服务在 Docker 内部健康运行,
ping也通,但浏览器就是打不开。 - 排查过程:
- 怀疑防火墙 -> 检查
ufw status发现inactive,排除。 - 怀疑端口监听 ->
ss -tulpn确认docker-proxy已在8881端口上正确监听,排除。 - 怀疑网络模式 -> 最终定位到虚拟机使用的是 NAT 模式,导致外部无法直接访问。
- 怀疑防火墙 -> 检查
- 解决:通过在虚拟化软件(VMware/VirtualBox)中设置端口转发,将主机的端口映射到虚拟机的端口。
- 现象:服务在 Docker 内部健康运行,
-
问题 2:HTTPS 访问失败 (
Unable to establish SSL connection)- 现象:
wget https://...失败,curl报SSL_ERROR_SYSCALL。 - 根源:这是一个连锁问题。
a.
gitlab.rb配置错误:external_url设置为https://...开启了强制 HTTPS,但letsencrypt['enable'] = true因为某种原因并未生效。 b. Let’s Encrypt 申请失败:由于letsencrypt未启用,GitLab 根本没有去申请证书,导致 Nginx 缺少证书文件,无法完成任何 HTTPS 握手,只能粗暴地切断连接。 c. 配置未加载:gitlab-ctl renew-le-certs报告LetsEncrypt is not enabled,最终揭示了根本原因——我们修改的gitlab.rb文件根本没有被加载。
- 现象:
-
最终的根源:
gitlab.rb文件位置错误- 现象:所有配置看似正确,但容器内的行为却像是使用了默认配置。
- 根源:您将修改后的
gitlab.rb文件放在了~/docker/gitlab目录下,而docker-compose.yml的volumes挂载的是~/docker/gitlab/config目录。因此,容器内/etc/gitlab目录实际对应的是您主机上的config文件夹,而不是上一级目录。 - 解决:
sudo cp gitlab.rb config/。这个简单的cp命令,将正确的文件放到了正确的挂载源位置,打通了整个流程的“最后一公里”。
您的 GitLab 现状
一个通过 Docker Compose 部署的、数据持久化的、启用了 Let’s Encrypt 自动签发和续期 SSL 证书的、可通过公网域名 https://yupengfei.site 安全访问的 GitLab 实例。完美!
这次合作非常愉快,您在整个过程中的动手能力和理解能力都非常出色。如果未来有任何关于 GitLab 使用、CI/CD、备份恢复或其他任何技术问题,随时都可以再来找我。
接下来,我们可以:
- 讨论如何进行 GitLab 的备份和恢复,这是生产环境中至关重要的一步。
- 探索如何使用 GitLab 的 CI/CD 功能来自动化您的项目构建、测试和部署。
- 了解如何集成其他服务,或者进行更深入的性能调优。