一直想在群晖中配一个 Gitlab CE 来备份代码。这篇文章中,我会陈述两种配置的方案,以及遇到的一些问题。
目前我的代码差不多全部保存在 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 套件。

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

开箱即用的套件
从名字来看,这几个 Docker 映像应该是针对群晖优化过的。缺点主要是版本比较旧,以及有些地方只能接受预定的配置而不能手动控制,倒也没有什么大的问题。
第二种方法是我比较推荐的,直接在 Docker 套件中安装。Gitlab 官方有出 一个说明,详细介绍了通过 Docker 安装的步骤和方法。
具体到群晖中,首先安装 Docker 套件。

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

Docker Hub 上的 Gitlab
选择 latest
版本。

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

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

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

其他就没什么要配置的了,直接点击启动即可。
如何迁移 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" => "你的 APP ID",
"app_secret" => "你的 APP SECRET",
"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 是不行的。但是可以尝试一下内网穿透。