DDNet 服务器配置教程 Linux 环境
配置之前可以参考一下官方网址给出的内容
官方网址:DDNet官方
环境说明
OS: Debian 11
安装
可以直接从官网下载,也可以使用这个链接:
Linux_DDNet 下载链接
上文中给的链接会因为更新而出现版本落后的情况,读者可以自行去官网下载。
如果你的 Linux 是云主机,可以获取链接,使用以下命令下载:
wget https://ddnet.org/downloads/DDNet-18.7-linux_x86_64.tar.xz
这个链接是与上面官方提供的下载链接一样的,同样可能会版本落后,读者也可以复制官方的链接,以获取最新版本
如果你是一个Linux新手,有些命令则可能会执行错误,应该是你的主机没有对应的命令,你可以在搜索引擎上搜索如何下载这些命令
解压安装
解压,命令行执行:
tar -xf DDNet-18.7-linux_x86_64.tar.xz
解压后得到一个文件夹:
配置服务器
这是重头戏,因为这个安装包的中并没有自带的配置文件,因此很多适用于windows的教程并不能用于此,但是运行时可以指定配置文件,使用 -f
参数。
首先,进入这个目录:
有些文件你可能没有(例如serverctl.sh、log),因为这是我后来手动写的…
可以先尝试启动一下服务器:
./DDNet-Server
以这样的方式启动的服务器只能运行在本地局域网,如果想要让其显示在游戏内列表上,则需要进行额外的配置。
由于这个压缩包并没有官方直接提供的配置文件,我手写了一个:
# 一般选项
# ---------------
# 服务器端口(仅端口范围 8303-8310 会在局域网标签中显示,
# 默认为 0,表示自动选择一个空闲端口,范围在 8303-8310 之间)
# sv_port 8303
# 服务器名称
sv_name ""
# 加入服务器的密码,空字符串表示不需要密码
password ""
# 管理员的 rcon (F2) 密码。如果不设置,将生成一个随机密码
# 并显示在服务器窗口中。
sv_rcon_password ""
# 版主的 rcon (F2) 密码。如果不设置,则没有密码。
sv_rcon_mod_password ""
# 帮助者的 rcon (F2) 密码。如果不设置,则没有密码。
sv_rcon_helper_password ""
# 每次地图更换时执行的配置文件
# sv_reset_file "types/novice/flexreset.cfg"
# 服务器启动时加载的地图
sv_map "Sunny Side Up"
# 是否为测试服务器,并允许使用 rcon cheat。也在服务器类型中指示:
# - "DDraceNetwork" 表示 0(不允许 cheat)
# - "TestDDraceNetwo" 表示 1(允许 cheat)
sv_test_cmds 0
# 是否注册服务器(使其公开)
sv_register 0
# 高级选项
# ----------------
# 服务器日志存储的文件
logfile "DDNet-server-8303.log"
# 保存地图记录的文件夹
sv_score_folder "records"
# 服务器最大玩家数
sv_max_clients 64
# 每个 IP 地址最大玩家数
sv_max_clients_per_ip 4
# 比赛模式 - 启用时玩家进入服务器时作为观察者
sv_tournament_mode 0
# 玩家是否可以暂停角色并使用 /spec 命令使其消失
sv_pauseable 0
# 是否允许玩家使用 /rescue(也可以是 /r)命令将自己传送脱离冻结状态
sv_rescue 1
# 两次救援命令之间的时间间隔(单位:秒)
sv_rescue_delay 5
# 启用 rcon cheat 后是否显示排名
sv_rank_cheats 0
# 服务器定制
# --------------------
# 玩家加入时在聊天中显示的欢迎信息
sv_welcome "Welcome on my DDNet server! Running all maps from https://github.com/ddnet/ddnet-maps"
# 存放公告的文件(每个公告独占一行)
sv_announcement_filename "announcement.txt"
# 下一条公告将在多少分钟后显示(单位:分钟)
sv_announcement_interval 120
# 是否按顺序显示公告还是随机显示
sv_announcement_random 1
# 玩家加入时显示的每日一条信息(使用 "\n" 来换行)
sv_motd "Testserver with DDraceNetwork Features!\nRunning all maps from https://github.com/ddnet/ddnet-maps"
# 是否使用默认的 DDRace 规则
sv_ddrace_rules 1
# 自定义规则(最多 10 行)
sv_rules_line1 ""
sv_rules_line2 ""
sv_rules_line3 ""
# 每次地图更换后是否重置物理参数
sv_tune_reset 1
# 每次地图更换后是否重置 DDRace 参数
sv_ddrace_tune_reset 1
# 附加命令权限
# -------------------------------
# 你可以通过使用 "access_status" 查看特定认证级别的用户可访问的所有命令
# 格式:access_status [0: admin, 1: moderator, 2: helper, 3: user]
#
# 格式:access_level [command] [0: admin, 1: moderator, 2: helper, 3: user]
# 其中 0 只允许管理员访问,1 允许版主访问,2 允许帮助者访问,3 允许普通用户访问
# 示例:mod_command ban 1
# 非默认的命令,版主和帮助者可以访问
access_level left 2
access_level right 2
access_level up 2
access_level down 2
access_level super 2
access_level unsuper 2
access_level tele 2
access_level totele 2
access_level totelecp 2
access_level logout 2
access_level ninja 2
access_level grenade 2
access_level shotgun 2
access_level laser 2
access_level weapons 2
access_level unweapons 2
access_level unlaser 2
access_level unshotgun 2
access_level ungrenade 2
access_level unsolo 2
access_level undeep 2
access_level status 2
# 仅版主可以使用的命令
access_level ban 1
access_level unban 1
access_level ban_range 1
access_level unban_range 1
access_level unban_all 1
access_level bans 1
access_level bans_save 1
access_level kick 1
access_level force_vote 1
access_level moderate 1
# 特殊广播建议
# ----------------------------------------
# 向没有 DDNet 客户端的玩家显示广播
sv_client_suggestion "Get DDNet client from DDNet.org to use all features on DDNet!"
# 向使用非常旧版本 DDNet 客户端的玩家显示广播
sv_client_suggestion_old "Your DDNet client is old, update it on DDNet.org!"
# 向使用已知有机器人程序的客户端玩家显示广播
sv_client_suggestion_bot "Your client has bots and can be remotely controlled!\nPlease use another client like DDNet client from DDNet.org"
你可以手动复制并粘贴到服务器的配置文件中,我个人比较喜欢的风格是保存到一个文件夹中,例如:
mkdir Configs
创建一个存放配置文件的文件夹。
touch myServerconfig.cfg
创建一个配置文件,当然你也可以命名为别的。
上面是我自己的服务器配置,因为要同时运行多个房间,因此需要多个配置文件,后面的数字则是端口。
创建好之后将配置文件复制进去即可。
配置文件的一些必要说明
在配置文件中,有几个必须要知道的问题:
sv_port
: 这个参数是服务器的端口设置最好自己设置,最大是65535,官方默认是8303到8310sv_map
: 这个参数是服务器启动时默认地图的设置,一定要自己设置。地图的路径在data/maps
中填写时不需要填写绝对路径,需要填写maps
开始的相对路径,并且不需要后缀- sv_test_cmds: 很多人开了服务器之后发现自己的模式永远都是
TestDDR
这是因为你的这个参数没有改为0,但是改为0之后,即是你是admin
也无法作弊 sv_register
: 这个参数最重要
!!! 关乎到你是否能在游戏列表找到你的服务器!默认参数为 0 即 “ipv4,ipv6” 但是有时候你的电脑并不能同时支持这两种注册方式,因此你可以尝试换成单独的ipv4
或者ipv6
直接修改即可,注意加上英文的冒号sv_max_clients_per_ip
: 这个参数不能为1!! 这样的话就不能开分身了
其他的参数和功能可以自行探索。
更多的配置参见: 设置和指令
运行服务器
最后运行服务器即可,需要制定配置文件的位置:
./DDNet-Server -f ./Configs/myServerconfig_8303.cfg
如果你想要让你的服务器一直运行,在终端关闭后也能继续运行,可以使用nohup
命令:
nohup ./DDNet-Server -f ./Configs/myServerconfig_8303.cfg
运行后的结果如下:
额外的说明(如果你有相关的服务器开发知识)
下面的这些内容是给业内人士看的,对于业余的同学,上面的内容已经够用了!!
日志文件的说明
在配置文件中有两个参数:
logfile
: 存储服务器日志,具体的路径在~/.local/share/ddnet
中sv_score_folder
: 存储地图数据,路径与上一条相同。
脚本
我额外为服务器的管理写了一个脚本,具有管理和查看服务器进程的功能(目前并不完善),供使用:
#!/bin/bash
# var:
LOG_DIR="./log"
CONFIG_DIR="./Configs"
# function:
check_log() {
temp_var=8302
if [ ! -d "$LOG_DIR" ]; then
mkdir -p "./log"
fi
for i in $(seq 1 8); do
port=$((temp_var + i))
log_file="$LOG_DIR/DDNet-server-$port.log"
if [[ -f "$log_file" ]]; then
echo "$log_file exists."
else
echo "$log_file not exists, creating..."
touch "$log_file"
if [[ -f "$log_file" ]]; then
echo "create done."
else
echo "Failed to create "$log_file", please resolve manually"
exit 1
fi
fi
done
}
start_server() {
temp_var=8302
echo "Start server engine..."
echo "Total: $1"
for i in $(seq 1 $1); do
port=$((temp_var + i))
echo "running $port ..."
log_file="$LOG_DIR/DDNet-server-$port.log"
nohup ./DDNet-Server -f "$CONFIG_DIR/myServerconfig_$port.cfg" >> "$log_file" 2>&1 &
echo "Server started on port $port with config myServerconfig_$port.cfg"
done
unset temp_var
}
start_server_logview() {
temp_var=8302
echo "Start server engine..."
echo "Total: $1"
for i in $(seq 1 $1); do
port=$((temp_var + i))
echo "running $port ..."
log_file="$LOG_DIR/DDNet-server-$port.log"
nohup ./DDNet-Server -f "$CONFIG_DIR/myServerconfig_$port.cfg" | tee -a "$log_file" > /dev/null 2>&1 &
echo "Server started on port $port with config myServerconfig_$port.cfg [log view modle]"
done
}
clear_all_log() {
temp_var=8302
echo "Start clear..."
echo "Total: 8"
for i in $(seq 1 8); do
port=$((temp_var + i))
echo "clearing $port log ..."
log_file="$LOG_DIR/DDNet-server-$port.log"
: > "$log_file"
done
}
read_target_log() {
log_file="$LOG_DIR/DDNet-server-$1.log"
cat "$log_file" | less
}
# main:
while [[ $# -gt 0 ]]; do
case "$1" in
-clear_log)
if [ -z "$2" ]; then
echo "Error: A value must follow \"-clearlog\""
exit 1
else
if [ $2 -gt 8310 ] || [ $2 -lt 8303 ]; then
echo "Error: The value after \"-clearlog\" must be between in 8303 and 8310 "
exit 1
else
DDNET_LOG_CLEAR_TAR=$2
shift 2
fi
fi
shift 2
;;
-clear_all_log)
CLEAR_ALL_LOG_FLAG=true
shift
;;
-check_log)
check_log
shift
;;
-help)
HELP_FLAG=true
shift
;;
-log_view)
LOGVIEW_FLAG=true
shift
;;
-nums)
if [ -z "$2" ]; then
echo "Error: A value must follow \"-nums\""
exit 1
else
if [ $2 -gt 8 ] || [ $2 -lt 1 ]; then
echo "Error: The value after \"-nums\" must be between 1 and 8 "
exit 1
else
DDNET_SERVER_NUM=$2
shift 2
fi
fi
;;
-pslist)
PSLIST_FLAG=true
shift
;;
-read_log)
if [ -z "$2" ]; then
echo "Error: A value must follow \"-read_log\""
exit 1
else
if [ $2 -gt 8310 ] || [ $2 -lt 8303 ]; then
echo "Error: The value after \"read_log\" must be between 8303 and 8310"
exit 1
else
READ_LOG_TAR=$2
shift 2
fi
fi
;;
-run)
RUN_FLAG=true
shift
;;
-stop_all)
STOPALL_FLAG=true
shift
;;
*)
echo "Error: Invalid parameters."
exit 1
esac
done
if [[ "$HELP_FLAG" == true ]]; then
echo "help:"
echo " -clear_log [target_ID] 清除指定日志 (ID 范围在 8303 - 8310)"
echo " -clear_all_log 清除所有日志"
echo " -check_log 检查日志完整性"
echo " -help 输出帮助信息"
echo " -log_view 启动时将日志输出在终端的同时保存"
echo " -nums [nums] 启动服务器的数量"
echo " -pslist 列出当前正在运行的所有服务器信息"
echo " -read_log [target_ID] 查看指定的服务器日志"
echo " -run 运行,必须配合 \"-nums\" 选项使用"
echo " -stop_all 停止所有服务器"
fi
if [[ "$PSLIST_FLAG" == true ]]; then
ps aux | grep 'DDNet-Server' | less
fi
if [[ "$STOPALL_FLAG" == true ]]; then
pkill -f "./DDNet-Server"
fi
if [[ "$CLEAR_ALL_LOG_FLAG" == true ]]; then
clear_all_log
fi
if [ -n "$READ_LOG_TAR" ]; then
read_target_log $READ_LOG_TAR
fi
if [ -n "$DDNET_LOG_CLEAR_TAR" ]; then
: > "$LOG_DIR/DDNet-Server-$DDNET_LOG_CLEAR_TAR.log"
fi
if [ "$RUN_FLAG" == true ]; then
check_log
if [ -n "$DDNET_SERVER_NUM" ]; then
if [[ "$LOGVIEW_FLAG" == true ]]; then
start_server_logview $DDNET_SERVER_NUM
else
start_server $DDNET_SERVER_NUM
fi
else
echo "Error: Options \"-run\" and \"-nums\" must be present at the same time."
exit 1
fi
fi
脚本功能还不够完善,仍在开发中!!!