From 0b7800b49f4407c527c2bfed2a91e0542c8d1906 Mon Sep 17 00:00:00 2001 From: Fallen_Breath Date: Sat, 9 Dec 2023 20:05:16 +0800 Subject: [PATCH] docs: add quick start and config --- docs/cli.md | 3 + docs/command.md | 3 + docs/config.md | 547 ++++++++++++++++++++++++++++++++++++++++ docs/config.zh.md | 547 ++++++++++++++++++++++++++++++++++++++++ docs/example.md | 1 - docs/example.zh.md | 1 - docs/img/welcome.png | Bin 0 -> 51938 bytes docs/img/welcome.zh.png | Bin 0 -> 45801 bytes docs/index.md | 20 +- docs/index.zh.md | 7 + docs/quick_start.md | 117 +++++++++ docs/quick_start.zh.md | 117 +++++++++ docs/reference/index.md | 5 + mkdocs.yml | 33 ++- 14 files changed, 1383 insertions(+), 18 deletions(-) create mode 100644 docs/cli.md create mode 100644 docs/command.md create mode 100644 docs/config.md create mode 100644 docs/config.zh.md delete mode 100644 docs/example.md delete mode 100644 docs/example.zh.md create mode 100644 docs/img/welcome.png create mode 100644 docs/img/welcome.zh.png create mode 100644 docs/index.zh.md create mode 100644 docs/quick_start.md create mode 100644 docs/quick_start.zh.md create mode 100644 docs/reference/index.md diff --git a/docs/cli.md b/docs/cli.md new file mode 100644 index 0000000..ef6aec4 --- /dev/null +++ b/docs/cli.md @@ -0,0 +1,3 @@ +--- +title: 'CLI Tool' +--- diff --git a/docs/command.md b/docs/command.md new file mode 100644 index 0000000..e400262 --- /dev/null +++ b/docs/command.md @@ -0,0 +1,3 @@ +--- +title: 'Commands' +--- diff --git a/docs/config.md b/docs/config.md new file mode 100644 index 0000000..d84c7d6 --- /dev/null +++ b/docs/config.md @@ -0,0 +1,547 @@ +--- +title: 'Configuration' +--- + +## Configuration Explanation + +Here's a full explanation on the config file, if you want to have a deep dive on it + +### Root config + +This is the root json object in the config files + +```json +{ + "enabled": true, + "debug": false, + "storage_root": "./pb_files", + + // Subconfigs. See the following sections + "command": {/* Command config */}, + "server": {/* Server config */}, + "backup": {/* Backup config */}, + "scheduled_backup": {/* Scheduled backup config */}, + "prune": {/* Prune config */}, + "database": {/* Database config */} +} +``` + +#### enabled + +The switch of the plugin. Set to false to disable the plugin + +- Type: `bool` +- Default: `false` + +#### debug + +The debug switch. Set to true to enable debug logging + +- Type: `bool` +- Default: `false` + +#### storage_root + +The root directory for Prime Backup to store all data files + +The path is related to the work directory of MCDR. By default, the root directory will be `/path/to/mcdr_root/pb_files` + +- Type: `str` +- Default: `"./pb_files"` + +--- + +### Command config + +```json +{ + "prefix": "!!pb", + "permission": { + "abort": 1, + "back": 2, + "confirm": 1, + "database": 4, + "delete": 2, + "delete_range": 3, + "export": 4, + "list": 1, + "make": 1, + "prune": 3, + "rename": 2, + "show": 1, + "tag": 3 + }, + "confirm_time_wait": "1m", + "backup_on_restore": true, + "restore_countdown_sec": 10 +} +``` + +#### prefix + +The prefix of all Prime Backup commands in MCDR. Normally you don't need to change it + +- Type: `str` +- Default: `"!!pb"` + +#### permission + +Minimum required [MCDR permission level](https://mcdreforged.readthedocs.io/en/latest/permission.html) for all subcommands + +It's a mapping that maps from string to integer, storing permission level requirements for all subcommands. +If a subcommand is not in the mapping, it will use level 1 as the default permission requirement + +For example, in the default config, `"back"` is mapped to `2`, +which means that the `!!pb back` command requires permission level >= 2 to execute + +- Type: `Dict[str, int]` + +#### confirm_time_wait + +Some of the MCDR commands requires user to enter `!!pb confirm` to continue. +This config defines the maximum time wait for those commands + +When time exceeds, the command will be cancelled + +- Type: [`Duration`](#duration) +- Default: `"1m"` + +#### backup_on_restore + +If an automatically backup should be made before restoring the world to a given backup. These automatic backups are the "pre-restore backups" + +This is a safeguard prepared for those idiot users + +- Type: `bool` +- Default: `true` + +#### restore_countdown_sec + +The duration in seconds of the countdown during backup restoring, before closing the Minecraft server + +- Type: `int` +- Default: `10` + +--- + +### Server config + +Options on how to interact with the Minecraft server + +```json +{ + "turn_off_auto_save": true, + "commands": { + "save_all_worlds": "save-all flush", + "auto_save_off": "save-off", + "auto_save_on": "save-on" + }, + "saved_world_regex": [ + "^Saved the game$", + "^Saved the world$" + ], + "save_world_max_wait": "10m" +} +``` + +#### turn_off_auto_save + +If the autosave should be turned off before making a backup + +Since turning off autosave provide a consistent view to the Minecraft world files, it's suggested to set this option to `true` + +- Type: `bool` +- Default: `true` + +#### commands + +A set of Minecraft commands to be used by Prime Backup. Current they're only used during a backup creation + +Timing of what Prime Backup will do during a backup creation + +1. Turn off autosave with command stored in subconfig `auto_save_off`, if config [`turn_off_auto_save`](#turn_off_auto_save) is true +2. Save all worlds with command stored in subconfig `save_all_worlds` +3. Wait until all words are saved, i.e. the server outputs matches one of the regex in config [`saved_world_regex`](#saved_world_regex) +4. Create the backup +5. Turn on autosave with command stored in subconfig `auto_save_on`, if config [`turn_off_auto_save`](#turn_off_auto_save) is true + +#### saved_world_regex + +A list of regular expressions for identifying whether the server has already saved the world + +- Type: `List[re.Pattern]` + +#### save_world_max_wait + +The maximum waiting time to before world saving is complete during backup creation + +- Type: [`Duration`](#duration) +- Default: `"10m"` + +--- + +### Backup config + +Configs on how the backup is made + +```json +{ + "source_root": "./server", + "targets": [ + "world" + ], + "ignored_files": [ + "session.lock" + ], + "hash_method": "xxh128", + "compress_method": "zstd", + "compress_threshold": 64 +} +``` + +#### source_root + +The root directory where the backup / restore operations happen + +Usually this should be the [working_directory](https://mcdreforged.readthedocs.io/en/latest/configuration.html#working-directory) of MCDR, +i.e. the `server` directory by default + +- Type: `str` +- Default: `"./server"` + +#### targets + +The target files / directories to make backups + +Usually you need to add the name(s) of your world folder(s) here + +For example, for bukkit-like servers that split the world dimensions, you might want to use: + +```json +"targets": [ + "world", + "world_nether", + "world_the_end" +] +``` + +- Type: `List[str]` + +#### ignored_files + +A list of file names to be ignored during backup. It contains `session.lock` by default +to solve the backup failure problem caused by `session.lock` being occupied by the server in Windows + +If the name string starts with `*`, then it will ignore files with name ending with specific string, +e.g. `*.test` makes all files ends with `.test` be ignored, like `a.test` + +If the name string ends with `*`, then it will ignore files with name starting with specific string, +e.g. `temp*` makes all files starts with `temp` be ignored, like `tempfile` + +- Type: `List[str]` + +#### hash_method + +The algorithm to hash the files. Available options: "xxh128", "sha256" + +- [`"xxh128"`](https://github.com/Cyan4973/xxHash): A extremely fast, high-quality 128bit non-cryptographic hash algorithm. + Recommend to use, unless you want theoretic extreme safety on hackers +- [`"sha256"`](https://en.wikipedia.org/wiki/SHA-2): A cryptographically secure and widely used 256bit hash algorithm. + It's slower than xxh128, but the speed is acceptable enough with modern hardware + + +!!! danger + + You **CANNOT** change the `hash_method` after the plugin is enabled. Make your choice wisely + + If you do want to change the `hash_method`, you need to delete the `prime_backup.db` file and the `blobs` folder in the [storage root](#storage_root), + which will delete all existing backups + +- Type: `str` +- Default: `"xxh128"` + +#### compress_method + +The method to compress files stored in a backup + +| Compress Method | Description | Speed | Compress rate | +|-----------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------|-------|---------------| +| `plain` | No compression, copy the file directly | ★★★★★ | ☆ | +| `gzip` | The [gzip](https://docs.python.org/3/library/gzip.html) library based on [zlib](https://www.zlib.net/). The format same as a `.gz` file | ★★ | ★★★★ | +| `lzma` | The [LZMA](https://docs.python.org/3/library/lzma.html) algorithm. The same format as a `.xz` file. Provides the best compression, but the speed is very slow | ☆ | ★★★★★ | +| `zstd` | The [Zstandard](https://github.com/facebook/zstd) algorithm. A good balance between speed and compression rate. Recommend to use | ★★★☆ | ★★★★ | +| `lz4` | The [LZ4](https://github.com/lz4/lz4) algorithm. Faster than Zstandard, and even much faster in decompression, but with a lower compression rate | ★★★★ | ★★☆ | + +!!! warning + + Changing `compress_method` will only affect new files in new backups (i.e., new blobs) + +!!! note + + If you want to use `lz4` as the compress method, you need to install the lz4 python library manually + + ```bash + pip3 install lz4 + ``` + +- Type: `str` +- Default: `"zstd"` + +#### compress_threshold + +For files with a size less than the `compress_threshold`, no compression will be applied. They will be stored in the `plain` format. + +!!! warning + + Changing `compress_threshold` will only affect new files in new backups (i.e., new blobs) + +- Type: int +- Default: `64` + +--- + +### Scheduled backup config + +Configuration of the scheduled backup feature from Prime Backup + +It's for creating a backup periodically and automatically for your server + +```json +{ + "enabled": false, + "interval": "12h", + "crontab": null, + "jitter": "10s", + "reset_timer_on_backup": true +} +``` + +#### enabled, interval, crontab, jitter + +See the [crontab job setting](#crontab-job-setting) section + +#### reset_timer_on_backup + +If the schedule timer should be reset on each manual backup + +- Type: `bool` +- Default: `true` + +--- + +### Prune config + +The backup prune feature from Prime Backup enables automatically backup cleanup for the backup storage + +```json +{ + "enabled": true, + "interval": "3h", + "crontab": null, + "jitter": "20s", + "timezone_override": null, + "regular_backup": { + "enabled": false, + "max_amount": 0, + "max_lifetime": "0s", + "last": -1, + "hour": 0, + "day": 0, + "week": 0, + "month": 0, + "year": 0 + }, + "pre_restore_backup": { + "enabled": true, + "max_amount": 10, + "max_lifetime": "30d", + "last": -1, + "hour": 0, + "day": 0, + "week": 0, + "month": 0, + "year": 0 + } +} +``` + +It contains 2 prune settings for 2 kinds of backups: + +- `regular_backup`: For regular backups, i.e. not pre-restore backups +- `pre_restore_backup`: For pre-restore backups + +Each prune settings describes the retain policy in detailed + +Prime Backup use the following steps to decide what to delete and what to retain: + +1. Use [`last`, `hour`, `day`, `week`, `month`, `year`](#last-hour-day-week-month-year) to filter out backups to be deleted / retained +2. Use `max_amount` and `max_lifetime` to filter out those old and expired backups from the to-be-retained backups from step 1 +3. Collected those to-be-deleted backups from the 2 steps above, delete them one by one + +#### max_amount + +Defines the maximum number of backups to keep, e.g. `10` means to keep a maximum of 10 of the latest backups + +Set it to `0` for unlimited + +- Type: `int` + +#### max_lifetime + +Defines the maximum retention duration for all backups. Backups exceeding this duration will be pruned and deleted. + +Set it to `0s` for no time limit + +- Type: [`Duration`](#duration) + +#### last, hour, day, week, month, year + +A set of [PBS](https://pbs.proxmox.com/)-style prune options, to describe how backups are deleted/retained + +See the [prune simulator](https://pbs.proxmox.com/docs/prune-simulator/) for more explanations on these options + +The [prune simulator](https://pbs.proxmox.com/docs/prune-simulator/) can also be used to simulate the retain policy + +Notes: Value `0` means no retention on this period; Value `-1` means unlimited backups can be retained on this period, equivalent to setting to a very large value + +- Type: `int` + +--- + +#### enabled, interval, crontab, jitter + +See the [crontab job setting](#crontab-job-setting) section + +#### timezone_override + +An optional timezone override during the prune calculation. By default (`null` value), Prime Backup will use the local timezone + +Example values: `null`, `"Asia/Shanghai"`, `"US/Eastern"`, `"Europe/Amsterdam"` + +- Type: `Optional[str]` +- Default: `null` + +--- + +### Database config + +Configurations for the SQLite database, used by Prime Backup + +```json +{ + "compact": { + "enabled": true, + "interval": "1d", + "crontab": null, + "jitter": "5m" + }, + "backup": { + "enabled": true, + "interval": "7d", + "crontab": null, + "jitter": "10m" + } +} +``` + +Subconfig `compact` and `backup` describe the crontab jobs on the database + +#### compact + +The database compact job + +It performs the [VACUUM](https://www.sqlite.org/lang_vacuum.html) command on the database, to compact the database file and free up unused space + +#### backup + +The database backup job + +By default, Prime Backup creates backups for the database in the `db_backup` directory +within the [storage root](#storage_root) periodically, just in case something wrong happens + +Database backups are stored with the `.tar.xz` format, and won't take up much space + +#### enabled, interval, crontab, jitter + +See the [crontab job setting](#crontab-job-setting) section + +--- + +## Subconfig types + +### crontab job setting + +Setting of a crontab job to describe when the job executes. There are 2 valid mode + +- interval mode: Execute the job at given time interval. The first execution also has to wait for the given interval +- crontab mode: Execute the job at specific time, described by a crontab string + +If the job is enabled, you must choose one of the above modes and set the related config values correctly + +```json +// Example +{ + "enabled": true, + "interval": "1h", + "crontab": null, + "jitter": "10s" +} +``` + +#### enabled + +The switch for the job. Set to `true` to enable the crontab job; Set to `false` to disable the crontab job + +- Type: `bool` + +#### interval + +Used in interval mode. The time interval between 2 jobs + +It should be `null` if the job is not in interval mode + +- Type: `Optional[str]` + +#### crontab + +Used in crontab mode. The crontab string + +You can use [https://crontab.guru/](https://crontab.guru/) to create a crontab string + +It should be `null` if the job is not in crontab mode + +- Type: `Optional[str]` + +#### jitter + +The jitter between 2 scheduled backup jobs + +The actual execution time for the next job will be shifted randomly with `[-jitter, +jitter]` + +Set it to `"0s"` for no jitter + +- Type: `str` + +--- + +## Special value types + +### Duration + +Describes a time duration length with a string, e.g. `"3s"`, `"15m"` + +A Duration consists of two parts: the number, and the time unit. + +For the number part, it can be an integer, or a float + +For the unit part, see the following table: + +| Unit | Description | Equals to | Value in seconds | +|----------------|-------------|--------------|------------------| +| `ms` | millisecond | 0.001 second | 0.001 | +| `s`, `sec` | second | 1 second | 1 | +| `m`, `min` | minute | 60 seconds | 60 | +| `h`, `hour` | hour | 60 minutes | 3600 | +| `d`, `day` | day | 24 hours | 86400 | +| `mon`, `month` | month | 30 days | 2592000 | +| `y`, `year` | year | 365 days | 31536000 | diff --git a/docs/config.zh.md b/docs/config.zh.md new file mode 100644 index 0000000..46f4676 --- /dev/null +++ b/docs/config.zh.md @@ -0,0 +1,547 @@ +--- +title: '配置文件' +--- + +## 配置文件详解 + +这是对配置文件的完整解释。如果你想深入了解它,那就接着往下看吧 + +### 根配置 + +这是配置文件中的根 json 对象 + +```json +{ + "enabled": true, + "debug": false, + "storage_root": "./pb_files", + + // 子配置。详见以下各节 + "command": {/* 命令配置 */}, + "server": {/* 服务器配置 */}, + "backup": {/* 备份配置 */}, + "scheduled_backup": {/* 定时备份配置 */}, + "prune": {/* 修剪配置 */}, + "database": {/* 数据库配置 */} +} +``` + +#### enabled + +插件的开关。设置为 `false` 以禁用插件 + +- 类型:`bool` +- 默认值:`false` + +#### debug + +调试开关。设置为 `true` 以启用调试日志 + +- 类型:`bool` +- 默认值:`false` + +#### storage_root + +Prime Backup 储存各种数据文件所用的根目录 + +这是一个相对于 MCDR 工作目录的相对路径。默认情况下,根目录将是 `/path/to/mcdr_root/pb_files` + +- 类型:`str` +- 默认值:`"./pb_files"` + +--- + +### 命令配置 + +```json +{ + "prefix": "!!pb", + "permission": { + "abort": 1, + "back": 2, + "confirm": 1, + "database": 4, + "delete": 2, + "delete_range": 3, + "export": 4, + "list": 1, + "make": 1, + "prune": 3, + "rename": 2, + "show": 1, + "tag": 3 + }, + "confirm_time_wait": "1m", + "backup_on_restore": true, + "restore_countdown_sec": 10 +} +``` + +#### prefix + +MCDR 中,Prime Backup 所有命令的前缀。通常你不需要更改它 + +- 类型:`str` +- 默认值:`"!!pb"` + +#### permission + +所有子命令所需的 [MCDR 权限等级](https://mcdreforged.readthedocs.io/en/latest/permission.html) 的最低要求 + +它是一个从字符串映射到整数的映射表,存储所有子命令的权限级别要求。 +如果子命令不在映射表中,将使用 `1` 作为默认的权限等级要求 + +例如,在默认配置中,`"back"` 被映射到 `2`, +这意味着 `!!pb back` 命令需要权限级别 >=2 才能执行。 + +- 类型:`Dict[str, int]` + +#### confirm_time_wait + +有一些命令需要用户输入 `!!pb confirm` 才可继续执行。 +这里定义了这些命令的最长等待时间 + +若等待超时,则命令将被取消执行 + +- 类型:[`Duration`](#duration) +- 默认值:`"1m"` + +#### backup_on_restore + +在回档至指定备份前,是否要自动创建一个备份。这一类备份被称为“回档前备份” + +这是一道为那些傻瓜用户准备的安全保障 + +- 类型:`bool` +- 默认值:`true` + +#### restore_countdown_sec + +在回档时,关闭 Minecraft 服务器前,执行倒计时的持续秒数 + +- 类型:`int` +- 默认值:`10` + +--- + +### 服务器配置 + +与 Minecraft 服务器交互相关的选项 + +```json +{ + "turn_off_auto_save": true, + "commands": { + "save_all_worlds": "save-all flush", + "auto_save_off": "save-off", + "auto_save_on": "save-on" + }, + "saved_world_regex": [ + "^Saved the game$", + "^Saved the world$" + ], + "save_world_max_wait": "10m" +} +``` + +#### turn_off_auto_save + +是否应在进行备份之前关闭自动保存 + +由于关闭自动保存可以确保在备份期间,Minecraft 存档文件不会发生变化,因此建议将此选项设置为 `true` + +- 类型:`bool` +- 默认值:`true` + +#### commands + +Prime Backup 使用的 Minecraft 指令的集合。目前它们仅在创建备份期间使用 + +Prime Backup 在创建备份时的操作时序如下: + +1. 如果配置 [`turn_off_auto_save`](#turn_off_auto_save) 为 `true`,则使用子配置 `auto_save_off` 存储的命令关闭自动保存 +2. 使用子配置 `save_all_worlds` 存储的命令,触发服务器保存 +3. 等待直到世界保存完毕,即服务器输出与 [`saved_world_regex`](#saved_world_regex) 的某一个正则表达式成功匹配 +4. 创建备份 +5. 如果配置 [`turn_off_auto_save`](#turn_off_auto_save) 为 `true`,则使用子配置 `auto_save_on` 存储的命令打开自动保存 + +#### saved_world_regex + +一个正则表达式列表,用于识别服务器是否已保存完成 + +- 类型:`List[re.Pattern]` + +#### save_world_max_wait + +在创建备份期间,等待世界保存完成的最长等待时间 + +- 类型:[`Duration`](#duration) +- 默认值:`"10m"` + +--- + +### 备份配置 + +与创建配置具体细节相关的配置 + +```json +{ + "source_root": "./server", + "targets": [ + "world" + ], + "ignored_files": [ + "session.lock" + ], + "hash_method": "xxh128", + "compress_method": "zstd", + "compress_threshold": 64 +} +``` + +#### source_root + +进行备份/还原操作的根目录 + +通常应该是 MCDR 的 [工作目录](https://mcdreforged.readthedocs.io/zh-cn/latest/configuration.html#working-directory), +即默认情况下的 `server` 目录 + +- 类型:`str` +- 默认值:`"./server"` + +#### targets + +要备份的目标文件/目录 + +通常来讲,你需要在整理添加你的存档文件夹的名字 + +例如,对于像 bukkit 那样把每个维度存在独立的文件夹里的服务器,你需要这么配置: + +```json +"targets": [ + "world", + "world_nether", + "world_the_end" +] +``` + +- 类型:`List[str]` + +#### ignored_files + +在备份时忽略的文件名列表,默认仅包含 `session.lock` +以解决 Windows 下 `session.lock` 被服务端占用导致备份失败的问题 + +若文件名字符串以 `*` 开头,则将忽略以指定字符串结尾的文件, +如 `*.test` 表示忽略所有以 `.test` 结尾的文件,如 `a.test` + +若文件名字符串以 `*` 结尾,则将忽略以指定字符串开头的文件, +如 `temp*` 表示忽略所有以 `temp` 开头的文件,如 `tempfile` + +- 类型:`List[str]` + +#### hash_method + +对文件进行哈希时所使用的算法。可用选项:`"xxh128"`、`"sha256"` + +- [`"xxh128"`](https://github.com/Cyan4973/xxHash): A extremely fast, high-quality 128bit non-cryptographic hash algorithm. + Recommend to use, unless you want theoretic extreme safety on hackers +- [`"sha256"`](https://en.wikipedia.org/wiki/SHA-2): A cryptographically secure and widely used 256bit hash algorithm. + It's slower than xxh128, but the speed is acceptable enough with modern hardware + + +!!! danger + + 你 **不能** 在启用插件后修改 `hash_method`。请明智地做出选择 + + 如果你确实需要修改 `hash_method`,你需要删除 [数据根目录](#storage_root) 路径下的 `prime_backup.db` 文件和 `blobs` 文件夹。 + 这将删除所有的备份 + +- 类型:`str` +- 默认值:`"xxh128"` + +#### compress_method + +在储存备份中的文件时,所使用的压缩方法 + +| 压缩方法 | 描述 | 速度 | 压缩率 | +|---------|-------------------------------------------------------------------------------------------------------|-------|-------| +| `plain` | 无压缩,直接复制 | ★★★★★ | ☆ | +| `gzip` | 基于 [zlib](https://www.zlib.net/) 的 [gzip](https://docs.python.org/3/library/gzip.html) 库。`.gz` 文件同款格式 | ★★ | ★★★★ | +| `lzma` | [LZMA](https://docs.python.org/3/library/lzma.html) 算法。`.xz` 文件同款格式。提供最佳的压缩率,但是速度非常慢 | ☆ | ★★★★★ | +| `zstd` | [Zstandard](https://github.com/facebook/zstd) 算法。一个优秀的压缩算法,在速度和压缩率间取得了较好的平衡。推荐使用 | ★★★☆ | ★★★★ | +| `lz4` | [LZ4](https://github.com/lz4/lz4) 算法。比 Zstandard 快,解压速度非常快,但是压缩率相对较低 | ★★★★ | ★★☆ | + +!!! warning + + 更改 `compress_method` 只会影响新备份中的新文件(即新的数据对象) + +!!! note + + 如果你想使用 `lz4` 作为压缩方法,你需要手动安装 `lz4` python 库 + + ```bash + pip3 install lz4 + ``` + +- 类型:`str` +- 默认值:`"zstd"` + +#### compress_threshold + +对于大小小于 `compress_threshold` 的文件,不弃用压缩。它们将以 `plain` 格式存储 + +!!! warning + + 更改 `compress_threshold` 只会影响新备份中的新文件(即新的数据对象) + +- 类型:int +- 默认值:`64` + +--- + +### 定时备份配置 + +定时备份功能的配置 + +该功能会定期为服务器自动创建备份 + +```json +{ + "enabled": false, + "interval": "12h", + "crontab": null, + "jitter": "10s", + "reset_timer_on_backup": true +} +``` + +#### enabled, interval, crontab, jitter + +见 [定时作业配置](#定时作业配置) 小节 + +#### reset_timer_on_backup + +是否在每次手动备份时重置计划定时器 + +- 类型:`bool` +- 默认值:`true` + +--- + +### 剪裁配置 + +Prime Backup 的备份剪裁功能可用于自动清理过时备份 + +```json +{ + "enabled": true, + "interval": "3h", + "crontab": null, + "jitter": "20s", + "timezone_override": null, + "regular_backup": { + "enabled": false, + "max_amount": 0, + "max_lifetime": "0s", + "last": -1, + "hour": 0, + "day": 0, + "week": 0, + "month": 0, + "year": 0 + }, + "pre_restore_backup": { + "enabled": true, + "max_amount": 10, + "max_lifetime": "30d", + "last": -1, + "hour": 0, + "day": 0, + "week": 0, + "month": 0, + "year": 0 + } +} +``` + +它包含两种剪裁设置,分别针对于如下两种类型的备份: + +- `regular_backup`: 针对常规备份,即非回档前备份 +- `pre_restore_backup`: 针对回档前备份 + +每种剪裁设置都详细描述了存档的保留策略 + +Prime Backup 会执行以下步骤来决定删除/保留哪些备份 + +1. 使用 [`last`, `hour`, `day`, `week`, `month`, `year`](#last-hour-day-week-month-year) 筛选出要删除/保留的备份 +2. 使用 `max_amount`、`max_lifetime`,在第 1 步保留的那些备份中,筛选出那些旧的和过期的备份 +3. 收集上面 2 步中筛出来的那些需要删除的备份,逐个进行删除 + +#### max_amount + +定义要保留的最大备份数量,例如 `10` 表示最多保留最新的 10 个备份 + +设置为 `0` 表示无限制 + +- 类型:`int` + +#### max_lifetime + +定义所有备份的最大保存时长。超出给定时长的备份将被裁剪删除 + +设置为 `0s` 表示无时长限制 + +- 类型:[`Duration`](#duration) + +#### last, hour, day, week, month, year + +一组 [PBS](https://pbs.proxmox.com/) 风格的剪裁选项,用于描述备份的删除/保留方式 + +查看 [剪裁模拟器](https://pbs.proxmox.com/docs/prune-simulator/) 了解这些选项的更多解释 + +[剪裁模拟器](https://pbs.proxmox.com/docs/prune-simulator/) 也可用于模拟备份的保留策略 + +注意:值 `0` 表示不为该区间保留任何备份;值 `-1` 表示该区间可以保留无限多的备份,与设为极大值等价 + +- 类型:`int` + +--- + +#### enabled, interval, crontab, jitter + +见 [定时作业配置](#定时作业配置) 小节 + +#### timezone_override + +在裁剪期间,所使用的时区。默认情况下(使用 `null` 值),Prime Backup 将使用本地时区 + +例子:`null`, `"Asia/Shanghai"`, `"US/Eastern"`, `"Europe/Amsterdam"` + +- 类型:`Optional[str]` +- 默认值:`null` + +--- + +### 数据库配置 + +Prime Backup 所使用的 SQLite 数据库的相关配置 + +```json +{ + "compact": { + "enabled": true, + "interval": "1d", + "crontab": null, + "jitter": "5m" + }, + "backup": { + "enabled": true, + "interval": "7d", + "crontab": null, + "jitter": "10m" + } +} +``` + +子配置 `compact` 和 `backup` 描述了与数据库相关的定时作业 + +#### compact + +数据库精简作业 + +它对数据库使用了 [VACUUM](https://www.sqlite.org/lang_vacuum.html)指令, 以精简数据库文件,并释放未使用的空间 + +#### backup + +数据库备份作业 + +默认情况下,Prime Backup 会定期在 [数据根目录](#storage_root) 内的 +`db_backup` 目录中创建数据库备份,以防数据库文件损坏而导致无法访问备份 + +数据库备份将以 `.tar.xz` 格式存储,不会占用太多空间 + +#### enabled, interval, crontab, jitter + +见 [定时作业配置](#定时作业配置) 小节 + +--- + +## 子配置项说明 + +### 定时作业配置 + +一个定时作业相关的配置,用于描述该作业会在什么时候执行。有两种模式: + +- 间隔模式:按给定的时间间隔执行作业。第一次执行也要等待给定的间隔 +- 定时模式: 在特定时间执行作业,由 crontab 字符串描述 + +若作业被启用,你必须选择上述模式之一,并正确设置相关配置值 + +```json +// 例子 +{ + "enabled": true, + "interval": "1h", + "crontab": null, + "jitter": "10s" +} +``` + +#### enabled + +作业的开关。设为 `true` 以启用该作业,设为 `false` 以禁用该定时作业 + +- 类型:`bool` + +#### interval + +在间隔模式中使用。两次任务之间的时间间隔 + +若作业未使用间隔模式,其值应为 `null` + +- 类型:`Optional[str]` + +#### crontab + +在定时模式中使用。描述定时计划的一个 crontab 字符串 + +你可以使用 [https://crontab.guru/](https://crontab.guru/) 来创建一个 crontab 字符串 + +若作业未使用定时模式,其值应为 `null` + +- 类型:`Optional[str]` + +#### jitter + +两次作业之间,执行之间的抖动 + +下一个任务的实际执行时间,将在范围 `[-jitter, +jitter]` 内进行随机偏移 + +设置为 `"0s"` 表示无抖动 + +- 类型:`str` + +--- + +## 特殊的值类型 + +### Duration + +使用字符串描述的时间持续长度,如:`"3s"`、`"15m"` + +Duration 由两部分组成:数字和时间单位。 + +对于数字部分,它可以是整数或浮点数 + +对于单位部分,参见下表: + +| 单位 | 描述 | 等价于 | 秒数 | +|----------------|----|---------|----------| +| `ms` | 毫秒 | 0.001 秒 | 0.001 | +| `s`, `sec` | 秒 | 1 秒 | 1 | +| `m`, `min` | 分钟 | 60 秒 | 60 | +| `h`, `hour` | 小时 | 60 分钟 | 3600 | +| `d`, `day` | 天 | 24 小时 | 86400 | +| `mon`, `month` | 月 | 30 天 | 2592000 | +| `y`, `year` | 年 | 365 天 | 31536000 | diff --git a/docs/example.md b/docs/example.md deleted file mode 100644 index 9b4b764..0000000 --- a/docs/example.md +++ /dev/null @@ -1 +0,0 @@ -default english example diff --git a/docs/example.zh.md b/docs/example.zh.md deleted file mode 100644 index 8fe5a19..0000000 --- a/docs/example.zh.md +++ /dev/null @@ -1 +0,0 @@ -中文example \ No newline at end of file diff --git a/docs/img/welcome.png b/docs/img/welcome.png new file mode 100644 index 0000000000000000000000000000000000000000..825c1cbacb3bec7bcc9fab3af4a445c2ee0f0b25 GIT binary patch literal 51938 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

R3cjU$0S0%nz<2_4i9R?V924{c=Y0*;r7Upnm?> z!1c&<1|0DzPq50>#-bTSBvpP; zPoA}O)dG}tvn~bOx3dL&c7=$hDgO8fUQlXQ*|hXPttA%kp0eh!QBI@dCO<;6 zq(^`+u!wk2$LUSIf4|{MYDe6x*XkIgj>^q&+3}K#!kE#!IW!w61&a_yj2v#MzlIWA zyST|RWyR!(R3KLW66G^z@U)QnQLRhLVBexmsQr6ffc`bLlPmyLpI&GE-AsWDFn_2K zn7jrgAVj3wjWS#?VM%va5ts-!?&A2ri8~2wUu19!;Az(A)K5srcNtHoo@sG<4myiQ zzzubB`G|e@M6y9Y$;WKi8Eh+&6cxzQCD6)c(U%4*6Hrk_rWTWaPH;v@hYvxHVzb__ z6nF4Gj04x{L>1IZl#0f z9H;lg-X+Mrw5z>Fq9bo91K1s8&dX?J!ab$)VBOCM=G zowwQ!5jWn-rdU+<@mJq#!Pw{vb?PKTqI6hEerB(#G4QBow~biJ@! z=qgL=BhSLZNlO20EVZs{Cal|IXBQ#VlJU?|#w#+IgNRJ4PlQ*LhuXNHf04~`TNl5g ziN(+@rK8&9YL(-g6|mRTX&n;9p4h#27HVXPuwbuSmmhUW8%Xk>Y8_*KYjA`#jG~@q zeKd7?5^VkNiL$05kLF9Qf_KWpnU_He3;$m3>&1(EEALCi2qtE|)4$w9vy!C|!0DEk zHmllp*-aqn4O>pgE9^EyT~Bi^T#d3kaA9#}h5e&hPdj zKW_yz4v+K?7pey4XbmtNf?PmtZP7`UnW!5Ppj_u754Od5j}7~cPHp6B1w6UJpi2if zmW=vQbHgwQ6S8C|M?S{qk_@gfV^d5*3$1@&36&FBH$AY0xfktxYWdc)%1tF3-)C6c zYk0P*6JzTI(gp^!Un(5?u8y90J2-k#v0tfrvla0hgHm`Zp=N+c#(?7yAjOh@5G4Nf z7I`XQ*r_@Fdq@*3?TX7aK|8-}U4YT`SqKAZzPSf64gwk#P=!zF8QJ{ypvOSnD7)Z_ z^|u38d)Pj(gaA3BkjS*fxBP2+5uYm@o5T2wo<4DVed}-R4*wDw%o~FoeTvQVRKppn zUmVI4uRQ!xAsxhEbiLqu0Ozp7Bvs~@Pj;VV*glH6$48Gj)2@33c`?dNjT(AU-cVNH zVYOY)KvX2Haa7)uYg*(c>^G!sE3Kum;MahKOl6_c)O^{y0UTOci= zTbq(X6Bu7rl>!c~@_(T0LFWy(#dg!})Kg0MHQJcR$$d2e2Bf z^`~QH&l%yTF)9P^p6%e%aZ2=O%UQPX>br0?f_BHqeV&gwXI)Nv-V2aV5v%Z5bzDGz z8%$qkoeQSAWzU$&%Lsv3?INig9`zt{VXjmIjSj{N#Azh=uxCjqYj8B z&V7jf4V;d%w@pt~UU;VV1SxqT@a!|`T{c_<)Vh<`2|O6lBMqro_??9`8X-|=iZ-*qppS)znl`!wv2 zKY2a-nHMq0-yI9f$-G)rQC?n2Amu>VTHn*NOR4NQ*Pi!~YU*C*3NM!BULnf3t+$O- zkn#~O#R^^y8(uB-2lT+lKi=$q?-e05p2qVO|K#l=UD8weGfni@^8nYyyXY#1aH5C9F^axI zf%FfB_HwhM0b=jfu0_zAjyfO}=bXHX8`CqjZg2>u-FM0a@qV2efVj()qV7Fp3>9n|1wQVLLEjWabwo-~PWDi)?V)hou3jO2vuL&O=92^}21=M)zc#Te; zDsmm?;Q>9}bV~gZQn*$*%ypfow-VHK(?=@#3X6FHa8Gb+ukz-~0Hh_hK95s}68E@g z!`aX34%X;FqcdFe>G&^TPJIUo<2amxc>=pO-8QpUUI9`b0b}5w*cNAgG`o##td${h zk3SDYVAnq!H-*3hkodoEJl=V7XAe?AfOIgd^VX83Vj`DMza=jn^{NW<(xOqxH=vH2 zb^EDgdaeF_&S1J+A%U=EC3QAr zTYNR{H`sD?{Nc3`991Y_#EtlMt3Tq36z`mLMHwnP8S6cZGp8m%acihWQcEC6eDvg_ zcxcn)kL7+1<-Ru~dkOFOdfhTRURY**JbU;}(sA{^<8J|w0Qc(?iF^xApgJ)C7978D z6R5`#FoD;76lzinlgO!i47UDlBJi7EMD4Apg|89Ln8ygQZ*r_2A9+v&mX1gAt^5~; z0Zt(a$Fq}+8~?Ejm_~9N*_Yw^p5rYS9w2`O!8Y5EppOLNXb;c4BklJBR53(dKNL9w z1mgZ*QPz8GI8ndQz=sFQYLQiiC~FSg)NQ8GHrXhQm$lHez>DEePI^i~;ZHt~XAJ`e zqZlo=Hiro4C=TBSf!2+Q4#7b3g>c? z0ga32d=I+Mhm#-~KbuK_;J(AP`vE%LH&$2@4ZqoP2DeT)`l>$_+VQdm@!+-@pat;W zCIXeLbn0|0XirnHv(d+9h1^5Ss;1IKQOhnYd{aXxJDO{|hzq!dS`5S+?PhY{ac{f$-Gz_XI=T z?YhD5WM`CIBM%(#`^Q-0&4DA z%SUW_A`T#Di?`Bnl3-8UogSTaq$g&PEz!g%uzCQN9rx|sjhujn*zc<{DO~YUhh^iC z)%%@*A)mOW>W_1aBm&YaaTAd%xn$N>$o}L>Gh`GY-9g0Fx*^#*(N0PR&{WN>&gB%| znhcKK`L8qaYiI~`%XkFX(s0rZ2Gax4qrU!awz#0&K0DDMa>bjDY?NmAN7_R4p>Fvi8vbo(C0mkFHDXi!dXF zeqCG*yNL8gT@TGMumgJ0NAopnDvx?+tESM3-`Mcd4FH!*3eNB?rBw@j^8Iba zuC0AZI~4#+hI|JAX8+q1ZD<)G_L3rN&ID2F(zsy9DieiMA%=5?=lu@1KiehOl!uQ! zA}TB#u%$C!4&!+_yMAh6(~TDoFYmbh2=kA7;K%v=`5zu0VJo12OL>O$1%#&vTWw~} zd{pRauwZ-e{XpVJZ=lp6Bd4`65?w-W>v6QJOApLEteoz%;d;fJ!RIMLM8`m{w(q;H zu(+_)Q2tR(VYhFyE_3PuM;B8moT73_oj=r46uH{U&QX)zV3Vh_{G!Od#<&eA#;K!m zfI$FMI@V;riY~6VrL#IfwCG-XrUSQW8aWw1!+a)wGW zFFHVeobOD)9}%ge0usm4Rn310EIjXHi|;?e9yrE4oFygV53N;9dAK&{6bW!HFwE7qa`X$9fM|K- z2~wV;JXfN_GJ8I_KY3s{0E-Y+f1VBRs=D!%kXWO^QDs}hD+HY1^?Wj59{q!}Vxa&5 zy8Bdi35uwWqQF@pFN}QIzI_teTDe)>#ig4LR7|a>axW@V%=LYDN#@hqPj1QK(r<`JR+kTL*x_V<{dyn&V3;>o+GN6ZR-?Zxh*vmhz55x3_0^rYM6r zoE`MvxZI7id#PK^X6Xh7_76S8aOVKrozK8^QgNBz(EeGre9y==A1G+UC|`KJR?b=> zy%J-LR0Bl}{sAJ^QBZ@O{e%JxO3Jz{)&7g#oDPf4Out?&(MijMDdU9Y6 z#Z_6Jg7bxi;k9Y)Lg{RuTJwg`B}UnFj6B}r%AK1f4mG-$lZPi2mHp#z4ZP?{mp7S% zqBst}Q(R1*yUb!Km_=7?v=v?@RTJvqQ08)4ezup_Ap7c~>-bbM&SE&ewElmkfQK1W z$H=~Gt8_?`HbM>q_Q~CweFUAo$v|r1sahC^!9o|6I!;*J;{YQNP1iNOb2VW-wsH1V z{Gbf!1-PFNI{?Y7gO zwu?TJMU~VUuo50_+fa2t`p>^bm8*)XlJy>&tUp#`ECBIr1qE_LxLsK@17&5V*1*oF zXc7ka>{I?Xl{;k_*mD%8Np*Y3^5m4G^jt7}M=6h`IM(Hog4Cv{I>W z2AI$BLAd8ufa;~f^#=eyJ5e5>>-;oAFN$=hNg3BT;SRC@1#F^|`TtOK#bmGxlb}ux zmJKW=z=>%ybATnbs-3mMWssUG?h<(h*U;*P&__oHW%nD2iGN%E>gX;t5pmt~yV6$5 zSkZ7~cUMR%y(7jp^BPQjqyum6m;Kl^Xs$ry?H5NfsBGZ8Ub)}i z`eu$K%WcE4q8+drWABOS)zI3#OL%iz=s;svWc2ZwLPgII?Z+O)u}K3=Im)a;%0#I> zJ$_3Yo|Er}ic6OWLO0o>$fk}4%t8qjx_@u92pQ<3<3 z_~Z+y?v-Wz@LlS1#f;C|u(;6FIR{cF-~1MlI$_XerTNZW|M=9fBkizTX*l<-DmF(| zE7OKIg(Y9C%L1xUjDR(C3fH9d#NGb&po1Ud$%95@o)Drka#`b>*K+VPx|lya652@8 zOi4LAa00@!s z`AzQ4H*^!5NwL<$vCj6DOT4yQ7td&p+lY+K=uql1hJErPbh=Kl+LU?*D@krzHm6XQ zp#~Tn4`*DPyEp^~o?M*64e1|l)MK5EIR(2$oK5#TfM_30Y{fiyPS6$ee$l!TGpvtn zQJ5I%KSeUR*F=$vHuaf zW#Av5K@~hoBi2adCA3?!mr)bYQ-a1=#$S+^+;c44NVdxgml;+JddsYvTOS#M9MW8R zd<-xbD&O%z8-K(r81;B(MxC5q zNpmNH&)(%wf44@kwoEDjrbw>dU0KANaBl=4-u~C%oCRSbw2$P4OUl>XHy}ZQ;u(9Z632;qXxVI+zZy(j!XCfnwpb1L_R8e;w*d>qJvFzh9i}e>sZnHP%RFzE!UEaDU%hHlh%N z9vdeJ&s1+be)nH$=;T|V#BJOP831t75k%s;vT#Y(lliFYBXFF;z@H+1G!`lXDI=&U4LT4xPpxrs;Ln}7XA1(kOy4zpF`BQbB z3RFsJBspX<{R^y35!h2bILJ5lT%0#TGt^Q9Nu>gBQk=`JQUd%0b7NWWc z&)U{;`_|zA8aB&;wugUC^T%`V@*J-S3R{W-y~?X&?-W6UWpdG}bbI8WE0iKAHFR%g zw^3;_+M!pz=d-uKLnB2w?4%JzaGQ^4fXWx4 z%voeAZGZzPbe0r7$jG0ZqCdCZ!sO)O|5T7CGS>SDG%a?N@(}(5QLTg!@-^))-wfz+2v{k>;h)$9pYpp$AwKN?*mufpTqy#mru)3fEqmY zd4ktr|7zpW;vb=_jA{1Yw=Tob6d7;to9}#A@>LZR-?Qr~`L?3-oZ`T2-EmsfONgE= zzA*)n#^YCSVWD1$pH&{(!Or}lmBG7)k8R;90k>(x)N9_qkUP#TT!l{78!5 zo|}tO2WYo)X{U02u(wnFkm&~`B-`!Jk+l+3S2xwB70wCpe9tQzrfOrYu#WN-x*rJxwS>ny_^vA0r zBIR7oQ;(KGX~2UR)i~G4A>L#}X|ADm%jl_1-Ue>}%swWPHt#RU@Q;^{r!B z`PXqg+ko3-8P!Y;Vdlk4q9?@NO|Ze2wj8`cRrp{tCs&wa{y-7CjREZehalHgP@wQ# z4k%~wMCP}7RB{@htBG$rMyU>(@kQ~5rA|4BHEkhEe_yV)LWEzAHPkL4&*2gPa4^z{oLwAPp3*OsKJ$3i z&y0?Ud@mwth?~%>Q+=9TD8^MZD|B0$65X{_)&F`MEbc!T=6_y$`6w+d3}=kHiMh~B z5Q|wX&wxNYx$FWpyUmA{OKt#>I3DC>2Ws#|uG0|lZuw&IOH}tw4~86Og?Z>@n@gp? zTmg}BsF>MlzELulNUu9NLGiu_whvv;0^bh~nJ@viK@Cew@(6iAST;S-QvekkxP6Bc zA)BeRuh6BeClm|t_Os~{m|(b#s{!aDyhY5YfeC*K5-0!d$ZT66ePT+!Dou`aZ?2r{ z1EKb=1B%>~Z}Of8Lyo(1ixW{e9x6br@M?zrz&y(^!S$w&Y_GO(@+)%J^)0b2iXLV2 z^Y!QwH01(uNJXv5om=GAc%1yQJL17bye`tOO67}5XXX#78RTQHE(g!6uG(%Cjt$>r zB@wVIs$%rq9OBHYRAgls3G43YY3zR!nL550e$BNFg5NU~aPCt%_6wWm<1wYv^;NT zkto^>NjQGjNrlFAp*}?p|3)Oq1~E*8?gNmepDO!5P6{}xHfp5KZHqSP8ko0lJl<90 z^>|&CO}7i5m?zySO3A&P%>=Mbxm6%d1W+Ai=NrEgDRB;Vb`f)k-+wB4py6+08L#^} z9j&$tU`9nryvoI~(r$y}w^L3H@E|fv`q^!I*GfxkzA|tp>ulFiiCTFysE_hjW^2dJ zW;-X9PYKz@3%J{UwZYay9 zTMacA5tpF^O8P(+V1gM?2CVByXcjqH!i_>#^`VytuBaIMg?r$IdC|w=-gJwC+0ISKq*8Y;K#8Nx)Zb>I3iX%R? z%sW=TF}R_f+Y0P+nL%Fmxi}MK-bEwRju-73E+9WUH6U+{4U%RAz_>b6ZRsAl%l{Zi zIazF+=66>kEw8xB>|OdGOgK~t!LFsM4=Q^E2t~0rZ?}?4 zUbQYvq|gfg4tjuxS^#!%_T`O{K+y5ZT$qr5%bd(Td`IT48F0_ttQda#uS!$j4Uo_Q z2EXz)b{YXEkIxe{zBxguSMFsxj7-WO@+efZ&N~a$UCMaN3)|lyBdZ>$V)#D((aYNN zfWd{dTw>x#7ah|*^WARFd){8`A+vnkONU&(u6?*irhR;B+lNh+idIR}*sH0(Nd_2Y zP%jU~$g!x(K^=>0Vw*CsdlM$UFH(-* zeLuRyPRLZ&&`>xv9(0gR!4d@n_XvF?sZ&w}<<@&cvrcIHSA);eT z_Da&BDA^}O8U`WRcO@fRQ720%WJ^QIWSc>@u`efC53+A#$(nr$NtpLLs&jt7ejVq1 z-_PfL=bxnJdG6Wr?`g9xy9rI z_On%#R;+V-3C$geI6-rn*!Vb$y6VR1!_j%95;r>XVSMum`7P|dmHjgX>4bh`u#dV# z`)HxYZ&4GRDc?BHE`ZQax~j@HOB0?@K+G7wN&n;gdum3xxv%u#eu-c5WrRh5>&t;Z z2xV%yD(><_M|2F66*k@#V8Wt$X!Y^a=#%Cv_eqVv-XMU|p0$z9C7^+uP{w#3WTHknouu1Q=Pca1w9DUm^sKjLI(Yj zeTPiHmZ`XZU)xO~`w;bNW&XKtFyX?--)xF}g3sTx8owgtV067QDTmNcjn)1PgZ_nS z{eENpuQB%BZ6I|0J)B>U@4f=%AAi)*4eOmIr!#Q>EfjV&%z<>)q?vfjjte&@wWRu}*E>?(0Z1THph0kw`p-yZCz z7l)ey-68I&RduV#{o_IW9m|%~+3E78MD8nl(?yEb?jTnB5v7&nK{*XPK_4xf*#7{C zyXz@MOK+!78Z4g}dgy4YpQ82_bP8e^A{#1%n^FhO^l&T7Ycah=?xp!7BTVyn7=;Cn z`rKI>QTnFV=ijO<6pstohU{dqa*bJ>$nEYncKQw7*<+$n8ZBntu_mfVDmFD9Rjp6b zxpcqw<&)4t4GD3BdM%MjT4?RxY{AsdD}WNa$p9edxkhO-)aQzMTwNpQK(^#Bocy+{ zr}<>K6drJL+d588xfyEpu%96f3#;N$6@JyTC@YrrfMarU&*WRo`c$->`ZVf4QJ+);b9?$M|5;c;i6jlg!dKOrO);^ViaC@*uG3Lz(w2MR6SDqzb6B)h{6XL={d&v6)u0EC8Ou}igJ+=w z|2=~G>u>9m<)@pt%v5tfG@7hT^26qqWAFF^7ZgV?2a53dA|?Ynb1qdC0p2=a9D5+7p@7u~ZSW*s5>v%e`J zPvdd$NIyBm_`dg+oYn1nZc1Fa{3&}^p`;ACy@#VHv`i>*HF&9x;TFXeSLcrDV`Ks| zkwE62#^P+9VbJcHmlDrH$?hs#a*0{?H%k=z&2Uu5BH*T9g`Pp?^F#jPcbTHNSJw3I z;Ho5LGOxyFZ5OvOt!f;W&wrWG>`L}0l&{)dej7lZNV%=++>hwoDc40NeWGg_<27cnK^;X(^0v~L#QbvG+?-aeMtc;3h4?U}bU z^*;ZALBVoB|AqwF0(siVIaLh1dMMYCl21ge2_`1fj#mLAKQ5fpLQ%~sA=12dGj2k? zza{!x4Z{;2!#iP|db;sU%Zc-$QV>rOjt1dHWoxhAf87vk10rTrpejgr$U1f) z{*6i2$2YG$u8QI97UW)afvz`jmK$w6+I*k zv*lEmPPIOR3V0FmVIPoa=qIN8->2>NpT5V~apT%PxhDNWD=5kR;M&u$;RrhIn`<7Lj5%XP+z!MKVrU6x88U>*n>ar7CLG6^K^Q zUHbSggMOQih|WVFw>lO6bS_yx1bY>LJ94AcqgrPOn6f__UM_YjRq%auGR_pR-UvE) z;{lRQD#2@cn+A;6%{km`^R8QUNa)m-faue^yKqptsq9zeX^rz1$fXexVdq3FYK~Mz z=~-Du%?W~%Go>&N{8K&-l@E4*JYW+qbSv)Wq~oyJXy5+CaX}U2tC+D0eW8S$pTTK? zwpnv%;)NH_qFQ9#4@U-M=4WSnm)c1&NUiDJ2J504jj9Ka4ricMd4&=Q*72DkdURyR z?y$w%&kU7cTH1_(@6O=hn~_=E1p)^kyA4KFS_u~P$UfyC&83d~PC@%|;XP5X22qI9 zGijcPwPx_^ZWaUIVob?BJF_PJ@ z^_5hrJU_C%de4U2*e1G_or3mfN{2CPZ@?xsT-U-=w+XVJ$WMmZOu*q;y*$W~UEcWc ztH&(`AS-!FQkpopdQ~ot%z^B4 zBf-ri&P#^)engs0sW2%H7vhHN>HQ{(s9mQ*2ZUB!7c|E}3KkdP(^{YD$@BSWPW1&=suXX^4)O zM;)NxPR*KwEhPYs%RXh6V4H8OA1D8XkN!2(pq^e?3C%>6BpaXVE&A-=D4mtmxP%=5 z#UcLB9ZUukaD$!oLIb=QzII$hAXd}i0&=PLxR$|6KlZ7Jd*qxPr~|jf8-a9jz4sp< zu7{6m&4~(|d$?2T?Rty)x<7uTTW(akXsItD60DP`A|jgoydRQX7Y>k=5TQ~A{c?P! zda<&yaa)UvP9&FRx3RQ1)GU7EpRq3J7B5a~c06Gsv@!RyOOcBOFEsaWxVZI5?W~}^ zZ0O?WURydnz|%}_xEo}?UU1f&95*PqOD#nd=vjP~k~hz%GOAaTKNXjru6e>iU={oq z*nJ!0`kON{Uu}M-eI9G(8RhY|qk`tJscRwCEhDyEyRTbtW?0CZ8jAgW3+$s2wk-rL zNpA95JTl~qw~kFWV{EkQI~s)*>(Ra7BK8ur!28N&m#^9zof<=)o(pY7WqL@dpCg%v zhokYrE=fAXBj)ny%~5snx9dJAhTPH@7f|-C%f#=V&%}qyu@=aFiQf9wT(js#=?6Zy zTa>Q(8d+PkWV-w97d4+U0%cao@>h!`7`j=0Egshi2tAP@h=QaNC%a=^Tr|gLWwU~| z`>!giTSa(H)m_l^niTd~whuYxqtSzwMwYR%PV_aikulH76Ss$JswEk>w)M zlFeuoVSI52i*tXg=3nB2h<219`@h0ele@Wd-6qo;-k!uh8p;Lduse{`yrwkuR)`KzTm7^ zJmd(_6%0D&Gzr?5&FEWAjo%#PC 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 RY@l_Ul;l)pQ)CRi{tG5Hke>hm literal 0 HcmV?d00001 diff --git a/docs/img/welcome.zh.png b/docs/img/welcome.zh.png new file mode 100644 index 0000000000000000000000000000000000000000..27e24ba504c274fb062a762a6084ddecb6743b26 GIT binary patch literal 45801 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 literal 0 HcmV?d00001 diff --git a/docs/index.md b/docs/index.md index 000ea34..69f4d13 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,17 +1,7 @@ -# Welcome to MkDocs +--- +title: 'Home' +--- -For full documentation visit [mkdocs.org](https://www.mkdocs.org). +# Welcome to Prime Backup Documentation -## Commands - -* `mkdocs new [dir-name]` - Create a new project. -* `mkdocs serve` - Start the live-reloading docs server. -* `mkdocs build` - Build the documentation site. -* `mkdocs -h` - Print help message and exit. - -## Project layout - - mkdocs.yml # The configuration file. - docs/ - index.md # The documentation homepage. - ... # Other markdown pages, images and other files. +This is the official documentation of the Prime Backup plugin diff --git a/docs/index.zh.md b/docs/index.zh.md new file mode 100644 index 0000000..6e0a0fb --- /dev/null +++ b/docs/index.zh.md @@ -0,0 +1,7 @@ +--- +title: '首页' +--- + +# 欢迎来到 Prime Backup 的文档 + +这里是 Prime Backup 插件的官方文档 diff --git a/docs/quick_start.md b/docs/quick_start.md new file mode 100644 index 0000000..47d4617 --- /dev/null +++ b/docs/quick_start.md @@ -0,0 +1,117 @@ +--- +title: 'Quick Start' +--- + +## Install + +### Prepare MCDR + +Prime Backup is a [MCDReforged](https://github.com/Fallen-Breath/MCDReforged) plugin, +and it requires `mcdreforged>=2.12` to work + +To install / update MCDReforged, you can run: + +```bash +pip3 install mcdreforged>=2.12 -U +``` + +See [MCDR document](https://mcdreforged.readthedocs.io/en/latest/quick_start.html) for more information + +### Install Python requirements + +Prime Backup requires a few python libraries to run, they are all listed in the +[requirements.txt](https://github.com/TISUnion/PrimeBackup/blob/master/requirements.txt) at the [GitHub repository](https://github.com/TISUnion/PrimeBackup) root + +```bash title="requirements.txt" +--8<-- "requirements.txt" +``` + +Use command `pip3 install -r requirements.txt` to install all required Python requirements + +### Install the plugin + +Download Prime Backup from [GitHub Release](https://github.com/TISUnion/PrimeBackup/releases), +and place it into the plugin folder of MCDR. Perform a [MCDR plugin reload](https://mcdreforged.readthedocs.io/en/latest/command.html#hot-reloads) + +## Configure + +Before using Prime Backup, you need to configure its config file correctly + +Don't worry, for most of the config options, you can use the default values. +But there's a few options that you still need to configure carefully + +### Location + +When Prime Backup is firstly loaded by MCDR, it will automatically generate the config file, +with the location at `config/prime_backup/config.json` + +```bash +mcdr_root/ +└── config/ + └── prime_backup/ + └── config.json <------------- +``` + +It's a json file, so you need to follow the json syntax to edit it + +### Necessary configs + +Here are a few important things in the config file: + +1. The backup format you want to use + + ```js + // root config + { + // ... + "backup": { + "hash_method": "xxh128", + "compress_method": "zstd", + } + // ... + } + ``` + + - [`hash_method`](config.md#hash_method): The algorithm to hash the files. Available options: "xxh128", "sha256" + + - [`"xxh128"`](https://github.com/Cyan4973/xxHash): A extremely fast, high-quality 128bit non-cryptographic hash algorithm. + Recommend to use, unless you want theoretic extreme safety on hackers + - [`"sha256"`](https://en.wikipedia.org/wiki/SHA-2): A cryptographically secure and widely used 256bit hash algorithm. + It's slower than xxh128, but the speed is acceptable enough with modern hardware + + - [`compress_method`](config.md#compress_method): The way the backups get compressed. Common suggestions: + + - `"plain"`: No compression. Use this if you want the maximum operation speed + - [`"zstd"`](https://github.com/facebook/zstd): Fast and good compression algorithm. Recommend to use you want to save some disk spaces + + !!! danger + + You **CANNOT** change the `hash_method` after the plugin is enabled. Make your choice wisely + + !!! warning + + Changing `compress_method` will only affect new files in new backups + +2. Enable the plugin. Set the `enabled` option in the root object to `true`. It should be at the top of the whole config file + + ```json + // root config + { + "enabled": true + // ... + } + ``` + +3. Reload the plugin with MCDR command + + ```text + !!MCDR plugin reload prime_backup + ``` + +Now Prime Backup should start working + +## Use + +Enter `!!pb` in the MCDR console, or in game, you should see the welcome page as shown below + +![welcome](img/welcome.png) diff --git a/docs/quick_start.zh.md b/docs/quick_start.zh.md new file mode 100644 index 0000000..0635e1f --- /dev/null +++ b/docs/quick_start.zh.md @@ -0,0 +1,117 @@ +--- +title: '快速上手' +--- + +## 安装 + +### 准备 MCDR + +Prime Backup 是一个 [MCDReforged](https://github.com/Fallen-Breath/MCDReforged) 插件, +它需要 `mcdreforged>=2.12` 才能运行 + +要安装/更新 MCDReforged,你可以运行: + +```bash +pip3 install mcdreforged>=2.12 -U +``` + +详见 MCDR 的[相关文档](https://mcdreforged.readthedocs.io/en/latest/quick_start.html) + +### 安装 Python 依赖 + +Prime Backup 需要一些 python 库才能运行,它们都被列在了 +[GitHub 仓库](https://github.com/TISUnion/PrimeBackup) 根目录的 [requirements.txt](https://github.com/TISUnion/PrimeBackup/blob/master/requirements.txt) 文件中 + +```bash title="requirements.txt" +--8<-- "requirements.txt" +``` + +使用命令 `pip3 install -r requirements.txt` 即可安装所有需要的 Python 依赖 + +### 安装插件 + +从 [GitHub Release](https://github.com/TISUnion/PrimeBackup/releases) 下载 Prime Backup 插件, +并将其放入 MCDR 的插件文件夹中,然后执行 [MCDR 插件重载](https://mcdreforged.readthedocs.io/zh-cn/latest/command.html#hot-reloads) 操作 + +## 配置 + +在使用 Prime Backup 之前,你需要正确配置其配置文件,才可让其工作 + +别着急,对于大多数配置选项,你可以使用默认值。 +但还有一些选项,是需要你配置一下的 + +### 位置 + +在 Prime Backup 插件首次被 MCDR 加载时,其配置文件将自动生成, +路径为:`config/prime_backup/config.json` + +```bash +mcdr_root/ +└── config/ + └── prime_backup/ + └── config.json <------------- +``` + +它是一个 json 文件,所以你得遵循 json 语法来编辑 + +### 必要的配置项 + +配置文件中的一些重要内容如下所示: + +1. 你想要使用的备份格式 + + ```js + // 根配置 + { + // ... + "backup": { + "hash_method": "xxh128", + "compress_method": "zstd", + } + // ... + } + ``` + + - [`hash_method`](config.zh.md#hash_method): 对文件进行哈希的算法。可用选项: "xxh128", "sha256" + + - [`"xxh128"`](https://github.com/Cyan4973/xxHash)::一种极快的、高质量的 128 位哈希算法,不提供密码学安全性。 + 推荐使用,除非你想要理论上的极端安全 + - [`"sha256"`](https://en.wikipedia.org/wiki/SHA-2): 一种广泛使用的、密码学安全的 256 位哈希算法。 + 它比 xxh128 慢,但在现代的硬件上也不会慢太多 + + - [`compress_method`](config.zh.md#compress_method): 备份文件的压缩方式。常用建议: + + - `"plain"`: 无压缩。如果你希望获得最快的操作速度,就用这个 + - [`"zstd"`](https://github.com/facebook/zstd): 快速且高效的压缩算法。如果你想节约一些磁盘空间的画,推荐使用 + + !!! danger + + 你 **不能** 在启用插件后修改 `hash_method`。请明智地做出选择 + + !!! warning + + 更改 `compress_method` 只会影响新备份中的新文件 + +2. 启用插件。在配置文件的根对象中,设置 `enabled` 为 `true`。它应该位于整个配置文件的最上面 + + ```json + // root config + { + "enabled": true + // ... + } + ``` + +3. 使用 MCDR 命令重载插件 + + ```text + !!MCDR plugin reload prime_backup + ``` + +现在 Prime Backup 应该开始工作了 + +## 使用 + +在 MCDR 控制台或游戏中输入 `!!pb`,你应该看到如下所示的欢迎页面 + +![welcome](img/welcome.zh.png) diff --git a/docs/reference/index.md b/docs/reference/index.md new file mode 100644 index 0000000..60b4f47 --- /dev/null +++ b/docs/reference/index.md @@ -0,0 +1,5 @@ +--- +title: 'References' +--- + +TODO diff --git a/mkdocs.yml b/mkdocs.yml index 4851d1d..dd190c3 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -4,11 +4,30 @@ site_url: https://tisunion.github.io/PrimeBackup/ site_author: Fallen_Breath site_description: A powerful backup plugin for MCDR, an advanced backup solution for your Minecraft world repo_url: https://github.com/TISUnion/PrimeBackup +repo_name: TISUnion/PrimeBackup copyright: Copyright © 2023 Fallen_Breath exclude_docs: |- /requirements.txt + +# https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown/ +markdown_extensions: + - admonition + - toc: + permalink: true + # https://squidfunk.github.io/mkdocs-material/setup/extensions/python-markdown-extensions/ + - pymdownx.highlight + - pymdownx.inlinehilite + - pymdownx.superfences + - pymdownx.snippets + theme: name: material + features: + - content.code.copy + - navigation.expand + - navigation.path + - navigation.prune + - navigation.top # https://squidfunk.github.io/mkdocs-material/setup/changing-the-colors/#automatic-light-dark-mode palette: - media: "(prefers-color-scheme)" @@ -25,6 +44,7 @@ theme: toggle: icon: material/brightness-4 name: Switch to system preference + plugins: - search - i18n: @@ -32,9 +52,20 @@ plugins: docs_structure: suffix languages: - locale: en - default: true name: English build: true + default: true - locale: zh name: 简体中文 build: true + nav_translations: + Reference: 参考 + +nav: + - index.md + - quick_start.md + - config.md + - command.md + - cli.md + - Reference: + - reference/index.md