Tropical Algae's Blog
802 words
4 minutes
Minecraft-Bedrock服务器快速搭建

Download Package#

服务器需要始终保持最新,落后的版本可能影响玩家连接。

下载地址:[Click Here]

使用方法#

适用于Linux服务器,参考环境:Ubuntu 22.04 LTS Docker 24.0.4

宿主机映射配置文件与存档至容器,后续维护工作只需修改宿主机下的配置文件并重启容器。

环境变量.env变量值及注意事项见下表

server_pkg="/workspace/temp/mc/bedrock-server-1.21.73.01.zip"
sv_name="YOURCRAFT"
sv_ipv4_port="11451"
sv_ipv6_port="11452"
sv_default_world_file="/workspace/temp/mc/world.zip"
sv_root="/data/minecraft/bedrock"

运行 bash <file_name>.sh 启动服务器,执行前请先修改配置。

RED='\033[31m'
GREEN='\033[32m'
YELLOW='\033[33m'
BLUE='\033[34m'
RESET='\033[0m'

if [ -f .env ]; then
    source .env
else
    echo -e "${RED}❌ .env dose not exised! ${RESET}" >&2
    exit 1
fi
world_name="world"
config_file="server.properties"
workspace="minecraft_server_builder"
sv_world_path=${sv_root}/worlds/${world_name}
sv_version=$(echo "${server_pkg}" | grep -oP '\d+\.\d+\.\d+\.\d+')

# clean history works
echo -e "${YELLOW}Try to clean docker builder environment... ${RESET}"
rm -rf $workspace || true
echo -e "${YELLOW}Try to remove docker contain... ${RESET}"
docker rm -f minecraft_bedrock_server 2>/dev/null || true
echo -e "${YELLOW}Try to remove docker image... ${RESET}"
image_ids=$(docker images | grep minecraft_bedrock | awk '{print $3}')

if [[ -z "$image_ids" ]]; then
    echo -e "${YELLOW}⚠️  There is no image named minecraft_cedrock. ${RESET}"
else
    echo -e "${BLUE}Get images named minecraft_bedrock: ${RESET}"
    docker images | grep minecraft_bedrock
    read -p "$(echo -e "${BLUE}Did you wanna delete them? (y/n): ${RESET}")" confirm
    if [[ "${confirm}" == "y" || "${confirm}" == "Y" ]]; then
        echo -e "${BLUE}Deleting images: ${RESET}"
        echo "$image_ids"
        echo "$image_ids" | xargs docker rmi -f
        echo -e "${GREEN}✅ Delete completed! ${RESET}"
    else
        echo -e "${GREEN}🟢 The deletion operation has been canceled. ${RESET}"
    fi
fi

# initialize work environment
echo -e "${GREEN}Create work envirment -> ${workspace} ${RESET}"
mkdir -p ${workspace}
mkdir -p ${sv_root}
cd ${workspace}

# get server package
pkg_name=$(basename ${server_pkg})
if [[ ${server_pkg} =~ ^https?:// ]]; then
    echo -e "${BLUE}Downloading server package... ${RESET}"
    wget ${server_pkg}
else
    if [[ -f "${server_pkg}" ]]; then
        echo -e "${BLUE}Preparing local service files. ${RESET}"
        cp ${server_pkg} ${pkg_name}
    else
        echo -e "${RED}❌ Local service ${server_pkg} does not existed. ${RESET}" >&2
        exit 1
    fi
fi
echo -e "${BLUE}Unzip ${pkg_name}... ${RESET}"
unzip -q ${pkg_name}
rm -f ${pkg_name}

# change config
if [[ -f "${sv_root}/${config_file}" ]]; then
    cp -f ${sv_root}/${config_file} ./${config_file}
fi
sed -i -e "s/^server-name=.*/server-name=${sv_name}/" \
    -e "s/^server-port=.*/server-port=${sv_ipv4_port}/" \
    -e "s/^server-portv6=.*/server-portv6=${sv_ipv6_port}/" \
    -e "s/^level-name=.*/level-name=${world_name}/" \
    "${config_file}"

cp -f ./${config_file} ${sv_root}

# unzip default world file, skip steps when the target world already exists
if [[ -d "${sv_world_path}" ]]; then
    echo -e "${YELLOW}World already exists. ${RESET}"
elif [[ -z "${sv_default_world_file}" ]]; then
    echo -e "${RED}❌ World file not configured. ${RESET}" >&2
    exit 1
elif [[ ! -f "${sv_default_world_file}" ]]; then
    echo -e "${RED}❌ World file '${sv_default_world_file}' does not existed. ${RESET}" >&2
    exit 1
else
    echo -e "${BLUE}Copying world data... ${RESET}"
    mkdir -p ${sv_world_path} || true
    mkdir -p ./temp
    unzip -q ${sv_default_world_file} -d ./temp
    mv ./temp/*/* ${sv_world_path}
    rm -rf ./temp
fi

tee ./launch.sh <<- EOF
LD_LIBRARY_PATH=. ./bedrock_server
EOF

echo -e "${BLUE}Build Dockerfile for service: ${RESET}"

tee ./Dockerfile <<- EOF
FROM debian:bookworm-slim

LABEL maintainer="Tropical Algae<tropicalalgae@gmail.com>" version="1.0"

WORKDIR /game

RUN apt-get update && apt-get install -y --no-install-recommends libcurl4 screen ca-certificates unzip && rm -rf /var/lib/apt/lists/*

COPY . .

EXPOSE ${sv_ipv4_port}

# RUN useradd -m mcroot && chown -R mcroot /game

# USER mcroot

ENTRYPOINT ["sh", "./launch.sh"]
EOF

docker build -t minecraft_bedrock:${sv_version} .

echo -e "${GREEN}✅ Done! Minecraft startup! ${RESET}"

docker run -itd --name minecraft_bedrock_server --restart=always \
    -p ${sv_ipv4_port}:${sv_ipv4_port}/udp -p ${sv_ipv6_port}:${sv_ipv6_port}/udp \
    -v ${sv_root}/worlds:/game/worlds \
    -v ${sv_root}/server.properties:/game/server.properties \
    minecraft_bedrock:$sv_version

docker logs -f minecraft_bedrock_server
VariableValueDescribe
server_pkg官方提供的安装包,可以是URL或本地文件路径使用绝对路径
sv_name服务器名称
sv_ipv4_port服务器连接IPV4端口
sv_ipv6_port服务器连接IPV6端口[2024.3.4]暂时没使用到
sv_default_world_file服务器默认加载的World压缩包本地文件路径,空值跳过解压环节使用绝对路径
sv_root宿主机存储配置文件与地图文件的本地路径使用绝对路径

版本更新#

修改server_pkg为最新的service包,重跑脚本即可完成更新

注意: 存档文件夹默认为world,更新将不会对该文件夹做任何修改。若希望修改服务器存档,请手动修改配置文件,并将存档文件解压到sv_root下。

Minecraft-Bedrock服务器快速搭建
https://tropicalalgae.cn/posts/minecraft_server/minecraft_server/
Author
Tropical algae
Published at
2024-05-10