Newer
Older
homeassistant-infra / scripts / sync-test-to-prod.sh
#!/bin/bash
#
# Skrypt do synchronizacji konfiguracji Home Assistant: TEST → PROD
# Użycie: ./sync-test-to-prod.sh
#

set -e

TEST_IP="192.168.50.210"
PROD_IP="192.168.50.211"
HA_CONFIG="/root/config"
BACKUP_DIR="./backups"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)

echo "======================================"
echo "🔄 Synchronizacja HA: TEST → PROD"
echo "======================================"
echo "Test: $TEST_IP"
echo "Prod: $PROD_IP"
echo "======================================"
echo ""

# Tworzenie katalogu na backupy
mkdir -p "$BACKUP_DIR"

# Funkcja do wykonywania poleceń SSH na HA
ha_cmd() {
    local host=$1
    shift
    sshpass -p "QWer!@34" ssh -o StrictHostKeyChecking=no root@${host} "$@"
}

# Sprawdzenie dostępu do środowisk
echo "🔍 Sprawdzanie dostępu do środowisk..."
if ! ha_cmd $TEST_IP "test -d $HA_CONFIG"; then
    echo "❌ Brak dostępu do TEST ($TEST_IP)"
    echo "   Upewnij się, że:"
    echo "   1. VM jest uruchomione"
    echo "   2. SSH jest włączony w HA"
    echo "   3. Hasło root jest ustawione"
    exit 1
fi

if ! ha_cmd $PROD_IP "test -d $HA_CONFIG"; then
    echo "❌ Brak dostępu do PROD ($PROD_IP)"
    exit 1
fi

echo "✅ Dostęp do obu środowisk OK"
echo ""

# Backup produkcji przed zmianami
echo "💾 Backup produkcji przed zmianami..."
PROD_BACKUP="$BACKUP_DIR/prod_backup_${TIMESTAMP}.tar.gz"
ha_cmd $PROD_IP "cd /root && tar czf - config/" > "$PROD_BACKUP"
echo "✅ Backup zapisany: $PROD_BACKUP"
echo ""

# Lista plików do synchronizacji
echo "📋 Pliki do synchronizacji:"
ha_cmd $TEST_IP "cd $HA_CONFIG && ls -lh *.yaml *.json 2>/dev/null | awk '{print \$9, \$5}'" || true
echo ""

# Potwierdzenie użytkownika
read -p "❓ Czy chcesz kontynuować synchronizację? (tak/nie): " confirm
if [ "$confirm" != "tak" ]; then
    echo "❌ Anulowano"
    exit 0
fi

# Synchronizacja konfiguracji
echo ""
echo "🔄 Synchronizacja plików konfiguracyjnych..."

# Pliki do synchronizacji (dodaj/usuń według potrzeb)
CONFIG_FILES=(
    "configuration.yaml"
    "automations.yaml"
    "scripts.yaml"
    "scenes.yaml"
    "groups.yaml"
    "customize.yaml"
    "secrets.yaml"
)

TEMP_DIR=$(mktemp -d)

for file in "${CONFIG_FILES[@]}"; do
    if ha_cmd $TEST_IP "test -f $HA_CONFIG/$file"; then
        echo "  📄 $file"
        ha_cmd $TEST_IP "cat $HA_CONFIG/$file" > "$TEMP_DIR/$file"
        cat "$TEMP_DIR/$file" | ha_cmd $PROD_IP "cat > $HA_CONFIG/$file"
    else
        echo "  ⚠️  $file - nie znaleziono w TEST"
    fi
done

# Synchronizacja katalogów (opcjonalnie)
echo ""
echo "📁 Synchronizacja katalogów custom_components, themes, www..."
for dir in "custom_components" "themes" "www"; do
    if ha_cmd $TEST_IP "test -d $HA_CONFIG/$dir"; then
        echo "  📁 $dir/"
        # Usunięcie starego katalogu na PROD
        ha_cmd $PROD_IP "rm -rf $HA_CONFIG/$dir"
        # Utworzenie archiwum na TEST
        ha_cmd $TEST_IP "cd $HA_CONFIG && tar czf - $dir/" > "$TEMP_DIR/${dir}.tar.gz"
        # Rozpakowanie na PROD
        cat "$TEMP_DIR/${dir}.tar.gz" | ha_cmd $PROD_IP "cd $HA_CONFIG && tar xzf -"
    fi
done

# Czyszczenie
rm -rf "$TEMP_DIR"

echo ""
echo "♻️  Restart Home Assistant na PROD..."
ha_cmd $PROD_IP "ha core restart" || ha_cmd $PROD_IP "systemctl restart home-assistant@homeassistant.service" || true

echo ""
echo "✅ Synchronizacja zakończona pomyślnie!"
echo ""
echo "======================================"
echo "📊 Podsumowanie"
echo "======================================"
echo "Backup PROD: $PROD_BACKUP"
echo "Data sync: $(date)"
echo ""
echo "🌐 Sprawdź produkcję:"
echo "   http://${PROD_IP}:8123"
echo ""
echo "↩️  Aby przywrócić backup:"
echo "   ./restore-backup.sh $PROD_BACKUP"
echo "======================================"