公司代码不想放公网托管,群晖 Git Server 自建私有仓库:从开 SSH 到克隆

研发团队代码、ansible 配置库、网络设备的配置备份,很多企业不愿意放到公网代码托管平台:不是信不过平台,而是行业客户合同里写着数据不出内网。买一台代码托管一体机成本不低,其实公司机房里已经在跑的群晖 NAS 就能干这件事——套件中心的 Git Server 套件装上,配好 SSH 和共享文件夹,几分钟就能有一个完全在内网的 Git 服务。贵州诚鑫致达科技在给客户搭内网开发环境时,这是最常用的一步。

先说清楚这个方案的定位:Git Server 套件提供的是标准的 Git 仓库能力(通过 SSH 协议访问),适合中小团队的代码版本管理与内部协作;它不内置网页界面、工单、代码评审这些托管平台功能,需要网页化界面的团队可以另行评估容器类方案,官方帮助中也明确提到:出于安全考虑,Git Server 不再支持 git-shell 命令,若要允许用户通过 git-shell 访问存储库,建议改用其他基于容器的 Git 服务。以下步骤以 DSM 7 的官方帮助为依据。

操作步骤

第 1 步:安装 Git Server 套件。 打开套件中心,搜索 Git Server 安装。为什么单独装套件而不是直接 SSH 进去 apt 装Git:套件中心的版本由群晖打包维护,随 DSM 版本适配,卸载升级都有入口,后续换机迁移也容易盘点。

第 2 步:启用 SSH 服务。 进入控制面板 > 终端机和 SNMP > 终端机,勾选启用 SSH 服务。Git Server 的仓库访问走 SSH 协议,这一步不开,后面克隆会直接连不上。企业环境建议同时记下 SSH 端口号:如果保持默认 22,注意防火墙上只对内网网段放行。

第 3 步:为仓库建一个专用共享文件夹。 进入控制面板 > 共享文件夹,新建一个例如名为 gitrepo 的文件夹。为什么不把仓库散放在现有业务文件夹里:共享文件夹是 DSM 权限、快照、备份的原子单位,仓库独立成文件夹后,可以单独给开发组授权、单独做快照排期,不会和业务数据互相牵连。

第 4 步:给使用者的账号授权。 在共享文件夹的权限设置里,给需要访问仓库的用户或群组读/写权限。注意两点:一是用普通用户账号操作仓库,官方明确提示不要用 root 权限执行建库命令;二是建议按群组授权而不是逐个勾人,人员变动时改群组就行。

第 5 步:SSH 登录 NAS 创建裸仓库。 在开发机上执行:

ssh [NAS管理员用户名]@[NAS的IP或主机名] -p [SSH端口号]
cd /[存储空间名称]/[共享文件夹名称]/
mkdir [仓库名]
cd [仓库名]
git init --bare

例如 ssh myadminuser@192.168.1.2 -p 22 登录后,cd /volume1/gitrepo/,mkdir proj-config,进入后执行 git init --bare。用 --bare 建的是裸仓库:它不存工作副本、只存版本历史,正是服务端仓库该有的形态,避免推送时在服务器上产生工作区冲突。

第 6 步:在开发机上克隆验证。 在装好 Git 的电脑上执行:

git clone ssh://[用户名]@[NAS的IP或主机名]/volume1/gitrepo/[仓库名]

例如 git clone ssh://mygituser@192.168.1.2:/volume1/gitrepo/proj-config。克隆能成功,说明 SSH、权限、路径三者都通了;克隆下来的空仓库里 git add 提交一次再 git push,全链路就验证完了。克隆失败的排查顺序:先看 SSH 服务是否启用,再确认该账号对仓库所在共享文件夹有读/写权限,最后核对路径拼写。

运维注意事项

  • 备份纳入快照与备份任务:仓库文件夹本质是共享文件夹,快照和 Hyper Backup 都能覆盖,建议纳入既有备份排期;裸仓库用文件级备份是可靠的,因为 Git 对象本身不可变。
  • SSH 端口收口:仓库只在内网用的话,DSM 防火墙规则里把 SSH 端口限制到内网网段,避免暴露在公网。
  • 用户账号走常规流程:离职停用账号即失去仓库访问,不需要额外在 Git 侧再做一遍权限回收。
  • 容量小不是问题:配置库、脚本库这类场景通常几个 GB 以内,对在售的各盘位机型都不构成压力,按团队规模选型即可。

一套走下来,公司内网就多了一个不依赖外部服务的版本管理据点,代码和配置的每次变更都有据可查。