最近公司新够了一批服务器,且此前的服务器即将作废,迁移就顺理成章地成为了一道必不可少的工序。本文主要讲解 Gitlab server 迁移步骤。
前景提要
当前的 Gitlab(CE,社区版) 是通过 Docker 运行的,命令如下:
#!/bin/bash
CONTAINER_NAME=gitlab-server
CONFIG_DIR=/opt/servers/gitlab/config
LOGS_DIR=/opt/servers/gitlab/logs
DATA_DIR=/opt/servers/gitlab/data
sudo docker run -d \
--name $CONTAINER_NAME \
--hostname gitlab.example.com \
-p 443:443 \
-p 80:80 \
-p 22:22 \
--restart always \
-v $CONFIG_DIR:/etc/gitlab \
-v $LOG_DIR:/var/log/gitlab \
-v $DATA_DIR:/var/opt/gitlab \
gitlab/gitlab-ce
注意自定义配置 hostname = gitlab.example.com。
这台服务器直接用于提供 Gitlab 服务器,不经过代理进行访问(推荐),所以端口都采用默认的配置。
备份
备份前请确认 Gitlab 处于运行状态,然后执行
请自行替换
执行 Gitlab 备份命令
# 备份重要私密文件
docker exec -it {container_id} gitlab-ctl backup-etc
# 备份 Gitlab 上传文件,数据库等
docker exec -it {container_id} gitlab-backup
这里,我们会得到两个备份文件:
/etc/gitlab/config_backup/gitlab_config_1605521585_2020_11_16.tar
/var/opt/gitlab/backups/1605508463_2020_11_16_13.5.4_gitlab_backup.tar
复制备份文件到宿主机(方便转移)
请自行替换备份文件名
docker cp {container_id}:/etc/gitlab/config_backup/gitlab_config_1605521585_2020_11_16.tar ~/
docker cp {container_id}:/var/opt/gitlab/backups/1605508463_2020_11_16_13.5.4_gitlab_backup.tar ~/
转移备份文件
转移备份文件到新服务器
转移前请确保知晓对方服务器帐号密码或者将本服务器的 public key 添加到对方服务器的 ~/.ssh/authorized_keys 中
rsync ~/gitlab_config_1605521585_2020_11_16.jar username@server:~/
rsync ~/1605508463_2020_11_16_13.5.4_gitlab_backup.tar username@server:~/
启动新 Gitlab 并准备备份文件
进入新的服务器后,按照本文开头命令运行全新的 Gitlab。
配置 sshd 默认端口
由于 Gitlab 需要占用 22 端口,所有需要配置 sshd 的默认端口,保证 Gitlab 能够正常启动。
编辑 sshd_config 文件:
sudo vim /etc/ssh/sshd_config
新增以下配置:
Port 2222
重启 sshd:
sudo systemctl restart sshd
解压并复制到容器对应目录
# 解压 Gitlab 配置
mkdir ~/gitlab-config
tar xvf gitlab_config_1605497689_2020_11_16.tar -C ~/gitlab-config
# 将目录复制到容器目录中
docker cp ~/gitlab-config/etc/gitlab/ {container_id}:/etc/
# 将备份文件复制到容器指定目录中
docker cp 1605508463_2020_11_16_13.5.4_gitlab_backup.tar {container_id}:/var/opt/gitlab/backups
容器中的备份文件:1605508463_2020_11_16_13.5.4_gitlab_backup.tar
的权限为:-rw------- 1 1000 1000
,会导致备份还原程序解压时出现 Permisssion Denied 错误,所以需要进入容器中设置该文件的权限为:-rw------- 1 git git
。
docker exec -it {container_id} bash
chown git:git /var/opt/gitlab/backups/1605508463_2020_11_16_13.5.4_gitlab_backup.tar
exit
进行备份还原操作
此时新的 Gitlab 正在运行,且备份数据已准备就绪。在还原之前,首先需要停止 unicorn、puma 和 sidekiq 服务。
docker exec -it {container_id} gitlab-ctl stop unicorn
docker exec -it {container_id} gitlab-ctl stop puma
docker exec -it {container_id} gitlab-ctl stop sidekiq
docker exec -it {container_id} gitlab-ctl status
执行备份还原操作:
docker exec -it 18 gitlab-backup restore
申请域名证书
这里推荐使用 https://github.com/acmesh-official/acme.sh/wiki/dnsapi 获取免费证书。
配置 Nginx SSL
进入容器 /etc/gitlab/ssl 或者直接在 /opt/servers/gitlab/config/ssl 下添加证书即可。注意:域名证书文件名必须以 crt 结尾,如:gitlab.example.com.crt,同时 ca.crt (证书授权证书)也许要添加到对应的目录或者 append 到 gitlab.example.com.crt 中。否则会造成 x509: certificate signed by unknown authority
错误。
重启 Gitlab
docker restart {container_id}
最后当然是更改域名的解析了 :P