301 lines
6.6 KiB
Bash
301 lines
6.6 KiB
Bash
#!/usr/bin/env bash
|
||
# 2026年5月7日-05点04分
|
||
# 项目地址: https://git.a-hxin.cn/ahxin/ets2-server.git
|
||
|
||
set -Eeuo pipefail
|
||
|
||
export DEBIAN_FRONTEND=noninteractive
|
||
export NEEDRESTART_MODE=l
|
||
|
||
REPO_HOST="https://git.a-hxin.cn/ahxin/ets2-server"
|
||
BRANCH="master"
|
||
RAW_BASE="${REPO_HOST}/raw/branch/${BRANCH}"
|
||
|
||
STEAM_USER="steam"
|
||
STEAM_HOME="/home/steam"
|
||
|
||
STEAMCMD_DIR="${STEAM_HOME}/steamcmd"
|
||
ETS2_DIR="${STEAM_HOME}/ets2_sv"
|
||
ETS2_DOC_DIR="${STEAM_HOME}/ets2_doc"
|
||
ETS2_BIN_DIR="${ETS2_DIR}/bin/linux_x64"
|
||
|
||
SERVER_SCRIPT_URL="${RAW_BASE}/server/server.sh"
|
||
SERVER_SCRIPT_PATH="${ETS2_BIN_DIR}/server.sh"
|
||
|
||
ETS2_CMD="/usr/local/bin/ets2_sv"
|
||
|
||
APP_ID="1948160"
|
||
|
||
while [ $# -gt 0 ]; do
|
||
case "$1" in
|
||
--branch)
|
||
BRANCH="$2"
|
||
RAW_BASE="${REPO_HOST}/raw/branch/${BRANCH}"
|
||
SERVER_SCRIPT_URL="${RAW_BASE}/server/server.sh"
|
||
shift 2
|
||
;;
|
||
*)
|
||
echo "[ERROR] 未知参数: $1"
|
||
exit 1
|
||
;;
|
||
esac
|
||
done
|
||
|
||
echo "========================================"
|
||
echo " ETS2 Dedicated Server 一键部署脚本"
|
||
echo " System: Ubuntu / Debian"
|
||
echo " Branch: ${BRANCH}"
|
||
echo "========================================"
|
||
|
||
if [ "$(id -u)" -ne 0 ]; then
|
||
echo "[ERROR] 请使用 root 权限执行:"
|
||
echo "curl -fsSL \"${RAW_BASE}/install_server/install_server.sh\" | sudo bash"
|
||
exit 1
|
||
fi
|
||
|
||
echo
|
||
echo "一、检查系统环境"
|
||
|
||
if [ -f /etc/os-release ]; then
|
||
. /etc/os-release
|
||
echo "[INFO] 当前系统: ${PRETTY_NAME:-unknown}"
|
||
fi
|
||
|
||
if ! command -v apt-get >/dev/null 2>&1; then
|
||
echo "[ERROR] 当前脚本主要适配 Ubuntu / Debian,未检测到 apt-get"
|
||
exit 1
|
||
fi
|
||
|
||
echo
|
||
echo "二、创建 steam 用户"
|
||
|
||
if id "${STEAM_USER}" >/dev/null 2>&1; then
|
||
echo "[OK] 用户 ${STEAM_USER} 已存在,跳过创建"
|
||
else
|
||
adduser \
|
||
--system \
|
||
--shell /bin/bash \
|
||
--gecos 'Steam Service User' \
|
||
--group \
|
||
--disabled-password \
|
||
--home "${STEAM_HOME}" \
|
||
"${STEAM_USER}"
|
||
|
||
echo "[OK] 用户 ${STEAM_USER} 创建完成"
|
||
fi
|
||
|
||
echo
|
||
echo "三、创建工作目录"
|
||
|
||
mkdir -p "${STEAMCMD_DIR}" "${ETS2_DIR}" "${ETS2_DOC_DIR}" "${ETS2_BIN_DIR}"
|
||
chown -R "${STEAM_USER}:${STEAM_USER}" "${STEAM_HOME}"
|
||
|
||
echo "[OK] 目录创建完成:"
|
||
echo "${STEAMCMD_DIR}"
|
||
echo "${ETS2_DIR}"
|
||
echo "${ETS2_DOC_DIR}"
|
||
|
||
echo
|
||
echo "四、安装运行库"
|
||
|
||
dpkg --add-architecture i386 || true
|
||
|
||
apt-get update
|
||
|
||
apt-get install -y \
|
||
sudo \
|
||
curl \
|
||
ca-certificates \
|
||
tar \
|
||
gzip \
|
||
git \
|
||
util-linux \
|
||
coreutils \
|
||
procps \
|
||
iproute2 \
|
||
libc6:i386 \
|
||
libstdc++6:i386 \
|
||
libgcc-s1:i386 \
|
||
libx11-6:i386 \
|
||
libxext6:i386 \
|
||
libxau6:i386 \
|
||
libxdmcp6:i386 \
|
||
libncurses5:i386 \
|
||
libncursesw5:i386 \
|
||
libcurl4:i386 \
|
||
zlib1g:i386 \
|
||
libbz2-1.0:i386 \
|
||
libtinfo6:i386
|
||
|
||
echo "[OK] 运行库安装完成"
|
||
|
||
echo
|
||
echo "五、下载 / 更新 SteamCMD"
|
||
|
||
sudo -u "${STEAM_USER}" bash -lc "
|
||
mkdir -p '${STEAMCMD_DIR}'
|
||
cd '${STEAMCMD_DIR}'
|
||
curl -sqL 'https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz' | tar zxvf -
|
||
chmod +x '${STEAMCMD_DIR}/steamcmd.sh'
|
||
"
|
||
|
||
echo "[OK] SteamCMD 准备完成"
|
||
|
||
echo
|
||
echo "六、安装 / 更新 ETS2 Dedicated Server"
|
||
|
||
chown -R "${STEAM_USER}:${STEAM_USER}" "${STEAMCMD_DIR}" "${ETS2_DIR}"
|
||
|
||
set +e
|
||
|
||
sudo -u "${STEAM_USER}" bash -lc "
|
||
cd '${STEAMCMD_DIR}' &&
|
||
./steamcmd.sh \
|
||
+@sSteamCmdForcePlatformType linux \
|
||
+login anonymous \
|
||
+app_info_update 1 \
|
||
+force_install_dir '${ETS2_DIR}' \
|
||
+app_update '${APP_ID}' validate \
|
||
+quit
|
||
"
|
||
|
||
INSTALL_RESULT=$?
|
||
|
||
if [ "${INSTALL_RESULT}" -ne 0 ]; then
|
||
echo "[WARN] 第一次安装失败,尝试清理 SteamCMD 缓存后重试..."
|
||
|
||
sudo -u "${STEAM_USER}" rm -rf "${STEAMCMD_DIR}/appcache" || true
|
||
sudo -u "${STEAM_USER}" rm -rf "${STEAM_HOME}/Steam/appcache" || true
|
||
sudo -u "${STEAM_USER}" rm -rf "${STEAM_HOME}/.steam/appcache" || true
|
||
|
||
sudo -u "${STEAM_USER}" bash -lc "
|
||
cd '${STEAMCMD_DIR}' &&
|
||
./steamcmd.sh \
|
||
+@sSteamCmdForcePlatformType linux \
|
||
+login anonymous \
|
||
+app_info_update 1 \
|
||
+force_install_dir '${ETS2_DIR}' \
|
||
+app_update '${APP_ID}' validate \
|
||
+quit
|
||
"
|
||
|
||
INSTALL_RESULT=$?
|
||
fi
|
||
|
||
set -e
|
||
|
||
if [ "${INSTALL_RESULT}" -ne 0 ]; then
|
||
echo "[ERROR] ETS2 Dedicated Server 安装失败"
|
||
echo
|
||
echo "可手动测试:"
|
||
echo "sudo -u steam bash -lc 'cd ${STEAMCMD_DIR} && ./steamcmd.sh +login anonymous +app_info_print ${APP_ID} +quit'"
|
||
exit 1
|
||
fi
|
||
|
||
echo "[OK] ETS2 Dedicated Server 安装完成"
|
||
|
||
echo
|
||
echo "七、安装 server.sh 管理脚本"
|
||
|
||
mkdir -p "${ETS2_BIN_DIR}"
|
||
|
||
echo "[INFO] 下载地址:${SERVER_SCRIPT_URL}"
|
||
|
||
curl -fsSL "${SERVER_SCRIPT_URL}" -o "${SERVER_SCRIPT_PATH}"
|
||
|
||
chmod +x "${SERVER_SCRIPT_PATH}"
|
||
chown "${STEAM_USER}:${STEAM_USER}" "${SERVER_SCRIPT_PATH}"
|
||
|
||
echo "[OK] server.sh 安装完成:${SERVER_SCRIPT_PATH}"
|
||
|
||
echo
|
||
echo "八、修复 steamclient.so 链接"
|
||
|
||
if [ -f "${ETS2_DIR}/linux64/steamclient.so" ]; then
|
||
sudo -u "${STEAM_USER}" mkdir -p "${STEAM_HOME}/.steam/sdk64"
|
||
|
||
sudo -u "${STEAM_USER}" ln -sfn \
|
||
"${ETS2_DIR}/linux64/steamclient.so" \
|
||
"${STEAM_HOME}/.steam/sdk64/steamclient.so"
|
||
|
||
echo "[OK] steamclient.so 链接完成"
|
||
else
|
||
echo "[WARN] 未找到 ${ETS2_DIR}/linux64/steamclient.so,跳过"
|
||
fi
|
||
|
||
echo
|
||
echo "九、创建必要目录并设置权限"
|
||
|
||
mkdir -p "${ETS2_BIN_DIR}/logs"
|
||
mkdir -p "${ETS2_DOC_DIR}/Euro Truck Simulator 2"
|
||
|
||
chown -R "${STEAM_USER}:${STEAM_USER}" "${STEAM_HOME}"
|
||
|
||
chmod -R 775 "${ETS2_BIN_DIR}" || true
|
||
chmod -R 775 "${ETS2_DOC_DIR}" || true
|
||
|
||
echo "[OK] 权限设置完成"
|
||
|
||
echo
|
||
echo "十、创建快捷命令 ets2_sv"
|
||
|
||
rm -f "${ETS2_CMD}"
|
||
|
||
cat > "${ETS2_CMD}" <<EOF
|
||
#!/usr/bin/env bash
|
||
|
||
SERVER_SCRIPT="${SERVER_SCRIPT_PATH}"
|
||
|
||
if [ ! -f "\$SERVER_SCRIPT" ]; then
|
||
echo "[ERROR] 找不到服务脚本: \$SERVER_SCRIPT"
|
||
exit 1
|
||
fi
|
||
|
||
if [ "\$(id -un)" = "${STEAM_USER}" ]; then
|
||
exec "\$SERVER_SCRIPT" "\$@"
|
||
else
|
||
exec sudo -u ${STEAM_USER} "\$SERVER_SCRIPT" "\$@"
|
||
fi
|
||
EOF
|
||
|
||
chmod +x "${ETS2_CMD}"
|
||
|
||
echo "[OK] 快捷命令创建完成:${ETS2_CMD}"
|
||
|
||
echo
|
||
echo "========================================"
|
||
echo "部署完成"
|
||
echo "========================================"
|
||
echo
|
||
echo "仓库地址:"
|
||
echo "${REPO_HOST}.git"
|
||
echo
|
||
echo "当前分支:"
|
||
echo "${BRANCH}"
|
||
echo
|
||
echo "服务器目录:"
|
||
echo "${ETS2_DIR}"
|
||
echo
|
||
echo "配置目录:"
|
||
echo "${ETS2_DOC_DIR}/Euro Truck Simulator 2"
|
||
echo
|
||
echo "管理脚本:"
|
||
echo "${SERVER_SCRIPT_PATH}"
|
||
echo
|
||
echo "快捷命令:"
|
||
echo "ets2_sv"
|
||
echo
|
||
echo "下一步:"
|
||
echo "1. 上传 server_config.sii、server_packages.sii、server_packages.dat 到:"
|
||
echo " ${ETS2_DOC_DIR}/Euro Truck Simulator 2"
|
||
echo
|
||
echo "2. 检查配置:"
|
||
echo " ets2_sv check"
|
||
echo
|
||
echo "3. 前台调试启动:"
|
||
echo " ets2_sv debug"
|
||
echo
|
||
echo "4. 后台启动:"
|
||
echo " ets2_sv start"
|
||
echo
|
||
echo "========================================" |