代码别再放别人家了:Gitea自托管Git服务搭建实录,小鸡也能跑得飞快


导读:本站Git+Webhook篇讲过"push代码即上线",但那套流程的代码仓库还托管在GitHub——而代码在别人服务器上,永远有个隐忧:仓库被封、私有仓收费、CI额度收紧,哪一样都能让你的部署流水线当场断粮。这篇把自建Git托管正面讲透:Gitea为什么是最适合个人和小组的选择、二进制和Docker两种装法怎么挑、SSH和HTTP两种克隆方式怎么配、配合Nginx反代和HTTPS上生产、Webhook对接站内讲过的自动部署、以及备份迁移的完整姿势。读完这篇,你的代码资产正式归你自己的服务器管。

一、先想清楚:什么人需要自托管Git

不是所有人都该自建。如果你是单人开发、开源为主、没有频繁的私有仓需求,GitHub依然是最优解——它的生态、Actions、流量都不是自建能比的。但下面三种人,自托管的收益是实打实的:第一种,代码不能出门的——公司项目、有商业价值的私有代码,放在第三方托管心里不踏实;第二种,小团队协作——三五人的小组,GitHub按人头收费的私有协作功能一年几百刀,一台年付10刀的小鸡跑Gitea就全覆盖了;第三种,自托管体系玩家——本站讲过的自动部署、哪吒监控、Umami统计都自己收了,代码这个最核心的资产没理由还寄人篱下。Gitea在GitHub上八万多星不是没有道理:Go写的单二进制、资源占用极低(本站Swap篇说的512M小鸡轻松带)、自带Web界面和CI(Gitea Actions),是个人规模自托管Git的事实标准。

二、装法选择:二进制还是Docker

Gitea两种主流装法,各有适用场景。二进制装法适合"这台机器专门跑Gitea"的场景:一个二进制、一个配置文件、一个systemd单元(本站systemd篇的注册姿势原样适用),升级就是换个二进制,干净利落。Docker装法适合"和其他服务混部"的场景:本站Compose篇讲过的应用栈理念,Gitea加PostgreSQL两条服务写进docker-compose.yml,环境隔离、升级回滚都有Compose兜底。个人建议:已经在用Compose管理应用的读者选Docker(和站内其他文章的技术栈统一),纯Linux原生党选二进制(省掉Docker层,性能损耗为零)。本文以Docker为主线讲,二进制的关键差异在文末提示。Compose最小配置长这样:

services:
  gitea:
    image: gitea/gitea:1.22
    environment:
      - USER_UID=1000
      - USER_GID=1000
    volumes:
      - ./gitea:/data
      - /etc/timezone:/etc/timezone:ro
    ports:
      - "3000:3000"
      - "2222:22"

三个细节值得说:USER_UID/GID让容器内进程以宿主机普通用户身份跑,落盘文件权限不打架;3000是Web端口,2222是SSH端口——故意和宿主机的22错开,因为宿主机自己的sshd占着22,容器里的Gitea SSH只能用别的口;数据全部在./gitea卷里,这就是你全部代码资产的载体,从这一秒起进备份清单(备份篇的三层分类里,它是妥妥的第一层"死了无法重建")。数据库方面,个人单机用内置SQLite完全够用,仓库几十个、协作者几个的量级毫无压力;多人协作或打算长期运营再换PostgreSQL,升级数据用gitea migrate转换,不用从头来。

三、初始化:五分钟跑通首个仓库

docker compose up -d之后浏览器访问3000端口,首次进入安装向导。数据库选SQLite,站点URL填你准备好的域名(比如https://git.example.com——注意这里的URL会写进仓库克隆地址,后面反代配好后要回来改对,这是个经典新手坑),管理员账号当场创建。装完进后台,建一个测试仓库,页面上"克隆"按钮会给出HTTP和SSH两种地址。此时先别急着传代码,把第四、五节的SSH和反代配好,让克隆地址一步到位,免得仓库remote改来改去。

四、SSH克隆:免密与端口的那些事

HTTP克隆输密码、SSH克隆走密钥(SSH篇讲过的key免密原理原样适用),日常使用SSH体验好得多,但Gitea的SSH有个必须理解的点:容器里跑的ssh-server监听2222,而你本机的~/.ssh/config默认连22。两种解法:简单粗暴的,克隆地址用ssh://git@git.example.com:2222/user/repo.git这种带端口的写法;优雅的,本机ssh config加一段:

Host git.example.com
    Port 2222
    User git

之后正常git clone git@git.example.com:user/repo.git,端口自动带上。密钥的添加在Gitea网页的"设置-SSH密钥"里粘贴公钥,和GitHub操作一致。还有个进阶姿势:如果宿主机不想多开2222端口(ufw篇讲过的最小暴露面理念),可以用SSH协议转发——宿主机sshd的authorized_keys里加一条command=转发的条目,把22端口的特定连接转给容器内的Gitea sshd,Gitea文档管它叫"SSH passthrough"。个人玩家直接开2222端口更省心,passthrough属于洁癖向优化。

五、反代与HTTPS:让克隆地址体面起来

裸跑3000端口能用但不体面:HTTP明文、地址带端口号。上Nginx反代(反代篇的完整技能栈在这里复用):

server {
    listen 443 ssl;
    server_name git.example.com;
    ssl_certificate /etc/letsencrypt/live/git.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/git.example.com/privkey.pem;
    location / {
        client_max_body_size 512M;
        proxy_pass http://127.0.0.1:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

证书用certbot签(HTTPS篇的流程原样照搬),client_max_body_size那行是必须的——git push大文件时HTTP传输体积轻松超默认1M限制,push莫名报413错误,十有八九是反代没放大body限制,这是Gitea反代的第一大坑。配好后回Gitea后台把ROOT_URL改成https://git.example.com/,重启容器,克隆地址从此干净漂亮。顺带把HTTP强制跳转HTTPS也配上,SSH端口那个2222同理可以用ufw限制来源IP,公网开放但只有你的IP能连,安全再上一档。

六、Webhook自动部署:和站内那篇无缝对接

Gitea的Webhook和GitHub用法一致,这让站内Git+Webhook篇讲的"push即上线"整套流程平移过来零成本:仓库设置里加Webhook,指向你服务器上的部署接口,触发事件勾push,密钥按那篇文章讲的方式对齐。区别只有一个:GitHub的Webhook出口IP段固定且公开,Gitea的出口就是你服务器自己——所以接收端不用维护IP白名单,部署接口甚至可以只监听内网或localhost,反代只放行Webhook路径,安全性反而更好。再进一步,Gitea自带的Actions(语法兼容GitHub Actions)可以直接在仓库里写workflow:push触发、跑测试、构建镜像、推到本站Docker Registry篇讲过的自建仓库,一条"代码到部署"的完整流水线全在你自己机器上闭环,不依赖任何外部CI额度。

七、日常维护:升级、清理与容量

Gitea的升级节奏很健康,小版本每月一发。Docker装法的升级就是两行:改compose里的镜像tag,docker compose up -d拉新重建,数据在卷里原地无损(重要升级前照例先停容器、tar一份卷目录,备份篇的快照思想)。容量方面Gitea本身极其克制——Go二进制加SQLite,空闲时内存占用几十M——真正吃磁盘的是仓库本身和附件,后台"仓库管理"里能看到每个仓库的体积,runaway的大仓库基本都是误传的构建产物或二进制文件,配合.gitattributes的LFS管理,别让仓库变成垃圾场。日志在卷里gitea/log目录,logrotate篇讲的治理方案给它也来一份。再配一条cron定时任务(cron篇的口诀):每周把gitea卷目录rsync到备份机,或者干脆用备份篇的restic做加密快照——代码资产值得最高规格的待遇。

八、迁移搬家:比想象中简单得多

自托管最被低估的好处是"资产完全可搬运"。迁移一台Gitea只需要:新机器Compose拉起来同样版本,旧机器tar掉./gitea整个卷目录传过去解压,起来就是原来的样子——仓库、用户、Webhook、SSH密钥全都在,连登录session都保持。这比迁移GitHub组织简单一个数量级。反过来,从GitHub搬家进来也有官方工具:管理后台的"Migrate"功能,填入旧仓库地址和token,一次迁移连issue带PR带wiki全拉下来。很多人的实际路线是混合:GitHub放开源仓库蹭生态,Gitea放私有仓库保主权,两边用Gitea的镜像推送功能互相同步——一份代码两个去处,谁出事都伤不到根本,这思路和备份篇的3-2-1原则一脉相承。

结语

Gitea把"自托管Git"这件事的门槛压到了一台年付小鸡加半小时配置的程度,换来的回报是代码资产的完全自主:不怕仓库被封、不限私有数量、CI额度自己说了算、迁移就是一个目录。配齐本站讲过的反代、HTTPS、备份、监控,它就是你自托管版图里最稳的一块。今晚就把常用的私有仓库迁一批进去试试——第一次在自己域名的Web界面里看到自己的代码仓库,那种踏实感,用过GitHub十年也从未有过。


手机扫码阅读

微信或手机浏览器扫一扫,随时随地随心阅读与分享

备份篇说好的对象存储,自己造一个:MinIO自建S3实录,小鸡秒变私有云盘

VPS发信总进垃圾箱?Postfix发信服务搭建实录:SPF、DKIM、DMARC一条龙

评 论
更换验证码