本机 GitLab 部署整理
整理时间:2026-05-05
1. 部署方式
本机 GitLab 不是直接安装在宿主机系统里的,而是通过 Docker 容器运行。
- 容器名:
gitlab - 当前运行镜像:
gitlab/gitlab-ce:18.7.0-ce.0 - 容器状态:
Up 5 days (healthy)
说明:
/home/zbc/gitlab.sh中的历史启动命令使用的是gitlab/gitlab-ce:13.12.2-ce.0- 当前实际运行容器版本已经是
18.7.0-ce.0 - 因此
gitlab.sh可视为旧脚本,不能完全代表当前在线环境
2. 宿主机路径
GitLab 在宿主机上的主目录为:
/home/gitlab
主要子目录如下:
- 配置目录:
/home/gitlab/data/etc - 数据目录:
/home/gitlab/data/opt - 日志目录:
/home/gitlab/logs - 备份目录:
/home/gitlab/压缩包/GitLab备份 - 旧配置备份目录:
/home/gitlab/conf
相关文件:
- 活动配置文件:
/home/gitlab/data/etc/gitlab.rb - 活动密钥文件:
/home/gitlab/data/etc/gitlab-secrets.json - 历史配置备份:
/home/gitlab/conf/gitlab.rb.20251225-18.6.1 - 历史密钥备份:
/home/gitlab/conf/gitlab-secrets.json.20251225-18.6.1 - GitLab 备份脚本:
/home/gitlab/backup.sh - MinIO 备份脚本:
/home/gitlab/minio_backup.sh
3. 容器挂载关系
当前运行容器的挂载关系如下:
/home/gitlab/data/etc -> /etc/gitlab/home/gitlab/data/opt -> /var/opt/gitlab/home/gitlab/logs -> /var/log/gitlab
含义:
- 宿主机上的
/home/gitlab/data/etc保存 GitLab 配置 - 宿主机上的
/home/gitlab/data/opt保存 GitLab 业务数据 - 宿主机上的
/home/gitlab/logs保存 GitLab 日志
4. 当前访问入口
本机 IP:
192.168.3.103
容器端口映射:
3322 -> 22/tcp9980 -> 80/tcp
由此可得本机访问入口:
- Git SSH:
ssh://git@192.168.3.103:3322/<group>/<repo>.git - Web HTTP:
http://192.168.3.103:9980
GitLab 活动配置中的关键设置:
external_url 'https://gitlab.898311.xyz'
nginx['listen_port'] = 80
nginx['listen_https'] = false说明:
- GitLab 容器内部当前只监听 HTTP 80
external_url配置为https://gitlab.898311.xyz- 这说明 HTTPS 很可能由容器外部的反向代理或其他入口负责终止
5. 仓库远程地址
当前 GeneralAndroid 仓库远程地址为:
ssh://git@gitlab.898311.xyz:3322/zbc/GeneralAndroid.git
如果从本机局域网直连,也可按端口映射使用:
ssh://git@192.168.3.103:3322/zbc/GeneralAndroid.git
6. 空间占用
当前已确认的目录占用:
/home/gitlab:约358G/home/gitlab/data/etc:约188K/home/gitlab/data/opt:约336K/home/gitlab/logs:约20M/home/gitlab/压缩包:约358G
结论:
- 当前空间几乎都占用在
/home/gitlab/压缩包 - 主体是离线打包备份文件
7. 本地备份文件
目录:
/home/gitlab/压缩包/GitLab备份
当前已发现备份:
gitlab_backup_20260409_021936.tar.gz 60G
gitlab_backup_20260410_022116.tar.gz 60G
gitlab_backup_20260411_022246.tar.gz 60G
gitlab_backup_20260423_023546.tar.gz 60G
gitlab_backup_20260424_024142.tar.gz 60G
gitlab_backup_20260429_024524.tar.gz 62G总量约:
358G
8. 其他已发现内容
/home/gitlab 下还存在以下与运维相关的内容:
backup.lockminio_backup.lockminio_backup.statuscleanup_remote_backups.pycleanup_remote_backups.cpython-312.pyc
说明这些备份流程可能已经配套了远端清理或状态记录脚本。
9. 结论
这台机器上的 GitLab 可以概括为:
- 运行方式是 Docker 容器,不是宿主机原生安装。
- 宿主机核心目录在
/home/gitlab。 - 配置在
/home/gitlab/data/etc,数据在/home/gitlab/data/opt,日志在/home/gitlab/logs。 - 本机 Web 入口是
http://192.168.3.103:9980,SSH 入口是192.168.3.103:3322。 - 当前最大磁盘占用来自
/home/gitlab/压缩包/GitLab备份下的大体积备份文件。
10. 典型故障案例:push 被 pre-receive hook 拒绝
现象:
remote: Internal API unreachable
fatal: 无法读取远程仓库。或:
remote: calling pre_receive endpoint: http post to gitlab api /pre_receive endpoint: Internal API error (500)
! [remote rejected] master -> master (pre-receive hook declined)这类报错看起来像 Git 权限或仓库异常,但这次实际根因是 GitLab 容器内的 Rails/Puma 服务不可用,导致 pre-receive 依赖的内部 API 调用失败。
10.1 本次实际根因
排查结果:
- GitLab 运行在 Docker 容器
gitlab中 - 容器内
/dev/shm只有64M /dev/shm被 Puma 的 Prometheus mmap 指标文件打满,达到100%- GitLab Rails 日志出现:
exception.message: "unmapped file"以及:
writing value to /dev/shm/gitlab/puma/gauge_all_puma_*.db failed with unmapped file直接影响:
POST /api/:version/internal/allowed报错- push 过程中 pre-receive hook 调 GitLab 内部 API 失败
- 最终表现为
Internal API unreachable或pre-receive hook declined
10.2 快速确认命令
检查容器服务状态:
docker exec gitlab gitlab-ctl status检查 /dev/shm 是否打满:
docker exec gitlab df -h /dev/shm检查 Puma 指标文件:
docker exec gitlab ls /dev/shm/gitlab/puma检查日志关键词:
docker exec gitlab sh -lc "grep -RIn 'unmapped file\|Internal API error\|pre_receive' /var/log/gitlab/gitlab-rails /var/log/gitlab/gitaly /var/log/gitlab/gitlab-shell 2>/dev/null | tail -100"10.3 临时恢复办法
如果已经卡住,最快恢复方式是重启容器:
docker restart gitlab然后等待 Puma 恢复监听:
docker exec gitlab sh -lc 'tail -50 /var/log/gitlab/puma/current'看到类似:
Listening on unix:///var/opt/gitlab/gitlab-rails/sockets/gitlab.socket
Listening on http://127.0.0.1:8080说明 Rails/Puma 基本恢复,可以再重试 push。
10.4 长期修复办法
根因不是仓库内容,而是 Docker 默认 /dev/shm 太小。
建议把 GitLab 容器共享内存直接调到 1G:
docker run --shm-size=1g ...本机脚本 /home/zbc/gitlab.sh 已调整为:
sudo docker run -itd --shm-size=1g -p 9980:80 -p 3322:22 -v /home/gitlab/logs/:/var/log/gitlab -v /home/gitlab/data/opt:/var/opt/gitlab -v /home/gitlab/data/etc:/etc/gitlab --privileged=true --name=gitlab --restart always gitlab/gitlab-ce:13.12.2-ce.0注意:修改脚本后不会自动影响当前容器,必须重建容器才能生效:
docker stop gitlab
docker rm gitlab
bash /home/zbc/gitlab.sh因为配置、数据、日志都已经挂载到 /home/gitlab/...,正常情况下重建容器不会丢仓库数据。
11. 运维手册
本节面向日常维护,默认操作者具备宿主机 sudo 权限,并可执行 Docker 命令。
11.1 常用路径速查
- GitLab 宿主机根目录:
/home/gitlab - 活动配置:
/home/gitlab/data/etc/gitlab.rb - 活动密钥:
/home/gitlab/data/etc/gitlab-secrets.json - GitLab 数据:
/home/gitlab/data/opt - GitLab 日志:
/home/gitlab/logs - 本地备份目录:
/home/gitlab/压缩包/GitLab备份 - 旧配置备份:
/home/gitlab/conf - 启动脚本:
/home/zbc/gitlab.sh
11.2 常用访问入口
- Web:
http://192.168.3.103:9980 - SSH:
ssh://git@192.168.3.103:3322/<group>/<repo>.git - 域名远程地址:
ssh://git@gitlab.898311.xyz:3322/<group>/<repo>.git
说明:
external_url当前配置是https://gitlab.898311.xyz- 但容器内部 Nginx 监听的是 HTTP 80
- 如果外部用户通过 HTTPS 正常访问,说明外层还有单独的 HTTPS 代理层
11.3 容器日常操作
查看容器状态:
docker ps -a --filter name=gitlab查看容器详细端口:
docker inspect gitlab --format '{{json .HostConfig.PortBindings}}'查看容器挂载:
docker inspect gitlab --format '{{range .Mounts}}{{println .Source "->" .Destination}}{{end}}'启动容器:
docker start gitlab停止容器:
docker stop gitlab重启容器:
docker restart gitlab进入容器 shell:
docker exec -it gitlab bash11.4 GitLab 内部服务检查
检查 GitLab 各组件状态:
docker exec gitlab gitlab-ctl status查看 GitLab 版本:
docker exec gitlab gitlab-rake gitlab:env:info查看实时日志:
docker exec -it gitlab gitlab-ctl tail只看 Puma 日志:
docker exec gitlab sh -lc 'tail -100 /var/log/gitlab/puma/current'只看 Rails 日志:
docker exec gitlab sh -lc 'tail -100 /var/log/gitlab/gitlab-rails/production_json.log'只看 Nginx 日志:
docker exec gitlab sh -lc 'tail -100 /var/log/gitlab/nginx/gitlab_access.log'
docker exec gitlab sh -lc 'tail -100 /var/log/gitlab/nginx/gitlab_error.log'11.5 配置修改流程
宿主机配置文件:
/home/gitlab/data/etc/gitlab.rb
标准修改流程:
- 备份当前配置
- 修改
gitlab.rb - 执行
gitlab-ctl reconfigure - 检查服务状态和日志
- 验证 Web / Git SSH 是否恢复正常
示例命令:
cp /home/gitlab/data/etc/gitlab.rb /home/gitlab/conf/gitlab.rb.$(date +%F-%H%M%S)vim /home/gitlab/data/etc/gitlab.rbdocker exec gitlab gitlab-ctl reconfiguredocker exec gitlab gitlab-ctl statusdocker exec gitlab sh -lc 'tail -100 /var/log/gitlab/reconfigure/current'注意:
gitlab.rb修改后不会自动生效- 必须执行
gitlab-ctl reconfigure - 如果只是修改少量运行时配置,也建议至少执行一次
gitlab-ctl restart
11.6 常见配置项
当前确认的关键配置:
external_url 'https://gitlab.898311.xyz'
nginx['listen_port'] = 80
nginx['listen_https'] = false常见调整方向:
- 站点访问域名:
external_url - Git SSH 对外域名:
gitlab_rails['gitlab_ssh_host'] - SMTP 邮件:
gitlab_rails['smtp_*'] - 备份相关参数
- 上传、超时、代理相关设置
修改前建议先保存一份时间戳备份。
11.7 备份操作
本机已存在备份脚本:
/home/gitlab/backup.sh/home/gitlab/minio_backup.sh
本地 GitLab 备份目录:
/home/gitlab/压缩包/GitLab备份
如果使用 GitLab 自带备份命令,可在容器内执行:
docker exec -t gitlab gitlab-backup create执行后通常会在容器内的:
/var/opt/gitlab/backups
也就是宿主机的:
/home/gitlab/data/opt/backups
生成备份文件。
建议备份后再统一转移或归档到:
/home/gitlab/压缩包/GitLab备份
11.8 备份校验
查看本地备份文件:
ls -lh /home/gitlab/压缩包/GitLab备份查看容器内标准备份目录:
ls -lh /home/gitlab/data/opt/backups检查最近备份时间:
ls -lt /home/gitlab/压缩包/GitLab备份 | head检查备份总占用:
du -sh /home/gitlab/压缩包/GitLab备份11.9 恢复操作注意事项
恢复前必须明确:
- 恢复的是哪一天的备份
- 当前线上数据是否需要先做一次新备份
- 是否允许覆盖当前 GitLab 数据
恢复的一般思路:
- 停止可能写入 GitLab 的外部操作
- 备份当前配置和当前数据
- 将目标备份包放到 GitLab 可识别目录
- 按 GitLab 官方恢复流程执行
gitlab-backup restore - 执行
gitlab-ctl reconfigure - 重启服务并验证
因为恢复属于高风险操作,正式执行前建议单独写恢复步骤确认单,不要直接在生产上临时操作。
11.10 空间治理
当前磁盘压力主要来自:
/home/gitlab/压缩包/GitLab备份
先看目录占用:
du -sh /home/gitlab /home/gitlab/压缩包 /home/gitlab/data/opt /home/gitlab/logs看备份文件时间和大小:
ls -lh /home/gitlab/压缩包/GitLab备份建议治理策略:
- 先确认远端是否已有可靠副本
- 保留最近 N 份本地完整备份
- 删除超过保留期的离线归档
- 删除前记录文件名、日期、大小
- 删除后重新核对磁盘占用
删除前建议先做列表存档:
ls -lh /home/gitlab/压缩包/GitLab备份 > /home/gitlab/压缩包/gitlab-backup-list-$(date +%F).txt11.11 升级或重建容器
当前线上容器版本:
gitlab/gitlab-ce:18.7.0-ce.0
如果要升级或重建,原则是:
- 不直接依赖旧脚本中的镜像版本
- 先核对当前运行版本
- 确保挂载目录不变
- 先做备份再重建
建议流程:
- 备份
gitlab.rb和gitlab-secrets.json - 备份当前 GitLab 数据
- 记录当前端口和挂载配置
- 停容器
- 删除旧容器
- 用新镜像和相同挂载重建
- 验证服务、日志、Web、SSH
基础命令:
docker stop gitlab
docker rm gitlab然后按新的启动命令重建。
注意:
- 重建容器本身不应丢数据,前提是宿主机挂载目录没有变化
- 但跨大版本升级必须结合 GitLab 官方升级路径,不要跳版本乱升
11.12 HTTPS 反向代理核查
当前存在一个结构特征:
- GitLab 自身监听 HTTP 80
external_url却配置成 HTTPS 域名
这通常意味着外层还有反向代理。
建议核查项:
- 宿主机是否还有 Nginx
- 是否有 Caddy、Traefik 或其他反代
- 是否由网关设备或云负载均衡做 TLS 终止
排查方向:
ss -ltnpdocker ps -afind /etc/nginx /etc/caddy -maxdepth 3 -type f 2>/dev/null11.13 日常巡检建议
建议定期检查以下项目:
docker ps中gitlab是否为healthygitlab-ctl status中关键服务是否都在运行/home/gitlab/压缩包/GitLab备份是否持续增长- 是否存在最新可用备份
production_json.log中是否持续出现 500 错误/dev/shm是否再次接近打满
巡检命令示例:
docker ps -a --filter name=gitlab
docker exec gitlab gitlab-ctl status
docker exec gitlab df -h /dev/shm
du -sh /home/gitlab/压缩包/GitLab备份11.14 变更前最小检查清单
在修改配置、重建容器、清理备份、做恢复前,至少确认:
- 当前有可用备份
- 关键配置文件已单独备份
- 已记录当前镜像版本、端口映射、挂载目录
- 已评估业务影响窗口
- 已准备回滚方案
11.15 风险提示
当前环境至少有两个明确风险:
/home/zbc/gitlab.sh仍写着旧版本镜像,直接拿它重建可能导致版本回退或不一致- 本地备份目录已达
358G,如果不做保留策略,磁盘压力会持续增长
建议后续至少补两件事:
- 把当前线上真实启动参数整理成新的标准启动脚本
- 建立本地备份保留策略和定期清理策略