Dylan Liu / 树莓派搭建私有代码托管服务(Gitea)

Created Wed, 15 Jul 2020 00:00:00 +0000 Modified Mon, 21 Apr 2025 01:10:28 +0000

众所周知,GitHub时常处于存在或是不存在的薛定谔状态之中,若是自己的代码托管在上面,在紧急情况时,必须使用魔法才能够获得。

显而易见的是,不是每个人都是魔法师。所以,若是有一个能够存储自己的代码,并且不会失联的托管网站就好了。

在国内规模比较大的代码托管网站是Gitee,但对于我们这种只想将自己的代码托管在网站上,而不指望有人fork的小透明来说,搭建一个属于自己的代码托管服务显然是最好的。

比较知名的开源托管服务有:GitLab,Gitea,Gogs等。

GitLab是功能最多,体量最庞大的。它至少需要4G的内存来支撑运行。但对于我们个人或是3-5人的小团队来说,冗杂而无必要的功能只会增加不必要的开销。

这是一张服务对比图,来自Gitea官网

Gogs和Gitea就不一样了,它们是基于Go语言的轻量级托管服务,甚至可以在资源有限的树莓派Zero等低端微型电脑上流畅运行(当然,处理时间会比高级的要长一些。)

Gitea在Gogs的基础上增加了许多很有必要的功能,如GPG签名提交等。但是内存占用量与Gogs相比差距较大,据我的测试,在树莓派上,Gogs会占用20-30M的运存,而Gitea占用100-200M内存,所以我不建议树莓派1、2、Zero等内存在1G以下的设备安装Gitea。

根据标题,我这一篇文章主要讲树莓派4B安装Gitea。至于树莓派Zero安装Gogs是另外一篇文章。

一、前期准备工作

1.首先要更新树莓派上的源和软件。

sudo apt update //更新源
sudo apt upgrade //升级软件包

2.安装依赖

sudo apt install mariadb-server git unzip

3.完成MySQL的安装(使用安全安装)

sudo mysql_secure_installation

在这一过程中会设置root用户的密码,这个要妥善保存,因为其他要使用MySQL服务的应用都可能要使用它。

4.进入MySQL命令行界面

sudo mysql -u root -p

之后你需要输入安装时设置的root用户密码。

5.创建gitea数据库

CREATE DATABASE gitea;

6.为了其他数据库安全起见,我们创建一个专门用来管理gitea数据库的用户

GRANT ALL PRIVILEGES ON gogs.* TO '用户名'@'localhost' IDENTIFIED BY '密码';

7.刷新特权表

FLUSH PRIVILEGES;

8.接下来可以用ctrl+d或者输入exit来退出MySQL命令行模式

9.与数据库类似,为了系统的安全,我们专门创建一个用于处理git相关事务的账户,用“ -disabled-login ”参数确保它不可作为登录的账户

sudo adduser --disabled-login git 

我在此将之命名为git,但你也可以选择其他的命名方式,不过鉴于Gitea等配置时默认都是这个名字,还是建议不要改。

网图,我自己实现时并未截图。

二、开始安装Gitea

1.树莓派使用的Raspberry Pi OS属于Debian的一个分支,因此它属于Linux系统。而Gitea并没有针对Linux的独立安装包,因此我们只能通过二进制文件来安装。

cd /home/git
sudo wget https://dl.gitea.io/gitea/1.12.2/gitea-1.12.2-linux-arm64 -O gitea

现在我们已经将名为gitea的二进制文件下载到git用户对应的个人文件夹下了,下载链接会随时间或是系统而变化。我使用的是树莓派官方的测试版64位系统,因此要下载arm64版本,如果是正式版或是不同架构的设备,那就应该按照自己的情况选择对应的版本。附上下载地址

2.接下来我们对它赋予可执行权限

sudo chmod +x gitea

之后我们就可以直接运行来测试一下了。

./gitea web

测试完可以直接ctrl+c终止运行来退出。

3.如果我们不想每次关掉命令行窗口服务都会中断,我们必须将之配置为service

有两种方式可以做到,本文只介绍其中的systemd方式,而另一种supervisor,请看官方文档

首先,我们要在指定目录为它创建系统服务文件

sudo nano /etc/systemd/system/gitea.service

我在此使用的是nano,因为其操作简单,当然使用vim也是没问题的。

之后我们需要将官方的示例代码粘贴进去,并作出修改。

如果你按照之前的步骤配置,那么示例代码中仅有以下部分是必要的:

[Unit]
Description=Gitea (Git with a cup of tea)
After=syslog.target
After=network.target

[Service]
# Modify these two values and uncomment them if you have
# repos with lots of files and get an HTTP error 500 because
# of that
###
#LimitMEMLOCK=infinity
#LimitNOFILE=65535
RestartSec=2s
Type=simple
User=git
Group=git
WorkingDirectory=/home/pi/gitea/  //工作目录,配置在gitea文件所在的目录即可
# If using Unix socket: tells systemd to create the /run/gitea folder, which will contain the gitea.sock file
# (manually creating /run/gitea doesn't work, because it would not persist across reboots)
#RuntimeDirectory=gitea
ExecStart=/home/pi/gitea web --config /home/pi/custom/conf/app.ini    //配置文件位于工作目录下的custom/conf文件夹中
Restart=always
Environment=USER=git HOME=/home/git GITEA_WORK_DIR=/home/pi/   //按照工作目录配置
# If you want to bind Gitea to a port below 1024, uncomment
# the two values below, or use socket activation to pass Gitea its ports as above
###
#CapabilityBoundingSet=CAP_NET_BIND_SERVICE
#AmbientCapabilities=CAP_NET_BIND_SERVICE
###

[Install]
WantedBy=multi-user.target

配置完成后,保存退出,运行以下命令将服务加载,并启动。

sudo systemctl daemon-reload
sudo systemctl start gitea

如果想要开机自启,还必须运行以下命令:

sudo systemctl enable gitea

到此为止,安装完成。

三、配置Gitea

1.访问你服务器所在IP地址的3000端口就会进入主界面,地址格式如下:

http://<IP地址>:3000

界面如上图所示

2.接下来点击Sign In,第一次安装会跳转至配置界面

如上图所示

数据库类型我们选择MySQL,用户名和密码按照我们之前的配置,使用我们专属的giteauser即可。

域名和应用URL,如果有域名可以直接填写,没有的话可以稍后运行以下命令,编辑文件来配置:

sudo nano /home/git/custom/conf/app.ini

电子邮箱设置需要注意的是STMP服务器地址要带端口号,如:

stmp.qq.com:465

管理员账号不是必须的,因为系统会将创建的第一个账户默认为管理员。

可选设置可以按需要配置,如avatar等相关设置在国内就是无效的,需要魔法才能使用。

点击立刻安装,根据设备情况会花费不同时间,最后会看到以下界面,代表安装成功。

四、反向代理

我们会发现如果按照上述步骤做完,是不能直接通过域名访问Gitea网站的,因此我们需要做反向代理,通过Nginx或是Apache等反向代理服务来实现直接通过域名访问。

本文只介绍Nginx,Apache相关请看官方文档

Nginx的反向代理官网上解释得很详细,本文只补充HTTPS相关内容。

要配置HTTPS,有两种方式,一种是在gitea的app.ini中,按照下图指示来配置:

我们需要在文件中设置:

PROTOCOL = https
CERT_FILE = /你的/证书/文件/地址/路径
KEY_FILE = /你的/私钥/文件/地址/路径

在此之后,需要在反向代理中将:

proxy_pass http://localhost:3000;

修改为:

proxy_pass https://localhost:3000;

以上是第一种方法,第二种方法是在Nginx配置文件中配置,下面给出一个配置样例:


server { //将http全部重定向为https
        listen 80;
        listen [::]:80;

        server_name git.ourdocs.cn;

        location / {
                rewrite ^(.*)$ https://$host$1 permanent;
        }
}

server {

        # SSL configuration
        #
         listen 443 ssl;
         listen [::]:443 ssl;
         ssl_certificate /home/pi/Csr/*.ourdocs.cn_chain.crt;
         ssl_certificate_key /home/pi/Csr/*.ourdocs.cn_key.key;
         ssl_session_timeout 5m;
         #请按照以下协议配置
         ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
         #请按照以下套件配置,配置加密套件,写法遵循 openssl 标准。
         ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
         ssl_prefer_server_ciphers on;

         server_name git.ourdocs.cn;
         location / {
                proxy_pass http://localhost:3000;
         }

}

修改完配置文件后,使用下述代码使Nginx重新加载:

sudo nginx -s reload

本教程到此结束,附上安装完成后的截图一张: