#!/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")" ENV_FILE="${ENV_FILE:-.env}" if [[ ! -f "$ENV_FILE" ]]; then echo "Fant ikke $ENV_FILE – kopier .env.example til .env og juster." >&2 exit 1 fi # Verdier som bare gjelder for podman-kjøringen (ikke appen) envval() { grep -E "^$1=" "$ENV_FILE" | head -n1 | cut -d= -f2- || true; } BIND="$(envval SOAPBOX_BIND)" # tom = alle adresser (v4+v6) 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=always \ --cap-drop=all --security-opt=no-new-privileges \ --memory "$MEMORY" \ -p "${BIND:+${BIND}:}${PORT}:8080" \ -v "${VOLUME}:/data:Z" \ --env-file "$ENV_FILE" \ "$IMAGE" echo "soapbox lytter på ${BIND:-alle adresser}:${PORT} (data i ${VOLUME})" echo "Logger: podman logs -f soapbox"