From fe6fac84645384882a6f7da76f82102e644d6f5c Mon Sep 17 00:00:00 2001 From: Nils-Johan Gynther Date: Sun, 3 May 2026 11:41:49 +0200 Subject: [PATCH] feat(reset-script): add script for full database reset and rebuild process --- scripts/reset_recipe_stack.sh | 106 ++++++++++++++++++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 scripts/reset_recipe_stack.sh diff --git a/scripts/reset_recipe_stack.sh b/scripts/reset_recipe_stack.sh new file mode 100644 index 00000000..ae05613a --- /dev/null +++ b/scripts/reset_recipe_stack.sh @@ -0,0 +1,106 @@ +#!/usr/bin/env bash +set -Eeuo pipefail + +# ---------------------------------------- +# Config +# ---------------------------------------- +APP_DIR="${1:-/opt/containers/recipe-app}" +COMPOSE_FILES=(-f compose.yml -f compose.flutter.yml) +DB_CONTAINER="recipe-db" +IMPORTER_DIR="../microservice-importer" +SEED_FILE="db/seeds/seed_all.sql" + +# ---------------------------------------- +# Helpers +# ---------------------------------------- +log() { echo "[reset] $*"; } +fail() { echo "[reset][ERROR] $*" >&2; exit 1; } + +require_cmd() { + command -v "$1" >/dev/null 2>&1 || fail "Saknar kommando: $1" +} + +# ---------------------------------------- +# Preflight +# ---------------------------------------- +require_cmd docker +require_cmd git +require_cmd grep +require_cmd cut +require_cmd tr + +cd "$APP_DIR" || fail "Kunde inte byta till katalog: $APP_DIR" + +[ -f ".env" ] || fail ".env saknas i $APP_DIR" +[ -f "compose.yml" ] || fail "compose.yml saknas" +[ -f "compose.flutter.yml" ] || fail "compose.flutter.yml saknas" +[ -f "$SEED_FILE" ] || fail "$SEED_FILE saknas" +[ -d "$IMPORTER_DIR/.git" ] || fail "Importer-repot hittades inte i $IMPORTER_DIR" + +# Läs DB-variabler från .env (samma stil som manuella seed-kommandon) +DB_PASS="$(grep '^MARIADB_ROOT_PASSWORD=' .env | cut -d '=' -f2 | tr -d '"' | tr -d "'")" +DB_NAME="$(grep '^MARIADB_DATABASE=' .env | cut -d '=' -f2 | tr -d '"' | tr -d "'")" + +[ -n "${DB_PASS:-}" ] || fail "MARIADB_ROOT_PASSWORD är tom i .env" +[ -n "${DB_NAME:-}" ] || fail "MARIADB_DATABASE är tom i .env" + +echo +echo "VARNING: Detta gör en full reset av databasen." +echo "All data i DB-volymen försvinner (användare, inventarie, pantry, historik)." +echo +read -r -p "Fortsätt? Skriv JA för att bekräfta: " CONFIRM +[ "$CONFIRM" = "JA" ] || fail "Avbrutet av användare" + +# ---------------------------------------- +# Pull latest code +# ---------------------------------------- +log "Hämtar senaste kod för recipe-app" +git pull origin main + +log "Hämtar senaste kod för microservice-importer" +(cd "$IMPORTER_DIR" && git pull origin main) + +# ---------------------------------------- +# Full reset + rebuild +# ---------------------------------------- +log "Stoppar stacken och tar bort volymer" +docker compose "${COMPOSE_FILES[@]}" down -v --remove-orphans + +log "Bygger och startar stacken igen" +docker compose "${COMPOSE_FILES[@]}" up -d --build + +# ---------------------------------------- +# Wait for DB +# ---------------------------------------- +log "Väntar på databasen" +for i in $(seq 1 60); do + if docker exec "$DB_CONTAINER" mariadb-admin ping -h 127.0.0.1 -uroot -p"$DB_PASS" --silent >/dev/null 2>&1; then + log "Databasen är redo" + break + fi + if [ "$i" -eq 60 ]; then + fail "Databasen blev inte redo i tid" + fi + sleep 2 +done + +# ---------------------------------------- +# Run full seed +# ---------------------------------------- +log "Kör full seed från $SEED_FILE" +docker exec -i "$DB_CONTAINER" mariadb -uroot -p"$DB_PASS" "$DB_NAME" < "$SEED_FILE" + +# ---------------------------------------- +# Post-checks +# ---------------------------------------- +log "Visar container-status" +docker compose "${COMPOSE_FILES[@]}" ps + +log "Kontrollerar kategori-kopplingar på produkter" +docker exec -i "$DB_CONTAINER" mariadb -uroot -p"$DB_PASS" "$DB_NAME" -e " +SELECT COUNT(*) AS total_products FROM Product; +SELECT COUNT(*) AS products_with_category FROM Product WHERE categoryId IS NOT NULL; +SELECT COUNT(*) AS products_without_category FROM Product WHERE categoryId IS NULL; +" + +log "Klart"