在生产环境中部署代码托管平台,稳定、可控和易于维护是核心诉求。相比于传统的包管理器安装,基于 Docker 部署 GitLab 能够实现极佳的环境隔离与数据迁移便利性。本文将完整记录如何在服务器上基于 Docker 部署 GitLab 企业版,配置公网 HTTPS 访问,并实现版本的安全平滑升级。
一、 生产环境的避坑指南与版本策略
在动手之前,有几个生产环境的“铁律”需要遵守:
- 坚决弃用
latest标签:latest会在每次容器重建时拉取最新版,极易导致跨版本带来的数据库不兼容或系统崩溃。务必锁定具体的补丁版本(如18.10.3-ee.0)。 - 首选企业版 (EE) 镜像:拉取
gitlab-ee镜像而非社区版gitlab-ce。在不输入许可证的情况下,EE 版本完全等同于免费社区版功能;但未来若业务扩张需要高级功能,EE 版本只需输入激活码即可原地升级,免去了从 CE 迁移到 EE 的高风险停机折腾。 - 硬件资源底线:GitLab 是一个包含 PostgreSQL、Redis、Sidekiq 等众多组件的庞然大物。请确保宿主机至少拥有 4核 CPU 与 8GB 内存。
二、 准备持久化存储目录
为了保障数据安全并在日后能够随意销毁和重建容器,我们必须将 GitLab 的核心数据挂载到宿主机(例如单独的机械硬盘或数据盘 /mnt/gitlabdata)。
无需手动创建子文件夹,Docker 运行时会自动生成。我们要映射的三个核心目录是:
/var/opt/gitlab:存储仓库数据和数据库/etc/gitlab:存储核心配置文件/var/log/gitlab:存储系统日志
三、 配置 SSL 证书并启动容器
我们这里的架构方案是由 GitLab 容器原生处理 HTTPS。这种方案非常干净,不需要在宿主机额外部署 Nginx。
1. 放置 SSL 证书
GitLab 内部拥有严格的证书命名规范。我们需要提前在配置目录中创建 ssl 文件夹,并将你的域名(假设为 git.weforn.cn)对应的证书放进去,并严格按域名命名:
sudo mkdir -p /mnt/gitlabdata/config/ssl
# 将公钥和私钥按如下格式放入该目录:
# 公钥:/mnt/gitlabdata/config/ssl/git.weforn.cn.crt
# 私钥:/mnt/gitlabdata/config/ssl/git.weforn.cn.key2. 启动 GitLab 容器
执行以下单行命令,将宿主机的标准 Web 端口(80/443)以及自定义的 SSH 端口(222)映射到容器内部:
sudo docker run -d -p 443:443 -p 80:80 -p 222:22 --name gitlab --restart always -v /mnt/gitlabdata/config:/etc/gitlab -v /mnt/gitlabdata/logs:/var/log/gitlab -v /mnt/gitlabdata/data:/var/opt/gitlab gitlab/gitlab-ee:18.10.3-ee.0四、 核心配置:修改 gitlab.rb
容器启动后,我们需要修改配置文件,让 GitLab 知道自己被映射到了哪个公网域名,从而正确生成各类项目克隆链接。
sudo vim /mnt/gitlabdata/config/gitlab.rb在文件中修改或增加以下配置:
# 1. 设置公网访问的外部链接(使用 https,自动关联我们在 ssl 文件夹下放入的证书)
external_url 'https://git.weforn.cn'
# 2. 设置 SSH 协议所使用的域名和映射后的 222 端口
gitlab_rails['gitlab_ssh_host'] = 'git.weforn.cn'
gitlab_rails['gitlab_shell_ssh_port'] = 222保存退出后,重启容器使配置生效:
sudo docker restart gitlab等待初始化:首次启动或重启时,GitLab 需要较长时间进行组件加载。如果网页提示
502 Bad Gateway,属于正常现象,请耐心等待 2-5 分钟再刷新。
初始密码获取
如果需要查看初始的管理员 root 密码,可以通过以下命令获取(该文件在启动 24 小时后会自动销毁,请及时登录并修改密码):
sudo docker exec -it gitlab grep 'Password:' /etc/gitlab/initial_root_password五、 如何进行平滑的版本升级?
官方经常会发布补丁版本(如从 18.10.3 升级到 18.10.4)以修复安全漏洞。得益于 Docker 的数据分离机制,升级过程只需几分钟且非常安全。
Step 1:执行全量备份(关键保底操作)
sudo docker exec -t gitlab gitlab-backup create(注意:此命令备份了核心数据,但 /mnt/gitlabdata/config 目录下的 gitlab.rb 与证书建议手动复制一份留存。)
Step 2:拉取新版本镜像
提前拉取以缩短停机时间:
sudo docker pull gitlab/gitlab-ee:18.10.4-ee.0Step 3:停止并销毁旧容器
不用担心,数据都在你的 /mnt/gitlabdata 硬盘里:
sudo docker stop gitlab
sudo docker rm gitlabStep 4:使用新镜像重新启动
使用完全相同的挂载和端口映射参数,仅仅将末尾的版本号改为新的:
sudo docker run -d -p 443:443 -p 80:80 -p 222:22 --name gitlab --restart always -v /mnt/gitlabdata/config:/etc/gitlab -v /mnt/gitlabdata/logs:/var/log/gitlab -v /mnt/gitlabdata/data:/var/opt/gitlab gitlab/gitlab-ee:18.10.4-ee.0Step 5:查看升级日志
启动后,GitLab 内部会自动处理新老版本的数据库差异迁移。可以实时监控日志:
sudo docker logs -f gitlab当日志流趋于平稳,且可以通过浏览器正常访问 https://git.weforn.cn 时,恭喜你,系统已经成功完成了无缝升级!
版权属于:soarli
本文链接:https://blog.soarli.top/archives/982.html
转载时须注明出处及本声明。