Gitlab 迁移

1 基本介绍

由于最初安装时将gitlab和其他服务都装在了一个机器上,最近机器又经常莫名宕机,为了将应用归类分离,我们决定将gitlab迁移到其他机器。原机器环境如下:

  1. 系统centos 6.5
  2. 安装时使用的bitnami的一键安装包bitnami-gitlab-8.9.6-0-linux-x64-installer.run
  3. 原gitlab直接安装在了物理机上,使用ip和端口访问

迁移计划:

  1. 将gitlab迁移到centos7的虚拟机上
  2. 新应用在docker中运行
  3. 新应用使用域名访问,防止以后再迁移需要大家修改git远程仓库地址

2 迁移步骤

2.1 下载 docker 镜像

因为安装的时候使用的 8.9.6 版本,镜像最好也使用 8.9.6 版本,刚开始下载了 9.2.1 ,恢复时数据库不兼容,网那么慢,好不容易下载的,白折腾大半天,镜像下载地址大家可参考:

  1. https://dashboard.daocloud.io/packages/660fd50e-5047-45c5-b3c0-077dbd0c26f7
  2. 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 迁移的一个缺陷,不知道后面版本有没有修复,修复方法如下:

  1. 找到旧 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 值。
  2. 在容器里执行 gitlab-rails runner "Project.where.not(import_url: nil).each { |p| p.import_data.destroy if p.import_data }" 再试下,500错误没了,项目可以正常访问了!