<!--
  Copyright (c) 2024-2025 Тарабанов Александр Викторович
  All rights reserved.
  
  This software is proprietary and confidential.
  Unauthorized copying, modification, or distribution is prohibited.
  
  For licensing inquiries: info@hb3-accelerator.com
  Website: https://hb3-accelerator.com
  GitHub: https://github.com/HB3-ACCELERATOR
-->

# 🔄 Перенос зашифрованных данных между серверами

## 📋 Обзор

При переносе зашифрованных данных важно передать **и данные, и ключ шифрования** вместе.

## 🎯 Способы переноса

### **1. 🔑 Перенос с ключом шифрования (Рекомендуемый)**

#### **Создание миграционного пакета:**
```bash
chmod +x migrate-encrypted-data.sh
./migrate-encrypted-data.sh
```

#### **Что включается в пакет:**
- ✅ Бэкап базы данных (зашифрованные данные)
- ✅ Ключ шифрования (`full_db_encryption.key`)
- ✅ Скрипты шифрования/расшифровки
- ✅ Сервис для работы с зашифрованными данными

### **2. 🌐 Перенос через SSH**
```bash
# На исходном сервере
./migrate-encrypted-data.sh
# Выберите опцию 2 - SSH

# Автоматически создастся архив и отправится на целевой сервер
```

### **3. ☁️ Перенос через облачное хранилище**
```bash
# На исходном сервере
./migrate-encrypted-data.sh
# Выберите опцию 3 - Облачное хранилище

# Архив загрузится в S3/другое облачное хранилище
# Скачайте на целевой сервер и восстановите
```

### **4. 💾 Перенос через локальный носитель**
```bash
# На исходном сервере
./migrate-encrypted-data.sh
# Выберите опцию 4 - Локальный носитель

# Скопируйте архив на USB/SSD/другой носитель
# Перенесите на целевой сервер
```

## 🚀 Пошаговая инструкция

### **Этап 1: Подготовка исходного сервера**

#### **A. Создание миграционного пакета:**
```bash
# Создаём полный бэкап с ключом
./migrate-encrypted-data.sh
# Выберите опцию 1 - "Создать бэкап с ключом"

# Результат: migration_package_YYYYMMDD_HHMMSS.tar.gz
```

#### **B. Проверка содержимого:**
```bash
# Просмотр содержимого архива
tar -tzf migration_package_*.tar.gz

# Должно содержать:
# - encrypted_backup_*.sql (бэкап БД)
# - ssl/keys/full_db_encryption.key (ключ шифрования)
# - encrypt-all-tables.sh (скрипт шифрования)
# - decrypt-all-tables.sh (скрипт расшифровки)
# - backend/services/encryptedDataService.js (сервис)
```

### **Этап 2: Перенос на целевой сервер**

#### **A. Копирование архива:**
```bash
# Способ 1: SCP
scp migration_package_*.tar.gz user@target-server:/tmp/

# Способ 2: USB/локальный носитель
# Скопируйте файл на носитель и перенесите физически

# Способ 3: Облачное хранилище
# Скачайте архив из S3/другого хранилища
```

#### **B. Восстановление на целевом сервере:**
```bash
# 1. Распаковка архива
tar -xzf migration_package_*.tar.gz -C /path/to/your/app/

# 2. Восстановление ключа шифрования
chmod 600 ssl/keys/full_db_encryption.key

# 3. Восстановление базы данных
docker exec dapp-postgres psql -U dapp_user dapp_db < encrypted_backup_*.sql

# 4. Проверка целостности
./migrate-encrypted-data.sh
# Выберите опцию 5 - "Проверить целостность"
```

### **Этап 3: Проверка работоспособности**

#### **A. Проверка подключения к БД:**
```bash
# Проверяем подключение
docker exec dapp-postgres pg_isready -U dapp_user -d dapp_db

# Проверяем зашифрованные данные
docker exec dapp-postgres psql -U dapp_user -d dapp_db -c "
SELECT 
    table_name,
    COUNT(*) as encrypted_columns
FROM information_schema.columns 
WHERE table_schema = 'public'
AND column_name LIKE '%_encrypted'
GROUP BY table_name;"
```

#### **B. Тестирование приложения:**
```bash
# Запускаем приложение
docker-compose up -d

# Проверяем API
curl -X GET http://localhost:8000/api/health
curl -X GET http://localhost:8000/api/users
```

## 🔐 Безопасность при переносе

### **1. Защита ключа шифрования:**
```bash
# Правильные права доступа
chmod 600 ssl/keys/full_db_encryption.key

# Резервная копия ключа
cp ssl/keys/full_db_encryption.key ssl/keys/full_db_encryption.key.backup

# Проверка целостности
sha256sum ssl/keys/full_db_encryption.key
```

### **2. Безопасная передача:**
- Используйте SSH для передачи
- Шифруйте архив дополнительно
- Используйте защищённые каналы связи

### **3. Очистка после переноса:**
```bash
# Удаляем временные файлы
rm -rf migration_backups/
rm -f /tmp/migration_package_*.tar.gz

# Очищаем историю команд
history -c
```

## ⚠️ Важные замечания

### **1. Совместимость версий:**
- Убедитесь, что версии PostgreSQL одинаковые
- Проверьте совместимость расширений (pgcrypto)
- Убедитесь в совместимости Docker образов

### **2. Размер данных:**
- Зашифрованные данные занимают больше места
- Учитывайте размер при планировании переноса
- Используйте сжатие для больших баз данных

### **3. Время простоя:**
- Миграция может занять время
- Планируйте время простоя
- Используйте репликацию для минимизации простоя

### **4. Восстановление:**
```bash
# В случае проблем с миграцией
# Восстановите из резервной копии
docker exec dapp-postgres psql -U dapp_user -d dapp_db < backup.sql

# Восстановите ключ
cp ssl/keys/full_db_encryption.key.backup ssl/keys/full_db_encryption.key
```

## 🎯 Результат

После успешной миграции:
- ✅ Все данные перенесены с шифрованием
- ✅ Ключ шифрования восстановлен
- ✅ Приложение работает на новом сервере
- ✅ Безопасность данных сохранена

**Миграция зашифрованных данных завершена успешно!** 🔒 