项目/工具
工具 · 运行中

Gitea 私有代码仓库

自建 GitHub:私有仓库、代码浏览、历史、每日自动备份推送。

GiteaGitDockerNPM

这个项目是什么

Gitea 是一个轻量级的自建 Git 服务,我把它放在 Homelab 里,当作自己的「私有 GitHub」。它跑在 Docker 里,通过 NPM(Nginx Proxy Manager)做反向代理和证书管理,对外提供仓库浏览、代码历史、Issue 等常用能力。

为什么做

一是把代码从公有平台收回来。私有仓库、实验性项目、随手写的脚本,放在自己的机器上更踏实,也不受平台策略变化影响。二是学习:想完整走一遍 Git 服务的部署、镜像推送、证书扩展这些环节,而不是只会 git clone。

解决了什么问题

  • 私有仓库有了统一的落脚点,不用再散落在各个平台或本地目录里;
  • 有 Web 界面可以浏览代码、查看提交历史和 diff,比在终端里翻日志直观;
  • 每天自动备份并推送到别处,避免单机故障导致代码全丢;
  • 反向代理统一入口,证书续期交给 NPM,省去手工维护。

现在的状态

项目处于「运行中」,日常作为我的代码托管和备份节点使用。整体方案不复杂,一台机器、一个容器加一个定时备份脚本就够跑起来,后续要扩展(比如加 CI 或更多仓库)也有余地。

如果你也想自建一个代码仓库,这个组合算是一个成本低、维护压力小的起点。

功能

  • Docker 部署 Gitea,一条 compose 文件拉起服务
  • NPM 反向代理 + 证书管理,统一对外入口
  • Web 端浏览仓库、提交历史与代码 diff
  • 支持私有仓库,作为个人代码统一托管点
  • 定时脚本自动备份并推送,降低单机丢失风险

技术栈

GiteaGitDockerDocker ComposeNginx Proxy ManagerShell

使用 / 部署教程

部署步骤

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 镜像前先做一次完整备份,遵循官方的升级路径