如何在群晖 NAS 中借由 Docker 配置 Gitlab

一直想在群晖中配一个 Gitlab CE 来备份代码。这篇文章中,我会陈述:

  1. 搭建 Gitlab 需要一台怎样的 NAS
  2. 群晖多种搭建 Gitlab 方式的选择
  3. 如何迁移 Gitlab.com 的内容到 Gitlab CE 中
  4. 遇到的坑和填坑的经过

目前我的代码差不多全部保存在 Gtlab.com 上,没有备份,非常不安。这是我做这件事情的缘由。——我并不是担心我的私有代码会泄露,我觉得靠 Gitlab 足够保证它们的安全。所以我一直用着 Gitlab.com

要备份,我也想过其他选择。最终选择 Gitlab CE,一方面是近来其名声大噪,另一方面也是为了和 Gitlab.com 上的仓库能有最好的兼容。像我前东家用的 Gogs 就不能支持 git-lfs,虽然官方的说法没有错,lfs 并不是 git 标准中的东西,没必要去实现,但是我就是想用,而且既有仓库很多都是用了 lfs,自然不好替代。

搭建 Gitlab 需要一台怎样的 NAS

起初我试图在我的小 VPS 上强行跑一个 Gitlab 起来——我自然已经看到官方给出的硬件最低标准,双核,4G 内存。我那个小 VPS 是单核 512M 内存,但是我还是想试试。最后倒是没有直接报错,但是总之是没有跑起来。

后来我买了台廉价威联通,太过愚蠢,居然是 ARM 平台的,硬件配置相当低,也就只能满足「读写文件」这类最最基本的操作,连全局搜索都跑不动,应用商店里的配套服务根本没有几个是能用的。后来这台威联通被我积灰在了柜子深处,连开机都不想。因为我不久之后买了一台 Plus 系列的群晖。

群晖(Synology)算是 NAS 中的贵族了,但是服务也好,配套软件非常成熟,甚至市上还有不少「黑群晖」的存在,和苹果一样,又贵又好用。Plus 系列号称「专为高性能、数据密集型任务而设计,旨在满足随时加密和可扩展性需求」,经历了前一次威联通低端型号的惨烈教训,我现在宁可买贵也不想买一个什么都不能跑的摆设了。

但是标配群晖依然不能满足 4G 的内存需求,(我后来有尝试跑过,靠 2G 是跑不起来的。)所以买机器的时候,我顺便让老板帮我加了根内存条,也不贵,三星条一百多块钱,用得也挺好。

所以这就是搭建 Gitlab 所需的硬件条件:至少双核 x86 处理器,4G 以上内存。

群晖多种搭建 Gitlab 方式的选择

在群晖上跑 Gitlab 基本上就是靠 Docker 了。也有别的曲折的办法,比如直接编译源码来跑,比如装个虚拟机来跑,没必要,也肯定更折腾。

然而靠 Docker 依然是有两种途径。其一,使用现成的 Gitlab 套件。

安装后,它也会调用 Docker 来执行,并且不需要过多的干预,基本算是「开箱即用」了。

从名字来看,这几个 Docker 映像应该是针对群晖优化过的。缺点主要是版本比较旧,以及有些地方只能接受预定的配置而不能手动控制,倒也没有什么大的问题。

第二种方法是我比较推荐的,直接在 Docker 套件中安装。Gitlab 官方有出一个说明,具体介绍了通过 Docker 安装的步骤和方法。

具体到群晖中,首先安装 Docker 套件。

打开 Docker 后选择「注册表」,搜索「gitlab」,在结果中选择第一个 gitlab/gitlab-ce

选择 latest 版本。

下载完成后点击「映像」,双击 gitlab/gitlab-ce:latest 来创建一个容器。

点击「高级选项」进行配置。「卷」选项卡中,新建一个文件夹,把容器中的 /var/opt/gitlab 映射出来,其他路径问题不大。

「端口设置」中,为容器端口 80 指定一个本地端口,另外两个随机无妨。这个指定的端口可以填写到「常规设置」中的桌面快捷方式中。

其他就没什么要配置的了,直接点击启动即可。

如何迁移 Gitlab.com 的内容到 Gitlab CE 中

无论采用哪种安装方法,正常情况下,启动之后 CPU 占用会持续走高,等待数十秒到数分钟不等,CPU 占用回落后,双击桌面上的快捷方式即可进入网页。

第一次打开网页会提示设置密码,这个设置的是 root 账户的密码,设置后记下即可。一般不使用这个账户。

此时,可以正常注册账户并使用了。

登录后,选择新建一个项目,然后选择「Import project」,来源选择 Gitlab.com

接着会弹窗提示,要求配置 OAuth 认证。

To enable importing projects from GitLab.com, ask your GitLab administrator to configure OAuth integration

根据给出的文档,回到 Gtlab.com 依次操作就行。新建一个应用,名字随意,权限开到 api,「Redirect URI」中的「your-gitlab.example.com」部分换成 Gitlab CE 的实际地址。

如果开启了群晖的 SSH 服务,那就 SSH 登入群晖,执行:

sudo docker exec -it synology_gitlab bash

在容器的终端中,继续执行:

vi /etc/gitlab/gitlab.rb

粘贴下面这段文本到合适的位置:

gitlab_rails['omniauth_providers'] = [
{
"name" => "gitlab",
"app_id" => "e3c7c272c2c5d4a47ef68d2a89525a15cb09c9d4f27d2f92c94e43e818ff0de2",
"app_secret" => "450dbdf5d2b301989f15193acc62b242240abb6ed99239636a9a9cf2cbf8dc10",
"args" => { "scope" => "api" }
}
]

执行一次重新配置来让设置生效:

gitlab-ctl reconfigure

要是群晖没有开 SSH 服务,那也没关系。

四步走,不要慌。打开终端后,命令输入与前面的一致。

这时候再打开网页,导入 Gitlab 项目时就会提示授权,同意后就会列出所有在 Gitlab.com 账户中的项目了。

选择所有项目导入,这样就完成了。不过因为没有以镜像的方式导入,所以以后还是需要手动更新。

转换结果来看,lfs 可以转换过来,子模块也没有任何问题,原始的组织也都一并迁移。

遇到的坑和填坑的经过

问:配置完之后,打开网页出现「502 Whoops, GitLab is taking too much time to respond.」是怎么回事?

答:刚启动时,出现这个网页表明系统还没有准备好,多等等就行了。

问:刚一进去就提示重设密码,也不提示用户名,这个密码是做什么用的?

答:这是 root 账户的密码。

问:开启容器后总是很快就自动停止,为什么?

答:这是由于文件系统权限不一致引起的,映射文件夹只留 data 而不加入 config 和 log 即可。非要加的话,可参考阿里云的文章解决。

问:套件版 Gitlab 的 gitlab.rb 配置文件在哪里?

答:不知道,找不到。

问:网页版终端怎么粘贴命令?

答:用鼠标,右键粘贴。

问:这样搭建的 Gitlab 可以在互联网上访问吗?

答:取决于 NAS 有没有公网 IP,如果走 Quickconnect 是不行的。