1 基本介绍
由于最初安装时将gitlab和其他服务都装在了一个机器上,最近机器又经常莫名宕机,为了将应用归类分离,我们决定将gitlab迁移到其他机器。原机器环境如下:
- 系统centos 6.5
- 安装时使用的bitnami的一键安装包bitnami-gitlab-8.9.6-0-linux-x64-installer.run
- 原gitlab直接安装在了物理机上,使用ip和端口访问
迁移计划:
- 将gitlab迁移到centos7的虚拟机上
- 新应用在docker中运行
- 新应用使用域名访问,防止以后再迁移需要大家修改git远程仓库地址
2 迁移步骤
2.1 下载 docker 镜像
因为安装的时候使用的 8.9.6 版本,镜像最好也使用 8.9.6 版本,刚开始下载了 9.2.1 ,恢复时数据库不兼容,网那么慢,好不容易下载的,白折腾大半天,镜像下载地址大家可参考:
- https://dashboard.daocloud.io/packages/660fd50e-5047-45c5-b3c0-077dbd0c26f7
- https://hub.docker.com/r/gitlab/gitlab-ce/
2.2 运行
我们直接使用了 docker-compose 编排容器:
web:
image: 'gitlab/gitlab-ce:latest'
restart: always
hostname: 'gitlab.example.com'
environment:
GITLAB_OMNIBUS_CONFIG: |
external_url 'https://gitlab.example.com'
ports:
- '80:80'
- '443:443'
- '22:22'
volumes:
- '/srv/gitlab/config:/etc/gitlab'
- '/srv/gitlab/logs:/var/log/gitlab'
- '/srv/gitlab/data:/var/opt/gitlab'
2.3 备份旧 gitlab 数据
一般情况,执行 gitlab-rake gitlab:backup:create
即可完成gitlab的备份,备份文件: /var/opt/gitlab/backups/1495694937_gitlab_backup.tar。
我们使用的 bitnami 的一键安装包,执行时发现没有 gitlab-rake 命令,搜索才知道,需要先 sudo su git 切换到git用户,然后再在安装路径 /apps/gitlab/htdocs 下执行 bundle exec bin/rake gitlab:backup:create RAILS_ENV=production
备份文件安装路径: /apps/gitlab/htdocs/tmp/backups/1495694937_gitlab_backup.tar 目录下。实在找不到备份文件,可以使用 find / -name 1495694937_gitlab_backup.tar
搜下。
2.4 恢复备份数据到新 gitlab
由于新 gitlab 使用了 docker ,并且经将数据挂载到了 /srv/gitlab/data 目录,首先我们要将备份文件拷贝到 /srv/gitlab/data/backups 目录,然后在容器中执行 gitlab-rake gitlab:backup:restore BACKUP=1495694937
即可完成 gitlab 的恢复。
2.5 其他
有些情况,恢复后能够正常登陆,但当进入具体项目时出现 500 错误,查看日志 /srv/gitlab/logs/gitlab-rails/production.log 发现以下错误
OpenSSL::Cipher::CipherError (bad decrypt):
app/models/project.rb:456:in `import_url'
app/models/project.rb:486:in `external_import?'
app/models/project.rb:478:in `import?'
app/models/project.rb:494:in `import_in_progress?'
app/controllers/projects_controller.rb:93:in `show'
lib/gitlab/middleware/go.rb:16:in `call'
这是 gitlab 迁移的一个缺陷,不知道后面版本有没有修复,修复方法如下:
- 找到旧 gitlab 配置的 db_key_base ,网友说在 /etc/gitlab/gitlab-secrets.json 里,然而我们的却没有这个文件,但这并不妨碍我们找到它,在旧 gitlab 安装目录执行
find ./ -name *.yml | xargs grep "db_key_base"
和find ./ -name *.json | xargs grep "db_key_base"
无论是 json 还是 yml,总能搜索它,我们的是在安装路径 /apps/gitlab/htdocs/config/secrets.yml 里,将值覆盖新 gitlab 中 /srv/gitlab/config/gitlab-secrets.json 里的 db_key_base 值。 - 在容器里执行
gitlab-rails runner "Project.where.not(import_url: nil).each { |p| p.import_data.destroy if p.import_data }"
再试下,500错误没了,项目可以正常访问了!