#!/usr/bin/env bash set -euo pipefail STEAMCMDDIR="${STEAMCMDDIR:-/opt/steamcmd}" VALHEIMDIR="${VALHEIMDIR:-/opt/valheim}" BACKUPDIR="${BACKUPDIR:-/backups}" BEPINEX_URL="${BEPINEX_URL:-https://thunderstore.io/package/download/BepInExPack_Valheim/latest.zip}" SERVER_NAME="${SERVER_NAME:-Valheim Server}" WORLD_NAME="${WORLD_NAME:-Dedicated}" SERVER_PASSWORD="${SERVER_PASSWORD:-changeme}" PUBLIC="${PUBLIC:-1}" install_valheim() { echo "[valheim] installing/updating via SteamCMD..." "${STEAMCMDDIR}/steamcmd.sh" +login anonymous \ +force_install_dir "${VALHEIMDIR}" \ +app_update 896660 validate \ +quit } install_bepinex() { if [ -f "${VALHEIMDIR}/start_server_bepinex.sh" ]; then echo "[bepinex] already installed." return fi echo "[bepinex] downloading pack..." curl -L "${BEPINEX_URL}" -o /tmp/bepinex.zip unzip -q /tmp/bepinex.zip -d /tmp/bepinex cp -r /tmp/bepinex/* "${VALHEIMDIR}/" rm -rf /tmp/bepinex /tmp/bepinex.zip } 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" cp "/config/worlds_local/${WORLD_NAME}.fwl" "${BACKUPDIR}/${WORLD_NAME}_${ts}.fwl" } # Install/update install_valheim install_bepinex # Background backup loop while true; do sleep 3600 backup_world done & cd "${VALHEIMDIR}" echo "[valheim] starting server..." exec ./start_server_bepinex.sh \ -name "${SERVER_NAME}" \ -port 2456 \ -world "${WORLD_NAME}" \ -password "${SERVER_PASSWORD}" \ -public "${PUBLIC}"