#!/usr/bin/env bash # 2026年5月7日 # 项目地址: 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 \ libatomic1 \ libatomic1:i386 \ 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}" find "${ETS2_BIN_DIR}" -type d -exec chmod 775 {} \; 2>/dev/null || true find "${ETS2_BIN_DIR}" -type f -exec chmod 664 {} \; 2>/dev/null || true chmod +x "${SERVER_SCRIPT_PATH}" || true chmod +x "${ETS2_BIN_DIR}/server_launch.sh" 2>/dev/null || true chmod +x "${ETS2_BIN_DIR}/eurotrucks2_server" 2>/dev/null || true find "${ETS2_DOC_DIR}" -type d -exec chmod 775 {} \; 2>/dev/null || true find "${ETS2_DOC_DIR}" -type f -exec chmod 664 {} \; 2>/dev/null || true echo "[OK] 权限设置完成" echo echo "十、创建快捷命令 ets2_sv" rm -f "${ETS2_CMD}" cat > "${ETS2_CMD}" <