gitlab部署

1、宿主机新建gitlab的数据存放目录

$ mkdir /data /data/gitlab /data/gitlab/data  /data/gitlab/config  /data/gitlab/logs

2、运行gitlab镜像

$  docker run --detach \
--hostname 服务器ip \
--publish 14443:443 --publish 18800:80 --publish 12220:22 \
--name gitlab \
--restart always \
--volume /data/gitlab/config:/etc/gitlab \
--volume /data/gitlab/logs:/var/log/gitlab \
--volume /data/gitlab//data:/var/opt/gitlab \
gitlab/gitlab-ce:11.9.8-ce.0    //这里最好指定tag吧,因为恢复的时候用相同的tag才不会出现版本的问题

3、配置gitlab.rb

//修改 clone ssh时的端口  ssh://git@服务器ip:12220/groupname/xxxx.git
//如果使用的是默认端口就不需要改了
$ vim /data/gitlab/config/gitlab.rb //去掉注释 修改 gitlab_rails['gitlab_shell_ssh_port'] = 12220  
//进入容器
$ docker exec -it gitlab /bin/bash
//容器中重新加载配置文件:
$ gitlab-ctl reconfigure
//容器中重启gitlab服务
$ gitlab-ctl restart

gitlab备份、恢复

1、利用crontab、rsync实现准实时备份 、恢复

1.1、利用crontab、rsync实现准实时备份

直接把 /data/gitlab目录下的内容同步到【文件存储】或【服务器】等。
crontab 添加下面任务 因为gitlab的服务器上挂载了阿里云的NAS文件存储,所以我这里直接在gitlab服务器上添加crontab任务,定时把文件同步到NAS上。
crontab任务: 0 */2 * * * /usr/bin/rsync -avzP --delete --exclude=‘backups’ /data/gitlab /mnt_nas/gitlab/raw_backups >> /mnt_nas/rsynclog/rsync-gitlab-raw-backup.log //最多会丢失2小时的内容,其实时间间隔可以再小点15分钟一次都可以 。

有时可能这样同步过来的数据再回复的时候可能会报错,但我这边试了很多次都没问题

1.2、恢复

基于同步过来的文件新建一个gitlab镜像

//可以把备份的文件拷贝到任何合适的地方来新建镜像
//注意修改gitlab.rb文件
$  docker run --detach \
--hostname 服务器ip \
--publish 14443:443 --publish 18800:80 --publish 12220:22 \
--name gitlab \
--restart always \
--volume /mnt_nas/gitlab/raw_backups/gitlab/config:/etc/gitlab \
--volume /mnt_nas/gitlab/raw_backups/gitlab/logs:/var/log/gitlab \
--volume /mnt_nas/gitlab/raw_backups/gitlab//data:/var/opt/gitlab \
gitlab/gitlab-ce:11.9.8-ce.0

2、利用crontab、gitlab-rake、rsync实现备份 、恢复

2.1、利用crontab、gitlab-rake、rsync实现备份
//添加下面crontab任务。
//docker exec -i  这个不能加t 即docker exec -it ,不然gitlab-rake gitlab:backup:create的命令执行不了
//STRATEGY=copy  使用复制策略
//因为我把NAS挂载到了/data/gitlab//data/backups的目录,所以执行下面任务会直接把备份的文件生成到NAS上,省去了rsync部分
crontab任务: 0 3  * * *   docker exec -i gitlab gitlab-rake gitlab:backup:create STRATEGY=copy    >> /mnt_nas/rsynclog/gitlab-rake-backup.log
//还要把/data/gitlab/config目录中的配置文件gitlab-secrets.json备份过来,我这边是把这个目录备份的,
crontab任务: 0 3,13  * * *   /usr/bin/rsync -avzP  --delete  /data/gitlab/config /mnt_nas/gitlab/gitlab_rake_backups >> /mnt_nas/rsynclog/gitlab-config-backup.log

备份策略选项
该选项对gitlab 8.17及以上版本有效。
默认的备份策略是使用linux的tar/gzip命令。这在大多数情况下是没有问题的,但是当数据在打包过程中发生改变时,将会有错误抛出file changed as we read it,这会导致备份进程失败。为了解决这个问题,8.17引入了一个名为copy的备份策略,就是在调用tar、gzip时将数据拷贝到一个临时位置。不过也引入了另一个问题,将额外占用一倍的磁盘空间。 要使用复制策略而不是默认流策略,可以指定STRATEGY = copy。例如,sudo gitlab-rake gitlab:backup:create STRATEGY = copy。

2.2、恢复

重走一遍gitlab的部署
宿主机新建gitlab的数据存放目录

$ mkdir /data /data/gitlab /data/gitlab/data  /data/gitlab/config  /data/gitlab/logs

运行gitlab镜像

$  docker run --detach \
--hostname 服务器ip \
--publish 14443:443 --publish 18800:80 --publish 12220:22 \
--name gitlab \
--restart always \
--volume /data/gitlab/config:/etc/gitlab \
--volume /data/gitlab/logs:/var/log/gitlab \
--volume /data/gitlab//data:/var/opt/gitlab \
gitlab/gitlab-ce:11.9.8-ce.0    //这里最好指定tag吧,因为恢复的时候用相同的tag才不会出现版本的问题

配置gitlab.rb

//修改 clone ssh时的端口  ssh://git@服务器ip:12220/groupname/xxxx.git
//如果使用的是默认端口就不需要改了
$ vim /data/gitlab/config/gitlab.rb //去掉注释 修改 gitlab_rails['gitlab_shell_ssh_port'] = 12220

把备份的gitlab-secrets.json复制到/data/gitlab/config,把备份的仓储压缩包( 如:1587550111_2020_04_22_11.9.8_gitlab_backup.tar)复制到/data/gitlab/data/backups目录
执行恢复:
docker exec -i gitlab gitlab-rake gitlab:backup:restore BACKUP=1587550111_2020_04_22_11.9.8 force=yes (注1587550111_2020_04_22_11.9.8没有后缀_gitlab_backup.tar)

//重新加载配置文件:
 $ docker exec -i gitlab gitlab-ctl reconfigure
 //重启gitlab服务
 $ docker exec -i gitlab gitlab-ctl restart

常见错误

1、备份恢复后出现 【gitlab服务迁移到新服务器后integrations报500错误】

需要用备份的gitlab-secrets.json覆盖掉新生成的gitlab-secrets.json文件
然后重新加载配置文件:
gitlab-ctl reconfigure
重启gitlab服务
gitlab-ctl restart

完毕