背景:
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
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的工作流程:
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设置
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