针对 Linux 环境下 GitLab 的维护,主要涵盖系统更新、数据备份、日志清理、服务监控以及故障排查等方面。
以下是一份详细的维护指南,适用于 Omnibus 包安装方式(最常见的安装方式)。
GitLab 提供了一个统一的命令行工具 gitlab-ctl 来管理服务。
sudo gitlab-ctl status
sudo gitlab-ctl restart
sudo gitlab-ctl restart unicorn
sudo gitlab-ctl restart sidekiq
sudo gitlab-ctl stop
sudo gitlab-ctl start
/etc/gitlab/gitlab.rb 后必须执行):sudo gitlab-ctl reconfigure
数据无价,定期备份是第一要务。
GitLab 自带的备份命令会将数据打包成一个 .tar 文件。
# 执行备份(默认存放在 /var/opt/gitlab/backups/)
sudo gitlab-backup create
注意:从 GitLab 12.2 起,命令由 gitlab-rake gitlab:backup:create 改为 gitlab-backup create。
编辑 /etc/gitlab/gitlab.rb:
gitlab_rails['backup_path'] = "/mnt/backups"
然后执行 sudo gitlab-ctl reconfigure。
建议配置定时任务,例如每天凌晨2点备份:
sudo crontab -e
# 加入以下行
0 2 * * * /opt/gitlab/bin/gitlab-backup create CRON=1
注:CRON=1 参数会抑制备份过程中的交互式输出,防止 Cron 发送无关邮件。
恢复是一个高风险操作,会覆盖现有数据。
sudo gitlab-ctl stop puma
sudo gitlab-ctl stop sidekiq
11493107454_2018_04_25_10.6.4-ce_gitlab_backup.tar):sudo gitlab-backup restore BACKUP=11493107454_2018_04_25_10.6.4-ce
sudo gitlab-ctl restart
GitLab 的日志非常多,容易占满磁盘。
# 查看所有日志
sudo gitlab-ctl tail
# 查看特定服务日志(如 nginx)
sudo gitlab-ctl tail nginx
sudo gitlab-ctl tail gitlab-rails
GitLab 自带了 logrotate 配置,通常会自动轮转。如果需要手动触发清理:
sudo gitlab-ctl logrotate
为了防止日志无限增长,建议在 /etc/gitlab/gitlab.rb 中配置保留策略:
logging['logrotate_frequency'] = "daily"
logging['logrotate_rotate'] = 30 # 保留30天
logging['logrotate_size'] = "200M"
如果开启了 GitLab Container Registry,旧的镜像会占用大量空间。需要在项目中手动清理或使用 API 清理。
GitLab 升级路径非常严格,不能跨大版本跳跃(例如不能直接从 12.x 升级到 14.x)。
# CentOS/RHEL
sudo yum update gitlab-ee # 或者 gitlab-ce
# Ubuntu/Debian
sudo apt update
sudo apt upgrade gitlab-ee
如果你需要直接操作 GitLab 的数据库(PostgreSQL)或执行 Rails 命令进行高级维护。
sudo gitlab-psql -d gitlabhq_production
注意:一般情况下不建议直接修改数据库,除非你非常清楚在做什么。
sudo gitlab-rake gitlab:check SANITIZE=true
sudo gitlab-rake cache:clear
修改 /etc/gitlab/gitlab.rb:
external_url 'https://gitlab.yourdomain.com'
nginx['redirect_http_to_https'] = true
nginx['ssl_certificate'] = "/etc/gitlab/ssl/gitlab.pem"
nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/gitlab.key"
然后执行 sudo gitlab-ctl reconfigure。
如果系统盘空间不足,可以将仓库迁移到大磁盘。
git_data_dirs({
"default" => { "path" => "/data/gitlab/git-data" }
})
502 Whoops, GitLab is taking too much time to respond
free -h。sudo gitlab-ctl tail puma。磁盘空间满
df -h。GitLab 服务无法启动
sudo gitlab-rake gitlab:env:info。netstat -tulnp | grep 80。忘记 root 密码
sudo gitlab-rails console
u = User.where(id: 1).first
u.password = 'new_password'
u.password_confirmation = 'new_password'
u.save!
| 项目 | 频率 | 命令/操作 |
|---|---|---|
| 检查服务状态 | 每天/监控报警 | gitlab-ctl status |
| 检查磁盘空间 | 每周 | df -h |
| 备份 | 每天 | gitlab-backup create |
| 查看日志 | 按需 | gitlab-ctl tail |
| 更新版本 | 每季度/安全更新 | 按官方路径升级 |
| 清理旧备份 | 每月 | 手动删除 /var/opt/gitlab/backups/ 下的旧文件 |