通过gitlab命令进行的迁移
自建的Gitlab服务器常常会因为使用时间的增长,其空间容量等硬件需求都需要升级,或者迁移至更高配置的服务器上。备份、迁移、恢复、升级过程如下
1、gitlab备份
备份时需要保持gitlab处于正常运行状态,执行gitlab-rake进行备份。
gitlab-rake gitlab:backup:create
备份命令会在***/var/opt/gitlab/backups***目录下创建一个名称类似为1530156812_2018_06_28_10.8.4_gitlab_backup.tar的压缩包, 这个压缩包就是Gitlab整个的完整部分, 其中开头的1530156812_2018_06_28_10.8.4是备份创建的日期
/etc/gitlab/gitlab.rb 配置文件须备份
/var/opt/gitlab/nginx/conf nginx配置文件
/etc/postfix/main.cfpostfix 邮件配置备份
1.1 修改备份文件目录
可以通过***/etc/gitlab/gitlab.rb***配置文件来修改默认存放备份文件的目录
gitlab_rails['backup_path'] = "/var/opt/gitlab/backups"
1.2 设置备份过期时间
gitlab_rails['backup_keep_time'] = 604800 #以秒为单位
1.3 gitlab自动备份
0 2 * * * /opt/gitlab/bin/gitlab-rake gitlab:backup:create
2、gitlab迁移
迁移的整体思路是:
1、在新服务器上安装相同版本的gitlab
2、将备份生成的备份文件发送到新服务器的相同目录(备份文件目录)下
3、gitlab恢复
1、停止相关数据连接服务,修改文件权限
gitlab-ctl stop unicorn
gitlab-ctl stop sidekiq
#修改文件权限。
chmod 777 /var/opt/gitlab/backups/1530156812_2018_06_28_10.8.4_gitlab_backup.tar
2、从备份文件恢复
#从1530156812_2018_06_28_10.8.4编号备份中恢复
gitlab-rake gitlab:backup:restore BACKUP=1530156812_2018_06_28_10.8.4
3、启动gitlab
gitlab-ctl start
在实际情况中访问gitlab可能是用域名访问,我们可以修改gitlab配置文件中的url再进行备份,这样就不会影响迁移过程,恢复完成后需要进行的只是修改域名对应的dns解析ip地址
4、gitlab升级
gitlab-ctl stop #关闭gitlab服务
gitlab-rake gitlab:backup:create #备份
#安装成功后重新加载配置并启动
gitlab-ctl reconfigure
gitlab-ctl restart
5、gitlab更改默认的nginx
vim /etc/gitlab/gitlab.rb
nginx['enable'] = false #不启用nginx
检查默认nginx配置文件,并迁移至新Nginx服务
/var/opt/gitlab/nginx/conf/nginx.conf #nginx配置文件,包含gitlab-http.conf文件
/var/opt/gitlab/nginx/conf/gitlab-http.conf #gitlab核心nginx配置文件
重启 nginx、gitlab服务
gitlab-ctl restart
systemctl restart nginx.service
#访问可能出现报502。原因是nginx用户无法访问gitlab用户的socket文件。 重启gitlab需要重新授权
chmod -R o+x /var/opt/gitlab/gitlab-rails
Docker部署方式迁移
Docker部署方式一般会把gitlab的数据使用挂载目录的方式存储。
"Volumes": {
"/etc/gitlab": {
},
"/var/log/gitlab": {
},
"/var/opt/gitlab": {
}
},
把对应的目录绑定到新的服务的挂载目录上。
迁移对应的数据文件。
"Mounts": [
{
"Type": "volume",
"Name": "gitlab_config",
"Source": "/var/lib/docker/volumes/gitlab_config/_data",
"Destination": "/etc/gitlab",
"Driver": "local",
"Mode": "rw",
"RW": true,
"Propagation": ""
},
{
"Type": "volume",
"Name": "c4475269eda4c25ce95c5c8c353f12ee9acd52e8ccd66b1fbb2cf29acd011b63",
"Source": "/var/lib/docker/volumes/c4475269eda4c25ce95c5c8c353f12ee9acd52e8ccd66b1fbb2cf29acd011b63/_data",
"Destination": "/var/log/gitlab",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
},
{
"Type": "volume",
"Name": "gitlab_data",
"Source": "/var/lib/docker/volumes/gitlab_data/_data",
"Destination": "/var/opt/gitlab",
"Driver": "local",
"Mode": "rw",
"RW": true,
"Propagation": ""
}
],
注意
1、实际上docker模式上通过复制目录方式,会导致权限问题,因此最好通过备份还原方式。
2、还原的时候,保证 external_url ‘http://192.168.1.XX’ ,参数设置正确,这个参数影响 代码仓库的host。
解决方法:
修改:/var/opt/gitlab/gitlab-rails/etc/gitlab.yml -> /opt/gitlab/embedded/service/gitlab-rails/config/gitlab.yml 文件中host属性,然后重启服务。
## Web server settings (note: host is the FQDN, do not include http://)
host: 192.168.1.99
port: 80
https: false
问题:
1、权限问题
日志中提到了
docker exec -it gitlab update-permissions
docker restart gitlab
但是因为权限问题,容器启动之后很快就会关闭,所以执行第一条命令会提示容器未运行,
最好的解决办法就是,启动容器之后,迅速执行 docker exec -it gitlab update-permissions ,然后迅速执行docker restart gitlab,就成功了,亲测有效。别等到容器挂了才执行。
docker 运行gitlab,使用NFS,会有权限问题,参考:
https://docs.gitlab.com/ee/administration/nfs.html
https://stackoverflow.com/questions/21790337/attaching-network-storage-to-a-docker-container-for-gitlab-ssh-issue
https://forum.gitlab.com/t/running-gitlab-ce-from-the-docker-image-saving-data-onto-nfs-share-acl-problems/9155/2
https://docs.gitlab.com/omnibus/docker/README.html#linux-acl-issues
2、邮件不能正常发送
我们在安装gitlab时,会配置邮件发送信息。
docker配置方式如下:
environment: TZ: 'Asia/Shanghai' GITLAB_OMNIBUS_CONFIG: | external_url 'http://192.168.1.XX' gitlab_rails['time_zone'] = 'Asia/Shanghai' # 需要配置到 gitlab.rb 中的配置可以在这里配置,每个配置一行,注意缩进。 # 比如下面的电子邮件的配置: gitlab_rails['smtp_enable'] = true gitlab_rails['smtp_address'] = "smtp.263.net" gitlab_rails['smtp_port'] = 25 gitlab_rails['smtp_user_name'] = "[email protected]" gitlab_rails['smtp_password'] = "MMMMMM" gitlab_rails['smtp_authentication'] = "login" gitlab_rails['smtp_enable_starttls_auto'] = true gitlab_rails['smtp_tls'] = true gitlab_rails['gitlab_email_from'] = '[email protected]'
但是邮件发送不出去。
定位问题:
#进入docker容器
docker exec -it gitlab /bin/bash
#运行测试邮件命令
#1、进入
gitlab-rails console
#2、测试
Notify.test_email('[email protected]', 'Message Subject', 'Message Body').deliver_now
结果如下:
SocketError: getaddrinfo: Temporary failure in name resolution
from /opt/gitlab/embedded/lib/ruby/2.4.0/net/smtp.rb:539:in `initialize'
from /opt/gitlab/embedded/lib/ruby/2.4.0/net/smtp.rb:539:in `open'
from /opt/gitlab/embedded/lib/ruby/2.4.0/net/smtp.rb:539:in `tcp_socket'
from /opt/gitlab/embedded/lib/ruby/2.4.0/net/smtp.rb:549:in `block in do_start'
from /opt/gitlab/embedded/lib/ruby/2.4.0/timeout.rb:93:in `block in timeout'
from /opt/gitlab/embedded/lib/ruby/2.4.0/timeout.rb:103:in `timeout'
from /opt/gitlab/embedded/lib/ruby/2.4.0/net/smtp.rb:548:in `do_start'
from /opt/gitlab/embedded/lib/ruby/2.4.0/net/smtp.rb:518:in `start'
定位问题:
应该是dns问题,编辑dns
vi resolv.conf
里面有:
namesever 127.0.0.11
再增加一个
namesever 192.168.1.XX
测试OK
3、Failed to parse advertise address
alertmanager down with “create memberlist: Failed to get final advertise address: Failed to parse advertise address “””
参考:https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/3705
In /opt/gitlab/sv/alertmanager/run
add the option --cluster.advertise-address=127.0.0.1:9093
- /opt/gitlab/embedded/bin/alertmanager --web.listen-address=localhost:9093 --storage.path=/var/opt/gitlab/alertmanager/data --config.file=/var/opt/gitlab/alertmanager/alertmanager.yml + /opt/gitlab/embedded/bin/alertmanager --cluster.advertise-address=127.0.0.1:9093 --web.listen-address=localhost:9093 --storage.path=/var/opt/gitlab/alertmanager/data --config.file=/var/opt/gitlab/alertmanager/alertmanager.yml