# Runbook — Восстановление prod из snapshot

Версия документа: v2.34.0 · Последнее обновление: 2026-04-27

## Когда применять

- Drop droplet'а glsoft-prod-01 (хардвейр, network, kernel panic)
- Откат после неудачного релиза с потерей данных
- Перенос на новый region/size

## Что нужно на руках

- Доступ к DigitalOcean web UI (или `doctl` с `DIGITALOCEAN_API_TOKEN`)
- Доступ к Vault passphrase ("день Тироля" / 100419826444)
- SSH-ключ владельца, добавленный в DO account
- Reserved IP `161.35.217.19` (он сейчас прицеплен к `glsoft-prod-01`)

## Шаги

### 1. Выбрать snapshot

В DigitalOcean web UI:
1. Droplets → glsoft-prod-01 → tab "Snapshots"
2. Выбрать самый свежий snapshot со статусом Available (имя вида `glsoft-prod-01-2026-04-27-0300`)
3. Если droplet уже мёртв — Snapshots глобально → найти snapshot по имени

### 2. Создать новый droplet из snapshot

1. Кнопка "Create droplet from snapshot"
2. Region: **fra1** (тот же)
3. Size: тот же что был у glsoft-prod-01 (по умолчанию s-2vcpu-4gb если не помнишь)
4. SSH keys: добавить ключ владельца
5. Hostname: `glsoft-prod-01-restored` (временное имя)

Дождаться, когда droplet станет Active (~1 минута).

### 3. Переключить reserved IP

Это критично — на reserved IP смотрит DNS A-record `glpay.dev`, переключение быстрее чем DNS-update.

В DO web UI:
1. Networking → Reserved IPs
2. Найти `161.35.217.19` (сейчас на старом droplet)
3. "Reassign" → выбрать новый droplet `glsoft-prod-01-restored`
4. Подтвердить

В течение ~10 секунд трафик пойдёт на новый droplet.

### 4. SSH в новый droplet, проверить службу

```bash
ssh root@161.35.217.19
cd /opt/glsoft
systemctl status glsoft
```

Должно быть `active (running)`. Если нет:
```bash
journalctl -u glsoft -n 100 --no-pager
systemctl restart glsoft
```

### 5. Vault unlock

После восстановления tmpfs пуст, vault залочен:

```bash
curl -s http://localhost:8080/vault/status
# {"unlocked": false, ...}
```

Открыть https://glpay.dev/vault/unlock в браузере, ввести passphrase ("день Тироля" / 100419826444). Или через API:

```bash
curl -X POST https://glpay.dev/vault/unlock \
  -H 'Content-Type: application/json' \
  -d '{"Passphrase":"день Тироля"}'
```

Проверить:
```bash
curl -s https://glpay.dev/vault/status
# {"unlocked": true, ...}
```

### 6. Sanity check

```bash
curl -s https://glpay.dev/health
# {"version":"v2.X.Y", ...}
```

Версия должна совпадать с моментом, когда snapshot был сделан. Если нужно подтянуть свежие изменения с master:

```bash
cd /opt/glsoft
git fetch origin master
git reset --hard origin/master
systemctl restart glsoft
# Миграции применятся автоматом при старте.
```

### 7. Проверить ключевые endpoints

```bash
curl -s https://glpay.dev/health             # version
curl -s https://glpay.dev/intake/proposals   # пустой массив или список
curl -s https://glpay.dev/bottlenecks        # 5 предложений (если seed прошёл)
curl -s https://glpay.dev/backup/snapshots   # snapshots сохранились в DO, локальный кеш пустой — ничего страшного
```

### 8. Удалить старый droplet (опционально)

Когда новый droplet работает стабильно >1 часа:
1. DO web UI → Droplets → старый glsoft-prod-01 → Destroy

Snapshot'ы старого droplet'а останутся доступны и привязаны теперь к новому droplet'у.

## Восстановление БД отдельно (если только база битая)

В этой версии PostgreSQL живёт **внутри droplet'а** (не managed db), поэтому snapshot droplet'а покрывает и БД. Если нужен только rollback БД (а не всего droplet'а):

```bash
# Полный pg_dump каждый день в 02:30 UTC (cron) → /opt/glsoft/dumps/
ls -lah /opt/glsoft/dumps/
psql -U glsoft -d glsoft -f /opt/glsoft/dumps/glsoft-2026-04-27.sql
```

(pg_dump cron — отдельный задел, в v2.34 ещё не настроен. На сейчас snapshot — единственный метод.)

## Что делать, если SSH в новый droplet не открывается

1. DO web UI → Droplets → новый droplet → Console (через web)
2. `cat /var/log/cloud-init-output.log` — логи cloud-init
3. Проверить, что SSH-ключ был добавлен при создании
4. В крайнем случае reset root password из DO UI → войти через console → исправить ssh

## Контакты при инциденте

Owner — единственный участник. SSO/SLA нет. При проблеме:
- Telegram: chat 100419826444
- Email: указан в DO account
