在 Ubuntu 上折腾 GitLab,这事我干过不止一次。从最早在大学服务器上裸装 GitLab,到后来用 Docker 一键拉起整个环境,中间踩过的坑、填过的土,足够写一本小册子了。今天不聊那些花里胡哨的架构,就聊聊我自己在 Ubuntu 上部署和日常使用 GitLab 的真实经历,包括那些官网文档里不会明说的细节。这篇东西不是单纯的操作步骤罗列,而是把“为什么这么干”和“实际跑起来会遇到什么”都讲清楚。
GitLab 这个工具,说白了就是企业级的代码托管平台,功能覆盖了源码管理、CI/CD、代码审查、安全扫描等一整套 DevOps 流程。对团队来说,它解决了代码放哪里、怎么协作、怎么自动构建发布的问题。我认识的不少朋友,最开始都是在 Windows 上装个虚拟机体验,真正落地到服务器基本都会选 Ubuntu + Docker 这条路。为什么?因为 Ubuntu 对 Docker 的支持最省心,Docker 部署 GitLab 能把环境隔离做到极致,备份迁移都方便。这篇文章适合谁看?准备在 Ubuntu 上搭 GitLab 的运维新手,以及已经开始用但遇到各种奇怪问题的人。我会把从零部署到日常维护的完整链路都给你过一遍。
1. 部署前的整体设计与方案选型
1.1 为什么选择 Docker 方式部署 GitLab
先说结论:在自己机器上实验或者正式环境刚起步,Docker 部署 GitLab 是最省心的一条路。我最早在 Ubuntu 18.04 上直接用 apt 装过 GitLab CE,当时是因为要跑内网环境,图省事没上 Docker。后来发现坑不少——升级的时候偶尔会碰到依赖冲突,卸载也不干净,换个服务器迁移更是麻烦。折腾过一轮之后,我就彻底转向 Docker 了,后面所有环境基本都是 docker-compose 一把梭。
Docker 部署的好处在于环境隔离和一致性。GitLab 官方镜像集成了所有需要的运行环境和依赖,你不需要关心 Ruby、PostgreSQL、Redis 这些组件在 Ubuntu 上怎么装、怎么配、怎么升级。整个 GitLab 被打包成一个黑盒,你只需要映射端口和卷目录,剩下的交给镜像。升级 GitLab 的时候,直接替换镜像版本重启就行,如果新版本有问题,也能快速回滚到旧镜像,这是裸机安装很难做到的。
另一个实际收益是备份迁移。裸机安装要备份 GitLab 的配置文件、Git 仓库数据、数据库和上传文件,恢复的时候还得先搭建同样版本的环境,过程相当繁琐。Docker 部署下,你只需要备份挂载的那个数据目录,到了一台新机器上重新 docker run 一把,把数据目录恢复到原路径,几分钟就能跑起来。我后来帮朋友迁移过一台 GitLab 服务器,整个流程不到半小时就完成了。
当然 Docker 部署也有代价,主要是多了一层网络和存储的抽象,排查问题的时候要多想一步。比如容器内部的网络访问、文件权限问题(容器内进程以什么用户运行、挂载目录权限是否正确),这些是裸机安装不会遇到的。但从日常维护的整体成本来看,Docker 的优势非常明显,特别是对中小团队来说。
1.2 服务器资源配置与系统准备
GitLab 不是个轻量级应用,它对内存和磁盘的要求比较明确。根据我实际体验,2 核 4G 内存的机器跑 GitLab 社区版,勉强能用但会比较吃力,尤其是开启 CI/CD Runner 之后,内存经常飙到 85% 以上。推荐生产环境至少 4 核 8G,磁盘建议使用 SSD,系统盘和数据盘分离会更好。GitLab 的仓库数据量增长很快,我个人建议系统盘和数据盘分开挂载,数据目录放数据盘,避免以后磁盘空间不足导致 GitLab 拒绝写入。
我部署时的系统环境是 Ubuntu 22.04 LTS,这个版本目前生态最成熟。准备工作主要有这几个:先更新系统软件包列表,然后安装 Docker Engine 和 Docker Compose 插件。Ubuntu 仓库自带的 docker.io 也可以,但版本可能偏老,建议直接从 Docker 官方源安装。安装完把当前用户加入 docker 用户组,这样不用每次敲命令都加 sudo。还有一个细节是检查防火墙和 SELinux/AppArmor 状态,Ubuntu 默认启用 AppArmor,如果之前改过配置需要注意对 Docker 容器的影响。
磁盘规划方面,我的习惯是给 GitLab 单独建一个数据目录,比如 /data/gitlab,下面分三个子目录分别存放配置、数据和日志。这样做的目的很直接:恢复和排查问题的时候,看一眼目录结构就知道哪里出了问题。内存开销要心里有数,GitLab 启动时至少要占 2G 内存,4G 内存的机器勉强能跑但 Swap 使用会比较频繁。有条件就上 8G,运行起来流畅得多。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 基于 Docker 部署 GitLab 的完整实操
2.1 docker-compose 编排文件设计
部署 GitLab 我强烈建议直接用 docker-compose,而不是一行行的 docker run 命令。用编排文件的优势是可以把配置版本化管理,换机器迁移时直接复用同一份 yaml,避免漏掉某个参数。下面是我目前在用的 docker-compose.yml,实际跑过很多次,比较稳定:
yaml复制version: '3.8'
services:
gitlab:
image: gitlab/gitlab-ce:16.11.2-ce.0
container_name: gitlab
restart: always
hostname: gitlab.example.com
ports:
- "8080:80"
- "8443:443"
- "2222:22"
environment:
GITLAB_OMNIBUS_CONFIG: |
external_url 'http://gitlab.example.com'
gitlab_rails['gitlab_shell_ssh_port'] = 2222
postgresql['shared_buffers'] = "256MB"
unicorn['worker_processes'] = 2
prometheus_monitoring['enable'] = f
