这个项目是什么
Gitea 是一个轻量级的自建 Git 服务,我把它放在 Homelab 里,当作自己的「私有 GitHub」。它跑在 Docker 里,通过 NPM(Nginx Proxy Manager)做反向代理和证书管理,对外提供仓库浏览、代码历史、Issue 等常用能力。
为什么做
一是把代码从公有平台收回来。私有仓库、实验性项目、随手写的脚本,放在自己的机器上更踏实,也不受平台策略变化影响。二是学习:想完整走一遍 Git 服务的部署、镜像推送、证书扩展这些环节,而不是只会 git clone。
解决了什么问题
- 私有仓库有了统一的落脚点,不用再散落在各个平台或本地目录里;
- 有 Web 界面可以浏览代码、查看提交历史和 diff,比在终端里翻日志直观;
- 每天自动备份并推送到别处,避免单机故障导致代码全丢;
- 反向代理统一入口,证书续期交给 NPM,省去手工维护。
现在的状态
项目处于「运行中」,日常作为我的代码托管和备份节点使用。整体方案不复杂,一台机器、一个容器加一个定时备份脚本就够跑起来,后续要扩展(比如加 CI 或更多仓库)也有余地。
如果你也想自建一个代码仓库,这个组合算是一个成本低、维护压力小的起点。
功能
- Docker 部署 Gitea,一条 compose 文件拉起服务
- NPM 反向代理 + 证书管理,统一对外入口
- Web 端浏览仓库、提交历史与代码 diff
- 支持私有仓库,作为个人代码统一托管点
- 定时脚本自动备份并推送,降低单机丢失风险
技术栈
使用 / 部署教程
部署步骤
1. 准备目录
在宿主机上建一个配置目录,用来放 compose 文件和备份脚本,例如 opt-configs/gitea/,后续所有内容都围绕这个目录展开。
2. 编写 compose 文件
在目录下创建 compose.yaml,用官方 Gitea 镜像启动容器。要点:
- 映射数据卷,把 Gitea 的数据目录挂到宿主机,容器重建不丢数据;
- 映射 Web 端口(容器内默认 3000)和 SSH 端口(默认 22,宿主机上通常要换成别的端口避免冲突);
- 设置
restart: unless-stopped,机器重启后自动拉起。
启动:
docker compose up -d
docker compose logs -f
看到服务启动日志后,用浏览器访问宿主机对应端口,进入首次安装页面,按提示填数据库、站点 URL 和管理员账号。
3. 配置反向代理与证书
在 NPM 里新建一个 Proxy Host:
- Forward Hostname 填 Gitea 容器所在主机地址,Forward Port 填映射出来的 Web 端口;
- 打开 Websocket Support;
- 申请 Let's Encrypt 证书并开启 Force SSL。
注意把 Gitea 配置里的站点根 URL 改成最终域名,否则克隆地址和回调会不对。
4. 配置备份脚本
在同目录写 backup.sh,思路是:打包 Gitea 数据目录(或用 Gitea 自带的 dump 命令)→ 生成带日期的压缩包 → 推送到远端仓库或存储。
chmod +x backup.sh
用 crontab 每天定时执行,例如:
0 3 * * * /path/to/opt-configs/gitea/backup.sh >> /var/log/gitea-backup.log 2>&1
第一次务必手动跑一遍,确认产物完整、推送成功。
5. 验证
- 网页能正常登录,能新建仓库;
git clone走 HTTPS 和 SSH 都能通;- 备份脚本执行后,远端能看到当天的备份文件。
注意
端口、域名、数据库参数都按自己的环境填,不要照抄;升级镜像前先备份。
注意
- 备份脚本要定期验证可恢复性,只备份不演练等于没有备份
- 对外暴露时务必开启 HTTPS,并限制管理员账号的登录方式
- 升级 Gitea 镜像前先做一次完整备份,遵循官方的升级路径