Centos7.4下gitlab迁移及通过docker启动gitlab服务

背景:

1)原有的gitlab服务器是通过yum install 进行安装,版本为12.9.9

2)新的gitlab服务器要求使用docker运行gitlab服务

3)需要旧的gitlab服务器进行迁移,然后在新的gitlab服务器上通过docker正常运行

解决思路:

1)在新的服务器上安装docker,并启动

2)在新的服务器上拉取gitlab镜像,并运行

3)在旧的服务器上备份gitlab数据,并拷贝到新的服务器上面

4)在新的服务器上的容器里面,停止相关服务,进行数据恢复

5)重新加载配置,使配置生效,并重新启动容器内的gitlab服务

环境:

系统环境:CentOS7.4

# uname -a
Linux gitlab 3.10.0-693.el7.x86_64 #1 SMP Tue Aug 22 21:09:27 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
# lsb_release -a
LSB Version:    :core-4.1-amd64:core-4.1-noarch:cxx-4.1-amd64:cxx-4.1-noarch:desktop-4.1-amd64:desktop-4.1-noarch:languages-4.1-amd64:languages-4.1-noarch:printing-4.1-amd64:printing-4.1-noarch
Distributor ID: CentOS
Description:    CentOS Linux release 7.4.1708 (Core) 
Release:        7.4.1708
Codename:       Core

0.安装docker并运行

#0 卸载旧版本,较旧的 Docker 版本称为 docker 或 docker-engine 。如果已安装这些程序,请卸载它们以及相关的依赖项。
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine

#1 安装必要的一些系统工具
yum install -y yum-utils device-mapper-persistent-data lvm2

#2 设置docker仓库
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

#3 安装docker-ce
yum install docker-ce docker-ce-cli containerd.io

#启动
systemctl start docker

1.查看原有gitlab的版本

注意:新服务器上的gitlab的版本号必须与创建备份时的gitlab版本号相同。

方式一:

cat /opt/gitlab/embedded/service/gitlab-rails/VERSION

方式二:

在gitlab后台中查看,在部署的域名后面加上help

http://xxx.xxx.com/help
image-20220705145208908.png

2.拉取Gitlab镜像,在docker镜像仓库中,查找对应的版本

在新的服务器上拉取gitlab镜像

镜像地址:https://hub.docker.com/r/gitlab/gitlab-ce/

#拉取镜像
docker pull gitlab/gitlab-ce:12.9.9-ce.0
查看镜像
# docker images
REPOSITORY         TAG           IMAGE ID       CREATED        SIZE
hello-world        latest        feb5d9fea6a5   9 months ago   13.3kB
gitlab/gitlab-ce   12.9.9-ce.0   82c989350edd   2 years ago    1.92GB

3.启动容器

docker run -itd \
--publish 80:80 \
-v /data/gitlab/etc:/etc/gitlab \
-v /data/gitlab/etc:/etc/gitlab \
-v /data/gitlab/opt:/var/opt/gitlab \
--restart always \
--privileged=true \
--name gitlab \
gitlab/gitlab-ce:12.9.9-ce.0
命令 描述
-i 以交互模式运行容器,通常与 -t 同时使用命令解释
-t 为容器重新分配一个伪输入终端,通常与 -i 同时使用
-d 后台运行容器,并返回容器ID
-p 80:80 将容器内80端口映射至宿主机9980端口,这是访问gitlab的端口
-v /data/gitlab/etc:/etc/gitlab 将容器/etc/gitlab目录挂载到宿主机-v /data/gitlab/etc目录下,若宿主机内此目录不存在将会自动创建,其他两个挂载同这个一样
--restart always 容器自启动
--privileged=true 让容器获取宿主机root权限
--name gitlab 设置容器名称为gitlab
gitlab/gitlab-ce 镜像的名称,这里也可以写镜像ID

4.备份原有数据

在原来的gitlab服务器上备份数据

#通过gitlab-rake命令备份gitlab,该命令会备份gitlab仓库、数据库、用户、用户组、用户密钥、权限等信息
gitlab-rake gitlab:backup:create
#备份后,会在/var/opt/gitlab/backups/生产类似1656991024_2022_07_05_12.9.9_gitlab_backup.tar的备份文件

#此步骤可以不操作,默认备份后的文件存在/var/opt/gitlab/backups/目录下,如果要修改gitlab备份文件存储的路径的话,我们可以修改gitlab.rb文件
vim /etc/gitlab/gitlab.rb
gitlab_rails['backup_path'] = "/data/gitlab/back"

5.拷贝数据

把备份好的数据拷贝到新的服务器上面对应的目录,此处是通过容器挂载的目录,/data/gitlab/opt/backups

scp -r [email protected]:/var/opt/gitlab/backups/1656991024_2022_07_05_12.9.9_gitlab_backup.tar /data/gitlab/opt/backups/

6.在docker运行的git服务器上,登录进入容器

docker exec -it gitlab /bin/bash

7.Gitlab仓库恢复

#在gitlab容器内部,停止相关数据连接服务
gitlab-ctl stop unicorn
gitlab-ctl stop sidekiq

#恢复gitlab仓库
gitlab-rake gitlab:backup:restore BACKUP=1656991024_2022_07_05_12.9.9

8.手动备份

由于gitlab.rb 和 gitlab-secrets.json 两个文件包含敏感信息。未被备份到备份文件中。需要手动备份

把原有的gitlab项目里面的gitlab.rb 和 gitlab-secrets.json手动拷贝到/data/gitlab/etc目录(挂载目录)下面

#拷贝到/data/gitlab/etc目录(挂载目录)下面
/etc/gitlab/gitlab.rb  配置文件须备份
/etc/gitlab/gitlab-secrets.json  配置文件须备份

9.使配置生效

#在容器中执行gitlab-ctl reconfigure,使其修改配置生效
gitlab-ctl reconfigure

10.启动Gitlab服务,在容器中执行

根据实际情况进行启动或者重启

#启动命令
gitlab-ctl start
#重启命令
gitlab-ctl restart

11.定时任务执行备份

# 每周六凌晨2点备份gitlab数据
0 2 * * 6 /usr/bin/gitlab-rake gitlab:backup:create


#自定义备份脚本gitlab-bak.sh
#!/bin/bash
backupdir=/var/opt/gitlab/backups
#获取最新的备份文件
newfile=`ls -tl | grep tar | head -n 1 |awk '{print $9}'`
#gitlab备份命令
gitlab-rake gitlab:backup:create
#复制备份文件到另一台机器
scp ${backupdir}/${newfile} [email protected]:${backupdir}

12.扩展

12.1 GitLab概述

是一个利用 Ruby on Rails 开发的开源应用程序,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目。
Ruby on Rails 是一个可以使你开发、部署、维护 web 应用程序变得简单的框架。
GitLab拥有与Github类似的功能,能够浏览源代码,管理缺陷和注释。可以管理团队对仓库的访问,它非常易于浏览提交过的版本并提供一个文件历史库。它还提供一个代码片段收集功能可以轻松实现代码复用,便于日后有需要的时候进行查找。

GitLab官网:https://about.gitlab.com/

12.2 GitLab和GitHub的区别

也许在你看到上面GitLab介绍后,你会有个疑问,它怎么和GitHub那么像。没错二者确实有很大的关系和相似之处,可以说GitLab就是个高仿版的GitHub。

相同点:二者都是基于web的Git仓库,在很大程度上GitLab是仿照GitHub来做的,它们都提供了分享开源项目的平台,为开发团队提供了存储、分享、发布和合作开发项目的中心化云存储的场所。

不同点:GitHub如果要使用私有仓库,是需要付费的。GitLab可以在上面创建私人的免费仓库。GitLab让开发团队对他们的代码仓库拥有更多的控制,总的来说,如果你想远离 GitHub , GitLab 是首选。它可以从不同的来源导入项目和问题,包括 GitHub ,这使得迁移过程无忧无虑。 GitLab 界面设计精良,干净,直观,并且在用户体验和功能方面与 GitHub 相近。

12.3 Git相关概念

1)Git:是一种版本控制系统,是一个命令,是一种工具。
2)Gitlib:是用于实现git功能的开发库。
3)Github:是一个基于git实现的在线代码托管仓库,包含一个网站界面,向互联网开放。
4)Gitlab:是一个基于git实现的在线代码仓库托管软件,一般用于在企业内网搭建,相当于个人版的代码托管仓库。

12.4 Gitlab的版本:

1)Gitlab-ce:社区版(可以免费使用)
2)Gitlab-ee:企业版(收费)
3)GitLab 托管版本。

12.5 GitLab配置

#配置Gitlab服务的IP地址
vi /etc/gitlab/gitlab.rb
#容器外部挂载的目录是在/data/gitlab/etc/gitlab.rb
...
external_url 'http://gitlab.joshua317.com'         #指定IP,默认是80端口
...

#配置修改后,进行重启
gitlab-ctl restart

12.6 Gitlab相关目录

1)/var/opt/gitlab/git-data/repositories/:仓库默认存储目录
2)/opt/gitlab: 应用程序代码和相应的依赖程序
3)/var/opt/gitlab:gitlab各个组件的数据目录 gitlab-ctl reconfigure 命令编译后的应用数据和配置文件,不需要人为修改配置
4)/etc/gitlab: 配置文件目录
5)/etc/gitlab/gitlab.rb gitlab的主配置文件
6)/var/log/gitlab:此目录下存放了 gitlab 各个组件产生的日志
7)/var/opt/gitlab/backups/:备份文件生成的目录

12.7 GitLab服务构成

我们可以简单的使用命令去查看gitlab的各个服务

root@6eba08664d96:/#  gitlab-ctl status
run: alertmanager: (pid 11796) 4038s; run: log: (pid 310) 7874s
run: gitaly: (pid 11818) 4038s; run: log: (pid 301) 7874s
run: gitlab-exporter: (pid 11842) 4037s; run: log: (pid 297) 7874s
run: gitlab-workhorse: (pid 11849) 4037s; run: log: (pid 318) 7874s
run: grafana: (pid 11874) 4036s; run: log: (pid 320) 7874s
run: logrotate: (pid 19825) 436s; run: log: (pid 298) 7874s
run: nginx: (pid 11901) 4035s; run: log: (pid 311) 7874s
run: postgres-exporter: (pid 11917) 4035s; run: log: (pid 316) 7874s
run: postgresql: (pid 12003) 4035s; run: log: (pid 294) 7874s
run: prometheus: (pid 12012) 4034s; run: log: (pid 303) 7874s
run: redis: (pid 12035) 4034s; run: log: (pid 308) 7874s
run: redis-exporter: (pid 12040) 4033s; run: log: (pid 323) 7874s
run: sidekiq: (pid 12051) 4033s; run: log: (pid 305) 7874s
run: sshd: (pid 12057) 4032s; run: log: (pid 25) 7884s
run: unicorn: (pid 12773) 3910s; run: log: (pid 296) 7874s

Nginx:静态web服务器。
gitlab-shell:用于处理Git命令和修改authorized keys列表。
gitlab-workhorse: 轻量级的反向代理服务器。
logrotate:日志文件管理工具。
postgresql:数据库。
redis:缓存数据库。
sidekiq:用于在后台执行队列任务(异步执行)。
unicorn:An HTTP server for Rack applications,GitLab Rails应用是托管在这个服务器上面的。
1、Gitlab的工作流程:

image-20220705135644371.png

GitLab Shell
GitLab Shell有两个作用:为GitLab处理Git命令、修改authorized keys列表。
当通过SSH访问GitLab Server时,GitLab Shell会:
限制执行预定义好的Git命令(git push, git pull, git annex)
调用GitLab Rails API 检查权限
执行pre-receive钩子(在GitLab企业版中叫做Git钩子)
执行你请求的动作 处理GitLab的post-receive动作
处理自定义的post-receive动作
当通过http(s)访问GitLab Server时,工作流程取决于你是从Git仓库拉取(pull)代码还是向git仓库推送(push)代码。
如果你是从Git仓库拉取(pull)代码,GitLab Rails应用会全权负责处理用户鉴权和执行Git命令的工作;
如果你是向Git仓库推送(push)代码,GitLab Rails应用既不会进行用户鉴权也不会执行Git命令,它会把以下工作交由GitLab Shell进行处理:
调用GitLab Rails API 检查权限
执行pre-receive钩子(在GitLab企业版中叫做Git钩子)
执行你请求的动作
处理GitLab的post-receive动作
处理自定义的post-receive动作

GitLab Workhorse
GitLab Workhorse是一个敏捷的反向代理。它会处理一些大的HTTP请求,比如文件上传、文件下载、Git push/pull和Git包下载。其它请求会反向代理到GitLab Rails应用,即反向代理给后端的unicorn。

12.8 Gitlab设置中文

Gitlab在12版本之后就自带中文了,直接访问"域名+/profile/preferences"页面,下面有Localization设置

image-20220705140303399.png

12.9 Gitlab备份

如果是生产环境,备份是必须的。需要备份的文件:配置文件和数据文件。

1)备份配置文件

tar -czvf $(date "+etc-gitlab-%s.tar").tar.gz /etc/gitlab/

2)备份数据文件
默认数据备份目录是/var/opt/gitlab/backups,手动创建备份文件:

gitlab-rake gitlab:backup:create

3)设置备份数据上传到oss

### 1 修改/etc/gitlab/gitlab.rb配置文件,修改如下内容:

gitlab_rails['backup_upload_connection'] = {

'provider' => 'aliyun',

'aliyun_accesskey_id' => '有权限访问存储桶的用户key',

'aliyun_accesskey_secret' => '有权限访问存储桶的密钥',

'aliyun_oss_endpoint' => 'http://oss-cn-shanghai-internal.aliyuncs.com',

'aliyun_oss_bucket' => 'my-backup',   //OSS桶

'aliyun_oss_location' => 'shanghai'    //此行内容不关键,但必须要有
}
gitlab_rails['backup_upload_remote_directory'] = 'gitlab'   //存储gitlab备份的桶子目录

### 2 执行gitlab-ctl reconfigure让上步的配置生效
gitlab-ctl reconfigure

### 3 执行gitlab-rake gitlab:backup:create,等命令成功结束后,到阿里云的OSS桶中检查,就会发现备份文件已经自动上传了。
gitlab-rake gitlab:backup:create

### 4 进一步将gitlab备份命令加入到crontab中,实现每日自动备份上传到阿里云,这样就可以将代码安全的有一个异地备份了。在gitlab.rb中修改gitlab_rails['backup_keep_time'] = 86400 这行的值,可以控制gitlab本地备份目录中保存历史文件的时间长度,这样可避免本地的文件过多将磁盘空间耗尽。
另外,一般代码库的备份文件都不会小了,为了节省阿里云上面存储桶的存储成本,可以给存储桶设置文件的生命周期,比如超过30天的文件转入冷存储设备或删除,以降低存储成本。
至此,一个自动化的gitlab代码云端备份就大功造成了。

4)添加定时任务

#添加定时任务
crontab -e
# 每周六凌晨2点备份gitlab数据
0 2 * * 6 /usr/bin/gitlab-rake gitlab:backup:create
#重启定时任务
service crond restart

12.10 Gitlab相关命令

#1 帮助命令
gitlab-ctl --help

#2 重新加载gitlab配置文件:
gitlab-ctl reconfigure

#3 重新启动gitlab:
gitlab-ctl restart

#4 停止服务
gitlab-ctl stop

#5 查看某个组件的日志
gitlab-ctl tail nginx

#6 查看所有组件运行状态
gitlab-ctl status

#7 数据备份
gitlab-rake gitlab:backup:create

12.11 GitLab服务修改root密码

# 进入容器内部
docker exec -it gitlab /bin/bash
# 进入控制台
gitlab-rails console -e production
# 查询id为1的用户,id为1的用户是超级管理员
user = User.where(id:1).first
# 修改密码为joshua317
user.password='joshua317'
# 保存
user.save!
# 退出
exit

12.12 Docker安装

#0 卸载旧版本,较旧的 Docker 版本称为 docker 或 docker-engine 。如果已安装这些程序,请卸载它们以及相关的依赖项。
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine

#1 安装必要的一些系统工具
yum install -y yum-utils device-mapper-persistent-data lvm2

#2 设置docker仓库
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

#3 安装docker-ce
yum install docker-ce docker-ce-cli containerd.io

#启动
systemctl start docker

你可能感兴趣的:(Centos7.4下gitlab迁移及通过docker启动gitlab服务)