随着自己的服务越来越多,目前大概几十个,有些放在Github上,有些直接是放在本地的磁盘上,另外还有些自动化管理脚本,备份以及恢复脚本,内容管理工具等等,总体上比较杂乱,需要一个版本管理工具来系统记录一下。之前安装过Gogs,感觉也不错,可是当时没有太深入探究,倒是也能运行,遇到了不能使用ssh
管理仓库的问题,然后就搁置了。前几天越发觉得需要一个这样的工具,于是找到了Gitea。Gitea是从Gogs这个开源代码Fork过来的,稍微了解了下两者的关系,多少有点恩怨的意思,如果描述属实,我还是比较站Gitea。
here is the test line, which will be seen on https://blog.rustle.cc/gitea, but can not be found on https://blog.rustle.cc/30
整体思路:user → VPS(frps) → CrossChain(frpc) → CrossChain(nginx)
和其他火爆的应用一样,Gitea支持非常多种安装方案,具体可以参考Gitea文档,一如既往,这里还是选择使用本地化二进制安装包部署的方式,虽然最近我也有在了解Docker,并且安装了Docker和Docker的图形化管理工具Portainer,目前还在研究阶段,等了解差不多了之后可能会考虑这种部署方式。
从https://dl.gitea.com/gitea/下载gitea,放在系统路径下,建议是`/usr/local/bin/`目录下,让所有人都可以访问。
bashwget -O gitea https://dl.gitea.com/gitea/1.19.3/gitea-1.19.3-linux-amd64
chmod +x gitea
mv gitea /usr/local/bin/
因为gitea不支持root用户安装使用,所以需要为这个应用单独创建一个用户,而且是需要可登录类型的,密码可以设定,也可以不设定。另外还要准备gitea安装的相关目录,并且owner要设定为之前新建的用户。
bashadduser --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/
如下应该也是比较常见的初始化MySQL数据库的语句,之前搭建nextcloud,koel,jellyfin,cloudreve或者monica的时候都用过好多次,文档中也给出了基本示例,可以参考。
sqlCREATE 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,我自己在实践的过程中也遇到了一些问题,大多也是这样解决的。
bashsudo -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
,此时应该可以看到如下界面。
上述使用的是域名访问,因为我提前做了域名解析,并通过frp透传到内网的8111端口所部署的服务——Gitea,如下是刚安装好的时候的界面,看起来还是比较清爽的。
在第一步中,看到可以使用域名进行访问,这里是需要配置nginx反向代理之后才能实现,gitea文档中也贴心的给出了相关的配置,可参考修改,如下是我线上环境的配置。
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; } }
大部分情况下使用systemd
来管理服务还是非常方便的,如下算是通用流程了,其他服务也可以参照修改。
bashcp 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
和Github使用方法完全一致,使用ssh-keygen -t rsa -b 4096 -C "mffan0922@163.com"
命令生成id_rsa和id_rsa.pub两个文件,将后者配置在Gitea网站上,前者自行保留,配置到客户端~/.ssh/config
文件中即可。
整体过程中,遇到的问题只有一个,那就是配置好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
功能了。
Warning
宿主机和VPS的22端口均不可以配置在/etc/ssh/sshd_config
文件中,否则会被当成主机ssh服务端口进行访问
本文作者:Manford Fan
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!