> 参考:https://docs.gitlab.com/ee/raketasks/backup_restore.html
最近公司新够了一批服务器,且此前的服务器即将作废,迁移就顺理成章地成为了一道必不可少的工序。本文主要讲解 Gitlab server 迁移步骤。
# 前景提要
当前的 Gitlab(CE,社区版) 是通过 Docker 运行的,命令如下:
```bash
#!/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 处于运行状态,然后执行
> 请自行替换 {container_id}
## 执行 Gitlab 备份命令
```bash
# 备份重要私密文件
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`
## 复制备份文件到宿主机(方便转移)
> 请自行替换备份文件名
```bash
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 中
```bash
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 文件:
```bash
sudo vim /etc/ssh/sshd_config
```
新增以下配置:
```ini
Port 2222
```
重启 sshd:
```bash
sudo systemctl restart sshd
```
## 解压并复制到容器对应目录
```bash
# 解压 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`。
```bash
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 服务。
```bash
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
```
执行备份还原操作:
```bash
docker exec -it 18 gitlab-backup restore
```
# 申请域名证书
这里推荐使用 [https://github.com/acmesh-official/acme.sh/wiki/dnsapi](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
```bash
docker restart {container_id}
```
最后当然是更改域名的解析了 :P

Gitlab 服务器迁移