SSD Nodes Learn Hosting plans →
指南 Matt Connor作者: Matt Connor

存储 VPS 还是托管存储盒?如何选择

托管存储盒按 TB 收费但没有 shell,存储 VPS 提供 root 权限。本文说明备份、运行代码和协议能力的边界,并计算 19% 增值税对价格的影响。

存储 VPS 还是托管存储盒:简要结论

存储 VPS 是一台配备大容量磁盘、提供 root 访问权限并拥有专属网络地址的虚拟机。托管存储盒是按 TB 销售的存储配额,可通过 SMB、WebDAV、SFTP 和基于 SSH 的 rsync 访问,但远端不提供 shell。如果唯一用途是接收离开本机前已经加密的备份,托管存储盒通常更合适,因为您支付的是存储容量和他人提供的冗余能力。但只要您希望对数据运行代码,存储盒就无法满足需求,因为其中没有可运行代码的环境。

这就是两者的边界。下面的内容将说明这一边界在实际使用中的影响。大容量磁盘方案与普通计算方案的区别,参见存储 VPS 与普通 VPS 的区别;因此,本指南只比较 VPS 与托管存储产品。

托管存储盒实际是什么

提供商负责运行文件系统、磁盘和后台服务。您会获得一个登录账号、存储配额和一组固定协议。此类产品大多还提供只读快照、带有独立目录的子账号,以及可通过 davfs2 挂载的 WebDAV 端点。不要认为子账号会拥有独立配额。在 Hetzner's Storage Box 这一典型产品中,每个子账号都使用主存储盒的存储空间。文档提供的唯一控制方式,是将子账号的目录设为只读,使其无法上传或删除文件。不同提供商支持的功能列表可能不同,因此请查看您在另一个浏览器标签页中打开的提供商功能页面。

有一项功能需要单独说明,因为人们经常误解它。“支持 BorgBackup”表示提供商在其一侧运行 borg serve。Borg 是客户端/服务器程序:客户端负责去重、压缩和加密,服务器负责仓库的底层操作。如果远程主机上没有运行 Borg 进程,Borg 就会通过网络执行普通文件系统调用。因此,每次操作都需要一次往返,Borg FAQ 也建议避免这种方式。没有 shell 的存储盒无法安装 borg serve,因此这项功能完全取决于提供商是否提供。

存储 VPS 能为您提供哪些能力

root。这个词涵盖了大部分内容,但用户容易忽略的具体能力仍值得单独列出。

  • 任意运行所需的 daemon。 可以运行 restic REST 服务器、S3 兼容对象存储、同步客户端或数据库。部署属于您自己的 MinIO S3 API后,同一组磁盘就能提供应用代码可直接访问的服务。
  • 由您强制实施仅追加写入。 对备份而言,这是最重要的能力差异,下面有专门的章节介绍。
  • 让计算资源靠近数据。 restic check --read-data 和 borg check --verify-data 会读取存储库中的每个字节。在 VPS 上,您可以通过 SSH 针对本地路径运行它们,不会有数据经过互联网。对于托管存储主机,同一条命令会将整个存储库下载到您的网络线路。
  • 自行配置 SSH。 可以为每个密钥设置强制命令,使用 restrict 选项、非默认端口,以及为备份用户设置 Match 块。在托管主机上,您只能使用服务商选择支持的密钥选项,底层 sshd 也由服务商控制。
  • Docker 以及其上的所有服务。 带 TLS 和独立备份的 Nextcloud 实例在存储 VPS 上只是一个 compose 文件,而在托管主机上无法运行。
  • 从本地开始恢复。 直接在存储服务器上挂载 Borg 存档,然后复制出所需的一个目录,而不必先将完整快照下载到本地。

有一项看似属于上述列表,但实际并不属于:由您控制的服务器静态数据加密。您可以在 VPS 的数据卷上使用 LUKS,但该卷必须在启动时解锁。因此,您要么每次重启后都在控制台中输入密码短语,要么将密钥文件放在同一台机器上。虚拟机监控程序运营方也可以读取运行中虚拟机的内存。在这两种产品上,真正保护数据的措施都是客户端加密:由 Borg 或 restic 在数据离开源机器之前完成加密。区别在于,在 VPS 上,您还可以控制接收这些数据的进程。

为什么追加模式备份需要 VPS

备份客户端持有备份仓库的凭据。这是不可避免的,因为客户端必须写入仓库。因此,任何接管源机器的人也能访问并删除仓库。追加模式可以解决这个问题:仓库主机接受新数据,但拒绝删除操作,因此仅凭窃取的凭据无法销毁备份历史。

对于 Borg,追加模式是在仓库主机的 authorized_keys 中设置的强制命令。

command="borg serve --append-only --restrict-to-path /srv/borg/web01",restrict ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA... web01-backup

该行位于持有仓库的机器上的 /home/borg/.ssh/authorized_keys 中,写入该文件需要在这台机器上拥有 shell。在托管服务器上,哪些强制命令会被执行由服务提供商决定,因此只有当服务提供商将追加模式作为产品功能提供时,您才能使用该模式。Hetzner 的 Storage Box 支持该功能:截至 October 2026,其 Borg 文档说明可以使用追加模式,并支持强制命令和客户端限制。请查阅您所使用服务提供商的文档,不要自行假设。

对于 restic,限制更大。SFTP 后端使用文件系统协议,因此能够写入的客户端也能够删除,而且没有服务器端开关可以阻止删除。restic 的追加模式仅存在于 REST 后端中,该后端由名为 rest-server 的守护进程提供,并通过 --append-only 启动。运行守护进程需要一台允许您运行守护进程的机器。

清理追加模式仓库

追加模式表示服务器拒绝删除段文件,因此 borg prune 本身不会释放空间。可行的方式是使用两个密钥和两个 authorized_keys 条目:备份密钥启用追加模式,另一个不包含 --append-only 的密钥从不同于被备份机器的另一台机器上运行 borg prune 和 borg compact。Borg FAQ 建议使用不同的密钥,而不是反复切换该模式,因为这样更不容易出错。

指定每个仓库

对于托管服务器,SSH 端口通常不是 22。请使用服务商文档中指定的端口。

ssh-keygen -t ed25519 -f /root/.ssh/id_backup -C "borg web01"
# paste /root/.ssh/id_backup.pub into the provider's panel
export BORG_RSH='ssh -i /root/.ssh/id_backup'
borg init --encryption=repokey-blake2 \
  ssh://u123456@u123456.storagebox.example:23/./backups/web01

端口后的 /./ 表示该路径相对于账户的主目录。单个斜杠会使路径变为绝对路径,托管账户通常会拒绝这种路径并返回权限错误。repokey-blake2 会将加密密钥存储在仓库中,并使用您的密码短语保护。因此,请将该密码短语保存到待备份机器以外的位置。

export BORG_PASSPHRASE='...'   # or BORG_PASSCOMMAND reading from a secret store
borg create --stats --compression zstd,3 \
  ssh://u123456@u123456.storagebox.example:23/./backups/web01::web01-{now:%Y-%m-%dT%H:%M} \
  /etc /srv /home

运行成功后,末尾会显示统计信息块,其中列出文件数量和去重后的大小。随后,对同一个仓库 URL 运行 borg list,应按名称输出归档。如果没有任何输出,说明归档尚未提交。

在您自己的存储 VPS 上,仓库就是您拥有的一个目录。

sudo apt update && sudo apt install -y borgbackup
sudo adduser --disabled-password --gecos "" borg
sudo install -d -m 700 -o borg -g borg /home/borg/.ssh
sudo install -d -m 700 -o borg -g borg /srv/borg/web01

将上一节中的强制命令行添加到 /home/borg/.ssh/authorized_keys,然后从客户端使用绝对路径进行初始化。

borg init --encryption=repokey-blake2 ssh://borg@storage.example.com/srv/borg/web01

在两端运行 borg --version。较新主版本的客户端无法与较旧版本的服务器通信。支持 Borg 的托管服务器通常会安装多个服务器版本,并允许您通过 --remote-path 为每条命令选择版本。截至 2026 年 10 月,Hetzner 例如列出 borg-1.1、borg-1.2(默认版本)和 borg-1.4,并建议始终传递该标志。因此,使用 Borg 1.4 的客户端应为每条命令添加 --remote-path=borg-1.4。限制在于可选版本仅限于该列表:您只能从服务商安装的版本中选择;如果客户端版本超过列表中的最新版本,就只能等待服务商更新。在您自己的 VPS 上,两端的版本都由您决定,因此可以同时升级。

restic:通过 SFTP 访问主机,在 VPS 上运行 rest-server

restic 通过 SFTP 访问托管主机。将非标准端口写入 ~/.ssh/config,不要写入仓库字符串,因为包含端口的 URL 格式需要使用不便的双斜杠。

Host storagebox
  HostName u123456.storagebox.example
  User u123456
  Port 23
  IdentityFile /root/.ssh/id_backup
restic -r sftp:storagebox:/backups/web01 init
restic -r sftp:storagebox:/backups/web01 backup /etc /srv

删除开头的斜杠即可得到相对于账户主目录的路径,这正是大多数托管账户所需的格式:sftp:storagebox:backups/web01。

在存储 VPS 上,则运行 REST 服务器,并由此获得追加写入模式。rest-server 是项目发布页面提供的单个 Go 二进制文件,也可以使用 docker pull restic/rest-server:latest 拉取官方容器镜像。

sudo apt install -y apache2-utils
sudo install -d -m 700 /srv/restic
sudo htpasswd -B -c /srv/restic/.htpasswd web01
rest-server --path /srv/restic --listen 127.0.0.1:8000 --append-only --private-repos

将其绑定到回环地址,并在前面放置 TLS 反向代理;也可以通过 VPN 访问。这样,客户端即可通过 HTTPS 与其通信。

restic -r rest:https://web01:PASSWORD@storage.example.com/web01/ init

--private-repos 表示用户 web01 只能访问 /web01/,无法访问其他内容,因此即使一台主机遭到入侵,也无法读取另一台主机的快照。如果你刚开始使用 restic,VPS 上的完整 restic 配置介绍了调度和保留策略,restic 与 BorgBackup 的比较则说明哪种工具更适合你的数据。无论选择哪种工具,将每个备份写入两个仓库才是把单个存储目标转变为备份策略的关键。

德国价格标签的真实含义

面向企业的德国托管服务通常以未含税价格发布,并在价格旁标注“zzgl. MwSt.”。截至 2026 年 10 月,增值税税率为 19%。下面的数字只是计算结果,不是价目表。购买当天请查看服务商自己的页面。

图表Monthly net price and gross price at 19 percent VAT
此图表背后的数据
[
  {
    "label": "5 EUR net",
    "net_eur": "5.00",
    "gross_eur": "5.95"
  },
  {
    "label": "10 EUR net",
    "net_eur": "10.00",
    "gross_eur": "11.90"
  },
  {
    "label": "20 EUR net",
    "net_eur": "20.00",
    "gross_eur": "23.80"
  },
  {
    "label": "40 EUR net",
    "net_eur": "40.00",
    "gross_eur": "47.60"
  }
]

标价为 10.00 EUR 的未含税价格,德国私人客户收到的发票金额为 11.90 EUR;40.00 EUR 的未含税价格则变为 47.60 EUR。可以抵扣进项税(Vorsteuerabzug)的企业可以申请退回这部分增值税,因此对企业而言,未含税金额才是真实成本。欧盟其他地区持有有效 VAT 识别号的企业,通常按照反向征税规则以 0% 税率开票,并在本国申报和缴纳相应税款。请在订单表单中确认这一点,因为它取决于您在那里填写的号码。

如果一个浏览器标签页显示未含税价格,另一个显示含税价格,比较结果就会失真。德国面向消费者的页面必须显示含税价格,而面向企业的页面通常显示未含税价格。因此,同一产品看起来会无缘无故便宜约 16%,因为未含税价格等于含税价格除以 1.19。在比较每 TB 的价格之前,请先将两项报价换算到同一计价基础。

每月账单之外还有两项成本。第一项是流量:托管服务器通常包含流量额度,而 VPS 方案通常提供每月额度;恢复数 TB 数据可能超出该额度并产生超额费用。第二项是您的时间,因为 VPS 是一台需要您打补丁、监控并负责维护的机器。如果成本是决定因素,请先进行针对消费者云方案的实际成本计算,再比较块存储和对象存储中廉价 TB 容量的价格。这两项计算都应从实际所需容量的估算值开始,而该容量通常小于您凭记忆选定的数字。

DSGVO:磁盘存储在哪里,以及您需要签署的文件

这两款产品通常托管在德国或其他 EU 设施中。当它们代表您存储个人数据时,两家提供商都属于 DSGVO 第 28 条所称的 Auftragsverarbeiter(处理者)。这意味着您需要签署 Auftragsverarbeitungsvertrag(AVV,即数据处理协议)。德国提供商通常会在控制面板中发布协议,供您接受。数据中心位于德国并不能免除这一要求。它只能排除第三国传输问题,而这是另一个问题。

加密会改变风险,但不会改变文书要求。Borg 和 restic 在源计算机上加密数据,因此提供商存储的是自身没有密钥的二进制数据块。这是 DSGVO 第 32 条所称的有力技术措施。您仍然需要签署 AVV。请确认存储设施所在的城市,以及提供商是否会将数据复制到其他地点,因为“EU”和“德国”并不是同一个答案。EU 数据驻留及其对账单的影响对此有详细说明。

每种方案会在哪里出问题

以下是您实际会遇到的托管主机故障。

  • 配额已满。 写入会中途失败,存储库会保持锁定状态。下次运行前,使用 borg break-lock 或 restic unlock 清除锁,然后提高配额或清理旧数据。
  • 连接中断后残留的锁。 同样使用这两个命令。与 SFTP 或 borg serve 相比,通过挂载共享访问时更容易发生。
  • 存储库位于 davfs2 或 cifs 挂载点上。 这些挂载点的锁定和重命名行为与本地文件系统不一致,因此放在其中的存储库容易产生损坏的锁。请使用 SFTP 或 Borg 传输,而不要挂载远端主机并将其当作磁盘使用。
  • 验证会读取全部数据。 restic check --read-data 会读取整个存储库。如果远端没有 shell,这些网络流量会经过您的线路。请为此预留数小时,并选择您确实能够长期执行的计划。
  • 软件版本由对方按其时间表提供。 您可以使用 --remote-path 在服务提供商已安装的 Borg 版本中进行选择,但不能自行添加版本。如果客户端升级到列表中最新版本之后的版本,就必须等待服务提供商发布该版本。

以下是您需要自行负责的存储 VPS 故障。

  • 磁盘已满。 备份过程中 No space left on device 会失败,随后需要清除锁。在磁盘使用率达到 100 percent 之前,就应针对可用空间设置告警,因为存储库一旦填满,之后每晚都会备份失败。
  • 打补丁。 sshd、内核、容器运行时,以及您暴露到网络上的任何 daemon,都需要您负责更新。没有其他人会替您处理。
  • 只有一台机器。 主机侧 RAID 可以在磁盘损坏时继续工作,但无法应对您自己的 rm -rf、账单欠费或数据中心事故。单独使用存储 VPS 只是一个副本,不是完整的备份策略。
  • 滥用和责任。 IP 地址归您所有。开放的对象存储控制台或配置错误的 Samba 共享,都会产生需要您处理的滥用投诉。
  • 可用性由您负责维护。 凌晨 03:00 没有人会值守您的 systemd 单元。

决策规则

如果唯一任务是在异地存储数据,且数据在离开源服务器前已经加密,请购买托管存储盒。您支付的是存储容量和他人提供的冗余能力,同时无需自行打补丁、承担滥用责任,也无需维护可用性。这是最常见的情况,因为作为 Borg 或 restic 仓库的异地目标无需具备计算能力。

只要您希望对数据执行任何操作,就应购买存储 VPS。“任何操作”包括:无需通过互联网传输每个字节即可验证仓库、自行强制实施 append-only、通过 S3 API 提供文件、运行同步客户端、在本地提取某个目录,或根据合规请求扫描数据。对于整个接口只有文件协议的产品,这些操作都无法实现。

还有一种方案往往非常值得:两者都买。托管存储盒是位于某个服务商的低成本远端副本,存储 VPS 是您可以操作的工作副本,二者位于不同的故障域。在购买任一产品前,需要先向服务商确认的事项清单可以避免您之后迁移。

FAQ

我可以在托管存储盒上使用 BorgBackup 吗?

只有在提供商明确将 BorgBackup 列为支持的功能时才可以,因为 Borg 需要远程主机上运行 borg serve 进程。客户端负责去重和加密,服务器负责仓库操作。如果存储盒不提供 shell,您就无法自行安装该进程。支持此功能的提供商会说明 SSH 端口(通常不是 22)以及仓库路径格式。该路径通常相对于您的主目录,并在端口后写作 /./backups/name。

存储 VPS 的每 TB 成本比托管存储盒低吗?

通常不会。托管存储盒主要按容量销售,背后的计算资源很少,因此每 TB 的欧元成本通常更低。比较前,请先将两种方案统一到相同的税费基础上,因为德国企业页面显示未含税价格,消费者页面显示含税价格;19 percent 足以改变接近方案之间的比较结果。然后再加上 VPS 的流量额度,以及您用于打补丁的时间成本。

我是否需要为任一方案签署 Auftragsverarbeitungsvertrag?

需要。只要存储的数据包含其他人的个人数据,两种方案都需要。两类提供商都属于 DSGVO 第 28 条规定的数据处理者,客户端加密也不会取消合同要求。但这会显著降低存储层的敏感性,因为提供商持有的是没有解密密钥的 blob。大多数德国提供商会发布 AVV,您可以在控制面板中接受。

我可以在托管存储盒上使用仅追加备份吗?

只有在提供商将其作为功能提供时才可以。Borg 的仅追加模式需要在仓库主机的 authorized_keys 中设置强制命令,而您无法在那里使用 shell 来写入该命令。restic 完全不支持通过 SFTP 使用仅追加模式,因为该协议允许任何写入者执行删除操作。如果仅追加对您很重要(对于抵御勒索软件攻击而言确实应该如此),请在您控制的机器上运行带有 --append-only 的 rest-server。

存储 VPS 本身就是备份吗?

不是。它是一台位于一个数据中心、使用一个文件系统的机器。主机端 RAID 只能在磁盘损坏时继续工作,无法应对其他故障。备份意味着在第二个故障域中保存第二份副本。因此,托管存储盒和存储 VPS 作为一对使用时,比互相替代更合适。