关于我在腾讯云部署Gitlab

9,699 阅读10分钟

写在前面

很多人在公司里肯定都用过部署在内网的Gitlab或者其他类似的私有部署的DevOps平台,但是大都只是在公司运维已经部署完的情况下做一下pushpull的工作😆。我在新公司已经一个月多了,公司正好最近正在试行使用Gilab以及CI工具,每次我在推送代码到特定分支时(比如Develop)就会调用CI工具自动打包并且部署到特定的位置,而这一切只需要编写一个yml配置文件即可,非常的方便。
所以我产生了一个大胆的想法,正好在双十一刚刚拿下了一个三年的轻应用服务器,2内核4G内存,外加8M带宽与1200G的下行流量,这些在刚好满足Gitlab部署的条件的同时(Gitlab真的太吃内存了),这台服务器日常也都是闲置在哪里,本着试试就逝世的心态,我在昨天下班一到家就开始了我的踩坑之路😭。

注意

  • 下文中所使用的系统环境都是在腾讯云服务器+CentOS8的前提之下进行,作者本身是一个Linux菜🐔,如果出现不符合规范的地方请原谅,毕竟能在边百度/Google的情况下完成部署,并配置成符合自己想法的样子已经实属不易😭。
  • 在腾讯云服务器上,已经解除了很多关于配置服务器的相关限制(譬如SSH防火墙SeLinux等),下文不会再赘述。
  • 文中提到的包管理器均指的是CentOS8推荐的dnf

部署前准备

由于本文属于作者记录自己踩坑与分享性质文章,本文中提到的各项前置技能的掌握程度都是默认跟作者保持一致。

Postfix

这是一个邮件发送工具,Gitlab本身附带账号系统,而账号在使用前需要激活,所以必须要有对应的邮件发送工具,发送激活链接到绑定的邮箱。这个在包管理器的repo里是默认有的,所以可以直接安装。
只需要执行以下命令即可安装

dnf install postfix

dnf兼容yum大部分的使用习惯,所以安装步骤也是类似,只需要等待提示安装许可,输入yes就可以完成安装。

Gitlab-CE

Gitlab本身是一个商业化的软件,如果直接通过搜索引擎搜索并且进入到官网你可能之后看到关于商业版的介绍与免费试用,但是要知道,免费试用其实跟真正的免费肯定还是差很多的,不过Gitlab确实是提供了对应的真正免费的社区版。
这里是社区版所有版本安装包的下载地址:gitlab/gitlab-ce - Packages · packages.gitlab.com
打开以后看到一堆的下载列表

image.png

版本非常的多,而且还区分了各种版本,由于这里我也看不懂版本的实际意义,所以我干脆选择了看起来最符合的版本。首先使用的是基于RHEL开源的CentOS,而RHEL其实就是大名鼎鼎的RedHat,内部使用的离线包安装器就是rpm,所以这里选择gitlab-ce-14.4.2-ce.0.el8.x86_64.rpm。打开以后直接找到wget下载地址:

wget --content-disposition https://packages.gitlab.com/gitlab/gitlab-ce/packages/el/8/gitlab-ce-14.4.2-ce.0.el8.x86_64.rpm/download.rpm

在云服务器上选择一个合适的文件夹路径,直接运行上面的指令即可。

安装与配置

安装

在上面找到了下载安装包的方法,不过腾讯云似乎并没有对这个下载站点做加速处理,所以在云服务器上直接下载的速度可能会非常慢,而这个包又有900M之大,看到10k/s的下载速度,我最终选择了通过自己本地的macOS下载,然后使用scp传送到云服务器上。
不过这样做会遇到另外一个坑,那就是rpm在安装离线包的时候,会验证安装包的签名,这里拿macOS下载的包肯定是没办法通过验证的,会报一个verify错误,所以需要进行特殊处理。
执行安装命令时,可以通过跳过verify阶段来解决这个问题:

rpm -ivh <包名>.rpm --nodigest --nofilesdigest
# --nodigest 跳过包验证
# --nofiledigest 跳过包内文件验证

在一系列安装日志信息输出后,大概也就是十分钟差不多,就提示安装成功了。
输入以下指令就可以验证安装状态,首先是查看Gitlab的安装路径

find / -name gitlab

输出一堆路径,其中有几个比较重要的特别记住

/etc/gitlab # 这个是gitlab初始化时候的配置文件
/var/opt/gitlab # 这里是gitlab在运行时的配置文件

上面两个地址之所以需要关注,是因为后面我需要对Gitlab进行端口配置跟相对路径配置,由于这台云服务器本身后续还会拿来部署CI,一些简单的前端项目也需要在上面运行,而如果不设置端口的话,Gitlab默认会侵占80端口。但是如果给Gitlab设置成端口运行,我的强迫症又犯了,本来这台服务器就没有打算绑定域名(备案真的麻烦,而且部署DevOps估计审查难过) ,记住ip就够困难了,还需要记住一堆端口更困难了,所以还需还需要额外运行(为啥用额外待会儿会说)一个Nginx服务来反向代理,并且设置Gitlab/gitlab地址上。

配置相对路径

按网上已有到部署教程,这一步其实就应该开始执行服务启动了,但是因为踩过坑,所以这里先对Gitlab初始化前进行一次配置,省去反复重启的麻烦。
官方文档 - Install GitLab under a relative URL | GitLab中也有提到更加专业的配置方式,但是步骤非常的繁琐,并且似乎是建立在特定的安装模式下进行的,因为文档在开头就假设了Gitlab安装的路径,但是通过rpm安装的路径似乎不是很匹配,所以只能放弃。不过经过网上查阅资料,以及自己最终踩坑后的经验,还是可以得出更通用的解决方案就是了😂。
首先找到/etc/gitlab/gitlab.rb,这个上文中有提到,/etc/gitlab是放置在初始化时的配置文件的,所以这个Ruby文件也是其中一个,这个文件最终会影响/var/opt/gitlab下部分配置的输出。
打开/etc/gitlab/gitlab.rb后,定位到external_url字段,按道理都有,如果没有那里可以直接在空白位置自行添加一个,然后设置如下:

external_url 'http://<host>/gitlab' # 这里host替换成你自己的域名,没有就使用它默认的,正常不影响使用

初始化配置

上诉配置修改后,需要开始对项目进行初始化,这里需要用到刚刚安装后,Gitlab提供的服务管理工具gitlab-ctl
这玩意大概就是system-ctl的定制版本,我估计内部也是调用的system-ctlgitlab-ctl有下面几条常用指令:

reconfigure # 初始化所有配置
status # 查看服务状态,同system-ctl
start # 启动服务,同system-ctl
stop # 停止服务,同system-ctl
restart # 重启服务,同system-ctl

除了第一条,基本上都对应sysmte-ctl的基础用法。
这里直接运行

gitlab-ctl reconfigure

然后会有一堆日志输出,如果前置设置都没问题,这里基本上只需要等待结束,但是这里要注意一点:第一次执行初始化后,会帮助你分配一个root用户,这个用户具备超级管理员权限,非常的重要,而root用户的密码也会在此时分配。
初始密码所在文件路径为/etc/gitlab/initial_root_password ,要注意,这个文件会在初始化完成后24小时后被删除,所以一定要记得提前查看密码,并复制出来。然后在系统完成安装后登录root并完成密码的修改。
查看初始密码:

cat /etc/gitlab/initial_root_password 

修改运行端口

上诉完成了初始化的配置,但是此时的服务还不着急启动,这个时候启动,会默认占用80端口,如果你有其他需要80端口的服务运行,就比较麻烦,所以直接找到运行配置:/var/opt/gitlab/gitlab-rails/etc/gitlab.yml/var/opt/gitlab/nginx/conf/gitlab-http.conf
首先修改gitlab.yml

port: 8099 # 这里可以写入任意你自己需要的端口

然后是gitlab-http.conf

# 找到默认在生效的那个server
server {
    listen *:8099; # 这里端口要跟上面那个一致就行
    # ...其他配置
}

配置反向代理

做过前端分离部署跟nodejs的同学应该非常熟悉这个套路了,将特定路径前缀的地址代理到特定端口的服务上,这样就可以让多个服务并存在一台服务器的80端口上,非常好用。
这里需要配置一个额外的Nginx,这个也是dnf内置的一个包,直接下载即可:

dnf install nginx

安装完成后,直接进入/etc/nginx/nginx.conf里修改即可,毕竟后续80端口全部都用来进行不同服务的反向代理,所以不需要额外的配置文件来管理。

server {
    location /gitlab {
        proxy_pass http://127.0.0.1:8099/gitlab/; # 这里的端口必须的gitlab配置里的端口
    }
}

然后启动Nginx

nginx -t -c /etc/nginx/nginx.conf

如果之前以及运行过Nginx,这需要先停止,然后重新读取配置后再重启

nginx -s stop
nginx -s restart

访问

上诉全部完成后,就可以尝试访问了。在浏览器地址栏输入host:port/gitlab,回车,然后就发现了一件不好的事情,那就是它给我们重定向到了Nginx默认的首页,这里其实是一个坑,那就是没有登录的情况下,打开Gitlab首页会直接重定向到/根路由,按道理我们配置的相对路径不应该出现这个问题,但是由于昨晚配置完已经晚上0点,没有深查原因,但是猜测应该是Gitlab前端部分配置的锅,因为在简单查看后发现Gitlab前端似乎是使用了React框架,众所周知React是单独使用React-Router管理前端路由的。
不过找到了临时解决方案,那就是直接访问/gitlab/login则会打开登录地址,当登录成功时,就不会在重定向到根路由了。

配置中文

使用root登录后,打开Gitlab发现是一堆英文,虽然勉强能看懂,但是Gitlab是有提供中文语言包的。
image.png

修改管理员密码

管理员默认密码很长,不利于记忆,而且默认密码文件会被定期删除,后续忘记又要大费周章的处理,这里可以修改密码处理。

image.png

关闭自由注册

自己部署的平台肯定希望资源省之又省,而过多的用户注册服务器资源肯定受不了,所以要关闭注册功能。

image.png

创建一个普通用户

平时编写代码还是要使用普通用户,毕竟有时候需要将public项目分享给别人看,使用root风险有点大。

image.png 打开后正常填写表单即可。

写在最后

这次踩坑也算是花了不少功夫,文中已经将踩坑过程全部跳过,都是踩坑后的结果(中间遇到Nginx无法正常重启,然后发现是配置文件的问题,我太菜了🤦‍♂️),所以正常可以直接根据步骤来配置。

引用

rpm 命令详解 - xie仗剑天涯 - 博客园 (cnblogs.com)
【Git】 GitLab服务器社区版安装与配置 - H__D - 博客园 (cnblogs.com)
Install GitLab under a relative URL | GitLab