# 管理和维护服务器
## 服务端文件说明
在服务端根目录中,有很多文件和文件夹,以 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 文件可能处于不一致状态,导致存档损坏。
:::
***