0%

在NAS搭建Git服务器

群晖在套件中心提供了 Git Server 套件,可以直接使用。如果需要类似 GitHub 和 GitLab 的功能可以通过 Docker 搭建 Gitea 服务。


Git Server

安装套件

打开套件中心,搜索并安装 Git Server:

套件中心-GitServer

准备工作

新增共享文件夹

打开控制面板,在“共享文件夹”一栏点击上面的“新增”,创建名为 gitlib 的共享文件夹:

控制面板-创建共享文件夹

新增用户

打开控制面板,在“用户与群组”一栏点击上面的“新增”,创建名为 dev 的用户:

控制面板-新增用户

无需在这里对 dev 用户设置目录的访问权限,因为后面会通过终端进行设置。

设置访问权限

打开 Git Server 套件,勾选允许 dev 用户访问:

GitServer-允许dev访问

开启家目录和SSH

控制面板-启动家目录服务

控制面板-启动SSH功能

初始化远程仓库

打开 Xshell 等终端,通过 SSH 访问 NAS 服务器:

1
2
3
4
5
6
7
8
9
10
11
12
13
# 连接NAS
$ ssh sannaha@192.168.31.2
# 切换到root用户
$ sudo -i
Password:
# 进入gitlib目录
$ cd /volume2/gitlib/
# 创建并初始化仓库
$ git init --bare test.git

# 将gitlib目录的拥有者和操作权限给到dev用户
chown -R dev:users /volume2/gitlib/
chmod -R 755 /volume2/gitlib/

使用Git Server

创建本地版本库

创建本地仓库,并进行一次提交:

1
2
3
4
5
6
7
8
$ git init test.git
Initialized empty Git repository in D:/test.git/.git/

$ cd test.git
$ echo "Test git server." > README.MD

$ git add README.MD
$ git commit -m "first commit."

推送到远程仓库

关联远程仓库,并进行一次推送:

1
2
3
4
5
6
7
8
9
10
# 关联远程仓库
$ git remote add origin ssh://dev@192.168.31.2/volume2/gitlib/test.git
# 如果通过公网访问,可以使用下面这个链接
$ git remote add origin ssh://dev@<QuickConnectID>.synology.me:<port>/volume2/gitlib/test.git

# 第一次推送master分支到远程仓库
# 使用-u参数关联本地的master分支和远程的master分支
$ git push -u origin master
# 之后推送
$ git push origin master

Gitea

Gitea 是一个自托管的 all-in-one 软件开发服务,类似于 GitHub 和 GitLab,提供了 Git 托管、代码审查、团队协作等功能。与 GitLab 相比,Gitea 占用的内存很低,非常适合在群晖 Docker 中使用。

下载镜像

打开群晖的 Container Manager,在注册表一栏搜索“gitea”,双击下载 gitea 镜像:

ContainerManager-下载gitea镜像

gitea 镜像的 Docker Hub 地址:https://hub.docker.com/r/gitea/gitea

准备工作目录

打开群晖的 File Station,创建目录 /volume3/docker/mygitea,并该目录的读写权限设置为所有人。

创建容器

使用刚才下载好的镜像创建容器 mygitea

创建gitea容器-设置容器名称

设置好端口和存储空间映射:

创建gitea容器-设置端口和存储空间映射

容器创建好后会自动运行。

初始化gitea

浏览器打开 http://192.168.31.2:30000 ,初始配置使用默认的即可:

运行gitea容器-初始配置

耐心等待加载一分钟:

运行gitea容器-等待加载

显示登录页。此时我们还没有账号,注册的第一个账号便是管理员:

运行gitea容器-登录页

登录后便可以使用了:

运行gitea容器-公开活动

点击加号创建一个仓库,便会得到一个形如http://192.168.31.2:30000/sannaha/test.git的地址:

使用gitea-创建仓库

推送代码时作为远程服务器填入便可以使用了。

免密

添加SSH密钥

点击右上角的头像,选择设置,在“SSH / GPG 密钥”一栏选择“增加密钥”,填入公钥中的内容,一般位于 C:\Users\<USERNAME>\.ssh\id_rsa.pub

使用gitea-SSH密钥

如果是在 GitHub 上,完成这一步便可以免密推送代码了。但我们将关联的远程仓库地址换成 ssh 链接,会发现仍然要求我们输入密码:

1
2
3
$ git remote set-url origin git@192.168.31.2:sannaha/test.git
$ git push origin master
git@192.168.31.2's password:

仔细观察 SSH 链接,就能注意到不对劲的地方:

使用gitea-SSH链接

网页提供的 SSH 链接不含端口信息,使用的是默认的 22 端口。而宿主机的 22 端口是被宿主机的 SSH 服务占用的,我们是用宿主机的 30022 端口映射到容器内部的 22 端口。使用 22 端口无法访问到容器,自然无法做到免密。

修改端口配置

但如果只是把 30022 端口加到 SSH 链接上,会发现仍然不行。其实还需要我们修改 gitea 中的配置文件中的 SSH 端口配置:

mygitea/gitea/conf/app.ini
1
2
3
4
- SSH_PORT = 22
- SSH_LISTEN_PORT = 22
+ SSH_PORT = 30022
+ SSH_LISTEN_PORT = 30022

修改后重启容器,会发现网页上的 SSH 链接自动加上了端口信息,此时用该链接能够实现免密推送:

使用gitea-SSH新链接


参考资料

群晖知识中心-Git Server
在 Synology NAS 中搭建 Git Server
What is Gitea?
使用 Docker 安装gitea