# Freim Deploy — runbook для AI-агента

Ты ставишь **Freim Deploy** — self-hosted деплой-платформу на один VDS:
Node 22 + SQLite + Caddy + systemd, без Docker. Панель управляет сайтами по
SSH, выдаёт HTTPS и домены, катит релизы атомарно и откатывает их по
healthcheck.

Этот файл — исполняемая инструкция. Иди строго по шагам, ничего не
пропускай и не выдумывай команды, которых здесь нет.

- Сайт: <https://artfrost1.github.io/FreimDeploy>
- Репозиторий и установщик: <https://github.com/ARTFROST1/FreimDeploy>
- Полная документация: `README.md` в репозитории

Установщик открыт — его можно прочитать до запуска. Обновления подписаны
ed25519. Исходный код платформы закрыт.

---

## 0. Что должно быть у человека до начала

Спроси и убедись, что всё есть. Не начинай установку, пока не получишь
первые три пункта.

| Что | Требование |
|---|---|
| Сервер | Debian 12+ или Ubuntu 22.04+, чистый, от 1 ГБ RAM (комфортно — от 2 ГБ), root-доступ |
| Домен | Апекс-домен, которым человек управляет в DNS (`example.com`, без `https://` и без поддомена) |
| DNS | Две A-записи на IP сервера: `@` и `*` (wildcard) |
| GitHub PAT | Fine-grained, право `Contents: Read` на репозитории проектов. Начинается с `ghp_`, `ghs_` или `github_pat_` |
| Пароль root | Сохранён в менеджере паролей — это аварийный вход через VNC-консоль хостера |

**Wildcard-запись обязательна.** Адрес проекта — `<имя-проекта>.<домен>` —
нигде не хранится, а вычисляется из имени проекта. Без `*` каждый новый сайт
требовал бы ручной записи в DNS.

Проверка DNS до установки, на любом выдуманном поддомене:

```bash
dig +short A что-угодно.example.com @1.1.1.1
```

Ответ должен быть IP сервера. Если пусто — DNS ещё не разъехался, жди и
проверяй снова. **Не ставь платформу на неготовый DNS**: Caddy не получит
сертификат и человек решит, что установка сломалась.

---

## 1. Подключение к серверу

```bash
ssh root@<IP-СЕРВЕРА>
```

Если ключ не подставлен — зайди по паролю и добавь ключ **до** установки:

```bash
mkdir -p ~/.ssh && chmod 700 ~/.ssh
echo 'ssh-ed25519 AAAA... ключ' >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
```

Установщик отключает вход по паролю по SSH. Ключ должен работать до этого
момента, иначе человек потеряет доступ к своему серверу.

---

## 2. Установка

```bash
curl -fsSL https://raw.githubusercontent.com/ARTFROST1/FreimDeploy/main/install.sh | sudo bash
```

Занимает 2–5 минут. В выводе обязана появиться строка:

```
✓ подпись релиза проверена (ed25519)
```

**Если её нет — останови установку и скажи человеку.** Тарбол
распаковывается от root; без проверки подписи продолжать нельзя.

Ставится собранный релиз, исходного кода на сервере нет. Управление после
установки — командой `frostdeploy`:

```bash
frostdeploy status | logs | restart | update | rollback | reset-password
```

---

## 3. Первый вход — только через SSH-туннель

Панель слушает `127.0.0.1:9000` и в интернет не смотрит. **Порт 9000 не
открывают в файрволе никогда**: панель — это root-доступ ко всем управляемым
серверам, и её форма входа не должна быть видна из интернета.

Туннель поднимается **с компьютера человека**, а не с сервера:

```bash
ssh -L 9000:127.0.0.1:9000 root@<IP-СЕРВЕРА>
```

Не закрывая туннель, человек открывает у себя в браузере
`http://127.0.0.1:9000` — это мастер настройки. Заполняется:

| Поле | Требование |
|---|---|
| Пароль администратора | не короче 14 символов |
| GitHub PAT | из шага 0 |
| Платформенный домен | апекс, `example.com` |

После мастера панель доступна по HTTPS на `frostdeploy.<домен>` — сертификат
Caddy получит сам.

**Скажи человеку сохранить в менеджер паролей** пароль администратора и
`ENCRYPTION_KEY` из `/opt/frostdeploy/.env`. Этим ключом зашифровано всё
чувствительное в базе: GitHub-токен, SSH-ключи серверов, переменные окружения
проектов. Сервер потерян вместе с ключом — бэкап базы бесполезен.

---

## 4. Где остановиться

Твоя работа закончена, когда панель открылась в браузере на домене человека и
он вошёл под своим паролем. Дальше — добавление проектов через интерфейс, это
делает человек сам.

---

## Правила для тебя

- **Не открывай порт 9000 наружу** ни под каким предлогом.
- **Не придумывай флаги и пути.** Имена на диске (`frostdeploy`,
  `/opt/frostdeploy`, юниты `fd-*`, переменные `FD_*`) — контракт, они
  выглядят иначе, чем название продукта, и это нормально.
- **Не продолжай при непройденной проверке подписи.**
- Понадобились DNS, токен GitHub или пароль — спрашивай, не угадывай.
- Что-то пошло не так — покажи человеку вывод `frostdeploy logs` целиком, а
  не пересказ.

## Если у тебя нет доступа к серверу

Ты в браузерном чате и командовать сервером не можешь. Тогда веди человека:
диктуй по одной команде, жди вывод, объясняй каждый шаг одним предложением.
Не изображай, будто выполнил команду сам.
