#!/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