Gitea安装部署自建git托管系统

在之前【自建git服务实现hexo博客部署】这篇博文中提到了如何自建git服务远程仓库。这种方式需要在远程端输入命令来创建仓库和配置,比较麻烦,更希望可以搭建一个像github一样的web环境来方便地进行管理仓库以及配置。
突然想到chino把TIS外服的白名单放在自建的git服务下托管,每个部落的管理即使不懂得git也可以在网页上管理各自的白名单。一看原来是用Gogs搭建的
上网搜了一下还有很多人推荐Gitea,gitea是从Gogs源码的基础上开发的,听说使用起来也很不错,而且维护更新也更频繁,于是我就选择了Gitea
官方也是很有趣,官网上写着 「Git with a cup of tea」,这大概也是gitea名字的含义吧。

Gitea 是一个开源社区驱动的轻量级代码托管解决方案,后端采用 Go 编写,采用 MIT 许可证

先来看一下我部署好的gitea的首页界面
Flyky_gitea_index

安装MySQL数据库

Gitea需要有数据库,支持postgresql、mysql、sqlite,那我这里还是选择MySQL。我们选择安装软件源,用包管理安装

下载软件源

首先要下载软件源,去MySQL的官网下载站点下载软件源,我这里用的是CentOS,所以我使用Yum Repository
mysql_repo_download
选择相应系统版本的软件源下载,然后点击右侧的小感叹号(红框框出),在下面会有链接跳转到用该软件源安装的quick guide(指南),里面会详细的讲解如何使用软件源安装mysql
mysql_yum_quick_guide_link

由于我这里使用的yum,我在下面也简单的描述一下用yum软件源安装的过程,其他的譬如apt可以看指南步骤安装

## 安装软件源 首先将下载的软件源安装好
1
sudo rpm -Uvh mysql80-community-release-el7-3.noarch.rpm
## 选择mysql安装的release版本 首先先查看一下安装的软件源里包含了哪些包,以及默认启用的包版本
1
yum repolist all | grep mysql
我这里看到默认启用的是mysql8。0 ![mysql_grep_default](https://flyky1m-1251689806.cos.ap-guangzhou.myqcloud.com/blog8/mysql_grep_default.webp) 但是我要装的是5.7的版本,所以我们需要禁用8.0的源,启用5.7
1
2
sudo yum-config-manager --disable mysql80-community
sudo yum-config-manager --enable mysql57-community
然后用下面的命令查看一下启用的包,会发现8.0没有了,5.7启用成功
1
yum repolist enabled | grep mysql
## 安装mysql
1
sudo yum install mysql-community-server
安装完毕后`mysqld -V`查看一下mysql版本,确认是5.7 ## 启动mysql服务
1
2
3
sudo service mysqld start
# 或者
sudo systemctl start mysqld.service
上面的命令启动mysql服务。 ## 查看密码 / 设置密码
1
grep 'temporary password' /var/log/mysqld.log
可以查看到安装时自动生成的root密码 如果什么都没有查到说明没有生成密码,可以直接`mysql -uroot -p`登录,然后设置密码`mysqladmin -u root password "newpwd"` 如果查到了密码,登陆后要修改密码
1
alter user 'root'@'localhost' identified by 'your-new-passwd';

假如更新密码时遇到了ERROR 1819 (HY000): Your password does not satisfy the current policy requirements的错误提示
可以看一下这篇文章的解决方法

安装Gitea前的准备

创建git用户(组)

1
2
groupadd git
useradd -g git git -s /bin/git-shell

上面命令创建了一个git用户并加入了git用户组(并且为了安全禁止使用shell登录,这个创建用户后也可以在/etc/passwd文件里修改),我们接下来就用这个git用户运行gitea程序。

当然这一步不做也可以,不用git用户的话用当前用户或者root用户也可以,只是在配置gitea的时候要注意一下

创建gitea数据库

使用下面的sql代码创建gitea数据库
注意将示例代码中的gitea、gitea_user、gitea_password替换成实际的内容

1
2
3
4
create database gitea DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
CREATE USER 'gitea_user'@'localhost' IDENTIFIED BY 'git_password';
GRANT ALL PRIVILEGES ON gitea.* TO gitea_user@localhost IDENTIFIED BY 'gitea_password';
FLUSH PRIVILEGES;

启动并配置Gitea

启动Gitea与安装配置

第一次启动gitea

1
2
chmod +x gitea
./gitea web

web默认端口在3000,打开gitea页面之后,随便点击界面上的按钮(注册,登录之类的),或者在地址后加上/install,会跳转到『初始配置』页面进行安装前的配置,如下图:
gitea_first_config

这里的配置按照自己的实际情况来就可以了,配置完之后安装即可
配置之后也是可以更改的,gitea的配置文件在gitea/custom/conf/app.ini
具体的配置项可以去官方文档查看,也可以在本文的参考文章里的文章里查看

创建gitea service来启动Gitea

这里配置的是systemctl命令的系统服务。关于linux的系统服务管理相关,我在这篇博文中提过,建议先去了解一下。

由于我们创建的git账户无法使用shell登录,不好直接用git用户启动gitea,我们选择创建一个服务来启动关闭gitea。下面的创建服务的位置要根据你自己系统的service文件的实际位置改变,我这里是centos,所以在/etc目录下

1
vim /etc/systemd/system/gitea.service  #创建gitea.service

下面是一份示例,可以根据实际情况修改

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[Unit]
Description=Gitea (Git with a cup of tea)
After=syslog.target
After=network.target

[Service]
RestartSec=2s
Type=simple
User=git
Group=git
WorkingDirectory=/usr/program/gitea/
ExecStart=/usr/program/gitea/gitea web -c /usr/program/gitea/custom/conf/app.ini
Restart=always
Environment=USER=git HOME=/home/git GITEA_WORK_DIR=/usr/program/gitea
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
AmbientCapabilities=CAP_NET_BIND_SERVICE

[Install]
WantedBy=multi-user.target

之后就可以通过service gitea start,service gitea stop,service gitea status
或者systemctl start gitea,systemctl stop gitea,systemctl status gitea来开关和查看状态了

Nginx反向代理设置

如果需要用nginx反向代理的话。
这次我贴出一份完整的我的nginx配置(当然域名和证书路径还是假的啦)
我用了ssl证书,监听80重定向到443

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
server {
listen 80;
server_name git.example.com git.example.cn;
rewrite ^(.*)$ https://${server_name}$1 permanent;
}

server {
listen 443 ssl;
server_name git.example.com git.example.cn;

ssl_certificate /your/ssl/certificate/location;
ssl_certificate_key /your/ssl/certificate/key/location;
ssl_protocols TLSv1.2 TLSv1.1 TLSv1;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;

location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Nginx-Proxy true;
}
expires max;
}

参考文章