技术笔记

NAS 自建 Git 服务:Gitea 部署与备份

yaobingbin yaobingbin · · 约 7 分钟 · 0 条评论

为什么选 Gitea

自建 Git 服务的主要选项对比:

方案 内存占用 部署难度 特点
Gitea 150–400MB 低 Go 单二进制,轻量,功能够用
Gogs 100MB 以下 低 更轻,但功能少、更新慢
GitLab 4GB+ 高 功能最全(CI/CD、容器仓库),资源需求大
Forgejo 同 Gitea 低 Gitea 的社区分支,治理更中立

对家用 NAS,Gitea 是明显合适的选择。 GitLab 那套完整 DevOps 平台需要 4GB 以上内存和多容器协作,在 2C2G 或 4C8G 的家用机器上跑不动,也没必要。

Gitea 提供的功能对个人和小团队来说已经足够:仓库管理、分支保护、Pull Request、Issue、Wiki、Actions(兼容 GitHub Actions 语法的 CI)、包管理(npm/maven/docker)、Webhook、SSH 和 HTTP 两种协议。

部署

services:
  gitea:
    image: gitea/gitea:latest
    container_name: gitea
    restart: unless-stopped
    environment:
      - USER_UID=1000
      - USER_GID=1000
      - GITEA__server__DOMAIN=git.example.com
      - GITEA__server__ROOT_URL=https://git.example.com/
    volumes:
      - ./data:/data
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
    ports:
      - 3000:3000
      - 2222:22

SSH 端口冲突:必须处理的第一个问题

这是自建 Git 服务在 NAS 上最容易卡住的地方。

Git 支持 HTTP 和 SSH 两种协议。HTTP 走 3000 端口没冲突,但 SSH 默认用 22,而 NAS 自己的 SSH 服务已经占用了 22。

解决方式是把容器的 22 映射到宿主机的其他端口(上面示例用了 2222)。这样 clone 地址变成:

git clone ssh://git@192.168.1.10:2222/username/repo.git

注意 URL 格式变了。 默认 SSH 的 git@host:user/repo 这种简写形式默认连 22 端口,用非标准端口必须写成完整的 ssh:// 形式。

如果嫌麻烦,可以只用 HTTP(S)。 Gitea 的 HTTP 协议完全可用,配合个人访问令牌(Token)也能认证。对局域网或反代后的 HTTPS 访问,HTTP 方案更简单。

数据库选择

Gitea 支持 SQLite、MySQL/MariaDB、PostgreSQL:

数据库 适合 备注
SQLite 个人、少量仓库 零配置,够用
MySQL 小团队 需要单独容器
PostgreSQL 规模较大 官方推荐的生产选择

个人用途直接用 SQLite。 它随 Gitea 一起安装在 /data 目录里,不用额外维护数据库容器。只有当你有几十个仓库、多人频繁访问时,才需要考虑换 PostgreSQL。

首次配置

容器启动后访问 3000 端口,会进入安装向导。几个要注意的选项:

  • 站点名称和管理员账号:向导里创建的第一个账号自动成为管理员
  • 服务器域名和 Root URL:填实际访问地址。如果填错,Web 界面里的 clone 地址会是错的
  • 禁止自助注册:默认设置下任何人都能注册账号。如果是自用,务必在站点设置里关闭注册(DISABLE_REGISTRATION),或在安装后到管理后台关掉

备份:两种层次

正规备份方式 是 Gitea 自带的 dump 命令,它会生成一个包含数据库、仓库、附件、配置的完整归档:

docker exec -u git -it gitea gitea dump -c /data/gitea/conf/app.ini

生成的文件在容器内的 /data/gitea-dump-*.zip,拷出来存到别处。

简单方式 是备份整个 /data 目录。它包含:

  • gitea/repositories/ — 所有 Git 仓库(裸仓库)
  • gitea/gitea.db — SQLite 数据库(用户、Issue、PR、权限)
  • gitea/conf/app.ini — 配置文件
  • gitea/attachments/、gitea/avatars/ — 附件与头像

恢复时版本要匹配。 Gitea 跨大版本升级时数据库结构会变,用旧版本备份恢复到新版本实例上通常需要执行迁移。建议备份时记录一下 Gitea 的版本号。

备份频率:代码仓库是最高价值的数据之一,且改动频繁。建议每天一次,并保留多份历史版本(至少 7 天)。

异地备份:仓库数据体积小(除非有大量二进制或 LFS 文件),很适合用 rclone 同步到云端,成本极低。

进阶功能

Gitea Actions:兼容 GitHub Actions 语法的 CI 系统。需要额外部署 act_runner(一个独立的 runner 程序并注册到实例)。对个人项目来说,用它做自动构建、测试、部署是够用的。

镜像仓库(Package Registry):支持 npm、Maven、Docker、PyPI 等包格式。可以在家里搭一个私有 npm 源,这对前端开发很实用。

仓库镜像:可以配置 Gitea 自动从 GitHub 镜像仓库(定时拉取),相当于给重要的开源项目做一份本地快照。

LFS(大文件存储):如果仓库里有大文件,需要启用 LFS。注意 LFS 文件会显著增加存储占用和备份体积。

资源占用实测预期

规模 内存占用 CPU
空闲(几个仓库) 150–250MB 几乎为 0
20 个仓库、偶尔访问 250–400MB 低
频繁 CI + 多人 500MB–1GB 中

对 NAS 来说这点开销几乎可以忽略。 即便是 2GB 内存的入门机型,与系统和其他服务并存也没问题。

存储的 IO 特征:Git 操作产生大量小文件读写,这是机械盘最不擅长的负载类型。如果仓库多且操作频繁,把 Gitea 的 data 目录放在 SSD 上会有明显改善。

一个务实的判断

自建 Git 服务适合这些情况:

  • 有不便托管到公共平台的代码(公司内部、客户项目)
  • 想给所有仓库做本地统一备份
  • 需要私有包管理源
  • 纯粹想折腾、想把数据握在自己手里

如果只是个人开源项目,GitHub / Gitee 更省心——不用维护、不用备份、协作方便、还自带 Pages 和 CI 额度。自建服务的持续维护成本(升级、备份、故障排查)是真实存在的,只有在确实有理由时才值得承担。

微信搜一搜 纳思Note
评论经后台审核通过后显示 · 请勿发布广告、外链或无关内容

发表评论

邮箱地址不会被公开。填写昵称与邮箱后方可评论。