Gitea+Nginx+SSL+MySQL配置Git服务器记录

公司的项目一直用的SVN,最近觉得代码提交测试之后,更新到正式服务器有点麻烦,就折腾了下各种搭建自有git服务器程序,前后试了gitlab、gitea、gogs,最后选择了gitea,打算配置一台私有的git服务器跟同事协作及给服务器代码版本更新,这里记录一下gitea的配置过程。

一开始我是选择Gitlab的,听大家说这货功能强大,支持各种功能,我就试了下,发现很多功能我们暂时用不上,而且那货太占资源了,看官方文档说推荐4G内存,如果安装这个,再加上别的任务,我们的备用服务器可能扛不住,最后试了下gitea,发现比较节省资源,且依赖的服务也不多,最后决定选择这个。
如果不配置Nginx和SSL访问,直接使用Gitea和SQLite也可以,但是为了以后拓展以及数据安全及访问方便,我选择了用MySQL保存数据,以及用Nginx+SSL保证数据传输安全,所以就有了这篇文章。
本文的所有安装过程在Vultr上的512MB VPS操作通过,如果你想体验,可以通过这个链接购买:https://www.vultr.com
首先是安装各种依赖,比如说Nginx、MySQL、git等,我们选的是CentOS7系统,安装命令如下:

yum install nginx mariadb git wget

CentOS6系统:

yum install nginx mysql-server git wget

如果提示Nginx安装出错,请考虑启用EPEL源,或者考虑Linux安装官方最新版的Nginx
MySQL如果不想使用MariaDB,也可考虑CentOS系统yum安装MySQL 5.5/5.6/5.7/8.0
我习惯将所有的gitea数据放置到/var/gitea目录,这样便于管理,所以,新建文件夹及下载gitea:

mkdir /var/gitea
cd /var/gitea
wget https://dl.gitea.io/gitea/master/gitea-master-linux-amd64 -O gitea

这里下载的是Linux 64bit系统所运行的文件,更多平台参考这里:https://dl.gitea.io/gitea/master/
下载之后,赋予可执行权限,并执行:

chmod +x gitea
./gitea

在输出的显示信息中,提示我们可以打开对应主机的3000端口进行下一步,我们用浏览器打开http://ip_or_domain:3000 ,就能看到gitea的安装界面了,但是为了方便访问以及数据传输安全,我们接下来还要配置Nginx反代gitea的3000端口并强制SSL访问。
SSL证书申请可以参考这个:利用Certbot申请Let’s Encrypt SSL证书Certbot申请let’s encrypt ECC泛域名证书或者这个:利用acme.sh申请letsencrypt免费wildcard证书,这里就不多说了。
申请好SSL证书之后,我们接下来配置Nginx代理gitea并配置SSL访问。新建Nginx配置文件,然后参考如下配置:

vim /etc/nginx/conf.d/gitea.conf
server {
    server_name gitea.cloudbool.com;
    listen   443 ssl http2;
    ssl_protocols TLSv1.2 TLSv1.1 TLSv1;
    ssl_certificate /etc/letsencrypt/live/gitea.cloudbool.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/gitea.cloudbool.com/privkey.pem;
    ssl_session_cache        shared:SSL:10m;
    ssl_session_timeout      60m;
    ssl_session_tickets      on;
    ssl_stapling             on;
    ssl_stapling_verify      on;
    location / {
        proxy_pass http://127.0.0.1:3000;
    }
    client_max_body_size    4m;
    access_log /var/log/nginx/gitea.log;
    error_log /var/log/nginx/error.gitea.log;
    error_page 404 /404.html;
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root /usr/share/nginx/html;
    }
}
server {
    listen 80;
    server_name gitea.cloudbool.com;
    location / {
        rewrite ^/(.*)$ https://gitea.cloudbool.com/$1 permanent;
    }
}

因为gitea安装需要有数据库,虽然可选postgresql、mysql、sqlite,但是除了MySQL其余两个我们都不熟悉,所以我们选择了MySQL,使用下面命令创建一个gitea数据库并创建对应的用户给gitea使用,MySQL代码如下:

create database gitea DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
CREATE USER gitea_user@localhost;
SET PASSWORD FOR git_user@localhost= PASSWORD("git_password");
GRANT ALL PRIVILEGES ON gitea.* TO gitea_user@localhost IDENTIFIED BY 'gitea_password';
FLUSH PRIVILEGES;

分别将上述giteagitea_usergitea_password替换成实际的执行一下就行。
安装之前,我们最好还是配置一下systemd。就是到目前为止,我们使用的是root用户在运行gitea,如果是内网来说,没什么问题,但是如果要开放到公网访问,这可能是个安全隐患,所以,我们接下来创建一个专门的用户来运行gitea及配置systemd服务。
创建gitea组,以及添加gitea用户并加入gitea组:

groupadd gitea
useradd -g gitea gitea

上面命令创建了一个gitea用户并加入了gitea用户组,我们接下来就用这个用户运行gitea程序。
赋予相关可执行权限:

chown -R gitea.gitea /var/gitea

创建Linux Service文件并参考如下配置:

vim /etc/systemd/system/gitea.service
[Unit]
Description=Gitea (Git with a cup of tea)
After=syslog.target
After=network.target
After=mysqld.service
[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=gitea
Group=gitea
WorkingDirectory=/var/gitea
ExecStart=/var/gitea/gitea web
Restart=always
Environment=USER=gitea HOME=/home/gitea
[Install]
WantedBy=multi-user.target

接下来我们就可以开始安装gitea了,访问我们上述绑定的域名,直接就能看安装界面:
gitea-install-nginx-ssl-mysql
输入相关信息就能完成安装了,安装过程可以创建管理员、配置邮件发送、系统设置等,安装好之后的界面:
gitea-install-nginx-ssl-mysql-after-install
这样gitea就算配置完成了。