#!/bin/bash # ============================================================================= # apply_update.sh - Service update and restart logic # ============================================================================= # Called by update.sh after git pull. Performs the actual service updates: # 1. Updates .env with any new variables (03_generate_secrets.sh --update) # 2. Runs service selection wizard (04_wizard.sh) to update profiles # 3. Configures services (05_configure_services.sh) # 4. Pulls latest Docker images for selected services # 5. Restarts all services (06_run_services.sh) # 6. Displays final report (07_final_report.sh) # # Handles multiple compose files: main, n8n-workers, Supabase, and Dify. # # Usage: Called automatically by update.sh (not typically run directly) # ============================================================================= set -e # Source the utilities file and initialize paths source "$(dirname "$0")/utils.sh" init_paths # Set the compose command explicitly to use docker compose subcommand COMPOSE_CMD="docker compose" # Path to the 06_run_services.sh script RUN_SERVICES_SCRIPT="$SCRIPT_DIR/06_run_services.sh" # Check if run services script exists require_file "$RUN_SERVICES_SCRIPT" "$RUN_SERVICES_SCRIPT not found." cd "$PROJECT_ROOT" # Send telemetry: update started send_telemetry "update_start" # --- Call 03_generate_secrets.sh in update mode --- log_info "Ensuring .env file is up-to-date with all variables..." bash "$SCRIPT_DIR/03_generate_secrets.sh" --update || { log_error "Failed to update .env configuration via 03_generate_secrets.sh. Update process cannot continue." exit 1 } log_success ".env file updated successfully." # --- End of .env update by 03_generate_secrets.sh --- # --- Run Service Selection Wizard FIRST to get updated profiles --- log_info "Running Service Selection Wizard to update service choices..." bash "$SCRIPT_DIR/04_wizard.sh" || { log_error "Service Selection Wizard failed. Update process cannot continue." exit 1 } log_success "Service selection updated." # --- End of Service Selection Wizard --- # --- Configure Services (prompts and .env updates) --- log_info "Configuring services (.env updates for optional inputs)..." bash "$SCRIPT_DIR/05_configure_services.sh" || { log_error "Configure Services failed. Update process cannot continue." exit 1 } log_success "Service configuration completed." # Clean up legacy n8n worker containers from old naming convention cleanup_legacy_n8n_workers # Pull latest versions of selected containers based on updated .env log_info "Pulling latest versions of selected containers..." COMPOSE_FILES_FOR_PULL=("-f" "$PROJECT_ROOT/docker-compose.yml") # Check if n8n workers file exists (generated by 05_configure_services.sh) N8N_WORKERS_COMPOSE_FILE="$PROJECT_ROOT/docker-compose.n8n-workers.yml" if [ -f "$N8N_WORKERS_COMPOSE_FILE" ]; then COMPOSE_FILES_FOR_PULL+=("-f" "$N8N_WORKERS_COMPOSE_FILE") fi # Check if Supabase directory and its docker-compose.yml exist SUPABASE_DOCKER_DIR="$PROJECT_ROOT/supabase/docker" SUPABASE_COMPOSE_FILE_PATH="$SUPABASE_DOCKER_DIR/docker-compose.yml" if [ -d "$SUPABASE_DOCKER_DIR" ] && [ -f "$SUPABASE_COMPOSE_FILE_PATH" ]; then COMPOSE_FILES_FOR_PULL+=("-f" "$SUPABASE_COMPOSE_FILE_PATH") fi # Check if Dify directory and its docker-compose.yaml exist DIFY_DOCKER_DIR="$PROJECT_ROOT/dify/docker" DIFY_COMPOSE_FILE_PATH="$DIFY_DOCKER_DIR/docker-compose.yaml" if [ -d "$DIFY_DOCKER_DIR" ] && [ -f "$DIFY_COMPOSE_FILE_PATH" ]; then COMPOSE_FILES_FOR_PULL+=("-f" "$DIFY_COMPOSE_FILE_PATH") fi # Use the project name "localai" for consistency. # This command WILL respect COMPOSE_PROFILES from the .env file (updated by the wizard above). $COMPOSE_CMD -p "localai" "${COMPOSE_FILES_FOR_PULL[@]}" pull --ignore-buildable || { log_error "Failed to pull Docker images for selected services. Check network connection and Docker Hub status." exit 1 } # Start PostgreSQL first to initialize databases before other services log_info "Starting PostgreSQL..." $COMPOSE_CMD -p "localai" up -d postgres || { log_error "Failed to start PostgreSQL"; exit 1; } # Initialize PostgreSQL databases for services (creates if not exist) # This must run BEFORE other services that depend on these databases bash "$SCRIPT_DIR/init_databases.sh" || { log_warning "Database initialization had issues, but continuing..."; } # Start all services using the 06_run_services.sh script (postgres is already running) log_info "Running Services..." bash "$RUN_SERVICES_SCRIPT" || { log_error "Failed to start services. Check logs for details."; exit 1; } log_success "Update application completed successfully!" # --- Fix file permissions --- log_info "Fixing file permissions..." bash "$SCRIPT_DIR/08_fix_permissions.sh" || { log_warning "Failed to fix file permissions. This does not affect the update." } # --- End of Fix permissions --- # --- Display Final Report with Credentials --- bash "$SCRIPT_DIR/07_final_report.sh" || { log_warning "Failed to display the final report. This does not affect the update." # We don't exit 1 here as the update itself was successful. } # --- End of Final Report --- # Send telemetry: update completed with current services send_telemetry "update_complete" "$(read_env_var COMPOSE_PROFILES)" exit 0