docker部署的gitlab数据迁移
公司gitlab通过docker部署,现在需要将gitlab迁移到其他服务器。
参考网址:
https://juejin.cn/post/7223339726140407866 (docker-compose部署gitlab)
https://www.bookstack.cn/read/gitlab-doc-zh/docs-510.md (gitlab迁移中文文档)
https://developer.aliyun.com/article/1097508 (docker方式迁移)
//www.greatytc.com/p/09a2b0c25ecd (restore时日常处理)
https://www.cnblogs.com/libruce/p/16729807.html (restore时日常处理)
一、备份
-
备份gitlab镜像
# 在源服务器执行docker save导出gitlab镜像 docker save -o gitlabImage.tar gitlab-jh.tencentcloudcr.com/omnibus/gitlab-jh:latest # 在源服务器通过scp将gitlab镜像上传到目标服务器 scp -P 22 ./gitlabImage.tar root@192.168.2.2:/root/ # 此处使用scp,多次尝试使用rsync备份后目标地址文件大小跟原始文件大小差异很大 nohup scp -P 22 /data/gitlab/data/backups/jh_gitlab_backup.tar root@192.168.2.2:/data/git_back_data/ < /root/scp.out
-
备份数据
# 采用后台运行打印日志的方式备份,防止文件过大导致备份失败 nohup docker exec -t gitlab gitlab-backup create > /root/gitlab_backup.log 2>&1 &
备份配置文件
由于备份数据时并没有备份gitlab.rb 和gitlab-secrets.json配置文件,这两个文件是源gitlab配置文件,包含pg数据库相关的配置。
只需要备份容器内/etc/gitlab映射出来的全部文件即可。
二、恢复
- 先用docker-compose启动gitlab
docker-compose -f ./docker-compose-gitlab.yaml up -d
-
将备份文件拷贝到gitlab备份目录下,即容器内幕/var/opt/gitlab/backups映射出来的目录.
# 因为此次备份文件过大,所以直接移动 mv /data/git_back_data/jh_gitlab_backup.tar /data/gitlab/data/backups/
-
停止gitlab相关服务
#先进到容器 docker exec -it gitlab bash #在容器内执行命令停止 unicorn、puma、sidekiq gitlab-ctl stop unicorn gitlab-ctl stop puma gitlab-ctl stop sidekiq
-
执行恢复命令
因为此次备份文件为41G,多次尝试容器内直接执行 gitlab-backup restore 和容器外执行docker exec -it gitlab gitlab-backup restore,均因shell界面断连接导致失败。后尝试后台运行脚本,执行 nohup docker exec -it gitlab gitlab-backup restore &,但因为在该脚本执行过程中需要用户输入yes/no,导致命令只运行到解压完备份文件就停止。
最终选择使用expect命令实现,首先需要有个脚本restore.sh
#!/usr/bin/expect set timeout -1 spawn docker exec -it gitlab gitlab-backup restore expect { "yes/no" { send "yes\n";exp_continue } }
执行需要用到expect命令
expect restore.sh
在执行docker exec -it gitlab gitlab-backup restore可能会遇到以下报错:
Restoring PostgreSQL database gitlabhq_production ... ERROR: must be owner of extension pg_trgm ERROR: must be owner of extension btree_gist ERROR: must be owner of extension btree_gist ERROR: must be owner of extension pg_trgm
解决方案:
1). 修改postgresql配置
$ vim /var/opt/gitlab/postgresql/data/postgresql.conf listen_addresses = '*' # 最下面新增两行 $ vim /var/opt/gitlab/postgresql/data/pg_hba.conf local all all trust host all all 127.0.0.1/32 trust
2). 重启gitlab服务
$ gitlab-ctl restart ok: run: logrotate: (pid 29367) 1s ok: run: nginx: (pid 29371) 0s ok: run: postgresql: (pid 29389) 0s ok: run: redis: (pid 29391) 0s ok: run: sidekiq: (pid 29404) 0s ok: run: unicorn: (pid 29413) 0s
3). 修改gitlab账号为超级用户
$ su - gitlab-psql $ /opt/gitlab/embedded/bin/psql -h 127.0.0.1 gitlabhq_production psql (9.2.8) Type "help" for help. gitlabhq_production=# ALTER USER gitlab WITH SUPERUSER; ALTER ROLE gitlabhq_production=# \q
最后不要忘记停止unicorn、puma、sidekiq再执行restore
执行reconfigure
#将备份的配置文件中gitlab.rb 和gitlab-secrets.json复制到容器映射的配置文件路径
cp /data/git_back_data/config/gitlab.rb /data/gitlab/data/config/
cp /data/git_back_data/config/gitlab-secrets.json /data/gitlab/data/config/
# 执行reconfigure命令
docker exec -it gitlab-ctl reconfigure
-
恢复完成后,启动服务
gitlab-ctl start
重置root密码
#在gitlab容器内运行进入 Rails 控制台
gitlab-rails console -e production
#执行以下命令来修改 root 用户的密码:
user = User.where(id: 1).first
user.password = '123456'
user.password_confirmation = '123456'
user.save!
三、本地git仓库修改远程仓库地址
删除本地仓库关联的远程地址,添加新的远程仓库地址.
#查看远程仓库地址
git remote -v
D:\code>git remote -v
origin http://xxx.xxx.1xxx0.xxx:xxxx/some-group/some-project.git (fetch)
origin http://xxx.xxx.xxx.xxxx:xxxx/some-group/some-project.git (push)
#删除远程仓库:
git remote rm origin
# 添加新仓库地址:
git remote add origin http://xxx.xxx.xxx.xxx:xxxx/some-project.git
#拉取最新代码
git fetch origin
info: detecting host provider for 'http://xxx.xxx.xxx.xxx:xxxx/'...
info: detecting host provider for 'http://xxx.xxx.xxx.xxx:xxxx/'...
remote: Enumerating objects: 13, done.
remote: Counting objects: 100% (13/13), done.
remote: Compressing objects: 100% (7/7), done.
remote: Total 10 (delta 6), reused 5 (delta 2), pack-reused 0
结果:提交成功! # docker部署的gitlab数据迁移
公司gitlab通过docker部署,现在需要将gitlab迁移到其他服务器。
参考网址:
https://juejin.cn/post/7223339726140407866 (docker-compose部署gitlab)
https://www.bookstack.cn/read/gitlab-doc-zh/docs-510.md (gitlab迁移中文文档)
https://developer.aliyun.com/article/1097508 (docker方式迁移)
//www.greatytc.com/p/09a2b0c25ecd (restore时日常处理)
https://www.cnblogs.com/libruce/p/16729807.html (restore时日常处理)
一、备份
-
备份gitlab镜像
# 在源服务器执行docker save导出gitlab镜像 docker save -o gitlabImage.tar gitlab-jh.tencentcloudcr.com/omnibus/gitlab-jh:latest # 在源服务器通过scp将gitlab镜像上传到目标服务器 scp -P 22 ./gitlabImage.tar root@192.168.2.2:/root/ # 此处使用scp,多次尝试使用rsync备份后目标地址文件大小跟原始文件大小差异很大 nohup scp -P 22 /data/gitlab/data/backups/jh_gitlab_backup.tar root@192.168.2.2:/data/git_back_data/ < /root/scp.out
-
备份数据
# 采用后台运行打印日志的方式备份,防止文件过大导致备份失败 nohup docker exec -t gitlab gitlab-backup create > /root/gitlab_backup.log 2>&1 &
备份配置文件
由于备份数据时并没有备份gitlab.rb 和gitlab-secrets.json配置文件,这两个文件是源gitlab配置文件,包含pg数据库相关的配置。
只需要备份容器内/etc/gitlab映射出来的全部文件即可。
二、恢复
- 先用docker-compose启动gitlab
docker-compose -f ./docker-compose-gitlab.yaml up -d
-
将备份文件拷贝到gitlab备份目录下,即容器内幕/var/opt/gitlab/backups映射出来的目录.
# 因为此次备份文件过大,所以直接移动 mv /data/git_back_data/jh_gitlab_backup.tar /data/gitlab/data/backups/
-
停止gitlab相关服务
#先进到容器 docker exec -it gitlab bash #在容器内执行命令停止 unicorn、puma、sidekiq gitlab-ctl stop unicorn gitlab-ctl stop puma gitlab-ctl stop sidekiq
-
执行恢复命令
因为此次备份文件为41G,多次尝试容器内直接执行 gitlab-backup restore 和容器外执行docker exec -it gitlab gitlab-backup restore,均因shell界面断连接导致失败。后尝试后台运行脚本,执行 nohup docker exec -it gitlab gitlab-backup restore &,但因为在该脚本执行过程中需要用户输入yes/no,导致命令只运行到解压完备份文件就停止。
最终选择使用expect命令实现,首先需要有个脚本restore.sh
#!/usr/bin/expect set timeout -1 spawn docker exec -it gitlab gitlab-backup restore expect { "yes/no" { send "yes\n";exp_continue } }
执行需要用到expect命令
expect restore.sh
在执行docker exec -it gitlab gitlab-backup restore可能会遇到以下报错:
Restoring PostgreSQL database gitlabhq_production ... ERROR: must be owner of extension pg_trgm ERROR: must be owner of extension btree_gist ERROR: must be owner of extension btree_gist ERROR: must be owner of extension pg_trgm
解决方案:
1). 修改postgresql配置
$ vim /var/opt/gitlab/postgresql/data/postgresql.conf listen_addresses = '*' # 最下面新增两行 $ vim /var/opt/gitlab/postgresql/data/pg_hba.conf local all all trust host all all 127.0.0.1/32 trust
2). 重启gitlab服务
$ gitlab-ctl restart ok: run: logrotate: (pid 29367) 1s ok: run: nginx: (pid 29371) 0s ok: run: postgresql: (pid 29389) 0s ok: run: redis: (pid 29391) 0s ok: run: sidekiq: (pid 29404) 0s ok: run: unicorn: (pid 29413) 0s
3). 修改gitlab账号为超级用户
$ su - gitlab-psql $ /opt/gitlab/embedded/bin/psql -h 127.0.0.1 gitlabhq_production psql (9.2.8) Type "help" for help. gitlabhq_production=# ALTER USER gitlab WITH SUPERUSER; ALTER ROLE gitlabhq_production=# \q
最后不要忘记停止unicorn、puma、sidekiq再执行restore
执行reconfigure
#将备份的配置文件中gitlab.rb 和gitlab-secrets.json复制到容器映射的配置文件路径
cp /data/git_back_data/config/gitlab.rb /data/gitlab/data/config/
cp /data/git_back_data/config/gitlab-secrets.json /data/gitlab/data/config/
# 执行reconfigure命令
docker exec -it gitlab-ctl reconfigure
-
恢复完成后,启动服务
gitlab-ctl start
重置root密码
#在gitlab容器内运行进入 Rails 控制台
gitlab-rails console -e production
#执行以下命令来修改 root 用户的密码:
user = User.where(id: 1).first
user.password = '123456'
user.password_confirmation = '123456'
user.save!
三、本地git仓库修改远程仓库地址
删除本地仓库关联的远程地址,添加新的远程仓库地址.
#查看远程仓库地址
git remote -v
D:\code>git remote -v
origin http://xxx.xxx.1xxx0.xxx:xxxx/some-group/some-project.git (fetch)
origin http://xxx.xxx.xxx.xxxx:xxxx/some-group/some-project.git (push)
#删除远程仓库:
git remote rm origin
# 添加新仓库地址:
git remote add origin http://xxx.xxx.xxx.xxx:xxxx/some-project.git
#拉取最新代码
git fetch origin
info: detecting host provider for 'http://xxx.xxx.xxx.xxx:xxxx/'...
info: detecting host provider for 'http://xxx.xxx.xxx.xxx:xxxx/'...
remote: Enumerating objects: 13, done.
remote: Counting objects: 100% (13/13), done.
remote: Compressing objects: 100% (7/7), done.
remote: Total 10 (delta 6), reused 5 (delta 2), pack-reused 0
结果:提交成功!