迁移 GitLab 数据到全新容器

本文使用「署名 4.0 国际 (CC BY 4.0)」许可协议,欢迎转载、或重新修改使用,但需要注明来源。 署名 4.0 国际 (CC BY 4.0)

本文作者: 苏洋

创建时间: 2018年09月27日 统计字数: 7579字 阅读时间: 16分钟阅读 本文链接: https://soulteary.com/2018/09/27/migrate-your-gitlab.html


迁移 GitLab 数据到全新容器

本篇文章可以看做是全新搭建 GitLab 的教程使用。

我个人使用方式是使用虚拟机软件强制将 4核心4GB 的运行环境划分给 GitLab 等同购买使用等配置的云主机,这样做可以避免和主机上其他软件进行资源争抢,影响运行效率。

从 13 年到现在,这已经是第3次迁移 GitLab 了,之前的迁移主要原因:

  • 将低版本跨大版本升级至高版本
  • 将裸机运行的软件迁移至容器中

而这次的迁移主要原因:

  • 更换了性能更好的新硬件
  • 测试备份包是否能够正常工作
  • 减少磁盘碎片对于宿主机的资源浪费(实际使用20G以内,磁盘占用已经100多G)

在开始搭建应用和迁移数据之前,我们需要做一些准备工作。

准备工作

虽然我在对外的网站上使用了最新的 Ubuntu18.04 发行版,但是考虑最大程度的稳定性,我还是选择了 16.04 ,毕竟两年多的使用,几乎没有遇到问题,而且和 docker-ce 兼容性的问题,也解决了大半,省心省力。

配置操作系统

虚拟机默认安装完毕的操作系统,是无法使用 SSH 进行远程访问的。需要先安装 openssh-server 以便开启访问服务。

 
  1. apt update && apt install -y openssh-server

程序安装完毕之后,就可以直接使用 SSH 连接并管理服务器了。

我这里为了后面的操作简单,将新机器在本地 SSH CONFIG 中配置为了 gitlab-2018.lab.com ,然后做了 RSA KEY 授信免登陆。

 
  1. ssh-copy-id -i SOME—KEY.pub soulteary@gitlab-2018.lab.com

清理一下无用的软件源和注释。

 
  1. cat /etc/apt/sources.list | grep -v '#' | grep -v 'cdrom:' | sudo tee /etc/apt/sources.list

如果在国内,希望加速软件下载,可以使用下面的命令。

 
  1. cat /etc/apt/sources.list | sed -e "s/us\.archive\.ubuntu\.com/mirrors\.aliyun\.com/" | sed -e "s/security\.ubuntu\.com/mirrors\.aliyun\.com/" | sudo tee /etc/apt/sources.list

然后更新软件包,下载一些基础依赖和工具。

 
  1. apt install -y apt-transport-https ca-certificates curl software-properties-common
  2. apt upgrade -y

当然,如果要安装 docker-ce ,推荐使用官方源,可以参考 之前的文章 。我这里为了安装快速,就先使用国内阿里云的源了。

 
  1. curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
  2. apt-key fingerprint 0EBFCD88
  3.  
  4. add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
  5. apt install -y docker-ce

这里可以根据自己情况,考虑是否要锁定当前的 GitLab 软件版本。

 
  1. apt-mark docker-ce

编排工具,使用官方出品的 compose 即可,简单够用。

 
  1. curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
  2. chmod +x /usr/local/bin/docker-compose

考虑到 GitLab 会占用 22 端口,我们先行将系统的端口进行修改。

 
  1. cat /etc/ssh/sshd_config | sed -e 's/#Port 22/Port 55555/' | sed -e 's/Port 22/Port 55555/' | sudo tee /etc/ssh/sshd_config
  2.  
  3. service ssh restart

如果你也配置了 SSH CONFIG, 需要一同修改里面的端口记录。

有指定 SHELL 习惯的童鞋,可以顺手配置。

 
  1. apt install -y zsh
  2. sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"

修改 Docker 配置

如果觉得国内下载 Docker 镜像包比较慢,可以编辑 /etc/docker/daemon.json 加速资源下载。

如果你进行了配置修改,想要让配置修改生效,必须重启 docker 服务,可以参考下面的命令。

 
  1. mkdir -p /etc/docker && touch /etc/docker/daemon.json
  2.  
  3. cat <<EOF > /etc/docker/daemon.json
  4. {
  5. "registry-mirrors": [
  6. "http://你的镜像地址"
  7. ]
  8. }
  9. EOF
  10.  
  11. service docker restart

搭建新的 GitLab 运行容器

下面提供一个简单的文件配置,各位看官可以按自己需求修改。

因为没有用到太多特殊功能,我这里将 compose 配置声明为 v2 。

 
  1. version: '2'
  2.  
  3. services:
  4.  
  5. gitlab:
  6. restart: always
  7. image: 'gitlab/gitlab-ce:11.2.3-ce.0'
  8. hostname: 'gitlab.lab.com'
  9. ports:
  10. - "80:80"
  11. - "443:443"
  12. - "22:22"
  13. - "9005:9999" # Nginx
  14. # 解决搜索引擎搜索不出小于3字符问题
  15. # https://gitlab.com/gitlab-org/gitlab-ce/issues/40379
  16. entrypoint: |
  17. bash -c 'sed -i "s/MIN_CHARS_FOR_PARTIAL_MATCHING = 3/MIN_CHARS_FOR_PARTIAL_MATCHING = 1/g" /opt/gitlab/embedded/service/gitlab-rails/lib/gitlab/sql/pattern.rb && /assets/wrapper'
  18. volumes:
  19. - './config:/etc/gitlab'
  20. - './logs:/var/log/gitlab'
  21. - './data:/var/opt/gitlab'
  22. - './cert/lab.com.crt:/etc/gitlab/ssl/lab.com.crt:ro'
  23. - './cert/lab.com.key:/etc/gitlab/ssl/lab.com.key:ro'
  24. - './cert/lab.com.crt:/etc/gitlab/ssl/registry.gitlab.lab.com.crt:ro'
  25. - './cert/lab.com.key:/etc/gitlab/ssl/registry.gitlab.lab.com.key:ro'
  26. - './cert/lab.com.crt:/etc/gitlab/ssl/page.lab.com.crt:ro'
  27. - './cert/lab.com.key:/etc/gitlab/ssl/page.lab.com.key:ro'
  28. - './cert/lab.com.crt:/etc/gitlab/ssl/pages-nginx.crt:ro'
  29. - './cert/lab.com.key:/etc/gitlab/ssl/pages-nginx.key:ro'
  30. - './cert/lab.com.crt:/var/opt/gitlab/registry/certificate.crt:ro'
  31. - './embedded-logs:/opt/gitlab/embedded/logs/'
  32. environment:
  33. GITLAB_OMNIBUS_CONFIG: |
  34. external_url 'https://gitlab.lab.com'
  35. gitlab_rails['time_zone'] = 'Asia/Shanghai'
  36. gitlab_rails['gitlab_default_projects_features_issues'] = true
  37. gitlab_rails['gitlab_default_projects_features_merge_requests'] = true
  38. gitlab_rails['gitlab_default_projects_features_wiki'] = true
  39. gitlab_rails['gitlab_default_projects_features_snippets'] = true
  40. gitlab_rails['gitlab_default_projects_features_builds'] = true
  41. gitlab_rails['gitlab_default_projects_features_container_registry'] = false
  42. gitlab_rails['lfs_enabled'] = true
  43. gitlab_rails['registry_enabled'] = false
  44. prometheus_monitoring['enable'] = false
  45. node_exporter['enable'] = false
  46. redis_exporter['enable'] = false
  47. postgres_exporter['enable'] = false
  48. gitlab_monitor['enable'] = false
  49. registry['enable'] = false
  50. nginx['enable'] = true
  51. nginx['client_max_body_size'] = '250m'
  52. nginx['redirect_http_to_https'] = true
  53. nginx['redirect_http_to_https_port'] = 80
  54. nginx['ssl_certificate'] = "/etc/gitlab/ssl/lab.com.crt"
  55. nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/lab.com.key"
  56. nginx['ssl_ciphers'] = "ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256"
  57. nginx['ssl_prefer_server_ciphers'] = "on"
  58. nginx['ssl_protocols'] = "TLSv1.2"
  59. pages_external_url "https://page.lab.com/"
  60. pages_nginx['ssl_certificate'] = "/etc/gitlab/ssl/pages-nginx.crt"
  61. pages_nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/pages-nginx.key"
  62. gitlab_pages['enable'] = true
  63. gitlab_pages['inplace_chroot'] = true
  64. gitlab_pages['redirect_http'] = false
  65. gitlab_pages['use_http2'] = true
  66. gitlab_pages['dir'] = "/var/opt/gitlab/gitlab-pages"
  67. gitlab_pages['log_directory'] = "/var/log/gitlab/gitlab-pages"
  68. gitlab_pages['artifacts_server'] = true
  69. gitlab_pages['artifacts_server_timeout'] = 10
  70. nginx['http2_enabled'] = true
  71. nginx['proxy_set_headers'] = {
  72. "X-Forwarded-Proto" => "http",
  73. "CUSTOM_HEADER" => "VALUE"
  74. }
  75. nginx['status'] = {
  76. "listen_addresses" => ["127.0.0.1"],
  77. "fqdn" => "gitlab.lab.com",
  78. "port" => 9999,
  79. "options" => {
  80. "stub_status" => "on", # Turn on stats
  81. "access_log" => "on", # Disable logs for stats
  82. "allow" => "127.0.0.1", # Only allow access from localhost
  83. "deny" => "all" # Deny access to anyone else
  84. }
  85. }

将配置文件保存到新的服务器上,执行 docker-compose up 后,程序便会自动下载镜像文件,然后自动启动应用。

 
  1. Creating network "gitlablabcom_default" with the default driver
  2. Pulling gitlab (gitlab/gitlab-ce:11.2.3-ce.0)...
  3. 11.2.3-ce.0: Pulling from gitlab/gitlab-ce
  4. 3b37166ec614: Pull complete
  5. 3b37166ec614: Pull complete
  6. ba077e1ddb3a: Pull complete
  7. 34c83d2bc656: Pull complete
  8. 84b69b6e4743: Pull complete
  9. 0f72e97e1f61: Pull complete
  10. 2d84d0050f56: Pull complete
  11. 3988829a97fa: Pull complete
  12. 9388ce60a1b5: Pull complete
  13. 3f38070b922c: Pull complete
  14. 2484a73c1218: Pull complete
  15. be305d229b7a: Pull complete
  16. Digest: sha256:b5927ed7ac79524251c3b717195c239023a33d169709c9f1d74f0a898975938f
  17. Status: Downloaded newer image for gitlab/gitlab-ce:11.2.3-ce.0
  18. Creating gitlablabcom_gitlab_1 ... done
  19. Attaching to gitlablabcom_gitlab_1
  20. gitlab_1 | Thank you for using GitLab Docker Image!
  21. gitlab_1 | Current version: gitlab-ce=11.2.3-ce.0
  22. gitlab_1 |
  23. gitlab_1 | Configure GitLab for your system by editing /etc/gitlab/gitlab.rb file
  24. gitlab_1 | And restart this container to reload settings.
  25. gitlab_1 | To do it use docker exec:

当你看到下面的请求记录日志后,你的应用便启动完成了。

 
  1. gitlab_1 | ==> /var/log/gitlab/sidekiq/current <==
  2. gitlab_1 | 2018-09-27_03:15:25.08874 2018-09-27T03:15:25.088Z 1013 TID-osuacsvzh PagesDomainVerificationCronWorker JID-f6d295ba87e7ea6c13f788d4 INFO: start
  3. gitlab_1 | 2018-09-27_03:15:25.09873 2018-09-27T03:15:25.098Z 1013 TID-osuacsw65 StuckImportJobsWorker JID-465eb7f9283897dd1d622dc1 INFO: start
  4. gitlab_1 | 2018-09-27_03:15:25.13306 2018-09-27T03:15:25.132Z 1013 TID-osuacsvzh PagesDomainVerificationCronWorker JID-f6d295ba87e7ea6c13f788d4 INFO: done: 0.044 sec
  5. gitlab_1 | 2018-09-27_03:15:25.14188 2018-09-27T03:15:25.141Z 1013 TID-osuacsw65 StuckImportJobsWorker JID-465eb7f9283897dd1d622dc1 INFO: done: 0.043 sec
  6. gitlab_1 |
  7. gitlab_1 | ==> /var/log/gitlab/gitlab-rails/production.log <==
  8. gitlab_1 | Started GET "/help" for 127.0.0.1 at 2018-09-27 03:15:50 +0000
  9. gitlab_1 | Processing by HelpController#index as */*
  10. gitlab_1 | Completed 200 OK in 304ms (Views: 296.9ms | ActiveRecord: 3.0ms)
  11. gitlab_1 |

如果你是新用户,那么现在便可以结束文章浏览,访问你的 GitLab 进行体验了。

接下来我们开始老数据的备份,以及将数据迁移到新的 GitLab 应用中。

备份之前的 GitLab 数据

如果你也是使用容器化的方式运行 GitLab ,备份命令需要依赖 Docker 作为代理执行命令( gitlab_gitlab_1 为容器运行名称)。

 
  1. docker exec -t gitlab_gitlab_1 gitlab-rake gitlab:backup:create

如果是裸机运行,那么直接运行下面的命令。

 
  1. gitlab-rake gitlab:backup:create

命令顺利执行完毕后,然后可以在应用的 /data/backups 中找到备份的数据文件。

将数据文件保存/转移到新的机器上之后,我们便可以开始正式的迁移工作。

迁移(还原)数据

先将备份文件放置回新的应用的 /data/backups 文件夹中。

然后使用 docker ps 获取运行容器的名称。

 
  1. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  2. 3fba53e6c021 gitlab/gitlab-ce:11.2.3-ce.0 "bash -c 'sed -i \"s/…" 10 minutes ago Up 24 minutes (healthy) 0.0.0.0:22->22/tcp, 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp, 0.0.0.0:9005->9999/tcp gitlablabcom_gitlab_1

然后执行 dockerexec-t gitlablabcom_gitlab_1 gitlab-rake gitlab:backup:restore RAILS_ENV=production 即可开始恢复数据。

在执行过程中,程序会询问你是否愿意放弃当前应用的所有数据,开始恢复操作,请回复 yes 。

 
  1. docker exec -t gitlablabcom_gitlab_1 gitlab-rake gitlab:backup:restore
  2. Unpacking backup ... done
  3. Before restoring the database, we will remove all existing
  4. tables to avoid future upgrade problems. Be aware that if you have
  5. custom tables in the GitLab database these tables and all data will be
  6. removed.
  7.  
  8. Do you want to continue (yes/no)? yes

经过漫长的等待(根据数据量而定)。

 
  1. done
  2. Restoring uploads ...
  3. done
  4. Restoring builds ...
  5. done
  6. Restoring artifacts ...
  7. done
  8. Restoring pages ...
  9. done
  10. Restoring lfs objects ...
  11. done
  12. This will rebuild an authorized_keys file.
  13. You will lose any data stored in authorized_keys file.
  14. Do you want to continue (yes/no)? yes
  15.  
  16. .......
  17. Deleting tmp directories ... done
  18. done
  19. done
  20. done
  21. done
  22. done
  23. done
  24. done

最后重新启动你的 GitLab 应用,迁移就完毕了。

最后

喜欢折腾的小伙伴可以扫二维码添加好友(记得注明来源和目的,方便备注拉群)。

我计划拉个小群,把喜欢折腾的朋友聚一起,在不发广告的情况下,聊聊软件、HomeLab、编程上的一些问题,来扩展和积累一些写作素材。

---EOF

GitLab单机迁移至高可用架构,需要进行以下步骤: 1. 安装并配置HAProxy或Nginx负载均衡器,将请求转发到GitLab节点。 2. 安装并配置PostgreSQL数据库集群,并设置为GitLab的外部数据库。 3. 安装并配置Redis集群,用于GitLab的缓存和会话存储。 4. 在GitLab单机上备份所有数据,并将其恢复到新的GitLab高可用架构中。 5. 配置GitLab,将其配置为使用外部数据库和Redis集群。 6. 配置GitLab节点之间的数据同步,确保数据在所有节点之间同步。 7. 配置HAProxy或Nginx负载均衡器,将请求转发到新的GitLab高可用架构中。 具体操作步骤如下: 1. 安装并配置HAProxy或Nginx负载均衡器,将请求转发到GitLab节点。 - 安装HAProxy或Nginx。 - 配置负载均衡器,将请求转发到GitLab节点。 - 配置SSL证书(如果需要)。 2. 安装并配置PostgreSQL数据库集群,并设置为GitLab的外部数据库。 - 安装PostgreSQL数据库集群。 - 配置主从备份模式。 - 将GitLab数据库设置为外部数据库。 3. 安装并配置Redis集群,用于GitLab的缓存和会话存储。 - 安装Redis集群。 - 配置Redis集群的主从备份模式。 - 将GitLab的缓存和会话存储设置为Redis集群。 4. 在GitLab单机上备份所有数据,并将其恢复到新的GitLab高可用架构中。 - 在GitLab单机上备份所有数据,包括配置文件、数据文件、日志文件等。 - 将备份文件复制到新的GitLab高可用架构中。 - 恢复备份文件到新的GitLab高可用架构中。 5. 配置GitLab,将其配置为使用外部数据库和Redis集群。 - 配置GitLab使用外部数据库和Redis集群。 - 修改GitLab配置文件,指向外部数据库和Redis集群。 6. 配置GitLab节点之间的数据同步,确保数据在所有节点之间同步。 - 配置GitLab节点之间的数据同步,确保数据在所有节点之间同步。 - 确保所有节点的数据同步状态。 7. 配置HAProxy或Nginx负载均衡器,将请求转发到新的GitLab高可用架构中。 - 配置HAProxy或Nginx负载均衡器,将请求转发到新的GitLab高可用架构中。 - 测试GitLab高可用架构是否正常工作。 需要注意的是,在进行此操作之前,应备份所有数据,并确保您已经了解了所有步骤和风险。同时,建议使用容器化技术(如Docker)来简化部署和管理过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值