# Развёртывание панели автоответчика через Docker

Панель собирается в **один Docker-образ**: Express-сервер раздаёт и API, и собранный
фронтенд (один порт, без отдельного веб-сервера). База — SQLite в Docker-томе.

---

## 1. Что нужно на сервере

- **Docker** и **Docker Compose** (Compose v2 входит в Docker Engine).
  Проверка: `docker --version` и `docker compose version`.
- Linux-сервер (Ubuntu/Debian и т.п.). Архитектура x86_64.

Установка Docker на Ubuntu (если ещё нет):
```bash
curl -fsSL https://get.docker.com | sh
```

---

## 2. Скопировать проект на сервер

Залей папку `panel` целиком (например через `scp`, `rsync` или `git clone`):
```bash
# пример
scp -r ./panel user@SERVER_IP:/opt/panel
```
На сервере перейди в папку:
```bash
cd /opt/panel
```

---

## 3. Настроить `server/.env`

Скопируй пример и заполни значения:
```bash
cp server/.env.example server/.env
nano server/.env
```

Обязательно поменяй для продакшена:
```ini
PORT=4000
# длинная случайная строка — секрет для токенов входа
JWT_SECRET=ЗАМЕНИ_НА_ДЛИННУЮ_СЛУЧАЙНУЮ_СТРОКУ
# первый администратор (создаётся при первом запуске)
ADMIN_EMAIL=admin@твойдомен
ADMIN_PASSWORD=надёжный_пароль
# общий ключ Claude (можно оставить пустым и ввести в панели позже)
ANTHROPIC_API_KEY=sk-ant-...
CLAUDE_MODEL=claude-opus-4-8
```

Сгенерировать случайный `JWT_SECRET`:
```bash
openssl rand -hex 32
```

> ⚠️ Пароль admin и `JWT_SECRET` из примера — **только для локальной разработки**. На сервере обязательно поменяй.

---

## 4. Запустить

```bash
docker compose up -d --build
```

- `--build` соберёт образ (первый раз ~2–4 минуты).
- `-d` — запуск в фоне.

Проверить, что поднялось:
```bash
docker compose ps
docker compose logs -f        # логи (Ctrl+C чтобы выйти)
```

Должно появиться:
```
[server] API запущен на http://localhost:4000
[server] фронтенд раздаётся из client/dist
[engine] опрос почты каждые 60 сек
```

---

## 5. Открыть панель

В браузере: `http://SERVER_IP:4000`

Войти под админом из `server/.env` (`ADMIN_EMAIL` / `ADMIN_PASSWORD`).

Дальше в панели:
1. **Настройки Claude** — вставить API-ключ (если не задан в .env), выбрать модель.
2. **Обучение ИИ** — загрузить переписки.
3. **Анкеты (формы)** — проверить домен, таблицу ставок, шаблоны.
4. Создать пользователей (**Пользователи**), каждый заходит и настраивает свою **Почту** (IMAP/SMTP) и **Профиль**.
5. Включить автоответчик в разделе **Почта** (тоггл «Включить автоматический опрос»).

---

## 6. Обновление версии

После изменения кода:
```bash
cd /opt/panel
git pull            # или заново скопируй файлы
docker compose up -d --build
```
База данных не пострадает — она в томе `panel-data`.

---

## 7. Данные и бэкап

- Вся БД (пользователи, настройки, переписки, журнал) — в Docker-томе **`panel-data`**.
- Бэкап базы:
```bash
docker compose cp panel:/app/server/data/app.db ./app.db.backup
```
- Восстановление:
```bash
docker compose cp ./app.db.backup panel:/app/server/data/app.db
docker compose restart
```

---

## 8. Управление

```bash
docker compose stop      # остановить
docker compose start     # запустить снова
docker compose down      # остановить и удалить контейнер (том с данными остаётся)
docker compose down -v   # ⚠️ удалить ВМЕСТЕ с данными (том panel-data)
docker compose logs -f   # смотреть логи
```

---

## 9. Продакшен-рекомендации (по желанию)

- **HTTPS и домен.** Поставь перед панелью `nginx` или `caddy` как reverse-proxy с
  TLS-сертификатом (Let's Encrypt), проксируя на `localhost:4000`. Тогда панель будет
  доступна по `https://panel.твойдомен` вместо `http://IP:4000`.
- **Файрвол.** Если используешь reverse-proxy, закрой порт 4000 снаружи и открой только 443.
- **Сменить интервал опроса почты.** Значение `poll_interval_seconds` хранится в БД
  (по умолчанию 60 сек, минимум 30). Меняется напрямую в базе; перезапусти контейнер,
  чтобы применилось.

---

## Частые вопросы

**Письмо не уходит / ошибка SMTP.** Адрес в поле «Email отправителя (From)» должен быть
подтверждён в Postmark. Порт SMTP — 587 (STARTTLS), 465 часто закрыт файрволом.

**Анкеты обрабатываются без кредитов Anthropic.** Для писем-анкет ответ собирается по
шаблону — Claude и кредиты не нужны. Кредиты Anthropic нужны только для обычных писем.

**Автоответчик помечает входящие прочитанными.** Это нормально — так движок не обрабатывает
одно письмо дважды. Отправка всё равно только ручная (через журнал).
