run.sh: automatisk backup med rotasjon, og --restart=always

Før hver oppstart eksporteres datavolumet til
SOAPBOX_BACKUP_DIR/soapbox-data-<UTC-tidsstempel>.tar.gz; de
SOAPBOX_BACKUP_KEEP nyeste beholdes (standard 5, 0 = av). Bind-mounts
pakkes med tar, navngitte volum med podman volume export.

--restart unless-stopped byttet til --restart=always i run.sh og
compose.yaml: podman håndterer ikke unless-stopped som docker.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JcEy43fNYpwg6K6oTKakWR
This commit is contained in:
Ole-Morten Duesund 2026-08-26 14:41:16 +02:00
commit 4d9b6f9d90
5 changed files with 53 additions and 8 deletions

50
run.sh
View file

@ -1,6 +1,10 @@
#!/usr/bin/env bash
# Starter (eller erstatter) soapbox-containeren med innstillinger fra .env.
# Idempotent: kjør på nytt etter build.sh for å rulle ut nytt image.
#
# Før oppstart tas en backup av datavolumet til SOAPBOX_BACKUP_DIR med
# tidsstempel i navnet; de SOAPBOX_BACKUP_KEEP nyeste beholdes (standard 5).
# Sett SOAPBOX_BACKUP_KEEP=0 for å skru av backup.
set -euo pipefail
cd "$(dirname "$0")"
@ -11,16 +15,48 @@ if [[ ! -f "$ENV_FILE" ]]; then
fi
# Verdier som bare gjelder for podman-kjøringen (ikke appen)
PORT="$(grep -E '^SOAPBOX_PORT=' "$ENV_FILE" | cut -d= -f2- || true)"
VOLUME="$(grep -E '^SOAPBOX_VOLUME=' "$ENV_FILE" | cut -d= -f2- || true)"
MEMORY="$(grep -E '^SOAPBOX_MEMORY=' "$ENV_FILE" | cut -d= -f2- || true)"
PORT="${PORT:-8080}"
VOLUME="${VOLUME:-soapbox-data}"
MEMORY="${MEMORY:-512m}"
envval() { grep -E "^$1=" "$ENV_FILE" | head -n1 | cut -d= -f2- || true; }
PORT="$(envval SOAPBOX_PORT)"; PORT="${PORT:-8080}"
VOLUME="$(envval SOAPBOX_VOLUME)"; VOLUME="${VOLUME:-soapbox-data}"
MEMORY="$(envval SOAPBOX_MEMORY)"; MEMORY="${MEMORY:-512m}"
BACKUP_DIR="$(envval SOAPBOX_BACKUP_DIR)"; BACKUP_DIR="${BACKUP_DIR:-./backups}"
BACKUP_KEEP="$(envval SOAPBOX_BACKUP_KEEP)"; BACKUP_KEEP="${BACKUP_KEEP:-5}"
IMAGE="${1:-localhost/soapbox:latest}"
backup() {
local stamp file
stamp="$(date -u +%Y%m%d-%H%M%S)"
file="$BACKUP_DIR/soapbox-data-$stamp.tar.gz"
mkdir -p "$BACKUP_DIR"
if [[ "$VOLUME" == /* ]]; then
# Bind-mount: pakk katalogen direkte
[[ -d "$VOLUME" ]] || { echo "Ingen data å sikkerhetskopiere ennå ($VOLUME)"; return; }
tar -C "$VOLUME" -czf "$file" .
else
# Navngitt volum: podman eksporterer innholdet som tar
podman volume exists "$VOLUME" || { echo "Ingen data å sikkerhetskopiere ennå ($VOLUME)"; return; }
podman volume export "$VOLUME" | gzip > "$file"
fi
echo "Backup: $file ($(du -h "$file" | cut -f1))"
# Rotasjon: behold de N nyeste (navnene sorterer kronologisk pga. tidsstempelet)
local old
old="$(find "$BACKUP_DIR" -maxdepth 1 -name "soapbox-data-*.tar.gz" | sort | head -n "-$BACKUP_KEEP" || true)"
if [[ -n "$old" ]]; then
echo "$old" | xargs -r rm -f --
echo "Slettet $(echo "$old" | wc -l) gamle backuper (beholder $BACKUP_KEEP)"
fi
}
if [[ "$BACKUP_KEEP" -gt 0 ]]; then
backup
fi
# --restart=always: podman håndterer ikke "unless-stopped" som docker gjør;
# "always" er det som faktisk starter containeren igjen (sammen med
# podman-restart.service eller en systemd-enhet for reboot).
podman run -d --replace --name soapbox \
--restart unless-stopped \
--restart=always \
--cap-drop=all --security-opt=no-new-privileges \
--memory "$MEMORY" \
-p "127.0.0.1:${PORT}:8080" \