一、背景

在学习过程中,总是会写一些小工具。就我个人而言,有多台设备。经常会换设备,甚至搞坏系统。那么给这些代码找一个集中的就非常有必要了。于是,产生了一个非常自然而又实际的需求——使用git仓库来管理这些代码。

很多种选择,可以使用github、gitlab之类的国外的开源代码托管网站,也可以使用国内的如码云之类的,还可以直接使用一个nas目录的。但是,无论选择哪种都有各种缺陷。国外的网络不稳定,经常抽风无法访问,搭梯子费事又费钱。国内的又有各种限制,文件大小、访问形式等等,也是烦不胜烦。甚至可能完全无法使用,比如我曾经使用了一个语言模型,就超出了码云对单个文件大小的限制,以至于无法上传,很是郁闷。nas目录的话又不方便管理和维护。

最终,我选择自建一个git服务器,基本的要求如下:

  • 可以给项目分组,比如,根据不同用途、不同语言对各种项目进行分组管理。
  • 每个工程可以有一些简单的介绍,以便日后可以方便快速地唤醒沉睡的记忆。
  • 支持搜索,以方便以后查找。
  • 方便运行和维护,毕竟是自己搭建的,没有那么多精力去运行和维护它,一定要尽量做到免维护、自动备份。出了问题随时恢复。
  • 如果支持多用户,可以方便地分享给其他人就更好了。

简单来说,就是想自己搞一个github网站自己用,不需要跟github一样强大,但是,核心的功能当然是越多越好。

二、自建git服务器

开源的git服务器有很多,重量级最有名的就是gitlab,功能很全。但是,太耗资源了。管理、升级都很复杂。很多年前刚刚使用git时,曾经用搭建过一个,整整花了两天时间才搭好。记得当时的电脑还都是4G内存左右,gitlab运行就需要4G内存以上,为此还稍稍下狠心配了8G内存。不过,当初还是从微软的Visual Source Safe升级过来的,使用体验非常好,简直就是从农业时代直接进入了信息时代。

后来无意中发现了gogs这个服务器,一下子就被吸引住了。非常轻量级,只需要一个可执行文件即可运行,配置文件也非常清晰明了。并且也是通过这个程序才开始体会到go语言的那种单文件可执行程序带来的巨大便利性。

再后来又发现了一个基于gogs分叉出来的gitea,同样非常轻量级,配置文件也非常清晰。但是,比gogs功能更加丰富。

至于使用gitea还是gogs,完全看个人选择。gogs对于新手更加友好一些,更容易入门。gitea的文档也很完善,但是,因为功能多,所以,文档也会更复杂一些。

我曾经使用了很多年的gogs,但是,后来总觉得gogs对markdown的支持实在太鸡肋了。自己虽然也尝试加过一些特性,但是,总归无法合并到官方版本中,每次升级再改一遍很麻烦。于是,心一横切换到了gitea。至今没有起过对它动刀的念头。所以,下面的介绍均以gitea为主,gogs的方法相似。

三、gitea搭建方法

3.1 手动搭建

  1. 下载二进制包

    在GITHUB上面下载最新的二进制包即可,下载地址:https://github.com/go-gitea/gitea/releases

    如果无法访问github的话,也可以尝试去官网下载,地址为:https://dl.gitea.com/gitea/

    例如,我在魔百盒中就可以使用下面的命令:

    wget https://dl.gitea.com/gitea/1.19.2/gitea-1.19.2-linux-arm64
    chmod a+x gitea-1.19.2-linux-arm64
  2. 运行程序

    非常简单,只需要下面一个命令即可。

    ./gitea-1.19.2-linux-arm64
  3. 安装与配置

    在浏览器中访问:http://IP:3000即可进入gitea的安装页面。安装方法非常简单,只是需要设置一个数据库、配置一下默认选项、并添加管理员账号即可。这个时候所选择的所有配置都会被保存到gitea程序所在的data目录中。如果需要可以删除重建或者自己修改其中的配置文件

    注意:

    • 对于个人或者用户量比较少的情况,建议选择sqlite3。可以减少部署难度,也方便备份可恢复。
    • 在正式使用前多做一些验证,等熟悉以后在转正式使用。这样可以避免掉很多弯路。
    • 如果想作为生产力工具使用,建议通读一遍官方文档。
  4. 作为服务启动

    跟其他服务一样,自己写一个简单的service文件即可,例如:

    /etc/systemd/system/gitea.service

    [Unit]
    Description=gitea service
    After=syslog.target network.target remote-fs.target nss-lookup.target
    
    [Service]
    Type=simple
    ExecStart=/opt/gite/gitea
    # ExecReload=target_dir/restart.sh
    # ExecStop=target_dir/shutdown.sh
    SuccessExitStatus=0
    
    [Install]
    WantedBy=multi-user.target

    管理命令跟其他服务一样:

    • 启动:systemctl start gitea
    • 开机自动启动:systemctl enable gitea
    • 停止:systemctl stop gitea
    • 重启:systemctl restart gitea

3.2 使用docker搭建

无论何时何地,但凡可以使用docker,都是推荐使用docker来搭建服务的。除了docker本身带来的好处之外,还有很多额外的好处。比如手动搭建时其实还可能会遇到好多问题,比如git、比如各种权限问题等等。

如果想给data目录换个位置,docker部署的话,可以做到无缝支持。而手动搭建的就会非常麻烦。因为每个工程的配置文件中都会有路径名,不更改就会各种报错,更改的话又是一个不小的工作量。建立软连接也行,总觉得不那么优雅。

dacker部署gitea非常容易,只需要一个命令:

docker run -itd -p 3000:3000 -v `pwd`/data:/data  -v `pwd`/db:/db gitea/gitea:latest

启动成功后,依旧是去web界面中配置安装即可。

如果想要开启ssh,可以修改data/gitea/conf/app.ini中关于ssh的配置项,然后再把ssh的端口从docker容器中映射出来就可以了。

3.3 高可用

对于个人用户或者用户量比较少的情况而言,高可用的意义不大。因为高可用必然会带来高成本,用户量少也就无法均摊成本。但是,数据的自动备份一定是需要的。比如使用双硬盘,然后用rsync做同步实现主备。比如,通过shell+cron定时备份数据,实现每日或者每周备份,然后再定期进行刻盘存档或者使用多磁盘存档。

四、内网穿透

经过上面的一番努力后,在局域网中就可以快乐地使用自己的git服务器了。如果想通过公网访问,就要再次请出内网穿透这个老伙计了。具体方法可以参考《魔百盒折腾记——内网穿透(实操篇)》。下面是frpc中的参考配置如下:

[gitea_web]
type = http
local_ip = 127.0.0.1
local_port = 3000
subdomain = gitea

[gitea_ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 3001
remote_port = 3001

五、其他

这儿仅仅是一些很简单的入门配置。您如果真的要使用,还可能会遇到各种各样的问题。比如,手动部署的话会遇到git权限问题、ssh服务的调用问题等等。如果使用docker部署,也可能会遇到各种端口的困惑。如果再使用了内网穿透,就更加会面临安全方面的一些风险。只有在不停犯错,不停寻找解决方案的过程中,才能学习并锻炼自己。也才可以从这个过程中学习到别人的设计优点,再应用到自己的工作中,不停实践、不停改进、不停成长。