首次提交

This commit is contained in:
Dcr
2025-07-22 17:58:34 +08:00
commit 9f993b7793
8 changed files with 833 additions and 0 deletions

41
DockerFile/Dockerfile Normal file
View File

@@ -0,0 +1,41 @@
# 使用Ubuntu 22.04作为基础镜像
FROM ubuntu:22.04
ENV STEAMCMD_DIR=/opt/steamcmd
ENV STEAMCMD_URL=https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get install -y \
wget \
ca-certificates \
lib32gcc-s1 \
lib32stdc++6 \
libc6-i386 \
libcurl4 \
libncurses5 \
libsdl2-2.0-0 \
libtinfo5 \
libvorbisfile3 \
lib32z1 \
&& rm -rf /var/lib/apt/lists/*
RUN mkdir -p ${STEAMCMD_DIR}
COPY install_dayz.sh /opt/install_dayz.sh
COPY start.sh /opt/start.sh
RUN chmod +x /opt/install_dayz.sh /opt/start.sh
RUN useradd -m -d /home/steam steam
RUN mkdir -p /opt/games
RUN chown -R steam:steam ${STEAMCMD_DIR} && \
chown -R steam:steam /home/steam && \
chown steam:steam /opt/install_dayz.sh && \
chown steam:steam /opt/start.sh && \
chown -R steam:steam /opt/games
WORKDIR ${STEAMCMD_DIR}
CMD ["/opt/start.sh"]

View File

@@ -0,0 +1,37 @@
#!/bin/bash
# DayZ服务器安装脚本
# 使用环境变量中的Steam用户名和密码
# 检查环境变量
if [ -z "$STEAM_USERNAME" ] || [ -z "$STEAM_PASSWORD" ]; then
echo "错误: 请设置 STEAM_USERNAME 和 STEAM_PASSWORD 环境变量"
echo "在本目录下执行 vi .env 设置环境变量"
echo "示例:"
echo "export STEAM_USERNAME=your_username"
echo "export STEAM_PASSWORD=your_password"
exit 1
fi
# 切换到SteamCMD目录
cd /opt/steamcmd
# 运行SteamCMD安装DayZ服务器
echo "开始安装DayZ服务器..."
./steamcmd.sh +login $STEAM_USERNAME $STEAM_PASSWORD +app_update 223350 validate +quit
# 检查安装结果
if [ $? -eq 0 ]; then
echo "DayZ服务器安装完成"
else
echo "安装失败,请检查用户名和密码是否正确"
exit 1
fi
# 初始化BERcon配置
password=$(tr -dc 'A-Za-z0-9!@%^_=+?' < /dev/urandom | head -c 12)
cat > /root/Steam/steamapps/common/DayZServer/battleye/beserver_x64.cfg << EOF
RConPort 2314
RConPassword $password
RestrictRCon 0
EOF

132
DockerFile/start.sh Normal file
View File

@@ -0,0 +1,132 @@
#!/bin/bash
set -e # 遇到错误时退出
echo "=========================================="
echo "SteamCMD容器启动中..."
echo "时间: $(date)"
echo "=========================================="
copy_files() {
local mod_path=$1
local parent_path=$2
local lower_addons_path="${mod_path}/addons"
local upper_addons_path="${mod_path}/Addons"
local lower_keys_path="${mod_path}/keys"
local upper_keys_path="${mod_path}/Keys"
# 处理addons目录
if [ -d "$lower_addons_path" ]; then
find "$lower_addons_path" -type f -name '*.bisign' -exec cp -dpf {} "$parent_path/addons/" \;
elif [ -d "$upper_addons_path" ]; then
find "$upper_addons_path" -type f -name '*.bisign' -exec cp -dpf {} "$parent_path/addons/" \;
fi
# 处理keys目录
if [ -d "$lower_keys_path" ]; then
find "$lower_keys_path" -type f -name '*.bikey' -exec cp -dpf {} "$parent_path/keys/" \;
elif [ -d "$upper_keys_path" ]; then
find "$upper_keys_path" -type f -name '*.bikey' -exec cp -dpf {} "$parent_path/keys/" \;
fi
}
start_dayzserver() {
cd /root/Steam/steamapps/common/DayZServer
# 初始化mod变量
client_mods=""
server_mods=""
while IFS= read -r -d $'\0' folder; do
echo "处理客户端mod: $folder"
copy_files "$folder" "."
if [ -n "$client_mods" ]; then
client_mods="${client_mods};"
fi
client_mods="${client_mods}${folder}"
done < <(find "./client_mod" -type d -name '@*' -print0)
while IFS= read -r -d $'\0' folder; do
echo "处理服务端mod: $folder"
copy_files "$folder" "."
if [ -n "$server_mods" ]; then
server_mods="${server_mods};"
fi
server_mods="${server_mods}${folder}"
done < <(find "./server_mod" -type d -name '@*' -print0)
# 崩溃检测和自动重启循环
while true; do
echo "=========================================="
echo "启动DayZServer..."
echo "时间: $(date)"
echo "端口: ${DAYZ_SERVER_PORT}"
echo "CPU核心数: ${DAYZ_CPU_COUNT}"
echo "客户端mod: ${client_mods}"
echo "服务端mod: ${server_mods}"
echo "=========================================="
echo "执行命令: ./DayZServer -port=${DAYZ_SERVER_PORT} -cpuCount=${DAYZ_CPU_COUNT} -config=serverDZ.cfg -profiles=profiles -mission=./mpmissions/${DAYZ_MISSIONS} -mod=${client_mods} -servermod=${server_mods}"
# 启动DayZServer并捕获退出状态
./DayZServer -port=${DAYZ_SERVER_PORT} -cpuCount=${DAYZ_CPU_COUNT} \
"-config=serverDZ.cfg" "-profiles=profiles" \
"-mission=./mpmissions/${DAYZ_MISSIONS}" \
"-mod=${client_mods}" "-servermod=${server_mods}" &
# 保存进程ID
DAYZ_PID=$!
echo "DayZServer进程ID: $DAYZ_PID"
# 等待进程结束
wait $DAYZ_PID
EXIT_CODE=$?
echo "=========================================="
echo "DayZServer已退出"
echo "退出代码: $EXIT_CODE"
echo "时间: $(date)"
echo "=========================================="
# 检查是否正常退出退出代码0通常表示正常退出
if [ $EXIT_CODE -eq 0 ]; then
echo "DayZServer正常退出将在5秒后重启..."
sleep 5
echo "重新启动DayZServer..."
else
echo "DayZServer异常退出将在5秒后重启..."
sleep 5
echo "重新启动DayZServer..."
fi
done
}
# 检查并安装SteamCMD
if [ ! -f "/opt/steamcmd/steamcmd.sh" ]; then
echo "SteamCMD未安装开始下载和安装..."
echo "下载SteamCMD..."
wget -O /opt/steamcmd/steamcmd_linux.tar.gz ${STEAMCMD_URL}
echo "解压SteamCMD..."
tar xvzf /opt/steamcmd/steamcmd_linux.tar.gz -C /opt/steamcmd
echo "清理临时文件..."
rm /opt/steamcmd/steamcmd_linux.tar.gz
echo "设置执行权限..."
chmod +x /opt/steamcmd/steamcmd.sh
echo "SteamCMD安装完成"
else
echo "SteamCMD已存在跳过安装"
fi
if [ ! -f "/root/Steam/steamapps/common/DayZServer/DayZServer" ]; then
echo "DayZServer未安装开始安装..."
bash /opt/install_dayz.sh
else
echo "DayZServer已安装检查更新"
# 切换到SteamCMD目录
cd /opt/steamcmd
./steamcmd.sh +login $STEAM_USERNAME $STEAM_PASSWORD +app_update 223350 validate +quit
echo "启动DayZServer..."
cd /root/Steam/steamapps/common/DayZServer
start_dayzserver
fi