基于 Docker 的 Gitlab 环境迁移遇坑记录

因为安全需要,公司的gitlab需要从外网迁移到内网。按道理说公司的gitlab是用的docker部署,直接把原来的docker整个目录复制过来就可以,但是直接复制的会导致gitlab启动不了,中间遇到各种坑,这里记录下可能会帮助到有缘人,O(∩_∩)O哈哈~。

基础环境
操作系统:Ubuntu 18.04
容器环境:Docker version 20.10.12 / docker-compose version
Gitlab环境:Gitlab 13.7.9

(1)迁移准备工作

1.1 停掉gitlab

进入容器所在目录,停掉服务

docker-compose stop

千万可别 docker-compose down 这个将停止运行的容器,并且会删除已停止的容器以及已创建的所有网络。

1.2 拷贝giblab

 scp -r  ./gitlabxx user@192.168.xx.xx:/data/xx/xx

1.3 启动容器

进入拷贝后的目录,启动 gitlab

docker-compose up -d

(2)填坑

2.1 查看容器状态

查看容器状态,发现容器内部一直在重启

docker-compose ps

docker的 state 状态 一直是 starting ,通过网上搜索问题,判断应该是容器内部出了问题,进入容器

docker-compose exec gitlab bash
  • 其中 gitlab 是 docker-compose 的 services 名字,

进入后通过下面命令查看gitlab的运行状态:

gitlab-ctl status 

发现大量的中间件都没有启动,状态是 down ,例如下面这个:
down: alertmanager: (pid xxx) 4437s; run: log: (pid xx) 4461s
原因是容器内部文件复制过来后,导致权限错乱,因此需要重新整理下权限,重新配置下系统

2.2 重新配置权限 + 重新配置gitlab

update-permissions   #重新配置权限
gitlab-ctl reconfigure   #重新整理配置
gitlab-ctl restart   #重启gitlab

操作完之后,会发现大部分 gitlab 的组件都已经启动,有个别的没有启动,因此需要看日志来解决
在这里插入图片描述

2.3 解决 gitaly 启动问题

gitlab-ctl tail | grep error   # 查看错误日志

发现错误: /var/opt/gitlab/gitaly/gitaly.pid:permission denied 解决方式是赋权

cd /var/opt/gitlab/gitaly/  # 进入权限错误的目录
chmod 777 ./gitaly.pid      # 修改pid的权限,网上另外的解决办法是删掉这个pid文件
gitlab-ctl restart          #重启gitlab

重启gitlab后,gitaly可以正常启动
在这里插入图片描述

2.5 解决 rails 权限问题

查看日志发现错误 /var/opt/gitlab/gitlab-rails/sockets/gitlab.socket: connect: connection refused
解决办法是增加权限:

chmod -R o+x /var/opt/gitlab/gitlab-rails/

2.5 解决 grafana 权限问题

查看 gitlab 状态发现 grafana 还是 down,没有启动
在这里插入图片描述

解决办法

chown -R gitlab-prometheus:root /var/opt/gitlab/grafana/data  # 修改权限
gitlab-ctl restart                                            #重启gitlab

重启gitlab 后,发现所有组件都正常启动
在这里插入图片描述
访问gitlab可以正常进入,下面贴一个gitlab的架构图,大家对gitlab的各个组件有个大体了解:
在这里插入图片描述
GitLab 使用 Nginx 将前端请求代理到 Unicorn Web 服务器。默认情况下,Unicorn 与前端之间的通信是通过 Unix domain 套接字进行的,但也支持通过 TCP 转发请求。Web 前端访问 /home/git/gitlab/public 绕过 Unicorn 服务器来提供静态页面,上传(例如头像图片或附件)和预编译资源。GitLab 使用 Unicorn Web 服务器提供网页和 GitLab API。使用 Sidekiq 作为作业队列,反过来,它使用 redis 作为作业信息,元数据和作业的非持久数据库后端。

参考文献:
[1]. https://www.cnblogs.com/kika/p/10851614.html
[2]. https://zhuanlan.zhihu.com/p/354941496

### GitLab 项目备份与恢复方法 #### 使用内置命令进行备份和恢复 对于单个项目级别的备份,GitLab 提供了一套简便易用的功能来满足需求。当涉及到整个实例的数据保护时,则推荐采用官方提供的 `gitlab-rake` 命令来进行全面的备份工作[^1]。 为了确保数据的一致性和完整性,在执行全局恢复之前会清除现有记录并依据选定的时间点副本重建环境。具体来说就是利用如下指令完成指定版本号对应压缩包内所含资料的整体还原: ```bash sudo gitlab-rake gitlab:backup:restore BACKUP=时间戳_日期_GitLab版本 ``` 此过程不仅涵盖了仓库本身还包括配置设置等重要组成部分。 #### 利用导出功能实现跨平台迁移 除了传统的基于文件系统的快照方式外,GitLab 还特别设计了专门用于处理单一或多个项目的转移机制——即所谓的“项目导出”。这种方式允许管理员轻松地把特定资源从一处迁移到另一处而无需担心底层架构差异带来的兼容性问题[^2]。 用户只需简单几步就能打包所需的一切必要组件,并且可以在目标位置重新部署这些资产而不影响其他部分正常运作的状态。这种方法尤其适合于那些希望保留历史提交记录以及issue跟踪信息等情况下的场景应用。 #### 自动化定期保存策略 考虑到手动触发可能存在遗漏风险或者效率低下等问题,因此建议实施周期性的自动作业计划以保障长期稳定运行。借助Docker容器技术可以很方便地编写一段简单的Shell脚本来达成这一目的[^3]: ```bash #!/bin/bash case "$1" in "start") docker exec gitlab gitlab-rake gitlab:backup:create esac ``` 这段代码片段展示了如何通过调度程序(如cron job)配合上述逻辑达到无人值守条件下持续维护的目的。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

炼丹狮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值