Nextcloud数据如何独立备份和恢复? (版本控制/快照)

Nextcloud数据如何独立备份和恢复? (版本控制/快照)

每当多个用户与 Nextcloud 安装进行交互时,就有可能出现错误。家庭成员可能会删除旧照片,或者同事可能会意外勾选任务或日历事件,从而给其他用户带来问题。

当整个 Nextcloud 目录的完整文件系统快照或备份可用时,它们可用于恢复整个服务器的旧状态。如果系统完全崩溃,这很好。

但是,如果过了一段时间才发现问题,并且用户修改了其他数据,那么问题就出现了。然后,必须在拯救旧数据和销毁所有进度或保持当前状态之间做出选择。

Nextcloud 文档仅描述恢复整个安装的方法。

有没有一种方法可以更智能地自动备份所有 Nextcloud 数据(文件、消息、日历、任务等),以便可以独立恢复? (甚至可能处于在线状态?)

答案1

恢复在线状态确实需要完整磁盘备份(当然可以增量完成)。

当然,通过用户交互实际改变的事情是

  1. 数据库(包含所有用户信息、文件元数据、权限……)
  2. 数据存储
  3. nextcloud 本身(因为它可能会更新)。

我们可以“解决”3.,只需在每次备份 nextcloud 时要求对所有三个内容进行完整备份(数据库格式可能不向后兼容)。

在典型的容器化 nextcloud 设置中,您将拥有两个或三个容器:

  1. 数据库容器“DB”,需要首先启动(通常运行 postgresql)
  2. 实际运行nextcloud“NC”的容器,它连接到DB中的数据库,并将数据目录挂载为外部卷“V”
  3. (反向代理允许轻松地将 nextcloud 隐藏在 HTTPS 后面,并将 SSL 证书处理与 nextcloud 容器分离)

现在,定期备份包括

  1. 停止 nextcloud,或者至少冻结 NC,或者完全停止 NC
  2. 制作 V 的备份(可以很好地增量备份 – 任何现代备份实用程序都可以做到这一点),
  3. 告诉数据库进行备份 ( pg_backup_start),这将以一致的状态启动备份(数据库确保新操作不会影响备份的状态)
  4. 启动第 3 步后,要恢复功能,请重新启动 nextcloud(或解冻,或重新启动 NC)
  5. 让数据库将转储写入文件 ( pg_backup_stop);确保您知道哪个数据备份属于哪个数据库备份(应该从时间和日期清楚)

一般来说,由于实际的 nextcloud 容器不会很大,无论如何,因为它既不包含数据本身也不包含数据库,因此将其与数据和数据库备份一起保存也是有意义的。

然后可以在完全不同的(虚拟)机器上完成恢复,方法是启动数据库容器的副本,恢复数据库备份,同时解压缩数据备份,然后在数据库启动后使用数据启动 nextcloud 容器安装。


事实上,由于容器运行时(podman,还有 Docker)允许您进行独立的网络,因此您可以根据需要并行运行任意数量的数据库服务器;与用于支持快照的数据卷的文件系统(ZFS、btrfs 以及 LVM 快照+XFS 精简配置、bcachefs...)一起,您可以与当前状态并行地探索旧状态,而不会受到它们的干扰。

答案2

日历、消息等
理论上数据库转储应该使用一个或多个 INSERT 查询创建日历条目等。
您只需要找到正确的 INSERT 并尝试将它们重新插入当前数据库中。 (在尝试之前我会备份当前状态)

在我看来,垃圾箱和版本为用户恢复数据提供了很好的选择。

文件和垃圾箱
默认情况下,垃圾箱处于激活状态。当用户删除文件时,该文件将被放入垃圾箱。您可以使用config/config.php以下条目指定垃圾箱中文件的保存期限:(trashbin_retention_obligation' => 'auto, 128',有关详细信息,请参阅手册)。但是,如果可用空间/用户配额低于 50%,或者 adming 正在手动运行,则可能会提前清理occ trashbin:expire;occ trashbin:cleanup。 (或由用户选择)
我不使用日历,也许删除的日历条目也会以垃圾箱结束,并且可以恢复 - 我不知道。

文件及版本
另一件事是“版本 nextcloud 应用程序”,它添加了恢复旧版本文件的选项。年龄可以用 'versions_retention_obligation' => 'auto, 128',in设置config.php。在 nextcloud 应用程序部分启用它。我没用过这个应用程序,应该就像影子副本一样。

恢复单个文件
只要您不使用加密,并且仅使用本地帐户,用户数据就会存储在该nextcloud/data/username目录中。如果您连接到活动目录/openldap,则该目录是nextcloud/data/uuid可以在数据库中解析的uuid。 ( SELECT ldap_dn FROM oc_ldap_user_mapping WHERE owncloud_name='$U_ID')
可以从备份的用户目录中手动恢复文件并将其复制到当前用户数据目录中。确保随后扫描所有文件occ files:scan

如果启用加密 - :) 祝你好运。

相关内容