diff --git a/Dockerfile b/Dockerfile index 9089607..f021e46 100644 --- a/Dockerfile +++ b/Dockerfile @@ -16,16 +16,23 @@ RUN apt-get update && \ lib32stdc++6 && \ rm -rf /var/lib/apt/lists/* -RUN mkdir -p ${STEAMCMDDIR} ${VALHEIMDIR} ${BACKUPDIR} && \ - cd ${STEAMCMDDIR} && \ +# Create directories and install SteamCMD +RUN mkdir -p "${STEAMCMDDIR}" "${VALHEIMDIR}" "${BACKUPDIR}" && \ + cd "${STEAMCMDDIR}" && \ wget https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz && \ tar -xzf steamcmd_linux.tar.gz && rm steamcmd_linux.tar.gz +# Set working directory BEFORE copying scripts +WORKDIR ${VALHEIMDIR} + +# Copy scripts COPY entrypoint.sh /entrypoint.sh COPY backup.sh /backup.sh RUN chmod +x /entrypoint.sh /backup.sh -WORKDIR ${VALHEIMDIR} +# Copy managed wrapper into the correct directory +COPY start_server_managed.sh ./start_server_managed.sh +RUN chmod +x ./start_server_managed.sh EXPOSE 2456/udp 2457/udp 2458/udp diff --git a/entrypoint.sh b/entrypoint.sh index 41479f5..8df8b8f 100644 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -1,11 +1,11 @@ #!/usr/bin/env bash -set -euo pipefail +set -uo pipefail export TERM=xterm STEAMCMDDIR="${STEAMCMDDIR:-/opt/steamcmd}" VALHEIMDIR="${VALHEIMDIR:-/opt/valheim}" -BACKUPDIR="${BACKUPDIR:-/backups}" +BACKUPDIR="${BACKUPDIR:-/mnt/backups}" BEPINEX_URL="${BEPINEX_URL:-https://cloud.theminisip.ca/index.php/s/K32Lnjc6TyWXaiN/download}" @@ -14,6 +14,9 @@ WORLD_NAME="${WORLD_NAME:-Dedicated}" SERVER_PASSWORD="${SERVER_PASSWORD:-changeme}" PUBLIC="${PUBLIC:-1}" +# REQUIRED FIX: remove trailing slash +UNITY3D_WORLDS="/root/.config/unity3d/IronGate/Valheim" + install_valheim() { echo "[valheim] installing/updating via SteamCMD (forced non-interactive)..." "${STEAMCMDDIR}/steamcmd.sh" \ @@ -39,7 +42,6 @@ install_bepinex() { mkdir -p /tmp/bepinex unzip -q /tmp/bepinex.zip -d /tmp/bepinex - # Folder confirmed by you bep_root="/tmp/bepinex/BepInExPack_Valheim" if [ ! -d "${bep_root}" ]; then @@ -51,34 +53,34 @@ install_bepinex() { echo "[bepinex] copying contents of ${bep_root} to ${VALHEIMDIR}" cp -r "${bep_root}/"* "${VALHEIMDIR}/" - # Fix CRLF if present sed -i 's/\r$//' "${VALHEIMDIR}/start_server_bepinex.sh" - - # Ensure executable chmod +x "${VALHEIMDIR}/start_server_bepinex.sh" + + echo "[managed] patching BepInEx password override..." + sed -i '/PASSWORD=/d' "${VALHEIMDIR}/start_server_bepinex.sh" + sed -i '/changeme/d' "${VALHEIMDIR}/start_server_bepinex.sh" + sed -i '/password/d' "${VALHEIMDIR}/start_server_bepinex.sh" + + echo "[managed] rewriting BepInEx launch command..." + + sed -i '/exec .*valheim_server.x86_64/d' "${VALHEIMDIR}/start_server_bepinex.sh" + + cat >> "${VALHEIMDIR}/start_server_bepinex.sh" << EOF +exec ./valheim_server.x86_64 \ + -name "${SERVER_NAME}" \ + -port 2456 \ + -world "${WORLD_NAME}" \ + -savedir "${UNITY3D_WORLDS}" \ + -password "${SERVER_PASSWORD}" \ + -public "${PUBLIC}" +EOF } -backup_world() { - echo "[backup] backing up world..." - ts=$(date +"%Y-%m-%d_%H-%M-%S") - mkdir -p "${BACKUPDIR}" - cp "/config/worlds_local/${WORLD_NAME}.db" "${BACKUPDIR}/${WORLD_NAME}_${ts}.db" || true - cp "/config/worlds_local/${WORLD_NAME}.fwl" "${BACKUPDIR}/${WORLD_NAME}_${ts}.fwl" || true -} - -install_valheim -install_bepinex - -# Background backup loop -while true; do - sleep 3600 - backup_world -done & - -cd "${VALHEIMDIR}" - -echo "[valheim] using password: ${SERVER_PASSWORD}" -echo "[valheim] starting server..." +install_wrapper() { + echo "[managed] installing wrapper script..." + cat > "${VALHEIMDIR}/start_server_managed.sh" << EOF +#!/usr/bin/env bash +set -uo pipefail exec ./start_server_bepinex.sh \ -name "${SERVER_NAME}" \ @@ -86,3 +88,40 @@ exec ./start_server_bepinex.sh \ -world "${WORLD_NAME}" \ -password "${SERVER_PASSWORD}" \ -public "${PUBLIC}" +EOF + + chmod +x "${VALHEIMDIR}/start_server_managed.sh" +} + +backup_world() { + echo "[backup] backing up world directory..." + ts=$(date +"%Y-%m-%d_%H-%M-%S") + mkdir -p "${BACKUPDIR}" + + world_dir="${UNITY3D_WORLDS}/worlds_local/${WORLD_NAME}" + + if [ -d "${world_dir}" ]; then + zip -r "${BACKUPDIR}/${WORLD_NAME}_${ts}.zip" "${world_dir}" + echo "[backup] created ${BACKUPDIR}/${WORLD_NAME}_${ts}.zip" + else + echo "[backup] WARNING: world directory not found: ${world_dir}" + fi +} + +install_valheim +install_bepinex +install_wrapper + +mkdir -p "${UNITY3D_WORLDS}" || true + +while true; do + sleep 3600 + backup_world +done & + +cd "${VALHEIMDIR}" + +echo "[valheim] starting server..." + +# REQUIRED FIX: clean exec line +exec ./start_server_managed.sh