ubuntu20 部署 gitea

鉴于 github 太慢,gitee 审核,还是自己部署 gitea 比较好。

对于将 gitea 部署在国内服务器还是香港服务器,我是考虑了很久。

国内的服务器是阿里 ECS,2g 内存,足够部署 gitea 了。本身 MySQL 就已经安装了。缺点是网速慢,只有 1m。并且访问 github 很慢。

香港服务器是腾讯的轻量云,网速还行,访问 github 也快。缺点是内存只有 1g,没有部署 MySQL,没有自动备份。

最终我是选择将香港的服务器升级为 2g,部署了 MySQL 和 php 之类的。MySQL8 编译太慢,太耗内存,2g 物理内存 + 2g 虚拟内存直接吃满,还是败了。最终还是用的 MySQL5.7。

对于部署 gitea,我是倾向于 docker 的。可惜整了半天,容器连不上宿主机的 MySQL。MySQL 里对于 172.17.0.1 的访问已经添加了,ubuntu 的防火墙也直接关了,但连接就是超时。(感觉好累,升级血亏)

没办法,还是二进制安装吧。

安装参考:搭建Gitea-自己的git服务器 – 知乎 (zhihu.com)

添加用户

对于运行 gitea 的用户。我本来是准备直接 root 运行的,可惜 gitea 不让。

Gitea is not supposed to be run as root

没办法,跟着文档创建了 git 用户和组。

groupadd git
useradd git -g git

下载安装 gitea

我习惯于将 web 相关的东西放到 /home/wwwroot/ 下面,所以我是在 /home/wwwroot/ 下面创建的 gitea 目录。然后将目录用户设为 git。

cd /home/wwwroot
mkdir gitea
cd ./gitea
wget -O gitea https://dl.gitea.io/gitea/1.16.8/gitea-1.16.8-linux-amd64
chmod +x gitea
// 更改目录权限
cd ../
chown -R git:git ./gitea
// 切换 git 账户运行
su git
cd ./gitea
./gitea web

执行后可以先访问一下,确保服务跑起来了。这里需要配置一下 nginx

server
    {
        listen 443 ssl http2;
        #listen [::]:443 ssl http2;
        server_name gitea.dowhat.top;
        index index.html index.htm index.php default.html default.htm default.php;

        location /
        {
            proxy_pass http://0.0.0.0:3000;
            proxy_http_version 1.1;
            proxy_connect_timeout 4s;
            proxy_read_timeout 60s;
            proxy_send_timeout 12s;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $connection_upgrade;
            #proxy_set_header Host $http_host;
        }

        access_log  /home/wwwlogs/gitea.dowhat.top.log;
    }

配置文件无关部分省略了。这里需要注意的是,gitea 是跑在 0.0.0.0 的 3000 端口上。

浏览器可以访问后就可以配置 gitea 作为 linux 服务了。

配置 service

配置 service 是在 root 用户下进行的。

vim /etc/systemd/system/gitea.service

gitea 官网配置文件比较长,我是直接拿上面那个参考文档的配置修改了下。

[Unit]
Description=Gitea
After=syslog.target
After=network.target
​
[Service]
RestartSec=2s
Type=simple
User=git
Group=git
ExecStart=/home/wwwroot/gitea/gitea web --config /home/wwwroot/gitea/custom/conf/app.ini
Restart=always
​
[Install]
WantedBy=multi-user.target

/home/wwwroot/gitea/custom/conf/app.ini 这个文件可以先用 git 账户创建一下。

此外,/home/git 文件夹也需要创建一下,所属用户也是 git。否则服务无法启动。比如下面这样的服务状态提示。

root@VM-8-3-ubuntu:/home/wwwroot/gitea# service gitea status
● gitea.service - Gitea
     Loaded: loaded (/etc/systemd/system/gitea.service; disabled; vendor preset: enabled)
     Active: active (running) since Tue 2022-05-24 14:47:02 CST; 105ms ago
   Main PID: 41302 (gitea)
      Tasks: 6 (limit: 2270)
     Memory: 34.3M
     CGroup: /system.slice/gitea.service

May 24 14:47:02 VM-8-3-ubuntu systemd[1]: Started Gitea.
May 24 14:47:02 VM-8-3-ubuntu gitea[41302]: 2022/05/24 14:47:02 cmd/web.go:102:runWeb() [I] Starting Gitea on PID: 41302
May 24 14:47:02 VM-8-3-ubuntu gitea[41302]: 2022/05/24 14:47:02 ...s/setting/setting.go:801:loadFromConf() [F] Failed to create '/home/git/.ssh': mkdir /home/git: permission denied
May 24 14:47:02 VM-8-3-ubuntu systemd[1]: gitea.service: Main process exited, code=exited, status=1/FAILURE
May 24 14:47:02 VM-8-3-ubuntu systemd[1]: gitea.service: Failed with result 'exit-code'.

处理好之后,就可以通过 service gitea start 启动服务了。

为了让服务可以自启动,再执行下面这句:

systemctl enable gitea

设置 gitea

在第一次打开 gitea 的时候需要进行应用的设置(以后也可以修改配置文件:xxx/custom/conf/app.ini)。设置项中注意一下 ssh 的设置。ssh 服务器域名就是当前域名,端口默认是 22。但是,我的服务器 ssh 端口不是 22,所以我改成了自己的 ssh 端口。这就导致了之后无法 push 代码。

Gitea: Unauthorized
fatal: Could not read from remote repository.

当然,我不是很确定就是端口的问题,但是我尝试了各种方法,最后只能将 22 端口也开放才能正常 push。

服务器 ssh 多端口设置

之前关闭 22 端口,改为高位端口是为了防止恶意登录。现在则希望 22 端口和正在使用的高位端口一起开放。为了安全,现在禁止 root 通过 ssh 登录。另外,允许 ssh 通过 key 登录。

// /etc/ssh/sshd_config
#Port xxx
#AddressFamily any
AddressFamily inet
ListenAddress 0.0.0.0:xxx
ListenAddress 0.0.0.0:22

PermitRootLogin no

PubkeyAuthentication yes

本地 ssh 多账户设置

因为现在部署了 gitea,所以本地除了 github 的 ssh 账户,还要有 gitea 的账户。这就需要多账户配置了。

首先,生成 gitea 的 key。

ssh-keygen -t rsa -b 4096 -C "email@xx.com"

接下来一步注意了。ssh 默认保存的文件是 id_rsa。但这个文件已经存在了,是 github 账号的。所以在下一步让输入文件路径的时候,不要直接回车,输入需要保存的文件。

接下来的 passphrase 直接回车。

ssh 文件

我这里新的 ssh 文件是 id_rsa_gitea_dowhat_top。然后把 id_rsa_gitea_dowhat_top.pub 里的内容添加到 gitea 的 ssh 密钥里面。

然后很重要的一步,添加 config 文件。本地的 .ssh 文件夹里可能没有这个文件,直接新建一个就是。

# 配置 github.com
Host	github.com
	HostName	github.com
	IdentityFile	C:\\Users\\xxx\\.ssh\\id_rsa
	PreferredAuthentications	publickey
	User		git

# 配置 gitea.dowhat.top
Host	gitea.dowhat.top
	HostName	gitea.dowhat.top
	identityFile	C:\\Users\\xxx\\.ssh\\id_rsa_gitea_dowhat_top
	PreferredAuthentications	publickey
	User		git

Host 对应的是别名,以后可以通过 ssh gitea.dowhat.top 这种形式登录。User 是服务器上相关服务的账号。比如我的 gitea 服务就是通过 git 账号运行的。

// 验证
ssh -T gitea.dowhat.top
// 结果
Hi there, tony! You've successfully authenticated with the key named xxx, but Gitea does not provide shell access.
If this is unexpected, please log in with password and setup Gitea under another user.
Connection to gitea.dowhat.top closed.

出现上面的结果就代表成功了。but Gitea does not provide shell access 这句是说无法通过 shell 登录。不影响之后通过 git 提交代码。

验证成功了,但不代表提交代码成功。上面有说过,我一开始是通过高位端口配置的 ssh,后来开放了 22 端口才生效的。具体原因我也不清楚。不过开放 22 端口看起来挺正规的,免得仓库地址和 config 文件还要带上端口。

镜像仓库同步

对于 gitea 上的仓库,我希望是 github 的镜像,更新其中一方,自动更新另一方。配置镜像仓库需要其中一方的 access token。比如我从 gitea 镜像 github 的仓库,就需要 github 的 access token。access token 的获取可以参考 gitee 的文档。仓库镜像管理 ( Gitee <-> Github 双向同步) – Gitee.com

迁移仓库

仓库迁移好之后就是 github 上某个仓库的镜像了。但这时的镜像只有拉取功能,没有推送功能。所以还需要配置一下。仓库->设置->镜像设置:Repository Mirror – Docs (gitea.io)

我这里已经添加了一条推送设置了,下面的只是示例。授权里的用户名和密码不要写 github 的用户名和密码,因为 github 已经不支持用户名密码推送了。用户名按照图上写,密码就是 github 里生成的 access token。(如果没有记录下 access token 就重新生成一个吧。)

好了,完事了?没有。gitea 的镜像仓库比较特殊,不能提交代码。所以,要么代码提交到 github,gitea 同步拉取,要么,把 gitea 的镜像仓库转成普通仓库,然后代码提交到 gitea,等 gitea 同步到 github。

后记

为了部署这个 gitea 是真的折腾。踩了很多坑,还是搜不到解决方案的坑。比如 docker 无法访问宿主机数据库,我只能用二进制安装。比如高位端口无法 push 的问题。

虽然有了 gitea,但我还是感觉代码不安全,因为腾讯轻量云没有自动备份,说不定哪天就挂了。所以,最好以后服务器挂一个脚本,定时备份重要数据,然后本地跑一个脚本,定时拉取服务器的备份。毕竟网上的东西不仅仅属于你。