让老群晖继续发挥余热:搭建一个简单、够用的 Git Server

发布时间:2026/9/4 6:12:45
让老群晖继续发挥余热:搭建一个简单、够用的 Git Server 引子平时写代码时我有一些项目会直接放到 GitHub但也有一些自己的实验代码、脚本或者尚未公开的项目并不希望上传到公网。这些代码如果只存在笔记本电脑上又不太放心毕竟硬盘故障、系统重装甚至误删除都有可能发生。正好家里有一台已经用了很多年的群晖 NASSynology DS216play。这台 NAS 性能放到今天已经比较落后ARM 处理器、1GB 内存也不属于 Synology Container Manager 官方支持的机型。拿它折腾各种 Docker 应用并不合适。但是它有几个很大的优点功耗低噪音低个头小巧不占地方7×24 小时开机本来就负责备份数据之前我在《从 Windows 11 到 Ubuntu 26.04我的软件迁移实录下——微信、邮件、NAS、开发环境与 AI 工具迁移》中提到过用 Synology Drive Client 备份数据这台就是 Synology Drive Server群晖官方仍然提供 Git Server 套件DS216play 目前也仍有对应的 Git Server 版本。于是我想到既然不适合跑复杂服务那干脆让这台老 NAS 做一件它非常擅长的事情——当 Git Server。一、为什么不用 GitLab / Gitea提到自建 Git 服务现在很容易首先想到GitLab Gitea特别是 Gitea非常轻量还有漂亮的 Web UI。但仔细想想我真正需要的功能其实只有开发电脑 │ │ git push / pull ▼ 家庭 NAS │ └── 私有 Git Repository我主要是自己使用并不需要Issue Pull Request Code Review Wiki CI/CD Runner 多人协作GitLab 首先不用考虑。截至 2026 年GitLab Self-Managed 官方给出的单节点基线仍然是8 vCPU、16GB RAM即使小规模部署可以进一步裁剪和 DS216play 这种 1GB 内存的老 NAS 显然也不是一个级别的应用。Gitea 就轻量得多。而且 Gitea 官方确实提供 ARM Linux 二进制程序所以从技术上说并非完全没有办法在一些老 ARM 设备上手工安装。但我的 DS216play 本身又没有官方 Container Manager。如果为了 Gitea 再去研究ARM 二进制 DSM 兼容性 启动脚本 服务管理 权限 升级 数据备份那就把一个原本很简单的问题复杂化了。我的需求明明只是找个地方存 Git Repository。那为什么不用 Git 本身解决所以最终还是选择最简单的群晖 Git Server SSH Bare Repository没有 Web UI没有数据库也没有 Docker。但对自己的私人代码来说已经够用了。二、整体结构其实非常简单我的环境大致是Windows / Ubuntu / macOS │ │ Git SSH ▼ ┌─────────────────────┐ │ Synology DS216play │ │ │ │ Git Server │ │ │ │ code.git │ │ project-a.git │ │ project-b.git │ └─────────────────────┘后面的原理和使用 GitHub 其实没什么区别。GitHub 上可能是git clone gitgithub.com:user/project.git自己的群晖则变成git clone ssh://gitesterLocal_IP/volume1/gitserver/code.git其中Local_IP 是群晖的局域网固定 IP 地址。以后照样git pull git push即可。下面记录一下完整配置过程。三、安装群晖 Git Server首先进入DSM → 套件中心 → Git Server直接安装。安装完成以后先不用做其他复杂配置。四、创建 Git Repository 共享文件夹进入DSM → 控制面板 → 共享文件夹建立一个新的共享文件夹比如gitserver实际路径就是/volume1/gitserver/以后所有私人代码 Repository 都可以集中放在这里。例如/volume1/gitserver/code /volume1/gitserver/linux-lab /volume1/gitserver/test五、创建专门的 Git 用户接下来建立一个专门用于 Git 的普通用户。例如我这里使用gitester然后给它gitserver共享文件夹的读写权限。创建时让它加入默认的users用户组。确认用户、用户组和共享文件夹权限无误后完成创建。这样以后 Git 操作统一使用这个账号而不是 DSM 的管理员账户。六、允许这个用户使用 Git Server打开Git Server在用户列表里找到刚刚建立的gitester勾选允许访问。七、开启 SSHGit Repository 准备通过 SSH 访问所以还需要开启群晖 SSH 服务。进入DSM → 控制面板 → 终端机和 SNMP打开启用 SSH 服务默认端口22即可。我的 NAS 主要在家庭局域网中使用。如果准备从公网直接访问 SSH就还要另外考虑防火墙、端口暴露和安全策略这里暂时不展开。八、创建第一个 Git Repository接下来从电脑 SSH 登录群晖。例如ssh admin_userLocal_IP其中admin_user 是群晖的管理员用户Local_IP 是群晖的局域网固定 IP 地址。再取得 root 权限sudo -i进入刚才建立的共享目录cd /volume1/gitserver/建立第一个 Repositorymkdir code cd code git init --bare这里最关键的是git init --bare普通git init建立的是我们平时开发使用的工作 Repository。而git init --bare建立的是没有工作目录的Bare Repository非常适合作为服务器端远程仓库。然后把 Repository 所有者调整为之前建立的 Git 用户chown -R gitester:users /volume1/gitserver/code再设置权限chmod -R urwX,grwX,o-rwx /volume1/gitserver/code这样服务器端就准备完成了。九、客户端 Clone 测试回到开发电脑。执行git clone ssh://gitesterLocal_IP/volume1/gitserver/code其中Local_IP 是群晖的局域网固定 IP 地址。第一次连接可能会询问Are you sure you want to continue connecting?确认即可。然后输入gitester用户的密码。Clone 成功后cd code检查远程 Repositorygit remote -v应该可以看到类似origin ssh://gitesterLocal_IP/volume1/gitserver/code (fetch) origin ssh://gitesterLocal_IP/volume1/gitserver/code (push)至此一个最基本的私人 Git Server 已经可以正常使用了。提交一个测试文件并 Push 后也能看到仓库已经正常接收提交。十、问题来了每次 Git Push 都要输密码现在执行git pull或者git push都会要求输入gitester的密码。一次两次当然无所谓。但如果每天写代码经常 Commit、Push很快就会觉得麻烦。所以接下来给 SSH 配置公钥认证实现git pull git push都不需要再输入密码。十一、客户端生成 SSH Key现在的 Linux、Windows Git Bash 和 macOS 都可以直接使用ssh-keygen这里我使用 Ed25519ssh-keygen -t ed25519正常情况下直接连续回车即可。生成的文件位于~/.ssh/其中有两个重要文件id_ed25519 id_ed25519.pub其中id_ed25519是私钥。不能上传也不要给别人。而id_ed25519.pub是公钥需要把它放到群晖。查看公钥内容cat ~/.ssh/id_ed25519.pub会得到类似ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI......把这一整行复制下来。十二、在群晖上配置 authorized_keys再次使用管理员账号 SSH 登录群晖。首先建立 Git 用户的 SSH 目录sudo mkdir -p /var/services/homes/gitester/.ssh建立authorized_keys文件sudo touch /var/services/homes/gitester/.ssh/authorized_keys编辑sudo vi /var/services/homes/gitester/.ssh/authorized_keys把刚才id_ed25519.pub里面的一整行公钥粘进去。然后修正目录所有者sudo chown -R gitester:users /var/services/homes/gitester/.sshSSH 对权限比较敏感所以顺便把权限设置规范sudo chmod 700 /var/services/homes/gitester/.ssh sudo chmod 600 /var/services/homes/gitester/.ssh/authorized_keys最终目录结构大概是/var/services/homes/gitester/ └── .ssh/ └── authorized_keys十三、测试 SSH 免密登录回到客户端。可以先直接测试ssh gitester192.168.31.16或者直接进入 Repositorygit pull再执行git push如果不再要求输入gitester用户密码就说明 SSH 公钥认证成功。以后日常开发就是git add . git commit -m update git push不再需要输入 NAS 密码。十四、如果还是要求密码怎么办我以前折腾这一步时在群晖上花了一些时间。如果已经正确建立authorized_keys但仍然要求输入密码可以首先检查ls -la /var/services/homes/gitester/ ls -la /var/services/homes/gitester/.ssh/重点确认.ssh gitester 所有 authorized_keys gitester 所有 .ssh 700 authorized_keys 600然后检查/etc/ssh/sshd_config中的PubkeyAuthentication yes是否启用。如果确实需要修改可以sudo vi /etc/ssh/sshd_config确认把下面这行的注释取消后保存PubkeyAuthentication yes然后重启 SSH 服务。sudo systemctl restart sshd不过这里我现在建议先测试出现问题再修改 sshd_config不必把修改系统配置作为固定步骤。因为很多 DSM 环境本身已经支持公钥认证真正容易出问题的反而是authorized_keys 路径 用户 Home 文件所有者 目录权限十五、以后增加新的 Repository 也很简单假设又写了一个新的项目stm32-lab只要 SSH 登录群晖cd /volume1/gitserver/建立mkdir stm32-lab cd stm32-lab git init --bare调整所有者和权限chown -R gitester:users /volume1/gitserver/stm32-lab chmod -R urwX,grwX,o-rwx /volume1/gitserver/stm32-lab客户端git clone ssh://gitesterLocal_IP/volume1/gitserver/stm32-lab就可以用了。其中Local_IP 是群晖的局域网固定 IP 地址。甚至已有本地 Repository 也不用重新 Clone。例如本地已经有~/Projects/stm32-lab直接添加一个远程git remote add nas \ ssh://gitesterLocal_IP/volume1/gitserver/stm32-lab其中Local_IP 是群晖的局域网固定 IP 地址。然后git push -u nas main即可把代码 Push 到自己的群晖。十六、这种简单 Git Server 到底适合谁如果你的需求是几十人的研发团队 多人 Code Review Issue 管理 Pull Request CI/CD Runner Package Registry那当然应该考虑GitLab Gitea这样的完整平台。但如果和我一样有时需要自己写代码 私人项目不想放 GitHub 家里已经有一台长期运行的 NAS 不需要 Web UI 不需要 CI/CD 只需要 Push / Pull / Clone那么最简单的Git SSH可能已经够了。而且这类服务恰恰非常适合老 NAS。Git Server 平时的 CPU 和内存压力很低并不需要多强的硬件。真正重要的是低功耗 稳定 一直在线而这些恰恰是一台老群晖仍然很擅长的事情。十七、别忘了Git Server 不完全等于备份最后再补充一个容易忽略的问题。Git 本身是分布式版本控制系统。例如一个项目可能同时存在于开发电脑 │ ├── 完整 Git Repository │ 群晖 │ └── Bare Repository如果还有其他电脑 Clone 过电脑 A 电脑 B NAS实际上已经存在多份完整 Git History。这确实比代码只存在一块硬盘里安全得多。但我仍然不建议把Git Server完全等价成备份系统。NAS 上的 Repository 最好仍然跟随其他重要数据一起进行正常备份。Git 负责版本管理 代码同步 历史记录而 Backup 负责灾难恢复两者还是有区别的。写在最后到了 2026 年DS216play 确实已经是一台不折不扣的老 NAS 了。它不能官方运行现在流行的 Container Manager1GB 内存也完全不适合拿来折腾 GitLab 这种大型开发平台。Gitea 虽然轻得多但如果自己的需求只是保存几个私人 Repository为了一个 Web UI 再去手工折腾安装、启动、升级和维护也没有太大必要。于是我最后还是选择了最简单的Synology Git Server SSH Bare Repository SSH Key它没有漂亮的 Web 页面。没有 Issue。没有 Pull Request。也没有 CI/CD。但每次写完代码git add . git commit git push代码就安安静静地回到了家里的 NAS。对我来说这就已经完成了它的任务。有时候老设备并不是一定要淘汰。给它找到一个性能要求不高、但需要长期稳定运行的岗位反而可以继续发挥很多年的价值。而 Git Server我觉得就是老群晖一个相当不错的“养老岗位”。