# 管理和维护服务器

## 服务端文件说明

在服务端根目录中，有很多文件和文件夹，以 paper 服务端根目录的文件夹为例，根据作用，可分为以下几类，它们的作用如下。

### 服务器核心文件

这类文件在服务器运行时被调用，是服务器必不可少的核心文件。

|文件名|详解|
|---|---|
|**paper-xx.xx.x-x.jar**|毋庸置疑，这是服务器的核心 jar 文件，运行服务端需要运行此 jar 文件。|
|**libraries**|存放 Minecraft 运行所需的 Java 库（如 authlib、commons-lang 等）。首次启动时若缺失，Paper 会自动从 Mojang 官方源下载。|
|**world**|服务器的存档文件夹，如果你没有修改 `server.properties` 文件的 `level-name` 选项，默认为 world，若修改，则为你修改的名称|
|**world_nether**|服务器的下界维度文件夹，如果你没有修改 `server.properties` 文件的 `level-name` 选项，默认为 world_nether，若修改，则为你修改的名称 + _nether|
|**world_the_end**|服务器的下界维度文件夹，如果你没有修改 `server.properties` 文件的 `level-name` 选项，默认为 world_the_end，若修改，则为你修改的名称 + _the_end|

:::tip
在 Paper 中，各维度使用独立文件夹；而在原版或某些服务端中，下界和末地分别位于 `world/DIM-1/` 和 `world/DIM1/`。
:::

### 服务器配置文件

这些文件控制着服务器的行为，

|文件名|详解|
|---|---|
|**config**|存服务器的配置文件的文件夹，一般存放着较原版有第三方改动的配置文件，如 `paper-global.yml`、`paper-world-defaults.yml`。在模组服中，模组的配置文件在该目录下。|
|**paper-global.yml**|用于更改关于 paper 的全局配置。|
|**paper-world-defaults.yml**|用于更改关于世界的配置。|
|**server.properties**|服务器配置文件，mojang 官方服务端核心自带的配置文件。|
|**banned-ips.json**|ip 封禁列表，存放着通过 /ban-ip 命令封禁的玩家ip。|
|**banned-players.json**|玩家封禁列表，存放着通过 /ban 命令封禁的玩家以及玩家 uuid。|
|**commands.yml**|添加自定义命令的配置文件。|
|**ops.json**|管理员权限名单。|
|**server-icon.png**|服务器图标，一般不会自动生成，需要玩家手动上传，尺寸与格式必须为 64x64 像素的 .png 格式，名称也必须为 server-icon.png。|

:::tip
下列配置文件为 bukkit/spigot 下游分支独有，paper 就是 bukkit/spigot 的下游分支。
:::
|||
|---|---|
|**bukkit.yml**|bukkit 系配置文件，paper 作为 bukkit 的下游服务端核心，存放关于 bukkit 系配置。|
|**spigot.yml**|spigot 系配置文件，paper 作为 spigot 的下游服务端核心，存放关于 spigot 服务端配置。|


### 插件

plugins 为服务器的插件目录，插件的 jar 文件应该放在此目录下，插件的配置文件在 `plugins/your_plugin_name` 目录下。

:::tip
如果服务端核心为模组端，模组文件夹为 mods 目录，配置文件在 config 目录下，但 Paper 作为插件服务端，不支持模组，此处仅为对比说明。
:::

## 存档文件说明

在服务端根目录的 world 文件夹内，有以下文件，他们存放着存档的数据，应优先备份此文件夹。

|文件名|说明|
|---|---|
|**level.dat**|存档的核心文件，记录着世界的元数据，如游戏规则，游戏模式，种子以及是否开启作弊等。|
|**advancements**|存储锁定的游戏进度和成就，每个玩家对应一个文件，命名格式为 `player's uuid.json` 文件|
|**data**|存放世界级别的自定义数据，包括：地图物品的图像数据（idcounts.txt、maps/）、书与笔的内容（通过数据包或命令生成的持久化文本）等。|
|**datapacks**|此处放置你的数据包。|
|**region**|存放方块数据（地形、建筑等）。每个 .mca 文件管理 32×32 个区块（即 512×512 方块），文件名格式为 `r.x.z.mca`，其中 `x = floor(方块X / 512)`，`z = floor(方块Z / 512)`。 |
|**entities**|存放实体数据（生物、掉落物、矿车、容器内物品等），结构同 `region`。|
|**poi**|存放兴趣点（Points of Interest），如村民工作站、床、钟等，用于 AI 寻路，结构同上。|
|**playerdata**|存放玩家的游戏内数据，如背包中的物品，所处的维度机及其坐标，已经获得的经验值等，每个玩家对应一个文件，命名格式为 `player's uuid.dat`|

## 存档备份

一般来说，仅需要备份存档即可，可以选择直接压缩为 .zip 格式来下载到本地来备份存档，对于 Linux 系统，可以选择编写一个 Shell 备份脚本来进行快捷备份，下面是柏茯灵自己为自己编写的备份脚本，可以在服务端根目录运行此脚本来备份存档。(编程能力有限还请见谅www)


此脚本会备份区域 (-2,-2)~(2,2) 之间的所有区域文件

:::danger
执行脚本前请安装 zip，并确定自己将该文件放在服务端根目录，保证 `server.properties` 中的 `level-name` 保持默认值，在自己的工作目录为服务端根目录的条件下执行。
:::

>注意，此脚本仅支持 26.1 及其更新版本。

```shell
#!/bin/bash
way=$(dirname "$0")
if [ -e ${way}/server.properties ]; then
    echo -e "\033[32mserver.properties found\033[0m"
    if [ -e ${way}/eula.txt ]; then
        echo -e "\033[32meula.txt found\033[0m"
        if [ -e ${way}/world/level.dat ]; then 
            echo -e "\033[32mworld/level.dat found\033[0m"
            echo "starting backup..."
            mkdir -p ${way}/swap/world/dimensions/
            cp -rf ${way}/world/level.dat ${way}/world/data ${way}/world/datapacks ${way}/world/players ${way}/swap/world/
            x_meta=(-2 -1 0 1 2)
            y_meta=(-2 -1 0 1 2)
            folder_all=("region" "entities" "poi")
            get_list=${way}/world/dimensions
            spacename=($(ls ${way}/world/dimensions/))
            for spacename_sel in ${spacename[@]}; do
                dimension=($(ls ${way}/world/dimensions/${spacename_sel}/))
                for dimension_sel in ${dimension[@]}; do
                    for folder_sel in ${folder_all[@]}; do
                        mkdir -p ${way}/swap/world/dimensions/${spacename_sel}/${dimension_sel}/${folder_sel}/
                        for x_meta_sel in ${x_meta[@]}; do
                            for y_meta_sel in ${y_meta[@]}; do
                                if [ -e ${way}/world/dimensions/${spacename_sel}/${dimension_sel}/${folder_sel}/r.${x_meta_sel}.${y_meta_sel}.mca ]
                                then
                                    cp -f ${way}/world/dimensions/${spacename_sel}/${dimension_sel}/${folder_sel}/r.${x_meta_sel}.${y_meta_sel}.mca ${way}/swap/world/dimensions/${spacename_sel}/${dimension_sel}/${folder_sel}/
                                else
                                    echo -e "\033[33m${spacename_sel}/${dimension_sel}/${folder_sel}/r.${x_meta_sel}.${y_meta_sel}.mca not found,skip this file\033[0m"
                                fi
                            done
                        done
                    done
                done
            done
            date=$(date +%y.%m.%d)
            mkdir saves
            cd ./swap/
            zip -r ${way}/saves/backup-${date}.zip ${way}/world/
	    rsync --progress -arv ${way}/saves/backup-${date}.zip acovia.net:files/acovia-backups/
        else
            echo -e "\033[31mworld/level.dat not found\033[0m"
        fi
    else
        echo -e "\033[31meula.txt not found\033[0m"
    fi
else
    echo -e "\033[31mserver.properties not found\033[0m]"
fi
```
运行此脚本后，备份后的 zip 文件会被保存在服务端根目录的 saves 文件夹中。

:::caution[**重要提醒**]
备份时务必**停止服务器**，否则 `level.dat` 或 region 文件可能处于不一致状态，导致存档损坏。  
:::

<br/>
<br/>
<br/>

***<center>--- 由 柏茯灵_RsDline 编写 ---</center>***
