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:
parent
2f74de4a32
commit
4d9b6f9d90
5 changed files with 53 additions and 8 deletions
|
|
@ -31,3 +31,7 @@ SOAPBOX_PORT=8080
|
||||||
SOAPBOX_VOLUME=soapbox-data
|
SOAPBOX_VOLUME=soapbox-data
|
||||||
# Minnegrense for containeren (bildebehandling er det som bruker mest)
|
# Minnegrense for containeren (bildebehandling er det som bruker mest)
|
||||||
SOAPBOX_MEMORY=512m
|
SOAPBOX_MEMORY=512m
|
||||||
|
# run.sh tar backup av datavolumet før hver oppstart, med tidsstempel i
|
||||||
|
# filnavnet, og beholder de N nyeste. 0 = ingen backup.
|
||||||
|
SOAPBOX_BACKUP_DIR=./backups
|
||||||
|
SOAPBOX_BACKUP_KEEP=5
|
||||||
|
|
|
||||||
1
.gitignore
vendored
1
.gitignore
vendored
|
|
@ -8,3 +8,4 @@ dist/
|
||||||
.playwright-mcp/
|
.playwright-mcp/
|
||||||
*.png
|
*.png
|
||||||
.env
|
.env
|
||||||
|
backups/
|
||||||
|
|
|
||||||
|
|
@ -66,6 +66,10 @@ cp .env.example .env # sett SOAPBOX_SITE_URL og hovedbruker
|
||||||
Ny versjon: `git pull && ./build.sh && ./run.sh`. Data ligger i podman-volumet `soapbox-data`
|
Ny versjon: `git pull && ./build.sh && ./run.sh`. Data ligger i podman-volumet `soapbox-data`
|
||||||
(`podman volume inspect soapbox-data` viser stien).
|
(`podman volume inspect soapbox-data` viser stien).
|
||||||
|
|
||||||
|
`run.sh` tar automatisk backup av volumet før hver oppstart til `SOAPBOX_BACKUP_DIR`
|
||||||
|
(standard `./backups/soapbox-data-<tidsstempel>.tar.gz`) og beholder de `SOAPBOX_BACKUP_KEEP`
|
||||||
|
nyeste (standard 5). Gjenopprett med `podman volume import soapbox-data <fil>`.
|
||||||
|
|
||||||
Caddy er ren reverse proxy, se `Caddyfile.example`. Ved sub-path skal Caddy **ikke** strippe
|
Caddy er ren reverse proxy, se `Caddyfile.example`. Ved sub-path skal Caddy **ikke** strippe
|
||||||
prefikset – appen monteres selv under `SOAPBOX_BASE_PATH`.
|
prefikset – appen monteres selv under `SOAPBOX_BASE_PATH`.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@ services:
|
||||||
soapbox:
|
soapbox:
|
||||||
image: localhost/soapbox:latest
|
image: localhost/soapbox:latest
|
||||||
container_name: soapbox
|
container_name: soapbox
|
||||||
restart: unless-stopped
|
restart: always
|
||||||
ports:
|
ports:
|
||||||
- "127.0.0.1:${SOAPBOX_PORT:-8080}:8080"
|
- "127.0.0.1:${SOAPBOX_PORT:-8080}:8080"
|
||||||
volumes:
|
volumes:
|
||||||
|
|
|
||||||
50
run.sh
50
run.sh
|
|
@ -1,6 +1,10 @@
|
||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
# Starter (eller erstatter) soapbox-containeren med innstillinger fra .env.
|
# Starter (eller erstatter) soapbox-containeren med innstillinger fra .env.
|
||||||
# Idempotent: kjør på nytt etter build.sh for å rulle ut nytt image.
|
# 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
|
set -euo pipefail
|
||||||
cd "$(dirname "$0")"
|
cd "$(dirname "$0")"
|
||||||
|
|
||||||
|
|
@ -11,16 +15,48 @@ if [[ ! -f "$ENV_FILE" ]]; then
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Verdier som bare gjelder for podman-kjøringen (ikke appen)
|
# Verdier som bare gjelder for podman-kjøringen (ikke appen)
|
||||||
PORT="$(grep -E '^SOAPBOX_PORT=' "$ENV_FILE" | cut -d= -f2- || true)"
|
envval() { grep -E "^$1=" "$ENV_FILE" | head -n1 | cut -d= -f2- || true; }
|
||||||
VOLUME="$(grep -E '^SOAPBOX_VOLUME=' "$ENV_FILE" | cut -d= -f2- || true)"
|
PORT="$(envval SOAPBOX_PORT)"; PORT="${PORT:-8080}"
|
||||||
MEMORY="$(grep -E '^SOAPBOX_MEMORY=' "$ENV_FILE" | cut -d= -f2- || true)"
|
VOLUME="$(envval SOAPBOX_VOLUME)"; VOLUME="${VOLUME:-soapbox-data}"
|
||||||
PORT="${PORT:-8080}"
|
MEMORY="$(envval SOAPBOX_MEMORY)"; MEMORY="${MEMORY:-512m}"
|
||||||
VOLUME="${VOLUME:-soapbox-data}"
|
BACKUP_DIR="$(envval SOAPBOX_BACKUP_DIR)"; BACKUP_DIR="${BACKUP_DIR:-./backups}"
|
||||||
MEMORY="${MEMORY:-512m}"
|
BACKUP_KEEP="$(envval SOAPBOX_BACKUP_KEEP)"; BACKUP_KEEP="${BACKUP_KEEP:-5}"
|
||||||
IMAGE="${1:-localhost/soapbox:latest}"
|
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 \
|
podman run -d --replace --name soapbox \
|
||||||
--restart unless-stopped \
|
--restart=always \
|
||||||
--cap-drop=all --security-opt=no-new-privileges \
|
--cap-drop=all --security-opt=no-new-privileges \
|
||||||
--memory "$MEMORY" \
|
--memory "$MEMORY" \
|
||||||
-p "127.0.0.1:${PORT}:8080" \
|
-p "127.0.0.1:${PORT}:8080" \
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue