Gitlab在群晖容器中安装、反向代理、https开启

rniu 07-19 17:15 关注

【写作说明】:本人初次接触Git,当在家中的群晖里面安装Gitlab时候,碰到的几个问题,相信会是大家初次安装Gitlab时候一定会遇到的麻烦。本文将这些问题点的解决方法写在这里,供参考。

背景

在群晖DSM系统里面,Gitlab有两种安装来源,一是DSM系统套件中心自带的第三方源,二是系统容器中的Gitlab-ce社区版,两者的区别网上有很多介绍,就不在这里说明了。使用系统容器安装的方式当然需要Plus系列的群晖。

本文所涉及的安装方法特指第二种群晖容器中安装的情况。我在安装的过程中,参考了网上很多文章,大部分是容器安装的方式,用关键字群晖+Gitlab搜索到的也包含DSM套件中心直接安装的Gitlab,他们都没有在文中交代,所以造成开启https设置的时候各种混乱和问题。

Gitlab安装

在容器的注册表中搜索gitlab,找到gitlab-ce,选择latest,下载好映像后安装。

gitlab/gitlab-ce社区版gitlab/gitlab-ce社区版

安装第一步点击高级设置

安装设置安装设置

到存储空间栏里面设置目录,点击添加文件夹,可以用File Station先在docker目录里新建好文件夹,也可以在添加文件夹窗口里新建。

Gitlab在群晖容器中安装、反向代理、https开启

装载路径和文件夹对应关系填好后如下:

设置路径设置路径

端口设置里面可以把http用到的容器80口对应的本地端口从自动改为一个自己指定的,如1234。如果使用默认的自动本地端口,则在该容器运行后,查看该容器详情窗口去获得实际自动分配到的本地端口号用于http访问。

设置端口设置端口

通过设置上述内容后,就可以安装了。安装好就可以通过http和ip地址加设置本地端口号访问了,如果页面能正常显示出来,说明安装过程顺利完成。接下来我重点介绍后续几个大家会踩坑的问题。

接着碰上第一个问题:root用户初始密码没有。网上的文章都介绍第一次访问

问题1:没有root用户密码,安装好以后无法登录

网上介绍安装方法的文章都说到第一次登录会提示设置初始密码,但我安装好以后登录的http页面只是提示输入用户名和密码,密码输入框只有一个,显然不是用于设置初始密码的。不知道是否应该我第一次http反问的时候页面被我又关闭了原因,但如果这样只允许首次访问来设密码而不判断密码是否被设置的状态,就是一个很低级的设计。我更相信新的Gitlab版本更改了初始密码的设置方式。我接着搜索如果重设root密码,看起来有些复杂。在此过程,偶然发现docker/configure目录里一个initial_root_password文件,打开一看果然记录了初始密码。查看Gitlab网站文档,原来GitLab 14.0开始, 把密码放在了/etc/gitlab/initial_root_password里了。

问题2:开启https和二级域名反向代理

为了安全,决定使用https,并使用https://git.abc.com:1234这样的二级域名给Gitlab访问。使用端口的原因是家里公网ip的80和443已被禁用。SSL证书和二级域名解析设置都按部就班,不详细说明。只是二级域名git用了CNAME方式解析到了同一IP的另一域名上。

首先有文章介绍在容器的环境变量里面添加 GITLAB_HTTPS 和SSL_SELF_SIGNED并设为true的方法被我验证了是不工作的,相信这个方法是针对指群晖自己的套件中心下载的Gitlab,但文章没有交代清楚,有很多类似的教程没有清楚说明这点,也就造成了初次安装的人搜索到相应的文章导致误区,浪费了时间。

针对容器里下载的Gitlab来开启https,正确的方法如下:

如果用File Station或者电脑访问群晖共享文件夹,在群晖的文件夹中(使用filestation)找到docker/gitlab/config/gitlab.rb文件,使用文本编辑工具编辑。我是在运行的Gitlab容器里面的终端机直接执行Linux的VI命令来查看和修改该文件的。该操作需要在运行的Gitlab容器上点击详情,再到终端机一栏选择新增,就可以得到一个bash新窗口用于执行容器里面的Linux命令。容器的/etc/gitlab/目录就是在安装时候映射的物理机本地目录docker/gitlab/config/,File Station或者容器里执行VI,对gitlab.rb操作实际修改的是同一个文件。

终端机执行命令终端机执行命令

在gitlab.rb文件中,最关键的一个改动是external_url。因为我用二级域名方式,还牵涉到反向代理和端口号的设置,开始不知道这个external_url的运行机制,怎么设置都不能让https工作,这上面断续试验浪费了一天的时间。后来还是看英文官方文档,才搞清楚了规则,然后很快就成功开启了https。修改时,把该行第一个注释字符#删除,域名的格式如下:

external_url 'https://<你的域名>:<端口>'

这句设置其实隐藏了好几个设置。首先如果输入域名的开始是http://,那Gitlab就开启http方式,而输入的是https开头,这自动打开https,并且关闭hppt。如果输入了https作为域名,依然还要保持http启用,这需要开启后面要提及的redirect_http_to_https。隐藏的第二个设置是关于端口,很多人安装Gitlab并启用https,被绕进问题的也基本在这个上面。这个语句输入的端口实际意味着容器的入口端口的修改!比如域名后面没有指定端口号,那输入https格式的域名就表示容器将使用443端口作为https访问端口,相应的http则用80,这样对容器高级设置里面的端口设置就要求容器端口应该是443或80,转发的本地端口则可以任意的。举个例子,如果修改的是external_url 'https://git.abc.com', 容器端口设置就必须指定443到一个本地的端口,如2000,那后面验证的时候可以直接用局域网的ip地址测试,端口必须这样:https://192.168.1.2:2000。如果修改的是external_url 'https://git.abc.com:1234', 那么容器的https端口就被自动改到1234了,那相应的端口设置就必须把容器端口从443改到1234,对应的本地端口仍然可以是2000,这ip访问格式应该是https://192.168.1.2:2000。如果真的这么改,显然产生了新问题,就是https://git.abc.com:1234会被作为https的地址显示在Gitlab项目库的link里,而我们真正可以成功访问的link则是https://git.abc.com:2000,怎么办?一个方式是容器端口设置里面把映射关系改到同一端口上,比如1234对应的本地端口也是1234。这也是为什么有的文章里面提到必须使用同样的端口才能成功访问的根本原因。知道url这里设置的端口实际会更改容器的访问端口,所有端口的映射就明白怎么做了,即使用了反向代理也不难理解。

如果需要保持hppt访问的话,需要开启下面两个参数:
nginx['enable'] = true
nginx['redirect_http_to_https']=true

接着需要设置SSL证书。用File Station在docker/gitlab/config/,或者Docker里面/etc/gitlab/新建ssl目录,然后把SSL证书下载到的pen和key文件存放到ssl目录。我用的阿里云,因为新增了git.abc.com二级域名解析,也需要申请对应的免费SSL证书,下载的时候选择nginx服务器格式就好,这个SSL证书也要同时导入到群晖的DSM里面,具体设置就不在此文细说,参考网上文章就可以。在gitlab.rb文件中需要的设置如下:

nginx['ssl_certificate'] = "/etc/gitlab/ssl/<文件名>.pem"
nginx['ssl_certificate_key'] = "/etc/gitlab/ssl//<文件名>.key"

另外一个相关更改是SSH访问端口,因为url里面指定了端口,在后面Gitlab Web页面看到的SSH Link地址会和实际的端口不一致。需要将下面的gitlab_shell_ssh_port改到实际的本地端口号,容器的端口设置里面本地端口改为自己指定的如1022,容器端口仍然保持默认的22。

gitlab_rails['gitlab_shell_ssh_port'] = 1022

最后,更改gitlab.rb完成以后,需要在容器的终端机里面,按上面新建bash窗口的方法,只是重配置和重启命令:

gitlab-ctl reconfigure
gitlab-ctl restart

万事俱备,只欠路由器里做好端口转发设定了。完成后外网https就可以访问。

问题3:二级域名反向代理

我的访问方式最终要实现1234作为统一端口代替默认的443,用二级域名指向不同的应用入口,比如git用来访问Gitlab。这样就需要使用DSM里的反向代理,设置如下:

反向代理设置反向代理设置

目的地主机名用localhost表示本机,端口2000是指向容器里设置的本地端口。还记得上面提到的容器端口吗?对于外网访问的端口已经在此确定为1234了,那就决定了Gitlab设置里面的external_url 必须也是同样的1234端口号,那么可以任意指定的是这个目的端口(也就是容器的本地端口)。外网访问起来就是用1234进来,DSM的Nginx服务器反向代理到2000端口指向容器,容器在转发2000到自己的1234。这个例子的容器端口设置如下:

反向代理对应的端口映射反向代理对应的端口映射

总结

希望通过本文帮助初次接触和安装Gitlab的朋友们,把我折腾浪费的时间以此文贡献一定的价值。


全部评论(18)
AllenGuan
2
07-19 22:08

试试gogs

fimmy
1
07-19 20:07

gitlab占用资源太多了

505cent
1
07-19 18:59

所以443端口被禁的话?还是用域名加端口登录?那你这样直接用群晖的反向代理登录不就可以了吗?

Benjom
1
07-19 17:49

这标题写的什么鬼?

rniu
0
08-02 14:12

考虑到Gitlab的内存占用接近3G,后来还是另外搭了轻量级的Gitea。

kxbs
0
07-20 15:41

个人建议不要把生产环境下的GitLab开放在公网上

空谷幽兰0x17
0
07-20 13:16

干什么用?

导演喊cut
0
07-20 09:46

楼主你这镜像带的动吗,耗电是不是巨大

值友9573854357
0
07-20 09:17
fimmy gitlab占用资源太多了 1

用gogs

ryune911
0
07-20 08:33

真的是醉了,nas 跑 gitlab 先不说卡不卡的问题,意义?接下来可以继续水在 nas 上用docker 安装 k8s、nginx、kong、mysql、redis[吐][吐][吐]