Документация

Полное руководство

Как и что настраивать в панели: порядок создания ресурсов, все поля, примеры nginx. То же содержание, что в разделе Документация панели (/adm-panel/docs).

Начало

Обзор панели

smart-nginx — панель управления nginx: сайты, upstream, TLS, WAF, аналитика. Все настройки хранятся в БД и попадают на edge после nginx apply.

Карта разделов

РазделПутьЧто настраивается
Дашборд/Сводка: сайты, сертификаты, nginx, трафик, алерты TLS
Графики/chartsTimeseries, домены, upstream, статусы, география, bot scores
Логи/logsTail и поиск access / error / WAF audit
WAF/wafModSecurity CRS, политика, IP-правила, боты, события, патчи
Сайты/sitesДомен, HTTPS, логи, маршруты, ошибки, stream, текстовый конфиг
Безопасность/site-securityPer-domain: WAF, geo, auth, mTLS, cache, ACL
Дополнения/site-additionsadd_header, server snippet, location snippet
Upstream/upstreamsИменованные пулы, баланс, health-check, drain
Бэкенды/backendsDocker / IP:port / папка — server в upstream
Сертификаты/certificatesLet's Encrypt HTTP-01 / DNS-01, автообновление
Docker/dockerКонтейнеры, discovery, wizard, drift
Импорт/importРазбор существующего nginx.conf → adopt
Конфиг nginx/nginxPreview, test, apply, ревизии, откат
Настройки/settingsРежим nginx, webhooks, access guard, hardening
Документация/docsЭто руководство

Порядок: новый сайт с нуля

  1. Upstream — имя пула, например api_pool. Вкладки Баланс и Health-check.
  2. Бэкенды — добавьте target в пул: Docker my-app:3000 или 10.0.0.5:8080. Probe должен быть OK.
  3. Сертификаты — запись example.com → «Выпустить» (HTTP-01: DNS на edge, порт 80 открыт).
  4. Сайты — домен example.com, HTTPS + сертификат, маршрут / → upstream api_pool.
  5. Безопасность — по необходимости: geo, WAF preset, bot limit, ACL.
  6. Дополнения — по необходимости: security headers, proxy_set_header, таймауты.
  7. Конфиг nginx → Test → Сгенерировать и применить.
Подсказка Кнопка «Перезагрузить nginx» на странице Сайты делает то же, что apply. Без apply изменения остаются только в БД.

Где что настраивать (шпаргалка)

ЗадачаРаздел панели
Домен, HTTPS, логи, маршрутыСайты → модалка
Canary / mirror / rate limit на путьСайты → Маршруты → карточка location
Кастомные 404 / 502Сайты → Ошибки
TCP/UDP (PostgreSQL, Redis)Сайты → Stream
Текстовый nginx для доменаСайты → Конфиг
WAF на домен, geo, auth, cacheБезопасность → карточка домена
ACL path/method/headerБезопасность → ACL
add_header, gzip, snippet serverДополнения → Server / Заголовки
proxy_set_header, таймауты locationДополнения → Location
Пул server, keepalive, stickyUpstream
Контейнер или IP в пулеБэкенды
Let's Encrypt, пути PEMСертификаты
Глобальная WAF-политикаWAF → Политика
IP allow/deny глобальноWAF → IP-правила
Bot rate limit глобальноWAF → Боты
Turnstile, CrowdSec, feedsНастройки → Расширенная защита
Webhooks, access guardНастройки → Интеграции
Откат конфигаКонфиг nginx → ревизии

Полный пример nginx

Результат после шагов выше
upstream api_pool {
    least_conn;
    keepalive 32;
    server my-app:3000 resolve;
}

server {
    listen 80;
    server_name example.com www.example.com;
    location ^~ /.well-known/acme-challenge/ {
        root /var/www/certbot;
    }
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    http2 on;
    server_name example.com www.example.com;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    client_max_body_size 10m;

    access_log /var/log/nginx/smart-nginx/access.json smart_nginx_json;

    location / {
        proxy_pass http://api_pool;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_http_version 1.1;
    }
}

Когда нужен nginx apply

ДействиеAuto-apply?Примечание
Сохранить сайт (домен, маршруты)часто даЗависит от полей; кнопка reload на Сайты
Безопасность / ACLнетСохранить → явный apply
Дополнениячасто даСообщение о перезагрузке в UI
Upstream / бэкендынетПосле health/drain — apply
WAF политика / IP rulesworker syncМожет потребовать reload edge
Настройки hardeningдаWAF sync + apply
Важно Ручные правки generated.conf на диске перезаписываются при Apply. Используйте snippet в Дополнениях или raw snippet в маршруте.
Обзор

Дашборд

Главная страница после входа. Только просмотр — переходы в разделы по клику на плитки.

Открыть в панели →

Плитки и счётчики

  • Сайты / Сертификаты / Upstream / Бэкенды — количество записей в БД
  • Нестабильные Docker-upstream — бэкенды в статусе down
  • Статус nginx — валидность конфига, последний reload, режим host/docker
  • Запросы за 24ч — график из access log JSON
  • Домены — распределение трафика по server_name
  • Алерты TLS — сертификаты, истекающие в ближайшие 14 дней
  • Онлайн · 5 мин — live RPS и активные соединения (stub_status)
  • WAF summary — заблокировано за период
Обзор

Графики

Обзор → Графики. Требуется JSON access log (вкладка Логи сайта или глобальный путь).

Открыть в панели →

Что на графиках

  • Запросы по времени — RPS, latency percentiles
  • По доменам — топ server_name
  • По upstream — нагрузка на пулы
  • HTTP-статусы — 2xx/4xx/5xx
  • Ошибки nginx — upstream timeout, connection refused
  • География — страны по GeoIP (нужен GeoLite2-Country.mmdb)
  • Топ IP — самые активные клиенты
  • Bot scores — распределение оценок ботов

Период: 1ч / 6ч / 24ч / 7д / 30д. Фильтр по сайту, если несколько доменов.

Как включить аналитику

  1. Сайты → сайт → вкладка Логи
  2. Access log: Как в панели (JSON) или JSON со своим путём
  3. Убедитесь, что worker читает тот же файл (ACCESS_LOG_PATH на сервере)
  4. Подождите 1–2 минуты после трафика — данные агрегируются в PostgreSQL
Обзор

Логи

Обзор → Логи. Просмотр файлов на edge без SSH.

Открыть в панели →

Типы логов

ЛогПуть (типично)Содержимое
Access JSON/var/log/nginx/smart-nginx/access.jsonКаждый HTTP-запрос, server_name, status
Error/var/log/nginx/error.logОшибки nginx и upstream
WAF audit/var/log/nginx/smart-nginx/waf-audit.jsonСрабатывания ModSecurity
Per-domainзадаётся на вкладке Логи сайтаОтдельный файл на домен

Интерфейс

  • Выбор файла из списка (включая per-domain)
  • Поиск по подстроке в строке
  • Follow — tail в реальном времени
  • Скачать — выгрузка фрагмента
Обзор

WAF (ModSecurity + OWASP CRS)

Глобальный WAF на edge. Per-domain настройки — в Безопасность → карточка домена.

Открыть в панели →

Включение на домене

  1. Безопасность → карточка домена → вкладка Безопасность
  2. Включите строгий WAF / выберите CRS exclusion preset (wordpress, nextcloud…)
  3. Задайте paranoia level 0–4 и при необходимости under_attack
  4. Сохраните → nginx apply
  5. События смотрите в WAF → События и на Дашборде

Вкладки раздела WAF

ВкладкаНастройкиПример
ОбзорГрафики timeseries, топ правил/IP/странпериод 24ч
СобытияЖурнал; фильтр IP, страна, rule_idблок IP из события
Политикаblock/detect по категориям: sqli, xss, lfi…anomaly_threshold: 5
ПатчиVirtual patches для CVEtoggle в каталоге
БотыГлобальный rate limit20 r/s, burst 40
IP-правилаallow / deny / block по CIDRdeny 203.0.113.0/24 на 24ч

Политика и false positives

Политика — глобальные пороги: режим block vs detect по категориям атак. anomaly_threshold (1–20, по умолчанию 5) — сумма score правил до блокировки.

На домене: CRS exclusion presets (WordPress, Next.js, REST API) снижают ложные срабатывания. Точечные исключения — rule id или SecRule snippet в патчах.

IP-правила и auto-block

IP-правила синхронизируются worker'ом в ip-rules.conf на edge. При action=blocked WAF может автоматически добавить IP в deny (WAF_AUTO_BLOCK_ENABLED, TTL 24h по умолчанию).

Таблица IP: страна, источник (manual/feed/auto), срок блокировки. Клик по строке → история запросов, разблок / whitelist.

Bot rate limit

Глобально — WAF → Боты: enabled, rate_limit_rps, burst. На домен — Безопасность → Bot rate limit: inherit / custom / off. Режимы: off (registry, mail), location (только UI/static), server (полный limit на server).

Генерируемый фрагмент
limit_req_zone $binary_remote_addr zone=sn_bot_<site_id>:10m rate=20r/s;
limit_req zone=sn_bot_<site_id> burst=40 nodelay;

API WAF

GET /api/waf/events?site_id=&limit=50
GET /api/waf/dashboard
GET/PUT /api/waf/threat-policy
GET/PUT /api/waf/bot-protection
GET/PUT /api/waf/ip-rules
Инфраструктура

Сайты

Virtual host — основа проксирования. Модалка: клик по карточке или сразу после «Добавить сайт».

Открыть в панели →

Создание

Инфраструктура → Сайты → форма вверху страницы.

ПолеПримерnginx
Название в панелиОсновной API
Доменexample.com, www.example.comserver_name
Подсказка Без хотя бы одного маршрута (location) трафик некуда проксировать.

Вкладки модалки

ВкладкаПоляГде ещё
Доменserver_name, enabled
HTTPSredirect, ssl, cert, client_max_body_sizeСертификаты
Логиaccess/error format и путиГрафики, Логи
Маршрутыlocation, upstream, canary, mirrorДополнения → Location
ОшибкиHTML 404/502Настройки → глобальные шаблоны
StreamTCP/UDP listen
СхемаWAF → nginx → upstreamтолько просмотр
Конфигтекст nginx, парсинг в вкладки

HTTPS

ПолеПримерnginx
HTTP → HTTPSвклreturn 301 https://$host$request_uri
HTTPSвклlisten 443 ssl; http2 on
Сертификатexample.comssl_certificate + ssl_certificate_key
Макс. загрузка10m, 100mclient_max_body_size
Важно Для Let's Encrypt HTTP-01: сертификат выпустите до или сразу после создания сайта; DNS должен указывать на edge.

Логи

Access logПутьНазначение
Как в панели (JSON)/var/log/nginx/smart-nginx/access.jsonАналитика, Графики
JSON свой путь/var/log/nginx/sites/example.com.jsonИзоляция на домен
Combined + домен.../example.com.logТекстовый лог
Combined/var/log/nginx/access.logКлассика без $host в строке
Выключитьaccess_log off
Error logПараметры
Как на сервереобщий error.log, warn
Свой файлпуть + уровень warn/error/debug
Выключитьerror_log /dev/null crit

Маршруты (location)

ПолеПримерnginx
Путь//api/static/location
Сравнениеprefix / exact / regex^~ / ~ / =
Upstreamapi_poolproxy_pass http://api_pool
proxy_passhttp://127.0.0.1:8080без upstream
WebSocketвклUpgrade + Connection
Canary upstreamcanary_pool + 10%split_clients
Mirrorshadow_poolmirror + mirror_request_body
Path rate limit10r/s, 5r/mlimit_req zone=...
Маршрут API с WebSocket
location /api/ {
    proxy_pass http://api_pool;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
}
Подсказка OpenAPI import: загрузите JSON OpenAPI 3 в маршруте — пути с x-rate-limit станут path rate limit rules.

Расширенные поля в карточке маршрута: raw snippet (директивы внутри location), импорт OpenAPI, advanced headers.

Страницы ошибок

Вкладка Ошибки: кастомный HTML для 404 и 502. Переменные: {{site_name}}, {{year}}.

error_page 404 /sn-errors/<site-id>/404.html;
location = /sn-errors/<site-id>/404.html {
    internal;
    alias /var/lib/smart-nginx/error-pages/<site-id>/404.html;
}

Stream (L4)

ПолеПример
site_typestream
listen port5432
протоколtcp / udp
upstream host:portdb.internal:5432

HTTP-маршруты не генерируются. Если TCP health upstream в down — listen для stream-сайта не попадает в конфиг.

Вкладка «Конфиг»

Вставьте фрагмент nginx → Применить к настройкам — парсится в Домен, HTTPS, Маршруты.

Важно add_header и server snippet — только в Дополнения. Безопасность и ACL — в Безопасность.
Инфраструктура

Безопасность сайта

Отдельная страница (не в модалке Сайты). Сетка доменов → модалка с вкладками Безопасность и ACL.

Открыть в панели →

Как открыть

  1. Инфраструктура → Безопасность
  2. Клик по карточке домена
  3. Вкладка Безопасность или ACL
  4. Сохранить → nginx apply

Вкладка «Безопасность» — все поля

ГруппаПоляПример значения
Security headerspreset: none/strict/hsts-only; Custom CSPdefault-src 'self'; script-src 'self'
TLSOCSP Staplingвкл → ssl_stapling on
Under attackвклlimit_req 2r/s на весь server
Under attack WAF strictвклповышенный paranoia при атаке
Honeypotвклложные /admin URL → block
Turnstile challengeвклauth_request после Turnstile
CRS exclusionwordpress / nextcloud / drupalменьше false positives
WAF paranoia0–42 — баланс
Bot rate limitinherit / custom / offcustom: 20 r/s, burst 40
limit_connчисло10 — макс. соединений с IP
limit_rateстрока100k — скорость отдачи
Geooff / allow / block + ISOallow: RU, BY, KZ
Site authoff / jwt / api_key / jwt_or_api_keyJWKS URL, audience, issuer
API keysимя, prefixдля api_key режима
Basic Authuser, passwordauth_basic на весь server
mTLSenabled, optional/on/require, CA PEMклиентские сертификаты
Proxy cacheenabled, proxy_cache_valid, purge200 10m; purge по host/path

Кэш и purge

Включите proxy cache на вкладке Безопасность. Очистка: UI (host, path, весь сайт) или API.

POST /api/sites/{id}/cache/purge?host=example.com&path=/api/
GET /api/sites/{id}/cache/status

Вкладка «ACL»

Правила сверху вниз — первое совпадение побеждает.

ПолеЗначенияПример
Типpath / method / headerpath
Значениестрока сравнения/admin, POST, secret-key
Header nameдля type=headerX-Api-Key
Действиеallow / deny / redirectdeny → 403
Redirect URLдля redirecthttps://example.com/login
Включеноcheckboxможно временно отключить правило
Инфраструктура

Дополнения

add_header, server snippet, proxy_set_header и location snippet — вынесено из модалки Сайты.

Открыть в панели →

Вкладка «Server»

Директивы внутри server { }. Не путать с маршрутами — это уровень всего домена.

Примеры
gzip on;
gzip_types application/json text/css application/javascript;
proxy_buffering off;
proxy_read_timeout 120s;

Вкладка «Заголовки»

ПолеПример
ИмяX-Frame-Options, Strict-Transport-Security
ЗначениеDENY, max-age=31536000
Alwaysвкл — и при ошибках 4xx/5xx

Пресеты: Запрет в iframe, Защита MIME, Referrer-Policy.

add_header X-Frame-Options "DENY" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;

Вкладка «Location»

Список маршрутов сайта (из Сайты → Маршруты). Для каждого: raw_snippet и пары proxy_set_header.

ПолеПример
raw_snippetproxy_read_timeout 300s; proxy_send_timeout 300s;
proxy_set_header Host$host
proxy_set_header X-Request-Id$request_id
proxy_set_header X-Forwarded-Prefix/api
Важно Маршрут должен существовать в Сайты → Маршруты. Здесь только дополнительные директивы к нему.
Инфраструктура

Upstream

Создаётся первым — до бэкендов. Имя выбирается в маршрутах сайта как proxy_pass.

Открыть в панели →

Создание

Имя латиницей: api_pool, static_backends. После создания — вкладки в модалке.

ВкладкаСодержание
Обзоримя, список привязанных сайтов и Docker-сервисов
Бэкендыserver-строки, ссылка на /backends?upstream=...
Балансmethod, hash_key, sticky_cookie, keepalive
Health-checkhttp/tcp, path, interval, fail/rise

Балансировка

МетодКогда
round_robinпо умолчанию
least_connнеравная длительность запросов
ip_hashsticky по IP клиента
hashпо $request_uri или другому ключу
randomслучайный server
ПараметрПример
hash_key$request_uri
sticky_cookieSESSIONID
keepalive32 idle connections

Health-check

ПолеПример
enabledда
typehttp / tcp
path/health
methodGET
expected status200
host headerexample.com
interval5s
timeout3s
fail / rise3 / 2

Drain и API

  1. На карточке upstream → server → Drain (30 мин по умолчанию)
  2. weight=0 — новые запросы не идут, активные дорабатывают
  3. С apply=true — сразу в конфиге
POST /api/upstreams/{id}/servers
{"host":"10.0.0.5","port":8080,"weight":1}

POST /api/upstreams/{id}/servers/{sid}/drain?minutes=15&apply=true
DELETE /api/upstreams/{id}/servers/{sid}

Пример nginx

upstream api_pool {
    least_conn;
    keepalive 32;
    server my-app:3000 resolve max_fails=0 fail_timeout=0;
    server my-app-2:3000 resolve max_fails=0 fail_timeout=0 backup;
}
Инфраструктура

Бэкенды

Конкретный target в upstream. Upstream должен существовать.

Открыть в панели →

Типы

ТипКак указатьnginx
Dockerконтейнер + порт (обязателен probe OK)server name:port resolve
IP:port10.0.0.5:8080server 10.0.0.5:8080
Папка/var/www/staticстатика через root/alias в location

Создание по шагам

  1. Бэкенды → Добавить
  2. Привязка: выберите upstream
  3. Адрес: тип Docker / IP:port / Папка
  4. Docker: выберите контейнер из списка, порт, дождитесь probe OK
  5. Балансировка (edit): «Участвует в балансировке» — enabled/disabled
  6. Сохранить → nginx apply
Подсказка URL /backends?upstream=<uuid> фильтрует список. Фильтры: только выключенные, только down.
Инфраструктура

Сертификаты

TLS для HTTPS. Можно создать до сайта.

Открыть в панели →

HTTP-01 (обычные домены)

  1. Сертификаты → Добавить → домены, challenge HTTP-01
  2. DNS A/AAAA на edge, порт 80 доступен из интернета
  3. На карточке → Выпустить (challenge через /.well-known/acme-challenge/)
  4. Сайты → HTTPS → выберите сертификат → apply

DNS-01 (wildcard)

Challenge DNS-01 — TXT-запись в DNS. Подходит для *.example.com. Нужен API-токен DNS-провайдера в env сервера.

Вкладки модалки

ВкладкаПоля
Основноеимя, домены SAN, challenge, автообновление
Путиfullchain.pem, privkey.pem
Сайтыгде используется сертификат
Статуссрок, challenge status, кнопка Выпустить/перевыпустить

Продление и ручной импорт

Worker проверяет срок каждые ~12ч. Обновить все на странице. Дашборд алертит за 14 дней до expiry.

Свой сертификат: укажите пути fullchain/key вручную (внутренний CA, импорт с другого сервера).

POST /api/certificates/{id}/issue
POST /api/certificates/renew-all
Инфраструктура

Docker

Контейнеры, compose-стеки, автоматическое обнаружение и wizard для быстрого создания сайта.

Открыть в панели →

Labels на контейнере

Для auto-discovery добавьте labels в docker-compose:

labels:
  smart-nginx.enable: "true"
  smart-nginx.host: app.example.com
  smart-nginx.port: "3000"
  smart-nginx.upstream: app_backend

Worker каждые ~2 мин синхронизирует контейнеры с upstream в БД. Prefix настраивается в Настройки → Docker discovery.

Discovery и Wizard

  1. Discovery — список контейнеров и compose-проектов
  2. Wizard — контейнер + порт → домен + path → создаёт upstream + site + location
  3. Конфиг nginx → Apply
GET /api/docker/containers
POST /api/docker/wizard

Drift

Drift — расхождения: контейнер удалён, порт изменился, имя другое. Исправьте бэкенд вручную или пересоздайте через wizard.

На странице Docker также: сети, сервисы с proxy, нестабильные upstream, привязка контейнеров.

Система

Импорт

Перенос существующего nginx.conf в панель без ручного ввода всех полей.

Открыть в панели →

Как импортировать

  1. Система → Импорт
  2. Вставьте текст nginx.conf или фрагменты с хоста
  3. Preview — распознанные sites, upstreams, certificates
  4. Отметьте что adopt (принять в БД)
  5. Опционально: sync nginx сразу после adopt
  6. Проверьте Конфиг nginx → Test → Apply
Подсказка Импорт не заменяет ручную проверку: server_name, пути сертификатов и upstream names сверьте с продом.
Система

Конфиг nginx

Финальный шаг: generated.conf на edge. Без Apply пользователи не увидят изменений.

Открыть в панели →

Порядок применения

  1. Preview — сгенерированный generated.conf до выката
  2. Test (nginx -t) — при ошибке Apply заблокирован
  3. Синхронизировать — копирование на edge без reload
  4. Reload — перезагрузка без регенерации
  5. Сгенерировать и применить — generate + sync + reload
  6. Revisions — история; откат на любую ревизию

Сравнение ревизий

Конфиг nginx → Сравнение (/nginx/compare) — side-by-side diff двух версий generated.conf.

Важно

Важно Файлы в volume nginx-generated перезаписываются при каждом generate. Не редактируйте их вручную на сервере.

Режим docker — edge-контейнер с host network. Режим host — системный nginx.

API

GET /api/nginx/preview
POST /api/nginx/test
POST /api/nginx/apply
POST /api/nginx/revisions/{id}/rollback
Система

Настройки

Глобальные параметры: режим nginx, интеграции, расширенная защита, пользователи.

Открыть в панели →

Основные

ПолеПримерНазначение
Режим nginxdocker / hostedge-контейнер или системный nginx
Docker resolver127.0.0.11DNS для resolve в upstream
Общая Docker-сетьsmart-nginx-proxyсеть для proxy_pass к контейнерам

Предпросмотр конфигурации — кнопка загрузит полный generated.conf.

Интеграции

БлокПоляПример
Access Guardenabled, window, thresholds 429/403, TTL30×429 за 300s → block 24h
Docker discoveryenabled, label_prefixsmart-nginx
Webhooksname, URL, eventscert.expiring, upstream.down, waf.block
Feature flagsname, map_source, map_keycookie ff → upstream variant
ComplianceCSV отчётTLS expiry, WAF on, upstream health

Расширенная защита

БлокПоля
Bot score → auto-blockscore_threshold, block_ttl_hours
Reputation feedsSpamhaus DROP, Tor exit URLs; sync_interval, TTL
Auto under_attackwaf_blocked_threshold, window_min, duration_min
Cloudflare Turnstilesite_key, secret_key — для challenge на сайтах
Virtual patchesкаталог CVE patches ModSecurity
CrowdSec LAPIenabled, lapi_url, api_key

Сохранение → синхронизация WAF + nginx apply.

Пользователи и error pages

JWT-логин. Роли: admin (полный доступ), viewer (только чтение). Смените пароль admin на проде сразу после установки.

Глобальные error pages — HTML 4xx/5xx для всех сайтов, если на сайте не заданы свои (Сайты → Ошибки).

Система

Справочник API и env

REST API и переменные окружения production. Auth: Authorization: Bearer <JWT>.

Базовый URL

Prod: /adm-panel/api/ · Dev: http://localhost:8080/api/

POST /api/auth/login
{"username":"admin","password":"..."}

Основные маршруты

Сайты и конфиг
GET/POST /api/sites
GET/PUT /api/sites/{id}/config
GET/PUT /api/sites/{id}/features
GET/POST/PUT/DELETE /api/sites/{id}/acl-rules
GET/PUT /api/sites/{id}/error-pages
POST /api/sites/{id}/openapi/import-rate-limits
POST /api/sites/{id}/cache/purge?host=&path=
Upstream и сертификаты
GET/POST /api/upstreams
POST /api/upstreams/{id}/servers
POST /api/upstreams/{id}/servers/{sid}/drain?minutes=15&apply=true
GET/POST /api/certificates
POST /api/certificates/{id}/issue
POST /api/certificates/renew-all
Nginx, WAF, аналитика
GET /api/nginx/preview
POST /api/nginx/test
POST /api/nginx/apply
POST /api/nginx/revisions/{id}/rollback
GET /api/waf/events
GET/PUT /api/waf/threat-policy
GET/PUT /api/waf/ip-rules
GET /api/analytics/dashboard
GET /api/analytics/summary?period=24h
Настройки
GET/PUT /api/settings
GET/PUT /api/settings/access-guard
GET/PUT /api/settings/security
GET/PUT /api/settings/webhooks

Переменные окружения (prod)

# Core
DATABASE_URL=postgres://...
JWT_SECRET=...
NGINX_MODE=docker
NGINX_CONTAINER=smart-nginx-edge
API_INTERNAL_URL=http://api:8080
SITE_AUTH_INTERNAL_SECRET=...

# WAF
WAF_DATA_DIR=/data/waf
WAF_LOG_PATH=/var/log/nginx/smart-nginx/waf-audit.json
WAF_AUTO_BLOCK_ENABLED=true
WAF_AUTO_BLOCK_TTL=24h
WAF_BOT_PROTECTION_ENABLED=true
WAF_BOT_RATE_LIMIT_RPS=20

# Analytics
ACCESS_LOG_PATH=/var/log/nginx/smart-nginx/access.json
GEOIP_DB_PATH=/data/geoip/GeoLite2-Country.mmdb

Полный список маршрутов — api/cmd/server/main.go. Env пример — deploy/env.example.