#!/bin/sh # Import n8n workflows and credentials from backup directory # This script runs inside the n8n-import container # # Credentials skip logic: # После успешного импорта создаётся маркер в /home/node/.n8n/imported/ # При повторном запуске файл с существующим маркером пропускается. # Это позволяет не перезатирать API-ключи при повторном деплое. # Чтобы принудительно переимпортировать — удалить маркер или задать FORCE_IMPORT=true set -e MARKER_DIR="/home/node/.n8n/imported" mkdir -p "$MARKER_DIR" COUNTER_FILE=$(mktemp) trap 'rm -f "$COUNTER_FILE"' EXIT echo "0" > "$COUNTER_FILE" # Import credentials first echo 'Importing credentials...' CRED_FILES=$(find /backup/credentials -maxdepth 1 -type f -not -name '.gitkeep' 2>/dev/null || true) if [ -n "$CRED_FILES" ]; then CRED_COUNT=$(echo "$CRED_FILES" | wc -l | tr -d ' ') # Normalize credentials files (wrap object in array if needed) echo "$CRED_FILES" | while IFS= read -r file; do FIRST_CHAR=$(head -c 1 "$file") if [ "$FIRST_CHAR" = "{" ]; then TMPFILE=$(mktemp) echo "[$(cat "$file")]" > "$TMPFILE" mv "$TMPFILE" "$file" fi done echo "0" > "$COUNTER_FILE" echo "$CRED_FILES" | while IFS= read -r file; do CURRENT=$(cat "$COUNTER_FILE") CURRENT=$((CURRENT + 1)) echo "$CURRENT" > "$COUNTER_FILE" filename=$(basename "$file") MARKER="$MARKER_DIR/cred_$(echo "$filename" | tr '/' '_')" printf "[%2d/%d] %s" "$CURRENT" "$CRED_COUNT" "$filename" # Пропустить если уже импортировался и FORCE_IMPORT не задан if [ -f "$MARKER" ] && [ "$FORCE_IMPORT" != "true" ]; then echo " SKIPPED (already imported, set FORCE_IMPORT=true to override)" continue fi OUTPUT_FILE=$(mktemp) if n8n import:credentials --input="$file" > "$OUTPUT_FILE" 2>&1; then echo " OK" touch "$MARKER" if [ -s "$OUTPUT_FILE" ]; then echo " Details: $(cat "$OUTPUT_FILE" | tr '\n' ' ')" fi else echo " FAILED" echo " Error: $(cat "$OUTPUT_FILE" | tr '\n' ' ')" fi rm -f "$OUTPUT_FILE" done fi # Import workflows echo '' echo 'Importing workflows...' WORKFLOW_FILES=$(find /backup/workflows -maxdepth 1 -type f -not -name '.gitkeep' 2>/dev/null || true) if [ -z "$WORKFLOW_FILES" ]; then echo 'No workflows found to import.' exit 0 fi TOTAL_FOUND=$(echo "$WORKFLOW_FILES" | wc -l | tr -d ' ') if [ -n "$IMPORT_LIMIT" ]; then WORKFLOW_FILES=$(echo "$WORKFLOW_FILES" | head -n "$IMPORT_LIMIT") fi TOTAL=$(echo "$WORKFLOW_FILES" | wc -l | tr -d ' ') echo "Importing $TOTAL of $TOTAL_FOUND workflows" echo '' echo "0" > "$COUNTER_FILE" echo "$WORKFLOW_FILES" | while IFS= read -r file; do CURRENT=$(cat "$COUNTER_FILE") CURRENT=$((CURRENT + 1)) echo "$CURRENT" > "$COUNTER_FILE" filename=$(basename "$file") printf "[%3d/%d] %s" "$CURRENT" "$TOTAL" "$filename" OUTPUT_FILE=$(mktemp) if n8n import:workflow --input="$file" > "$OUTPUT_FILE" 2>&1; then echo " OK" if [ -s "$OUTPUT_FILE" ]; then OUTPUT=$(cat "$OUTPUT_FILE") if echo "$OUTPUT" | grep -q "id"; then echo " Imported: $(echo "$OUTPUT" | tr '\n' ' ' | sed 's/[{}"]//g')" else echo " Details: $OUTPUT" fi fi else echo " FAILED" echo " Error: $(cat "$OUTPUT_FILE" | tr '\n' ' ')" fi rm -f "$OUTPUT_FILE" done echo '' echo 'Import complete!'