Files
recipe-app/deploy.sh
T
Nils-Johan Gynther 6c38101e5c
Test Suite / backend-pr-quick (push) Has been skipped
Test Suite / quick-import-pr-quick (push) Has been skipped
Test Suite / backend-full (push) Successful in 7m44s
Test Suite / flutter-quality (push) Failing after 8m15s
chore(deploy): add database maintenance and migration options
Added new deployment options to deploy.sh:
- --migrate: Runs Prisma migration deploy command
- --clean-database: Executes maintenance SQL to clean data while preserving categories

Added new maintenance directory backend/prisma/maintenance/ containing:
- clean-database.sql: SQL script for database cleaning operations

Updated deployment script to:
- Include new command-line flags in help text
- Add conditional blocks for running migrations and database cleaning
- Implement container readiness checks before running Prisma commands
- Preserve existing seed functionality while adding new maintenance features
2026-05-20 20:58:36 +02:00

151 lines
6.1 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/bin/bash
# deploy.sh Bygg och starta om recipe-app
# Kör från: /opt/containers/recipe-app/
# Kräver: .env-fil i samma mapp
#
# Användning:
# ./deploy.sh bygg allt (backend + flutter + importer)
# ./deploy.sh --backend bygg bara backend (snabbast, ~2-3 min)
# ./deploy.sh --flutter bygg bara flutter web-app
# ./deploy.sh --importer bygg bara importer-microservice
# ./deploy.sh --seed kör full seed på databasen (opt-in)
# ./deploy.sh --migrate kör Prisma-migrationer (opt-in)
# ./deploy.sh --clean-database kör underhålls-SQL som rensar data men behåller kategorier
# ./deploy.sh --pull-always kontrollera uppdateringar för basimages (flutter:3.41.9, node:24.15.0 etc)
# ./deploy.sh --backend --seed kombinera flaggor fritt (git pull körs alltid)
set -e
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
cd "$SCRIPT_DIR"
# ── Flaggor ──────────────────────────────────────────────────────────────────
BUILD_BACKEND=false
BUILD_FLUTTER=false
BUILD_IMPORTER=false
RUN_SEED=false
RUN_MIGRATE=false
RUN_CLEAN_DATABASE=false
PULL_IMAGES=false # --pull=false är standard (snabbt)
BUILD_ALL=true # om inga specifika tjänster anges, bygg allt
for arg in "$@"; do
case "$arg" in
--backend) BUILD_BACKEND=true; BUILD_ALL=false ;;
--flutter) BUILD_FLUTTER=true; BUILD_ALL=false ;;
--importer) BUILD_IMPORTER=true; BUILD_ALL=false ;;
--seed) RUN_SEED=true ;;
--migrate) RUN_MIGRATE=true; BUILD_BACKEND=true; BUILD_ALL=false ;;
--clean-database) RUN_CLEAN_DATABASE=true; BUILD_BACKEND=true; BUILD_ALL=false ;;
--pull-always) PULL_IMAGES=true ;;
--help|-h)
sed -n '/^# Användning:/,/^[^#]/p' "$0" | grep '^#' | sed 's/^# \?//'
exit 0
;;
*) echo "Okänd flagga: $arg (--help för hjälp)"; exit 1 ;;
esac
done
if [ "$BUILD_ALL" = true ]; then
BUILD_BACKEND=true
BUILD_FLUTTER=true
BUILD_IMPORTER=true
fi
# ── Validering ────────────────────────────────────────────────────────────────
if [ ! -f ".env" ]; then
echo "Fel: .env saknas. Kopiera .env.example och fyll i värdena:"
echo " cp .env.example .env && nano .env"
exit 1
fi
# ── Git pull ──────────────────────────────────────────────────────────────────
echo "Hämtar senaste kod (recipe-app)..."
git pull origin main
echo "Hämtar senaste kod (microservice-importer)..."
(cd "$SCRIPT_DIR/../microservice-importer" && git pull origin main)
# ── Bygger valda tjänster ─────────────────────────────────────────────────────
COMPOSE="docker compose -f compose.yml -f compose.flutter.yml"
SERVICES=""
[ "$BUILD_BACKEND" = true ] && SERVICES="$SERVICES recipe-api"
[ "$BUILD_FLUTTER" = true ] && SERVICES="$SERVICES recipe-flutter"
[ "$BUILD_IMPORTER" = true ] && SERVICES="$SERVICES importer-api"
echo "Bygger: ${SERVICES:-alla tjänster}..."
if [ "$PULL_IMAGES" = true ]; then
# Kontrollera om nya versioner av basimages finns på Docker Hub / ghcr.io
echo " (kontrollerar uppdateringar för basimages...)"
$COMPOSE build $SERVICES
else
# Standard: använd lokala cachade images, snabbare
$COMPOSE build --pull=false $SERVICES
fi
echo "Startar tjänster..."
$COMPOSE up -d
# ── Prisma migreringar och databasrensning (opt-in) ───────────────────────────
if [ "$RUN_MIGRATE" = true ] || [ "$RUN_CLEAN_DATABASE" = true ]; then
CLEAN_SQL_FILE="backend/prisma/maintenance/clean-database.sql"
echo "Väntar på att backend är redo för Prisma-kommandon..."
for i in $(seq 1 30); do
if docker exec recipe-api sh -lc "test -f /app/prisma/schema.prisma" >/dev/null 2>&1; then
break
fi
echo " ...försök $i/30"
sleep 2
done
if [ "$RUN_MIGRATE" = true ]; then
echo "Kör Prisma-migrationer (deploy)..."
docker exec recipe-api sh -lc "cd /app && npx prisma migrate deploy --schema prisma/schema.prisma"
fi
if [ "$RUN_CLEAN_DATABASE" = true ]; then
if [ ! -f "$CLEAN_SQL_FILE" ]; then
echo "Fel: saknar $CLEAN_SQL_FILE"
exit 1
fi
MARIADB_ROOT_PASSWORD=$(grep MARIADB_ROOT_PASSWORD .env | cut -d '=' -f2 | tr -d '"' | tr -d "'")
MARIADB_DATABASE=$(grep MARIADB_DATABASE .env | cut -d '=' -f2 | tr -d '"' | tr -d "'")
echo "Kör databasrensning från $CLEAN_SQL_FILE ..."
docker exec -i recipe-db mariadb -uroot -p"$MARIADB_ROOT_PASSWORD" "$MARIADB_DATABASE" < "$CLEAN_SQL_FILE"
echo "Databasrensning klar (kategorier bevarade enligt SQL-filen)."
fi
echo "Uppdaterar Prisma Client..."
docker exec recipe-api sh -lc "cd /app && npx prisma generate --schema prisma/schema.prisma"
fi
# ── Seed (opt-in) ─────────────────────────────────────────────────────────────
if [ "$RUN_SEED" = true ]; then
MARIADB_ROOT_PASSWORD=$(grep MARIADB_ROOT_PASSWORD .env | cut -d '=' -f2 | tr -d '"' | tr -d "'")
MARIADB_DATABASE=$(grep MARIADB_DATABASE .env | cut -d '=' -f2 | tr -d '"' | tr -d "'")
echo "Väntar på att databasen är redo..."
for i in $(seq 1 30); do
if docker exec recipe-db mariadb-admin ping -h 127.0.0.1 -uroot -p"$MARIADB_ROOT_PASSWORD" --silent 2>/dev/null; then
break
fi
echo " ...försök $i/30"
sleep 2
done
if [ -f "db/seeds/seed_all.sql" ]; then
docker exec -i recipe-db mariadb -uroot -p"$MARIADB_ROOT_PASSWORD" "$MARIADB_DATABASE" \
< db/seeds/seed_all.sql
echo "Full seed klar."
else
echo "Ingen db/seeds/seed_all.sql hittades — hoppar över seed."
fi
fi
echo "Status:"
$COMPOSE ps