This repository has been archived on 2023-11-13. You can view files and clone it, but cannot push or open issues or pull requests.
blog/_posts/2023-05-25-gitea.md

162 lines
7.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
layout : post
title : "自建Git托管服务"
subtitle : "Git with a cup of tea"
date : 2023-05-25 08:50:22
author : "Manford Fan"
catalog : false
header-img : "img/post-bg-universe.jpg"
tags :
- Git
- Gitea
---
随着自己的服务越来越多目前大概几十个有些放在Github上有些直接是放在本地的磁盘上另外还有些自动化管理脚本备份以及恢复脚本内容管理工具等等总体上比较杂乱需要一个版本管理工具来系统记录一下。之前安装过Gogs感觉也不错可是当时没有太深入探究倒是也能运行遇到了不能使用`ssh`管理仓库的问题,然后就搁置了。前几天越发觉得需要一个这样的工具,于是找到了[Gitea](https://github.com/go-gitea/gitea)。Gitea是从Gogs这个开源代码Fork过来的稍微了解了下两者的关系多少有点[恩怨的](https://blog.gitea.io/2016/12/welcome-to-gitea/)意思如果描述属实我还是比较站Gitea。
![gitea_about](/img/posts/gitea_about.png 'gitea_about')
## 一、环境准备
> 整体思路:***user → VPS(frps) → CrossChain(frpc) → CrossChain(nginx)***
和其他火爆的应用一样Gitea支持非常多种安装方案具体可以参考[Gitea文档](https://docs.gitea.cn/)一如既往这里还是选择使用本地化二进制安装包部署的方式虽然最近我也有在了解Docker并且安装了Docker和Docker的图形化管理工具Portainer目前还在研究阶段等了解差不多了之后可能会考虑这种部署方式。
#### 1. 下载二进制包
从https://dl.gitea.com/gitea/下载gitea放在系统路径下建议是`/usr/local/bin/`目录下,让所有人都可以访问。
```bash
wget -O gitea https://dl.gitea.com/gitea/1.19.3/gitea-1.19.3-linux-amd64
chmod +x gitea
mv gitea /usr/local/bin/
```
#### 2. 创建gitea用户
因为gitea不支持root用户安装使用所以需要为这个应用单独创建一个用户而且是需要可登录类型的密码可以设定也可以不设定。另外还要准备gitea安装的相关目录并且owner要设定为之前新建的用户。
```bash
adduser --system --shell /bin/bash --gecos 'Git Version Control' --group --disabled-password --home /home/gitea gitea
mkdir -p /opt/webdav/gitea/
mkdir -p /opt/webdav/gitea/custom/conf
mkdir -p /opt/webdav/gitea/data
mkdir -p /opt/webdav/gitea/log
touch /opt/webdav/gitea/custom/conf/app.ini
chown -R gitea:gitea /opt/webdav/gitea/
```
#### 3. 数据库初始化
如下应该也是比较常见的初始化MySQL数据库的语句之前搭建nextcloudkoeljellyfincloudreve或者monica的时候都用过好多次文档中也给出了基本示例可以参考。
```sql
CREATE DATABASE gitea CHARACTER SET 'utf8mb4' COLLATE 'utf8mb4_unicode_ci';
CREATE USER 'gitea'@'localhost' IDENTIFIED BY 'PASSWORD';
GRANT ALL PRIVILEGES ON gitea.* TO 'gitea'@'localhost';
FLUSH PRIVILEGES;
# Delete if necessary
DROP DATABASE gitea;
DROP USER 'gitea'@'localhost';
```
## 二、安装配置
gitea有着完善的文档支持而且源码在Github上托管理论上在安装配置以及使用上有任何问题都能够在上面找到issue我自己在实践的过程中也遇到了一些问题大多也是这样解决的。
#### 1. 安装
```bash
sudo -u gitea gitea web --install-port 8111 --custom-path /opt/source-code/gitea/custom/ --work-path /opt/source-code/gitea/ --config /opt/source-code/gitea/custom/conf/app.ini
```
之前说过gitea是不允许使用root权限安装的所以需要使用创建好的新用户执行如上命令控制台输出没问题的话我们就可以打开浏览器输入`http://localhost:8111`,此时应该可以看到如下界面。
![gitea_installation](/img/posts/gitea_installation.png 'gitea_installation')
上述使用的是域名访问因为我提前做了域名解析并通过frp透传到内网的8111端口所部署的服务——Gitea如下是刚安装好的时候的界面看起来还是比较清爽的。
![gitea_ok](/img/posts/gitea_ok.png 'gitea_ok')
#### 2. 配置nginx反向代理
在第一步中看到可以使用域名进行访问这里是需要配置nginx反向代理之后才能实现[gitea文档](https://docs.gitea.cn/administration/reverse-proxies/)中也贴心的给出了相关的配置,可参考修改,如下是我线上环境的配置。
```
server {
server_name gitea.rustle.cc;
listen [::]:443 ssl http2;
listen 443 ssl http2;
charset utf-8;
access_log logs/gitea.access.log main;
ssl_certificate /opt/configs/certs/rustle.cc.cer;
ssl_certificate_key /opt/configs/certs/rustle.cc.key;
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_set_header Cache-Control no-cache;
proxy_pass http://localhost:8111;
# 如果您要使用本地存储策略,请将下一行注释符删除,并更改大小为理论最大文件尺寸
client_max_body_size 4000M;
}
}
```
#### 3. systemd管理
大部分情况下使用`systemd`来管理服务还是非常方便的,如下算是通用流程了,其他服务也可以参照修改。
```bash
cp gitea.service /lib/systemd/system/
systemctl daemon-reload
systemctl start gitea.service
# 如下是service内容
# [Unit]
# Description=Gitea
# After=syslog.target
# After=network.target
#
# [Service]
# RestartSec=2s
# Type=simple
# User=gitea
# Group=gitea
# ExecStart=/usr/local/bin/gitea web --port 8111 --custom-path /opt/webdav/gitea/custom/ --work-path /opt/webdav/gitea/ --config /opt/webdav/gitea/custom/conf/app.ini
# Restart=always
#
# [Install]
# WantedBy=multi-user.target
```
#### 4. 配置ssh密钥
和Github使用方法完全一致使用`ssh-keygen -t rsa -b 4096 -C "mffan0922@163.com"`命令生成id_rsa和id_rsa.pub两个文件将后者配置在网站上后者自行保留。
## 三、遇到问题
整体过程中遇到的问题只有一个那就是配置好ssh之后无法使用ssh进行`clone/push/pull`等操作先说结论原因是服务部署在内网访问时是通过frp进行透传导致的。另外之前Gogs的问题应该也是相同的原因导致的。
默认`app.ini`配置文件中监听的ssh端口是22原来使用frp透传ssh访问的时候用的是VPS的54321端口所以使用ssh进行`clone/push/pull`操作的时候实际访问的是VPS的22端口但是VPS上既没有gitea用户也没有gitea服务自然就会失败。这个时候有两种解决方案一种是将VPS的22端口作为frp的ssh转发端口VPS本身的ssh端口修改成其他的另一种方案是在VPS上配置gitea服务则什么问题都没有。
很显然使用后者不切实际这里采用的是前者的方案修改好之后ssh还是无法执行`clone/push/pull`等操作最终还是在issue中找到了问题所在需要先执行一下图示的两个任务后面就很顺利的使用`ssh`的功能了。
另外如果是使用Docker安装的Gitea因为容器和宿主机需要端口映射所以为了使得`ssh`操作顺利执行,宿主机的默认`ssh`端口22要修改成别的Container的`ssh`端口映射成宿主机的22号端口。不同的是下图中的两个任务也能使用`ssh`功能了。
![gitea_ssh_problem](/img/posts/gitea_ssh_problem.png 'gitea_ssh_problem')
## 四、参考文档
- [Gitea-GitHub](https://github.com/go-gitea/gitea)
- [Gitea中文文档](https://docs.gitea.cn/)
- [Gitea-安装包](https://dl.gitea.com/gitea/)