在群晖Synology NAS中搭建Git服务器,并使用Hyper Backup定时备份

记录在群晖 Synology NAS 上搭建 Git 服务器、配置 SSH 免密访问,并用 Hyper Backup 定时备份仓库数据的完整流程。

搭建Git服务器

在套件中心安装 Git Server

安装

创建一个用户

创建一个新用户,用来保存git repo 数据, 假设账户名为git
控制面板 -> 用户账户 -> 新增
创建用户

启用 用户家服务

进入 控制面板 -> 用户账户 -> 高级 中启用 “用户家服务”。 启用 用户家服务

启用 SSH 功能

Git Server需要通过 SSH 进行访问, 进入 控制面板 -> 终端及 SNMP 中勾选 “启用 SSH 功能”。 SSH 功能

通过 SSH 连接到 Synology NAS

使用SSH工具(Windows Terminal, Putty, Xshell等) 连接 Synology NAS
账号和密码为创建用户时输入的内容,按提示输入用户名,密码通过后即可连接成功。

通过证书设置免密登录

用户的主目录为: /var/services/homes/git/ 在主目录下 创建 .ssh目录, 在.ssh目录下创建 authorized_keys 文件, 密钥保存在这个文件中 完成后目录结构如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
root@DiskStation:/var/services/homes/git# ll
total 0
drwxr-xr-x  1 git  users 726 Dec  7 21:21 .
drwx--x--x+ 1 root root   58 Dec  7 21:17 ..
drwx------  1 git  users  30 Dec  6 12:37 .ssh

root@DiskStation:/var/services/homes/git# cd .ssh/
root@DiskStation:/var/services/homes/git/.ssh# ll
total 4
drwx------ 1 git users   30 Dec  6 12:37 .
drwxr-xr-x 1 git users  726 Dec  7 21:21 ..
-rw-r--r-- 1 git users 2408 Dec  6 11:35 authorized_keys

root@DiskStation:/var/services/homes/git/.ssh# more authorized_keys 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDLZE20i2x2ms4BzrLwOsusHa/Xe2x4bA4fhJvlcTF9yVGJZEaHKHOPOGbxAxGtP0igqjIp95yRPwBX+YYWL9oG26LSBVZ8fuDbcj/TVVIP5rsG+5W4UrZxZHrPd91LQRCfIWPr7XfjTCZr9amaan7GCw2Zf/1pSiYmhfI4yWwteB/29TOavWNf1+ArWm/dFtfA
Nea6/BTJFRjrJuhh91VR1exOxEFK7gVRmg6KsmKzGNhSPkzlhRXLyQz7ttyaCY6VIH6NyHWjMnd8Io/tfpv7mL89/XfdnKgmkhzeUWUoAgvDBGnZpaFRV9PnSZDvV5BPcBx7WG9+4yPrAqj8x knightli@ubuntu

修改文件和目录的权限信息

1
2
chmod 700 .ssh
chmod 644 .ssh/authorized_keys 

修改sshd的配置文件 /etc/ssh/sshd_config, 注意要有以下三行, 如果用#注释的,要打开注释, 没有对应的行,则需要添加。

1
2
3
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile  .ssh/authorized_keys

设置成功后,可以不需要ssh密码直接SSH登录Synology NAS, 这步是为了以后使用git命令时免于每次都输入密码。

开始使用Git Server

在服务器端创建项目仓库

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
git@DiskStation:~$ mkdir my_project
git@DiskStation:~$ cd my_project/
git@DiskStation:~/my_project$ git init --bare
hint: Using 'master' as the name for the initial branch. This default branch name
hint: is subject to change. To configure the initial branch name to use in all
hint: of your new repositories, which will suppress this warning, call:
hint: 
hint:   git config --global init.defaultBranch <name>
hint: 
hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and
hint: 'development'. The just-created branch can be renamed via this command:
hint: 
hint:   git branch -m <name>
Initialized empty Git repository in /volume1/homes/git/my_project/

client端操作

1
2
3
C:\Users\knightli>git clone [email protected]:my_project
Cloning into 'my_project'...
warning: You appear to have cloned an empty repository.

命令行中clone后的git是服务器创建的账号名称
my_project是项目的仓库名称

完成clone后,后续可以正常操作。
push 完成后数据保存在Synology NAS 的 git用户主目录下

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
git@DiskStation:~/my_project$ ll
total 12
drwxr-xr-x 1 git users  98 Dec  7 22:23 .
drwxr-xr-x 1 git users 746 Dec  7 22:23 ..
drwxr-xr-x 1 git users   0 Dec  7 22:23 branches
-rw-r--r-- 1 git users  66 Dec  7 22:23 config
-rw-r--r-- 1 git users  73 Dec  7 22:23 description
-rw-r--r-- 1 git users  23 Dec  7 22:23 HEAD
drwxr-xr-x 1 git users 506 Dec  7 22:23 hooks
drwxr-xr-x 1 git users  14 Dec  7 22:23 info
drwxr-xr-x 1 git users  16 Dec  7 22:23 objects
drwxr-xr-x 1 git users  18 Dec  7 22:23 refs

Hyper Backup定时备份

git repo数据都位于/var/services/homes/git/下,只需备份此目录就可以

安装 Hyper Backup

安装

配置 Hyper Backup

配置1

Hyper Backup 备份到 Ubuntu rsync 的完整配置

另一台设备只是 Ubuntu 服务器、已经安装了 rsync,并不等于它可以直接作为 Hyper Backup 的目标端。Hyper Backup 使用普通 rsync 协议时,需要连接到 Ubuntu 上运行的 rsync daemon;daemon 还必须定义一个可写的模块。

最容易填错的一项是“共享文件夹”:它不是 Ubuntu 的绝对路径,而是 /etc/rsyncd.conf 中方括号定义的模块名。本文以把备份写入 Ubuntu 的 /srv/hyperbackup 为例,说明从服务端配置到群晖验证的完整流程。

先明确 Hyper Backup 的目标类型

在 Hyper Backup 新建数据备份任务时,目标端不是群晖,就不要选择“Synology rsync 服务器”,应选择:

1
rsync 兼容服务器

本文采用 rsync daemon 方式,默认 TCP 端口为 873。它适合可信局域网;如果要跨公网传输,优先用 VPN、Tailscale 或 SSH 加密方案,不要把 873 直接暴露到互联网。

Ubuntu 端准备目录和运行账户

登录 Ubuntu 后安装 rsync,创建一个不允许登录、只用于写入备份目录的系统账户:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
sudo apt update
sudo apt install -y rsync

sudo useradd --system \
  --home /nonexistent \
  --shell /usr/sbin/nologin \
  rsyncbackup

sudo mkdir -p /srv/hyperbackup
sudo chown -R rsyncbackup:rsyncbackup /srv/hyperbackup
sudo chmod 750 /srv/hyperbackup

这里的 rsyncbackup 是 rsync daemon 在服务器本地写文件时使用的账户。不要给它交互式 Shell,也不要把备份目录设成所有人可写。

创建 rsync daemon 模块

编辑配置文件:

1
sudo nano /etc/rsyncd.conf

写入以下内容;网段、用户名和路径应按你的环境替换:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
uid = rsyncbackup
gid = rsyncbackup
use chroot = no
max connections = 4
timeout = 600
log file = /var/log/rsyncd.log
pid file = /run/rsyncd.pid

[hyperbackup]
    path = /srv/hyperbackup
    comment = Synology Hyper Backup
    read only = no
    list = yes
    auth users = knightli
    secrets file = /etc/rsyncd.secrets
    hosts allow = 192.168.8.0/24
    hosts deny = *

[hyperbackup] 就是一个 rsync 模块。它把客户端看到的 hyperbackup 映射到服务器实际目录 /srv/hyperbackup

配置项 作用
[hyperbackup] Hyper Backup 中要选择的“共享文件夹”名称
path Ubuntu 上实际保存备份数据的位置
read only = no 允许 Hyper Backup 写入
auth users rsync 协议认证用户名,不是 Ubuntu 登录用户
hosts allow 允许访问服务的网段;可进一步收窄为群晖单个 IP

若群晖固定为 192.168.8.100,可以把 hosts allow 改为该地址,减少局域网内其他设备探测服务的机会。

设置 rsync 协议密码

rsync daemon 的认证账户和 Linux 登录账户可以完全无关。创建密码文件:

1
sudo nano /etc/rsyncd.secrets

用户名:密码 一行一个账户写入,例如:

1
knightli:Abcd123456789

保存后限制读取权限:

1
2
sudo chmod 600 /etc/rsyncd.secrets
sudo chown root:root /etc/rsyncd.secrets

不要把这份文件提交到 Git,也不要复用 Ubuntu 的登录密码。Hyper Backup 页面中的“用户账号”和“密码”应填写这里定义的值。

启动并确认 rsync daemon

不同 Ubuntu 版本或安装方式提供的 systemd 单元可能略有差异,先尝试由软件包提供的服务启动:

1
2
3
sudo systemctl enable --now rsync
sudo systemctl restart rsync
sudo systemctl status rsync

确认端口监听:

1
sudo ss -lntp | grep ':873'

正常情况下会看到类似结果:

1
LISTEN 0 5 0.0.0.0:873

若提示 rsync.service not found,先检查系统中实际可用的 unit:

1
systemctl list-unit-files | grep -i rsync

也可以用下面的命令临时验证配置是否能启动:

1
sudo rsync --daemon --config=/etc/rsyncd.conf

临时启动在重启后不会自动恢复;确认手动方式可用后,应根据 list-unit-files 的结果补齐对应服务或 socket 的开机启动配置,而不是长期依赖手工执行。

防火墙只放行群晖

如果 Ubuntu 启用了 UFW,假设群晖 IP 是 192.168.8.100,只允许它访问 TCP 873:

1
2
sudo ufw allow from 192.168.8.100 to any port 873 proto tcp
sudo ufw status numbered

同时检查云服务器安全组、上游路由器或 VLAN ACL。ss 显示监听而群晖仍连不上时,问题通常就在这些网络策略之一。

先在命令行验证模块和写入

不要先在 Hyper Backup 里反复试错。先从另一台 Linux 电脑或群晖 SSH 终端列出模块:

1
rsync rsync://[email protected]/

输入 /etc/rsyncd.secrets 中设置的密码后,应能看到:

1
hyperbackup    Synology Hyper Backup

再试一次小文件写入:

1
2
3
4
echo test > /tmp/rsync-test.txt

rsync -av /tmp/rsync-test.txt \
  rsync://[email protected]/hyperbackup/

在 Ubuntu 上确认:

1
ls -l /srv/hyperbackup/

能看到 rsync-test.txt,说明账号、密码、模块、目录权限和网络路径都已打通。测试完成后可删除该文件。

Hyper Backup 页面如何填写

回到群晖 Hyper Backup 的 rsync 目标页,按下面填写。

页面字段 示例值 说明
服务器类型 rsync 兼容服务器 目标是普通 Ubuntu,不是另一台群晖
服务器 IP 192.168.8.205 Ubuntu 的局域网地址
传输加密 局域网内可先关闭 关闭后走普通 rsync/TCP 873;跨公网不要这样用
端口 873 rsync daemon 默认端口
用户账号 knightli 对应 auth users
密码 rsync 密码文件中的密码 不是 Ubuntu 登录密码
共享文件夹 hyperbackup 对应 [hyperbackup],不是绝对路径
目录 synology-nas 模块目录下新建的子目录

若目录填写 synology-nas,最终数据会写入:

1
/srv/hyperbackup/synology-nas/

不要把“共享文件夹”填写为 /srv/hyperbackup。客户端通过 rsync 协议只能看到模块名,实际路径由服务器端配置决定。

常见问题排查

Hyper Backup 看不到共享文件夹

先运行模块列举命令。若没有 hyperbackup

  1. 检查 /etc/rsyncd.conf 是否真的有 [hyperbackup]
  2. 检查服务是否已重启;
  3. 检查 list = yeshosts allow 是否把群晖挡住;
  4. 查看 /var/log/rsyncd.log 获取认证或路径错误。

能连上但提示认证失败

确认 auth users/etc/rsyncd.secrets 左侧用户名完全一致;密码文件应为 用户名:密码,且权限为 600。特别注意 Hyper Backup 要填的是 rsync 密码,不是 SSH 或 Ubuntu 登录密码。

认证成功但无法写入

检查模块中的 read only = no,再检查本地目录权限:

1
2
sudo namei -l /srv/hyperbackup
sudo ls -ld /srv/hyperbackup

rsyncbackup 必须对该路径拥有穿越和写入权限。若日志显示磁盘满、只读挂载或文件系统错误,应先处理存储问题,避免备份任务反复失败。

是否应该打开传输加密

普通 rsync daemon 的认证并不等同于完整的传输加密。可信局域网可以按风险评估暂时关闭;经过互联网、公共 Wi-Fi 或不可信网段时,使用 VPN、Tailscale,或改用 Hyper Backup 支持的 SSH 加密传输。无论采用哪种传输方式,备份任务本身仍应启用版本保留和定期恢复演练。