# Миграция Unishift Platform (Prod) между серверами

Инструкция по переносу prod-стека платформы с одного сервера на другой.

---

## 1. Список переносимых файлов и каталогов

### Каталог платформы (по умолчанию `/opt/unishift`)
- **`.env`** — **критично**. Секреты и ключи шифрования (`ENCRYPTION_KEY`, `JWT_SECRET`, `SESSION_SECRET`, `DB_PASSWORD`, `MINIO_ROOT_PASSWORD`, `SERVICE_TOKEN`). Без `ENCRYPTION_KEY` зашифрованные данные сервисов (токены интеграций, секреты коннекторов) восстановить невозможно.
- **`.ush-state.json`** — фиксирует список установленных сервисов и профилей для CLI `ush`.
- **`docker-compose.yaml`** и **`services.yaml`** — конфигурация сервисов и манифест.
- **`centrifugo/`** (`centrifugo/config.json`) — конфигурация WebSocket-брокера.
- **`searxng/`** (`searxng/settings.yml`) — конфигурация поискового шлюза.
- **`postgres/init/`** — SQL-скрипты первичной инициализации (`00-enable-pgvector.sql`, `01-create-databases.sql`).
- **`llama-server/models/`** (опционально) — локальные GGUF-модели (если включен LLM-профиль).

### Данные (Docker Volumes)
- **`unishift-prod_postgres-data`** — все БД сервисов (`auth_db`, `spaces_db`, `command_manager`, `flow_manager`, `task_tracker`, `scheduler_db`, `storage_db`, `env_manager_db` и др.).
- **`unishift-prod_minio-data`** — хранилище объектов (файлы, аватары, документы, артефакты).
- **`unishift-prod_nats-data`** — очереди JetStream (сообщения/события).

### Конфигурация хоста (вне `/opt/unishift`, при наличии)
- **Reverse Proxy**: `/etc/nginx/sites-available/`, `/etc/nginx/conf.d/` или конфиги Caddy/Traefik.
- **SSL-сертификаты**: `/etc/letsencrypt/` (или выпуск заново через Certbot на новом сервере).
- **CLI ush / раннеры**: `~/.ush/` и службы systemd `/etc/systemd/system/ush-*.service`.

---

## 2. Экспорт на исходном сервере

### Шаг 1. Остановка приложений для консистентности данных
```bash
cd /opt/unishift

# Остановить сервисы приложений
ush platform down

# Поднять только БД и MinIO для снятия дампов
docker compose up -d postgres minio
```

### Шаг 2. Дамп PostgreSQL (со всеми базами и расширениями pgvector)
```bash
docker compose exec -T postgres pg_dumpall -U leggnom > /opt/unishift/unishift_postgres_dump.sql
```

### Шаг 3. Бэкап хранилища MinIO
```bash
docker run --rm \
  -v unishift-prod_minio-data:/data:ro \
  -v /opt/unishift:/backup \
  alpine tar -czf /backup/minio_data.tar.gz -C /data .
```

### Шаг 4. Полная остановка стека
```bash
docker compose down
```

---

## 3. Перенос на целевой сервер

Перенести каталог `/opt/unishift` со всеми конфигами и снятыми дампами:
```bash
rsync -avzP /opt/unishift/ root@<NEW_SERVER_IP>:/opt/unishift/
```

---

## 4. Развертывание и импорт на новом сервере

### Шаг 1. Подготовка окружения (Docker + Compose v2)
```bash
curl -fsSL https://get.docker.com | sh
```

### Шаг 2. Установка CLI `ush`
```bash
curl -fsSL https://storage.unishift.ru/cli/install.sh | bash
```

### Шаг 3. Запуск инфраструктуры хранения
```bash
cd /opt/unishift
docker compose up -d postgres minio
```

### Шаг 4. Восстановление баз данных PostgreSQL
```bash
docker compose exec -T postgres psql -U leggnom -d postgres < /opt/unishift/unishift_postgres_dump.sql
```

### Шаг 5. Восстановление файлов MinIO
```bash
docker run --rm \
  -v unishift-prod_minio-data:/data \
  -v /opt/unishift:/backup \
  alpine sh -c "tar -xzf /backup/minio_data.tar.gz -C /data"
```

### Шаг 6. Обновление сетевой конфигурации (при смене IP/домена)
```bash
ush platform update --dir /opt/unishift --public-host <NEW_IP_OR_DOMAIN>
```

### Шаг 7. Запуск платформы
```bash
ush platform up --dir /opt/unishift
```

### Шаг 8. Проверка статуса
```bash
ush platform ps --dir /opt/unishift
```

### Шаг 9. Очистка временных файлов
После успешной проверки удалить файлы дампов:
```bash
rm -f /opt/unishift/unishift_postgres_dump.sql /opt/unishift/minio_data.tar.gz
```
