DDNet 服务器配置教程 Linux 环境

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到8310
  • sv_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

脚本功能还不够完善,仍在开发中!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

若亦_Royi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值