Skip to main content
☘️ Septvean's Documents
Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

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
  • 核心配置项说明
  • 首次启动 & 登录
  • 常见问题
  • 生产环境注意事项

内容偏 运维级,不是只跑起来那种。

一、部署前准备(必须)

1️⃣ 服务器最低配置(真实可用)

项目 建议
CPU ≥ 2 Core(推荐 4 Core)
内存 ≥ 4G(最低),推荐 8G
磁盘 ≥ 50G(代码 + CI + 日志)
OS Linux(AlmaLinux / Ubuntu / Debian)

⚠️ 内存小于 4G 非常容易 OOM


2️⃣ 安装 podman & podman-compose

确保版本:

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}

三、docker-compose.yaml(核心)

最小可用生产模板

文件:/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

四、启动 GitLab

# 拉取镜像
# 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 登录页面。


五、首次登录 GitLab

1️⃣ 获取 root 初始密码

podman exec -it gitlab-ce grep 'Password:' /etc/gitlab/initial_root_password

⚠️ 该文件 24 小时后会自动删除


2️⃣ 登录

浏览器访问:

http://192.168.101.201:7000
  • 用户名:root
  • 密码:上一步获取的密码

修改密码:

右上角头像 -> Edit Profile -> User settings -> Password

修改完密码需要重新登录一次。

3️⃣ 启动设置

# 停止容器
podman-compose stop

# 使用 systemd 启动
systemctl start podman@gitlab-ce

# 创建系统服务
systemctl enable podman@gitlab-ce

六、关键配置说明(必须理解)


1️⃣ external_url(最重要)

external_url 'http://gitlab.example.com'

影响:

  • Git clone URL
  • Webhook
  • CI/CD
  • 邮件链接

如果是 内网 IP,可写:

external_url 'http://192.168.101.201:7000'

2️⃣ SSH 端口配置

如果你改了宿主机 SSH 端口(如 2222):

ports:
  - "2222:22"

同时:

gitlab_rails['gitlab_shell_ssh_port'] = 2222

3️⃣ GitLab 数据说明(重要)

目录 内容
/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

后台配置

禁止 SSH 访问

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


允许从webhooks和集成到本地网络请求

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

九、GitLab 备份与恢复(Docker 版)


1️⃣ 手动备份

podman exec -it gitlab-ce gitlab-backup create

备份文件在:

/data/gitlab-ce/data/backups/

2️⃣ 恢复(简述)

docker exec -it gitlab gitlab-backup restore BACKUP=xxxx

十、常见问题(高频)


❌ 1. 启动卡住 / OOM

原因:内存不足

解决:

  • ≥ 4G 内存
  • 关闭 Prometheus/Grafana

❌ 2. clone 提示 502 / 500

检查:

docker logs gitlab

通常是:

  • external_url 配置错误
  • Gitaly / Puma 启动失败

❌ 3. CI Runner 连接不上

记住:

  • Runner 是 独立部署
  • GitLab ≠ Runner

十一、生产级部署建议(重要)

  • ✅ GitLab 和 Runner 分离
  • ✅ GitLab 数据定期备份
  • ✅ 使用反向代理(Nginx)+ HTTPS
  • ✅ GitLab 升级前 반드시 备份
  • ✅ 不要频繁 docker pull latest(固定版本)

十二、推荐版本固定方式(生产)

image: gitlab/gitlab-ce:18.7.1-ce.0

避免版本升级事故。