在QNAP上安装Gitea


历尽千辛万苦,终于在自家NAS:QNAP TS-453Bmini上成功安装Gitea。记录一下主要经过和遇到过的大坑小坑。

下载和安装Gitea的qpkg

Gitea是一个类似Github的web server,可以方便地通过web来管理你的Git仓库。类似的工具还有GitBucket。QNAP官方市场里两者都没有,都需要从QNAPClub这个第三方市场去安装。不知为什么,似乎国内连接QNAPClub速度很慢,也可以设法从网页下载后手动安装。但是手动安装的qpkg不会在AppCenter里出现,大概需要依赖这个qpkg自带的.uninstall.sh来卸载,比较麻烦。

正式安装前的准备

Gitea自身并不带Git。所以需要预先安装Git。QNAP官方市场里同样没有Git(这是什么官方市场啊~),可以从QNAPClub里安装。安装Gitea前一定要先安装Git,否则开机启动时按安装顺序先启动Gitea就会因为Git尚未mount而失败。

根据无数网上文章指导,最好不要用admin账户运行Git和Gitea. 所以先要创建一个系统用户git和对应的git组。QNAP的adduser好像有些简化,只能先建好用户再建组。

adduser -h /share/homes/git -s /bin/bash -S -D
addgroup git
addgroup git git

Gitea需要数据库的支持。QNAP上自带的MySQL就可以用,再加装一个phpMyAdmin管理起来更加方便,幸好这个官方市场里有。按Gitea的官方推荐创建供Gitea使用的账号gitea和数据库giteadb。

通过web界面安装

安装完Gitea的qpkg后默认3000端口上就已经启动了Gitea的web服务,可以进行正式安装。但如果这样做,当把运行用户设置成git后会遇到设定运行用户和当前用户(admin)不符的问题。所以需要先中止Gitea web服务,然后用sudo以git的身份运行web服务。因为今后启动脚本也有类似问题,所以可以直接修改Gitea对应的qpkg目录(例如/share/CACHEDEV1_DATA/.qpkg/Gitea)里的Gitea.sh脚本,将其中start里的直接运行Gitea改成

export $USER = git
……
sudo -u $USER ./gitea web &

这样,运行/etc/init.d/Gitea.sh restart后,Gitea的web服务就以git用户来运行了。在这个过程中,会发现某些文件的访问权限问题。如果是git专用文件,改owner为git即可,但有些文件似乎是共用的。理想的方式是针对这些文件创建新的group来解决问题,我有些偷懒,直接将git加进了administrators组。这样当然会增加安全风险。

从网上找来一张安装界面图。数据库这里选MySQL,会要求填写账户名、密码和数据库名。Run As会自动检测到git。如果没有sudo -u还是以admin运行的话,即使改成git后面也无法提交。

一些路径的设置需要考虑一下。比如Gitea应用默认装在CACHEDEV1_DATA上,但希望Git仓库建在CACHEDEV2_DATA上,就需要改Repository Root Path。

使能rsa密钥鉴权的SSH访问

使用SSH访问Git既安全又方便,是大家的首选方式。基本方法是通过ssh-keygen生成rsa密钥对,然后将自己的公钥放到服务器端git用户home目录下.ssh/authorized_keys文件里。但我反复尝试,都无法在QNAP自带的SSH上成功使用公钥验证的方式登录。RAM里的/etc/ssh/sshd_config文件似乎是从硬盘上/etc/config/ssh/sshd_config生成的,还有一个专门控制AllowUsers的文件/etc/config/ssh/sshd_user_config。但无论我如何摆弄这两个文件,都无法使能公钥验证登录。最后,在另一个端口上打开了Gitea自带的SSH,这个世界一下就清净了。再次强烈鄙视一下QNAP的QTS系统!

Gitea的配置文件

Gitea的很多配置是通过文件…/.qpkg/Gitea/custom/conf/app.ini设置的,没有web界面可供修改。Gitea提供的帮助也没有很清晰地解释每个设置。偶然发现最好的文档是这个sample文件。例如打开Gitea built-in SSH需要修改如下设置:

[server]
... ...
START_SSH_SERVER = true
SSH_PORT = xxxx
SSH_ROOT_PATH = /share/homes/git/.ssh

SSH_PORT当然要避开QNAP自己的SSH端口。

关于Domain的设置

我的NAS使用了QNAP的DDNS,但将DOMAIN设置成域名,希望在内外网都能使用此域名访问Git时,遇到了内网反而无法访问的问题。这是因为外网/内网的主节点路由器没有使能NAT loopback,导致内网通过域名解析到公网ip后访问时无法利用NAT规则转发回内网。由于我的主节点路由器是电信定制的,没有NAT loopback选项,这个问题最终通过在内网路由器的DNSMasq上添加规则手动解析DDNS域名到内网ip而解决。但我的公司笔记本打开VPN后会接管DNS,此时该方案无法工作。

总结

Gitea本身是一个简单而强大的Git仓库管理工具,经过一系列配置,可以在QNAP的NAS上运行良好。