From c0b02b09e53017e26ee583f57b6c86672c38caa5 Mon Sep 17 00:00:00 2001 From: Joel Maxwell Date: Sun, 13 Sep 2026 19:40:42 -0300 Subject: [PATCH] init --- Dockerfile | 36 ++++++++++++++++++++++++++++++ backup.sh | 13 +++++++++++ compose.yml | 18 +++++++++++++++ entrypoint.sh | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 128 insertions(+) create mode 100644 Dockerfile create mode 100644 backup.sh create mode 100644 compose.yml create mode 100644 entrypoint.sh diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..a311088 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,36 @@ +FROM debian:12-slim + +ENV DEBIAN_FRONTEND=noninteractive +ENV STEAMCMDDIR=/opt/steamcmd +ENV VALHEIMDIR=/opt/valheim +ENV BACKUPDIR=/backups + +RUN apt-get update && \ + apt-get install -y --no-install-recommends \ + ca-certificates \ + curl \ + wget \ + unzip \ + tzdata \ + lib32gcc-s1 \ + lib32stdc++6 && \ + rm -rf /var/lib/apt/lists/* + +# 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 + +# Copy scripts +COPY entrypoint.sh /entrypoint.sh +COPY backup.sh /backup.sh +RUN chmod +x /entrypoint.sh /backup.sh + +WORKDIR ${VALHEIMDIR} + +EXPOSE 2456/udp 2457/udp 2458/udp + +VOLUME ["/config", "/backups"] + +ENTRYPOINT ["/entrypoint.sh"] diff --git a/backup.sh b/backup.sh new file mode 100644 index 0000000..be75815 --- /dev/null +++ b/backup.sh @@ -0,0 +1,13 @@ +#!/usr/bin/env bash +set -euo pipefail + +WORLD_NAME="${WORLD_NAME:-Dedicated}" +BACKUPDIR="${BACKUPDIR:-/backups}" + +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" + +echo "Backup complete: ${BACKUPDIR}/${WORLD_NAME}_${ts}" diff --git a/compose.yml b/compose.yml new file mode 100644 index 0000000..b350f31 --- /dev/null +++ b/compose.yml @@ -0,0 +1,18 @@ +services: + valheim: + image: valheim-managed:latest + container_name: valheim + restart: unless-stopped + environment: + SERVER_NAME: "Minisip Valheim" + WORLD_NAME: "MinisipWorld" + SERVER_PASSWORD: "changeme" + PUBLIC: "1" + TZ: "America/Moncton" + volumes: + - /mnt/tank/valheim/config:/config + - /mnt/tank/valheim/backups:/backups + ports: + - "2456:2456/udp" + - "2457:2457/udp" + - "2458:2458/udp" diff --git a/entrypoint.sh b/entrypoint.sh new file mode 100644 index 0000000..3e87c5d --- /dev/null +++ b/entrypoint.sh @@ -0,0 +1,61 @@ +#!/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}"