GitLab CE 部署
服务器:
- 192.168.101.201:GitLab CE
- 192.168.101.202:GitLab Runner
- 192.168.101.203:GitLab Runner
下面是一套 可直接用于生产 / 内网的 podman-compose 部署 GitLab CE(社区版)完整方案,包含:
- 目录规划
- podman-compose.yaml
- 核心配置项说明
- 首次启动 & 登录
- 常见问题
- 生产环境注意事项
内容偏 运维级,不是只跑起来那种。
| 项目 | 建议 |
|---|---|
| CPU | ≥ 2 Core(推荐 4 Core) |
| 内存 | ≥ 4G(最低),推荐 8G |
| 磁盘 | ≥ 50G(代码 + CI + 日志) |
| OS | Linux(AlmaLinux / Ubuntu / Debian) |
⚠️ 内存小于 4G 非常容易 OOM
确保版本:
podman version
podman-compose version
/data/gitlab-ce/
├── compose/ # docker-compose
├── config/ # GitLab 配置
├── data/ # Git 仓库 + 数据
└── logs/ # 日志
创建目录:
mkdir -p /data/gitlab-ce/{compose,config,data,logs}
文件:/data/gitlab-ce/compose/docker-compose.yaml
version: "3"
services:
gitlab:
image: gitlab/gitlab-ce:18.7.1-ce.0
container_name: gitlab-ce
restart: always
ports:
# 注意: 端口号要和 external_url 的端口一致
- "7000:7000"
volumes:
- /data/gitlab-ce/config:/etc/gitlab
- /data/gitlab-ce/logs:/var/log/gitlab
- /data/gitlab-ce/data:/var/opt/gitlab
environment:
TZ: Asia/Shanghai
GITLAB_OMNIBUS_CONFIG: |
external_url 'http://192.168.101.201:7000'
gitlab_rails['time_zone'] = 'Asia/Shanghai'
shm_size: "256m"
注意:一定要配置 external_url,否则后面可能出现一些莫名其妙的错误。
# 后期修改
sed -i "s|^# external_url .*|external_url 'http://192.168.101.201:7000'|g" gitlab.rb
# 拉取镜像
# HTTP_PROXY=http://127.0.0.1:1080 HTTPS_PROXY=http://127.0.0.1:1080 podman pull gitlab/gitlab-ce:18.7.1-ce.0
HTTP_PROXY=http://192.168.101.200:1080 HTTPS_PROXY=http://192.168.101.200:1080 podman pull gitlab/gitlab-ce:18.7.1-ce.0
# 切换目录
cd /data/gitlab-ce/compose
# 创建 或 重建 容器, 并启动
# 如果更新了 YAML 文件中的内容, 比如 image, 直接执行以下命令, podman-compose 会自动删除容器, 并启动创建新容器
podman-compose up -d
首次启动 5~10 分钟是正常的:
podman logs -f gitlab-ce
看到类似:
gitlab Reconfigured!
表示启动完成。
或者在启动过程中可以一直刷新 http://192.168.101.201:7000,直到看到 GitLab 登录页面。

podman exec -it gitlab-ce grep 'Password:' /etc/gitlab/initial_root_password
⚠️ 该文件 24 小时后会自动删除
浏览器访问:
http://192.168.101.201:7000
- 用户名:
root - 密码:上一步获取的密码


修改密码:
右上角头像 -> Edit Profile -> User settings -> Password


修改完密码需要重新登录一次。
# 停止容器
podman-compose stop
# 使用 systemd 启动
systemctl start podman@gitlab-ce
# 创建系统服务
systemctl enable podman@gitlab-ce
external_url 'http://gitlab.example.com'
影响:
- Git clone URL
- Webhook
- CI/CD
- 邮件链接
如果是 内网 IP,可写:
external_url 'http://192.168.101.201:7000'
如果你改了宿主机 SSH 端口(如 2222):
ports:
- "2222:22"
同时:
gitlab_rails['gitlab_shell_ssh_port'] = 2222
| 目录 | 内容 |
|---|---|
| /etc/gitlab | gitlab.rb 配置 |
| /var/log/gitlab | 日志 |
| /var/lib/gitlab | Git 仓库 / DB / CI |
备份的核心就是 /var/lib/gitlab
备份配置文件:
cd /data/gitlab-ce/config
cp gitlab.rb gitlab.rb_default
# sed -i -E "s/^[[:space:]]*#?[[:space:]]*(alertmanager|prometheus_monitoring|prometheus)\['enable'\][[:space:]]*=[[:space:]]*true|\1['enable'] = false|" gitlab.rb
# sed -i -E "s/^# (alertmanager|prometheus_monitoring|prometheus)\['enable'\] =.*/\1['enable'] = false/g" gitlab.rb
# Puma Worker 进程数 (测试环境调小一些, 正式环境调大一些)
# 内存紧张时,将 puma['worker_processes'] 调小,可以缓解内存不足问题
# 尤其是在虚拟机中最实验的时候,虚拟机内存会不够用,所以将 puma['worker_processes'] 调小
sed -i "s/^# \(puma\['worker_processes'\] =\).*/\1 2/g" gitlab.rb
# Prometheus Alertmanager
sed -i "s/^# \(alertmanager\['enable'\] =\).*/\1 false/g" gitlab.rb
# HA 配置,可关闭
sed -i "s/^# \(consul\['enable'\] =\).*/\1 false/g" gitlab.rb
# Geo 可关闭
sed -i "s/^# \(geo_logcursor\['enable'\] =\).*/\1 false/g" gitlab.rb
# Geo 二级节点,可关闭
sed -i "s/^# \(geo_postgresql\['enable'\] =\).*/\1 false/g" gitlab.rb
# 可关闭,备份可用外部工具
sed -i "s/^# \(gitlab_backup_cli\['enable'\] =\).*/\1 false/g" gitlab.rb
# GitLab Exporter
sed -i "s/^# \(gitlab_exporter\['enable'\] =\).*/\1 false/g" gitlab.rb
# Kubernetes Agent Server,可关闭
sed -i "s/^# \(gitlab_kas\['enable'\] =\).*/\1 false/g" gitlab.rb
# GitLab Pages 服务
sed -i "s/^# \(gitlab_pages\['enable'\] =\).*/\1 false/g" gitlab.rb
# GitLab Shell SSH 服务 (如果需要 SSH clone/push 必须启用)
sed -i "s/^# \(gitlab_sshd\['enable'\] =\).*/\1 false/g" gitlab.rb
# 如果使用自定义证书,可关闭
sed -i "s/^# \(letsencrypt\['enable'\] =\).*/\1 false/g" gitlab.rb
# 内置聊天服务
sed -i "s/^# \(mattermost\['enable'\] =\).*/\1 false/g" gitlab.rb
# Mattermost Nginx
sed -i "s/^# \(mattermost_nginx\['enable'\] =\).*/\1 false/g" gitlab.rb
# GitLab 内置监控,可以关闭
sed -i "s/^# \(monitoring_role\['enable'\] =\).*/\1 false/g" gitlab.rb
# Prometheus Node Exporter
sed -i "s/^# \(node_exporter\['enable'\] =\).*/\1 false/g" gitlab.rb
# Pages Nginx 配合 Pages,可关闭
sed -i "s/^# \(pages_nginx\['enable'\] =\).*/\1 false/g" gitlab.rb
# 高可用 Postgres,可关闭
sed -i "s/^# \(patroni\['enable'\] =\).*/\1 false/g" gitlab.rb
# HA standby,可关闭
sed -i "s/^# \(patroni\['standby_cluster'\]\['enable'\] =\).*/\1 false/g" gitlab.rb
# 可关闭
sed -i "s/^# \(pgbouncer\['enable'\] =\).*/\1 false/g" gitlab.rb
# Prometheus pgbouncer Exporter
sed -i "s/^# \(pgbouncer_exporter\['enable'\] =\).*/\1 false/g" gitlab.rb
# Prometheus PostgreSQL Exporter
sed -i "s/^# \(postgres_exporter\['enable'\] =\).*/\1 false/g" gitlab.rb
# Gitaly 集群协调器,如果只有单节点可关闭
sed -i "s/^# \(praefect\['enable'\] =\).*/\1 false/g" gitlab.rb
# 内置 Prometheus
sed -i "s/^# \(prometheus\['enable'\] =\).*/\1 false/g" gitlab.rb
# GitLab 内置 Prometheus Dashboard
sed -i "s/^# \(prometheus_monitoring\['enable'\] =\).*/\1 false/g" gitlab.rb
# Prometheus Redis Exporter
sed -i "s/^# \(redis_exporter\['enable'\] =\).*/\1 false/g" gitlab.rb
# 高可用 Sentinel,可单节点关闭
sed -i "s/^# \(redis_sentinel_role\['enable'\] =\).*/\1 false/g" gitlab.rb
# 内置 Docker Registry
sed -i "s/^# \(registry\['enable'\] =\).*/\1 false/g" gitlab.rb
# Registry Nginx
sed -i "s/^# \(registry_nginx\['enable'\] =\).*/\1 false/g" gitlab.rb
# 高可用 Sentinel,可单节点关闭
sed -i "s/^# \(sentinel\['enable'\] =\).*/\1 false/g" gitlab.rb
# 邮件防垃圾,可关闭
sed -i "s/^# \(spamcheck\['enable'\] =\).*/\1 false/g" gitlab.rb
# 定期存储检查,可关闭
sed -i "s/^# \(storage_check\['enable'\] =\).*/\1 false/g" gitlab.rb
# https://docs.gitlab.com/18.7/administration/settings/event_data/
sed -i "s/^# \(gitlab_rails\['initial_gitlab_product_usage_data'\] =\).*/\1 false/g" gitlab.rb

Admin area -> Settings -> General -> Visibility and access controls -> Enabled Git access protocols -> Only HTTP(S)

必须由管理员创建项目,禁止用户创建项目。
Admin area -> Settings -> General -> Account and limit
- Default projects limit -> 0
- User restrictions -> 去掉所有的勾


Admin area -> Settings -> General -> Sign-up restrictions ->
- ❌ Sign-up Enabled

Admin area -> Settings -> Metrics and profiling -> Event tracking
- ❌ Enable event tracking

Admin area -> Settings -> Network -> Outbound requests
-
✅ Allow requests to the local network from webhooks and integrations
-
解决 Webhook 添加内网 IP 的 Jenkins 报 Invalid url given 的错误

gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.example.com"
gitlab_rails['smtp_port'] = 465
gitlab_rails['smtp_user_name'] = "gitlab@example.com"
gitlab_rails['smtp_password'] = "password"
gitlab_rails['smtp_tls'] = true
# gitlab_rails['time_zone'] = 'UTC'
# gitlab_rails['time_zone'] = 'Asia/Shanghai'
sed -i "s|^# \(gitlab_rails\['time_zone'\] =\).*|\1 'Asia/Shanghai'|g" gitlab.rb
podman exec -it gitlab-ce gitlab-ctl reconfigure
systemctl restart podman@gitlab-ce.service
podman exec -it gitlab-ce gitlab-backup create
备份文件在:
/data/gitlab-ce/data/backups/
docker exec -it gitlab gitlab-backup restore BACKUP=xxxx
原因:内存不足
解决:
- ≥ 4G 内存
- 关闭 Prometheus/Grafana
检查:
docker logs gitlab
通常是:
- external_url 配置错误
- Gitaly / Puma 启动失败
记住:
- Runner 是 独立部署
- GitLab ≠ Runner
- ✅ GitLab 和 Runner 分离
- ✅ GitLab 数据定期备份
- ✅ 使用反向代理(Nginx)+ HTTPS
- ✅ GitLab 升级前 반드시 备份
- ✅ 不要频繁
docker pull latest(固定版本)
image: gitlab/gitlab-ce:18.7.1-ce.0
避免版本升级事故。