#1 卷首语
在24年9月的时候,我的一位朋友找到了我
向我咨询了一个看起来很简单的问题:“怎么在使用1p面板的服务器上为Dynmap开启外置Web服务器和MySQL”
我一开始寻思着这问题不挺简单的吗,照着文档部署不就可以了
至少直到我打开了Dynmap的Github仓库,看到那并不友好的文档之前我都是这么想的

文档中缺少了相当数量的关键信息(如PHP环境需要安装php-mysqli扩展等)甚至还有一些对于1p面板用户而言没必要的操作(比如修改默认站点配置)
且里面的内容顺序对于阅读者来说并不是很友好
事实上从开始研究这个问题直到最后部署完成断断续续的花了超过6个月的时间
为了方便后人,也为了方便直到我写这段话时那位大概率还没有开始弄的朋友 )
特撰写本文
#2 开始前
由于是在1p面板上部署这个方案,而众所周知,1p面板是一个基于Docker容器的面板,因此在开始以前我们需要简单介绍一下Docker容器
根据Docker官网的说法,本文中所指的Docker容器是:
一个标准的软件单元,它将代码及其所有依赖项打包在一起,以便应用程序能够在不同的计算环境之间快速可靠地运行。Docker 容器镜像是一个轻量级、独立且可执行的软件包,其中包含运行应用程序所需的一切:代码、运行时、系统工具、系统库和设置
——摘自Docker官网
而在本教程中,由于数据库和Web服务器都运行在容器上,使得Dynmap的部署复杂程度急剧增长
需要手动设置和挂载Dynmap目录以实现官方教程说的Option 1方案(直接连接文件夹)

限于篇幅和实用性,本文只介绍使用直接链接文件夹方式进行部署,不过我认为如果你看完了本文,那么你大概率也可以实现使用Option 2方案(复制Web文件)部署
#3 正式开始
由于篇幅所限,本文不会介绍如何在1p面板上安装MySQL和OpenResty,毕竟在1p面板上安装这两个东西基本有手就行
因此本文讲述的内容将直接从更改插件配置开始,因为当前版本的Dynmap与教程相比配置文件有些许差异
#3.1 更改插件配置
当你第一次启动完成服务器并且Dynmap已经生成了所有必要的文件之后,你应该可以在服务器的plugins文件夹中看到以下文件:
admins@HomeTheVM-S4:~/Paper/plugins$ ls
bStats dynmap Dynmap-3.7-beta-8-spigot.jar spark TabTPS tabtps-spigot-1.3.26.jar
admins@HomeTheVM-S4:~/Paper/plugins$
打开plugins/dynmap文件夹,你应该会看到以下文件:
admins@HomeTheVM-S4:~/Paper/plugins$ cd dynmap
admins@HomeTheVM-S4:~/Paper/plugins/dynmap$ ls
colorschemes custom-lightings.txt custom-shaders.txt ids-by-ip.txt lightings.txt markers.yml renderdata templates version.txt world.pending
configuration.txt custom-perspectives.txt export import markers perspectives.txt shaders.txt texturepacks web worlds.txt
admins@HomeTheVM-S4:~/Paper/plugins/dynmap$
编辑plugins/dynmap文件夹中的configuration.txt文件,修改第28行到第50行为以下内容
storage:
# Filetree storage (standard tree of image files for maps)
#type: filetree <- DONT FORGET TO COMMENT THIS OUT
# SQLite db for map storage (uses dbfile as storage location)
#type: sqlite
#dbfile: dynmap.db
# MySQL DB for map storage (at 'hostname':'port' with flags "flags" in database 'database' using user 'userid' password 'password' and table prefix 'prefix')
type: mysql
hostname: <MySQL主机名(此处不可填写本地回环地址!!!)>
port: <MySQL主机端口>
database: <数据库名称>
userid: <数据库用户>
password: <数据库密码>
prefix: "" # Can add prefix for tables if you want
flags: "?allowReconnect=true&autoReconnect=true"
接下来回到1p面板,点击左侧菜单栏-数据库,点击创建数据库,自行填写信息后点击确认

创建完成后界面应该如下:

点击“连接信息”查看主机连接信息


| <MySQL主机名> | <MySQL主机端口> | <数据库名称> | <数据库用户> | <数据库密码> |
| 主机内网IP | 3306 | dynmap-mysql | dynmap | xdmBzEsHahXxj827 |
修改完存储信息之后,就可以进行下一步了:更改组件设置
使用Ctrl+F打开搜索框
还是在文件configuration.txt中搜索"- class: org.dynmap.InternalClientUpdateComponent"
然后将configuration.txt的第48行到第83行替换为以下内容:
# - class: org.dynmap.InternalClientUpdateComponent
#sendhealth: true
#sendposition: true
#allowwebchat: true
#webchat-interval: 5
#hidewebchatip: false
#trustclientname: false
#includehiddenplayers: false
# (optional) if true, color codes in player display names are used
#use-name-colors: false
# (optional) if true, player login IDs will be used for web chat when their IPs match
#use-player-login-ip: true
# (optional) if use-player-login-ip is true, setting this to true will cause chat messages not matching a known player IP to be ignored
#require-player-login-ip: false
# (optional) block player login IDs that are banned from chatting
#block-banned-player-chat: true
# Require login for web-to-server chat (requires login-enabled: true)
#webchat-requires-login: false
# If set to true, users must have dynmap.webchat permission in order to chat
#webchat-permissions: false
# Limit length of single chat messages
#chatlengthlimit: 256
# # Optional - make players hidden when they are inside/underground/in shadows (#=light level: 0=full shadow,15=sky)
# hideifshadow: 4
# # Optional - make player hidden when they are under cover (#=sky light level,0=underground,15=open to sky)
# hideifundercover: 14
# # (Optional) if true, players that are crouching/sneaking will be hidden
#hideifsneaking: false
# If true, player positions/status is protected (login with ID with dynmap.playermarkers.seeall permission required for info other than self)
#protected-player-info: false
# If true, hide players with invisibility potion effects active
#hide-if-invisiblity-potion: true
# If true, player names are not shown on map, chat, list
#hidenames: false
接下来接着使用Ctrl+F打开搜索框
搜索"#- class: org.dynmap.JsonFileClientUpdateComponent"
然后将configuration.txt的第82行到第104行替换为以下内容:
- class: org.dynmap.JsonFileClientUpdateComponent
writeinterval: 1
sendhealth: true
sendposition: true
allowwebchat: true
webchat-interval: 5
hidewebchatip: false
includehiddenplayers: false
use-name-colors: false
use-player-login-ip: false
require-player-login-ip: false
block-banned-player-chat: true
hideifshadow: 0
hideifundercover: 0
hideifsneaking: false
# # Require login for web-to-server chat (requires login-enabled: true)
webchat-requires-login: false
# # If set to true, users must have dynmap.webchat permission in order to chat
webchat-permissions: false
# # Limit length of single chat messages
chatlengthlimit: 256
hide-if-invisiblity-potion: true
hidenames: false
然后禁用内置Web Server,使用Ctrl+F打开搜索框
在configuration.txt中搜索"disable-webserver"并将其值修改为true

接下来修改URL部分,还是使用Ctrl+F打开搜索框
在文件configuration.txt中搜索"url:",因为这份配置文件里有很多个"url",所以请务必多按几下回车,直到你看见类似于下方的内容:

将第458行到第472行修改为以下内容
url:
# configuration URL
configuration: "standalone/MySQL_configuration.php"
# update URL
update: "standalone/MySQL_update.php?world={world}&ts={timestamp}"
# sendmessage URL
sendmessage: "standalone/MySQL_sendmessage.php"
# login URL
login: "standalone/MySQL_login.php"
# register URL
register: "standalone/MySQL_register.php"
# tiles base URL
tiles: "standalone/MySQL_tiles.php?tile="
# markers base URL
markers: "standalone/MySQL_markers.php?marker="
到这里,你就完成了configuration.txt文件的修改,现在启动服务器,并检查在启动时控制台是否有弹出任何报错,尤其注意数据库是否能正常连接
如果出现了控制台出现了类似于以下内容:

则代表数据库未能正常连接,请检查你在刚才执行的所有步骤
如果出现了控制台出现了类似于以下内容:

这代表你错误的禁用了类,请检查是否正确的更改组件设置
如果控制台在启动中未出现任何带有[dynmap]标志的报错,并且你看到了以下内容
(Dynmap显示的数据库版本与你安装的数据库版本前两位一致)

则代表你更改的配置全部正确
#3.2 配置Web服务器
这是整份教程中最重要的一部分,由于1p面板是高度容器化的面板,包括Web服务器在内的各种服务全部运行在容器中,因此你需要进行以下操作:
- 创建运行环境
- 手动挂载目录
我们先从"创建运行环境"开始
在面板左侧菜单栏中点击网站-运行环境,就可以进入到配置运行环境的界面

点击"创建运行环境"
而通过官方教程可以知道,Dynmap需要PHP 7.2以上的运行环境
因此直接创建PHP 7.2以上的环境即可,本文中使用PHP 8.4

打开创建运行环境菜单后,向下滑,找到"扩展"一栏

在扩展一栏中输入"php-mysqli"
然后点击确认,等待镜像构建完成即可

返回到配置运行环境的界面后,如果我们刚才创建的镜像提示"正常",就代表已经创建完成了

接下来点击左侧菜单栏-网站-网站,进入到配置网站的界面

点击创建,在网站创建菜单里选择运行环境
而具体的运行环境则选择我们刚才创建的PHPv8,域名和端口号则根据实际情况自行填写

创建完成后可以直接访问创建好的网站,如果你看到了以下界面代表网站创建完成

接下来我们开始"手动挂载目录"
首先,你需要获取dynmap/web文件夹的绝对路径
本文中是"/home/admins/Paper/plugins/dynmap/web"
接下来你需要获取你的网站在容器中的路径
通常情况下,网站在容器中的路径是"/www/sites/<网站代号>/index"
当你获取到这两个信息之后,就可以开始挂载了,点击左侧菜单栏-容器,找到你在刚才创建网站的过程中自动创建的PHP容器,一般情况下,这个容器的名字以1Panel-php8开头,四位随机字母结尾

点击旁边的更多-编辑,就可以编辑容器的详细设置

滚动鼠标下滑到"挂载"

点击最底部的添加挂载


在这一步中,本机目录输入dynmap/web文件夹的绝对路径,容器目录则要输入刚才获取的网站在容器中的目录

然后点击底部的确认,此时如果面板弹出有关于网络的错误提示,那就将容器详细设置中的IPv4留空,让面板自动为容器分配IP
此时,如果你直接访问网站地址,应该会看到如下画面

这代表你上一步配置是正确的,因为我们修改了PHP容器的目录,所以现在OpenResty检测不到目录了
接下来我们需要修改OpenResty容器的挂载,操作与修改PHP容器的挂载相同

如果你在修改OpenResty容器的挂载时发现挂载已自动添加,而访问网站仍然是File not found.,请直接重启OpenResty容器让挂载生效
当你完成了所有步骤之后,访问网站域名:

你就可以看到网页地图了,至此,全教程结束。
