feat(reset-script): add script for full database reset and rebuild process
This commit is contained in:
@@ -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"
|
||||
Reference in New Issue
Block a user