#!/usr/bin/env bash set -euo pipefail CONFIG_FILE="/opt/appfactory/config/appfactory.env" if [ ! -f "$CONFIG_FILE" ]; then echo "Missing config file: $CONFIG_FILE" exit 1 fi source "$CONFIG_FILE" FORCE="false" BACKUP_FILE="" if [ "${1:-}" = "--force" ]; then FORCE="true" BACKUP_FILE="${2:-}" else BACKUP_FILE="${1:-}" fi if [ "$FORCE" != "true" ]; then echo "REFUSING TO RUN RESTORE." echo "" echo "Usage:" echo " sudo ./restore-appfactory.sh --force /path/to/backup.tar.gz" exit 1 fi if [ -z "$BACKUP_FILE" ]; then echo "Missing backup file." exit 1 fi if [ ! -f "$BACKUP_FILE" ]; then echo "Backup file not found: $BACKUP_FILE" exit 1 fi echo "======================================================" echo "DANGEROUS OPERATION: APPFACTORY RESTORE" echo "======================================================" echo "" echo "Backup file:" echo " $BACKUP_FILE" echo "" echo "This will overwrite:" echo " $APPFACTORY_DIR" echo " $WORKSPACE_DIR" echo "" read -r -p "Type RESTORE to continue: " CONFIRM if [ "$CONFIRM" != "RESTORE" ]; then echo "Cancelled." exit 1 fi TIMESTAMP="$(date +%Y%m%d-%H%M%S)" EMERGENCY_BACKUP_FILE="$BACKUP_DIR/emergency-before-restore-$TIMESTAMP.tar.gz" mkdir -p "$BACKUP_DIR" echo "Creating emergency backup:" echo "$EMERGENCY_BACKUP_FILE" tar -czf "$EMERGENCY_BACKUP_FILE" \ "$APPFACTORY_DIR" \ "$WORKSPACE_DIR" echo "Stopping AppFactory containers..." if [ -d "$APPFACTORY_DIR/deploy" ]; then cd "$APPFACTORY_DIR/deploy" docker compose -f docker-compose.yml -f apps-compose.yml down || true fi echo "Restoring backup..." tar -xzf "$BACKUP_FILE" -C / echo "Fixing ownership..." chown -R "$APP_USER:$APP_GROUP" "$APPFACTORY_DIR" chown -R "$APP_USER:$APP_GROUP" "$WORKSPACE_DIR" chmod 600 "$APPFACTORY_DIR/config/appfactory.env" || true echo "Starting core services..." cd "$APPFACTORY_DIR/deploy" docker compose -f docker-compose.yml up -d TOOLS_DIR="$WORKSPACE_DIR/appfactory-tools" if [ -d "$TOOLS_DIR" ]; then cd "$TOOLS_DIR" ./scripts/generate-apps-compose.sh || true ./scripts/generate-caddyfile.sh || true ./scripts/generate-apps-page.sh || true for app_dir in "$WORKSPACE_DIR"/*; do if [ -f "$app_dir/app.yml" ]; then app_id="$(basename "$app_dir")" echo "Rebuilding app: $app_id" ./scripts/deploy-app.sh "$app_id" || true fi done fi echo "Final compose up..." cd "$APPFACTORY_DIR/deploy" docker compose -f docker-compose.yml -f apps-compose.yml up -d echo "" echo "DONE" echo "Emergency backup:" echo "$EMERGENCY_BACKUP_FILE"