> For the complete documentation index, see [llms.txt](https://ayakaleaf-pro.ayaka.space/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://ayakaleaf-pro.ayaka.space/on-premises/zh-cn/wei-hu/data-and-backups.md).

# 数据和备份

有时，随着我们对 Overleaf 的演进，我们需要更改数据库中数据的模式；迁移脚本用于自动化这一过程。它们将已经在 [overleaf.com](https://docs.overleaf.com/on-premises/configuration/overleaf-toolkit) 首先，这是世界上最大的 Overleaf 实例，因此大多数情况很可能已经遇到过了；不过，我们对您的数据不作任何保证。请务必创建一个 **一致的** 您的数据备份 **之前** 升级您的实例。

{% hint style="info" %}
当升级到新的 Docker 镜像时，任何已经 **不要** 还未运行的迁移都会自动执行，这可能需要一些时间，具体取决于您的数据集大小；查看日志可以了解进度。更多信息请参见我们的 [日志记录](https://docs.overleaf.com/on-premises/configuration/overleaf-toolkit/logging) 文档。
{% endhint %}

### 数据存储

Overleaf 社区版和 Server Pro 将数据存储在三个不同的位置：

* **MongoDB 数据库：** 用户和项目数据存放在这里。
* **Redis：** 作为在处理中的数据的高性能缓存，主要存储与项目编辑和协作相关的信息。
* **Overleaf 文件系统：** 存储不可编辑的项目文件（包括图片），并在项目编译期间充当临时磁盘缓存。

{% hint style="info" %}
这可能是 `~/sharelatex_data` 或 `~/overleaf_data`，这取决于您的实例是在何时设置的。
{% endhint %}

{% hint style="success" %}
对于项目文件和完整项目历史数据，我们还支持兼容 S3 的存储后端。
{% endhint %}

有关磁盘上文件夹布局的更多信息，请参阅“文件夹详解”。

### 执行一致性备份

在进行一致性备份时，需要包含三个存储：

* MongoDB
* Redis
* Overleaf 文件系统数据

为了生成一致性备份，必须 **必须** 在备份过程中阻止用户生成新数据。因此，我们建议安排一个维护窗口，在此期间用户不应能够访问该实例或编辑其项目。

在开始备份过程之前，您需要让实例离线。从 Server Pro 开始 `3.5.0` 关机过程会自动关闭站点并断开用户连接。

要关闭实例，您需要运行 `bin/docker-compose stop sharelatex` 如果您运行的是 Toolkit 部署，或者 `docker compose stop sharelatex` 如果您运行的是 Docker Compose。

一旦 `sharelatex` 容器已停止，您就可以开始备份过程。

一旦备份过程完成 **成功地** 您需要启动 `sharelatex` 容器。为此请运行 `bin/docker-compose start sharelatex` 如果您运行的是 Toolkit 部署，或者 `docker compose start sharelatex` 如果您运行的是 Docker Compose。

{% hint style="danger" %}

* 备份应存储在与 Overleaf 实例运行所在服务器不同的另一台服务器上，理想情况下应完全位于不同地点。
* 将数据库复制到多个 MongoDB 实例上可能提供一定的冗余，但不能防止数据损坏。
* 测试备份是确保其完整且可用的最佳方式。
  {% endhint %}

### MongoDB

MongoDB 自带一个命令行工具 [mongodump](https://docs.mongodb.com/manual/reference/program/mongodump/) 可用于创建数据库中存储的用户和项目数据的备份。

### Overleaf 文件系统数据

对于 Toolkit 部署，不可编辑文件的存储路径在 `config/overleaf.rc` 使用上面的 `文件中，或者在` 环境变量中指定，但根据您的实例创建时间，这可能是 `data/sharelatex`.

使用如下工具，例如 **rsync** 递归复制此目录，才能确保创建完整备份。

### Redis

Redis 会在将用户会话和待处理文档更新写入 MongoDB 之前对其进行存储。

追加文件（AOF）持久化是 Redis 持久化的推荐配置。

Toolkit 用户默认已为 **新** 安装启用了 AOF；现有用户可找到有关启用 AOF 的更多信息 [这里](/on-premises/zh-cn/pei-zhi/overleaf-toolkit/redis.md#enabling-append-only-file-persistence).

如果您决定继续将 RDB 快照与 AOF 持久化一起使用，您可以将 RDB 文件复制到安全位置作为备份。

### 在服务器之间迁移数据

至多，您的新实例中目前还没有任何有价值的数据。我们没有用于合并实例数据的流程。

假设新实例尚无数据，以下是您可以遵循的一些步骤。从整体上看，我们会生成一个……的 tar 包 `mongo`, `redis` 和 `overleaf` 卷，将其复制到新服务器上，然后在那里重新解包。

#### Toolkit

```bash
# 优雅地关闭旧实例
old-server$ bin/stop

# 创建 tar 包
old-server$ tar --create --file backup-old-server.tar config/ data/

# 将 backup-old-server.tar 文件从 old-server 复制到
# new-server，可使用任何适合的方法

# 优雅地关闭新实例（如果尚未启动）
new-server$ bin/stop

# 移动新数据，您也可以删除它
new-server$ mkdir backup-new-server
new-server$ mv config/ data/ backup-new-server/

# 重新填充 config/data 目录
new-server$ tar --extract --file backup-old-server.tar

# 启动容器
new-server$ bin/up
```

#### Docker Compose

```bash
# 优雅地关闭旧实例
old-server$ docker stop sharelatex
old-server$ docker stop mongo redis

# 创建 tar 包
old-server$ tar --create --file backup-old-server.tar ~/OVERLEAF_data ~/mongo_data ~/redis_data

# 将 backup-old-server.tar 文件从 old-server 复制到
# new-server，可使用任何适合的方法

# 优雅地关闭新实例（如果尚未启动）
new-server$ docker stop sharelatex
new-server$ docker stop mongo redis

# 移动新数据，您也可以删除它
new-server$ mkdir backup-new-server
new-server$ mv ~/OVERLEAF_data ~/mongo_data ~/redis_data backup-new-server/

# 重新填充数据目录
new-server$ tar --extract --file backup-old-server.tar

# 启动容器
new-server$ docker start mongo redis
new-server$ docker start sharelatex
```

根据您的 **docker-compose.yml** 文件，您可能需要调整……的路径 `mongo`, `redis`, `overleaf` 卷。

{% hint style="info" %}
以 root 用户运行（或使用 sudo）时，tar 会保留文件所有者/组和权限，这在恢复备份时至关重要。
{% endhint %}

### 文件夹详解

{% hint style="info" %}
以下文件夹有额外说明：

* (b) 应包含在备份中，最好在实例停止时执行，以确保一致性
* (d) 可删除
* (e) 临时文件，在实例停止时可删除
  {% endhint %}

1. `~/mongo_data` (b)
   * mongodb 数据目录
2. `~/redis_data` (b)
   * redis 数据库数据目录
3. `~/overleaf_data`
   1. bin
      1. synctex (d)
         * 在最新版本中未使用；以前使用的是自定义 synctex 二进制文件（synctex 用于在 .tex 文件和 PDF 之间进行源映射）
   2. data
      1. 缓存 (e)
         * 用于编译的二进制文件缓存
      2. 编译 (e)
         * LaTeX 编译在此处进行
      3. db.sqlite (d)
         * 在最新版本中未使用；以前存储 clsi 缓存详情（要么已移至简单的内存映射，要么我们会扫描磁盘）
      4. db.sqlite-wal (d)
         * 在最新版本中未使用，见 db.sqlite
      5. 输出 (e)
         * 用于向客户端提供的 LaTeX 编译输出存储
      6. 模板文件 (b)
         * 模板系统的图片预览（仅 Server Pro）
      7. 用户文件 (b)
         * 项目的二进制文件
      8. 历史记录 (b)
         * 完整项目历史文件
   3. tmp
      1. dumpFolder (e)
         * 处理 zip 文件时的临时文件
      2. 上传 (e)
         * 文件上传缓冲（二进制文件/从 zip 创建新项目上传）
      3. projectHistories (e)
         * 用于完整项目历史迁移的临时文件


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://ayakaleaf-pro.ayaka.space/on-premises/zh-cn/wei-hu/data-and-backups.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
