# 03 · Настройки

Панель читает один файл формата `KEY=VALUE`. Порядок поиска:

1. путь из `FORNEX_ENV`;
2. `.env` в корне приложения;
3. `fornex.env` уровнем выше корня приложения (рекомендуется — вне корня сайта).

Если файла нет, используются настоящие переменные окружения: так панель запускается в
контейнере и в проверке CI. Настоящая переменная окружения всегда важнее файла, поэтому одно
значение можно переопределить на один запуск, ничего не редактируя.

Относительные пути в `DB_PATH`, `LOG_PATH`, `SNAPSHOT_DIR` считаются от корня приложения;
абсолютные используются как есть.

## Приложение

| Ключ | По умолчанию | Действие |
|---|---|---|
| `APP_NAME` | `Fornex Control` | заголовок окна и шапка страницы |
| `APP_ENV` | `production` | в `development` в ответ попадает текст исключения |
| `APP_VERSION` | `1.1.0` | показывается в интерфейсе и в `/api/health`; попадает в `?v=` ссылок на статику |
| `APP_URL` | `http://localhost:8080/` | канонический адрес, используется только в сообщениях |
| `APP_BASE` | пусто | подкаталог в URL, например `/fornex`; интерфейс добавляет его к своим запросам |
| `APP_TIMEZONE` | `UTC` | часовой пояс отметок времени, которые пишет панель |

## API Fornex

| Ключ | По умолчанию | Действие |
|---|---|---|
| `FORNEX_API_KEY` | — | **обязателен**: без него панель не запускается |
| `FORNEX_BASE_URL` | `https://ru.fornex.com/api` | публичный API живёт на хосте `ru.`; `fornex.com/api/` отвечает 302/403 |
| `FORNEX_TIMEOUT` | `30` | секунд на HTTP-запрос |
| `FORNEX_RETRIES` | `2` | повторы только для сети и 5xx, никогда для бизнес-ошибки |
| `FORNEX_USER_AGENT` | `fornex-control/1.1` | без браузерного `User-Agent` запросы к Fornex подвисают на TLS |
| `FORNEX_DEFAULT_IP` | пусто | подставляется в пресеты «сайт на VPS» и «почта на VPS»; пусто — поле обязательно заполнить |

## Вход

| Ключ | По умолчанию | Действие |
|---|---|---|
| `ADMIN_LOGIN` | `admin` | имя входа |
| `ADMIN_PASSWORD_HASH` | пусто | результат `password_hash()`; пусто — вход запрещён |
| `AUTO_LOGIN_IP` | пусто | адрес, с которого сессия выдаётся без пароля; пусто — механизм выключен |
| `SESSION_NAME` | `fnx_session` | имя cookie |
| `SESSION_IDLE` | `1800` | секунд бездействия до выхода |
| `SESSION_SECURE` | `1` | cookie только по HTTPS; `0` — лишь для локального HTTP |

`AUTO_LOGIN_IP` даёт право записи без пароля с одного адреса. Это удобство для рабочего места
внутри своей сети, а не способ аутентификации: оставляйте пустым, если сеть и адрес не ваши.

## Локальное состояние

| Ключ | По умолчанию | Действие |
|---|---|---|
| `DB_PATH` | `var/fornex.sqlite` | журнал, индекс снимков, токены API, попытки входа |
| `LOG_PATH` | `var/log/app.log` | журнал с ротацией: 5 МБ на файл, хранится 5 файлов |
| `LOG_LEVEL` | `info` | `debug`, `info`, `warning`, `error` |
| `SNAPSHOT_DIR` | `var/snapshots` | по каталогу на домен: BIND-файл и JSON с идентификаторами записей |

Каталог с базой и журналом должен быть доступен на запись пользователю PHP и недоступен по
HTTP. `var/` исключён в `.gitignore`.

## Проверка DNS

| Ключ | По умолчанию | Действие |
|---|---|---|
| `VERIFY_RESOLVER` | `8.8.8.8` | публичный резолвер: «что видит мир» |
| `VERIFY_AUTHORITATIVE` | `ns1.fornex.com` | авторитетный сервер Fornex: зона как она есть, без кеша |

Две половины отчёта существуют, чтобы различать «записи нет» и «резолвер ещё не догнал» — после
изменения зоны это разные вещи с разными действиями.

## Пределы безопасности

В `backend/config/defaults.php`:

| Ключ | По умолчанию | Действие |
|---|---|---|
| `security.login_attempts` | `10` | неудачных входов с адреса до ответа `429` |
| `security.login_window` | `900` | окно в секундах |

Ограничения частоты на самом API нет: панель рассчитана на работу за веб-сервером, который
такое ограничение ставит, и за списком разрешённых адресов. Не выставляйте её в открытый
интернет без обоих.

## Что не настраивается намеренно

- Зона никогда не кешируется локально.
- Записи `SOA` и `NS` не редактируются ни из интерфейса, ни из CLI.
- Удаление только по числовому `id`; настройки, включающей шаблонное удаление, нет.
- Снимок перед записью обязателен и не отключается.
