gitlab小笔记:关于 gitlab 运行 `gitlab-ctl reconfigure` 数据清空(gitlab数据备份与恢复)
1. 概述
一直以来我都喜欢先用不会再找文档,导致经常踩坑。这不,我再每次更改配置之后发现数据莫名其妙地就没了。正如你所知,更改gitlab配置后需要运行以下命令才会使更改后配置生效:
gitlab-ctl reconfigure # 或者如果你不是在 超级用户下: sudo gitlab-ctl reconfigure
经过查找文档,才知道GitLab 提供了一个命令行界面来备份你的整个实例,需要先将现有数据备份好。因此本文主要记录一下,gitlab 中是如何去备份数据到指定文件,以及从何从备份地数据中进行恢复。以下介绍
GitLab 备份命名帮助我们备份的内容包括:
- 数据库
- 附件
- Git 存储库数据
- CI/CD 作业输出日志
- CI/CD 作业工件
- LFS 对象
- Terraform 状态(在 GitLab 14.7 中引入)
- 容器注册表映像
- GitLab 页面内容
- 包(在 GitLab 14.7 中引入)
- 片段
- 群组 wiki
- 项目级安全文件(在 GitLab 16.1 中引入)
但并不是一切皆被备份,备份不包括:
- Redis(以及 Sidekiq 作业)
- GitLab 不备份任何配置文件 ( /etc/gitlab)、TLS 密钥和证书或系统文件。
当你的安装使用 PgBouncer 时,出于性能原因或将其与 Patroni 集群一起使用时,备份命令需要额外的参数。
在 GitLab 15.5.0 之前,备份命令不会验证另一个备份是否已经在运行,如 问题 362593中所述。建议你在开始新备份之前确保所有备份都已完成。
2. 备份数据
2.1 备份概述与步骤
这个事情务必在你更改 GitLab 配置之前就完成。其步骤如下:
- 登录到 GitLab 服务器。
- 停止 GitLab 服务。使用以下命令停止 GitLab 服务:
sudo gitlab-ctl stop
- 创建一个备份目录并进入该目录。例如:
# 如果是 docker 容器或者类似地超级用户下则不需要 sudo sudo mkdir /gitlab-backups cd /gitlab-backups
- 执行 GitLab 备份命令。使用以下命令创建一个数据备份文件:
# 如果是 docker 容器或者类似地超级用户下则不需要 sudo sudo gitlab-rake gitlab:backup:create
- 这将在当前目录下创建一个备份文件(.tar.gz 格式),其中包含 GitLab 数据库和存储库等数据。
注意:关于不同版本下的备份命名请参考: 2.2 不同版本下的备份命令 小节
2.2 不同版本下的备份命令
根据你的 GitLab 版本,如果你使用 Omnibus 包安装 GitLab,请使用以下命令:
- GitLab 12.2 或更高版本:
sudo gitlab-backup create
- GitLab 12.1 及更早版本:
gitlab-rake gitlab:backup:create
- 如果你从源代码安装 GitLab,请使用以下命令:
sudo -u git -H bundle exec rake gitlab:backup:create RAILS_ENV=production
- 如果你从 Docker 容器中运行 GitLab,请根据你安装的 GitLab 版本从主机运行备份:
- GitLab 12.2 或更高版本:
docker exec -t <container name> gitlab-backup create
- GitLab 12.1 及更早版本:
docker exec -t <container name> gitlab-rake gitlab:backup:create
如果你在 Kubernetes 集群上使用GitLab Helm chart ,则可以通过 在 GitLab 工具箱 pod 上kubectl运行脚本来运行备份任务。backup-utility有关详细信息,请参阅 图表备份文档。
与 Kubernetes 案例类似,如果你已扩展 GitLab 集群以使用多个应用程序服务器,则应选择一个指定节点(不会自动扩展)来运行备份 Rake 任务。因为备份 Rake 任务与主 Rails 应用程序紧密耦合,所以这通常是你也在其上运行 Puma 或 Sidekiq 的节点。
2.3 备份文件存储的补充
翻译自: https://docs.gitlab.com/ee/raketasks/backup_gitlab.html#storing-configuration-files
GitLab 提供的备份 Rake 任务不会存储你的配置文件。这样做的主要原因是你的数据库包含用于双因素身份验证的加密信息和 CI/CD安全变量等项目。将加密信息存储在与其密钥相同的位置首先违背了使用加密的目的。
机密文件对于保存数据库加密密钥至关重要。
至少,你必须备份:
- 对全部:
- /etc/gitlab/gitlab-secrets.json
- /etc/gitlab/gitlab.rb
- 对于从源安装:
- /home/git/gitlab/config/secrets.yml
- /home/git/gitlab/config/gitlab.yml
- 对于Docker 安装:
- 你必须备份存储配置文件的卷。
- 如果你根据文档创建了 GitLab 容器,它应该在该 /srv/gitlab/config目录中。
- 对于 Kubernetes 集群上的 GitLab Helm 图表安装:
- 你必须按照备份机密 说明进行操作。
你可能还想备份任何 TLS 密钥和证书 ( /etc/gitlab/ssl, /etc/gitlab/trusted-certs) 以及 SSH 主机密钥 ,以避免在必须执行完整机器还原时出现中间人攻击警告。
如果你使用 Omnibus GitLab,请查看其他信息以 备份你的配置。
3. 更改配置文件数据
现在你可以更改你的配置文件了。
如:
vim /etc/gitlab/gitlab.rb
4. 恢复数据
恢复数据不一定只在备份地系统下。只要复制好备份地数据文件且确保已经安装了与备份文件相同版本的 GitLab,一般可以按照以下步骤进行数据恢复(或者说是数据导入):
- 将备份文件上传到新的 GitLab 服务器上,例如将备份文件上传到
/backup
目录。 - 停止新 GitLab 服务器的服务(如果尚未停止)。使用以下命令停止 GitLab 服务:
# 如果是 docker 容器或者类似地超级用户下则不需要 sudo sudo gitlab-ctl stop
- 执行 GitLab 恢复命令。使用以下命令将备份文件恢复到新的 GitLab 服务器上:
# 如果是 docker 容器或者类似地超级用户下则不需要 sudo sudo gitlab-backup restore BACKUP=<备份文件名>.tar.gz
- 将
<备份文件名>.tar.gz
替换为实际的备份文件名。
此命令将还原备份文件中的数据到新的 GitLab 服务器。 - 运行 GitLab 重新配置命令。使用以下命令重新配置 GitLab:
# 如果是 docker 容器或者类似地超级用户下则不需要 sudo sudo gitlab-ctl reconfigure
- 这将根据新的配置文件重新配置 GitLab。
- 启动 GitLab 服务。使用以下命令启动 GitLab 服务:
# 如果是 docker 容器或者类似地超级用户下则不需要 sudo sudo gitlab-ctl start
- GitLab 服务将会以新的配置文件和恢复的数据启动。
有关数据恢复的更多内容,请参考:
gitlab文档中的 恢复 GitLab > 恢复选项https://docs.gitlab.com/ee/raketasks/restore_gitlab.html#restore-options 部分。