Динамический рендеринг
Сервер читает Markdown при старте и отдаёт HTML на лету. Никакой статической генерации — страницы формируются в момент запроса.
Два языка из коробки
Русский и английский. default_language в конфиге управляет URL-префиксами: / для основного, /en/ для остальных. Переводы — TOML-файлы темы с поддержкой plural-форм (CLDR: one/few/many для русского).
Шорткоды как плагины
Единый синтаксис {load:name;params} для шорткодов в теле страниц. Обработчики — Rust-методы плагина shortcodes: contacts (блок контактов) и include (вставка тела другой страницы). Контекст страницы передаётся напрямую, JS/CSS-ассеты встраиваются автоматически.
Система плагинов
Один плагин реализует несколько категорий хуков: markdown-постобработка HTML, render-хуки (pre/post вокруг Tera), Tera-функции и фильтры, middleware-слои и шорткоды. Встроенные: gallery, related, updated_note, markdown, force_https, shortcodes. Включение — [plugins] enabled, параметры — [plugins.{name}].
OAuth без PHP
Google и Yandex прямо из Rust-сервера. Провайдеры описываются декларативно (URL, ключи, поля профиля) — новый провайдер добавляется без изменения логики. CSRF-защита через отдельное хранилище state-токенов с constant-time сравнением (subtle::ct_eq). Сессии на JWT (HMAC-SHA256), secure cookie, ротация sid при upgrade.
RSS и Sitemap
Три режима sitemap: индексный, per-language, единый с hreflang. RSS 2.0. ETag на SHA-256 для условных запросов (304 Not Modified).
Hot reload
Watcher отслеживает content/ и каталоги темы (templates/, sass/, i18n/) — сайт обновляется автоматически без пересборки.
Вложенные страницы и навигация
Произвольная глубина вложенности, URL из полного подпути. subpage = true прячет страницу из листингов, но оставляет по прямому URL. Автоматические хлебные крошки и <title> вида «Раздел — Страница».
Поиск по сайту
Встроенный серверный поиск: доступен всем при search_public = true или только авторизованным. POST-форма с одноразовым CSRF-токеном, сортировки (релевантность/дата/заголовок/дата обновления), пагинация 10/30/50/все, <mark>-сниппеты и подсветка слов через ?hint=. Веса полей настраиваются через [params.search_weights].
Полное скрытие hidden-страниц
Страницы с hidden = "true" исключаются отовсюду: списки, теги, RSS, sitemap, поиск, прямой доступ (404). Ассеты скрытых разделов тоже блокируются.
Rate limiting
Sliding window per IP, конфигурируемый через [params.rate_limit]: единое окно, fallback-лимит и glob-правила путей (*, **, ?), longest match.
Безопасность и эксплуатация
- CSP строится из конфига + стандартные security headers; доп. хосты через
csp_script_src/csp_img_src/csp_connect_src. - Сжатие gzip/brotli.
- PROXY protocol и X-Forwarded-For — только от
trusted_proxies. - IP-restricted
/debug(htmx-обновление, графики Chart.js: requests/s, RSS, CPU, p99 per-route, hit-rate) и/health. /metricsв формате Prometheus (uptime, CPU, SQLite, токио-метрики опционально).
Время в футере
Версия сайта — время последнего обновления контента (mtime файла). Для авторизованных — полное время обработки запроса.
TLS
Четыре режима: off / self-signed / file / Let's Encrypt (TLS-ALPN-01). cert_watch перезагружает сертификаты на лету без рестарта.
Graceful degradation
При недоступности SQLite сервер продолжает работать (счётчик просмотров отдаёт ?); неблокирующий логгер падает на синхронную запись.
Качество
Разветвлённый набор тестов (unit в src/ + интеграционные HTTP + отдельные suite для контента/страниц/шаблонов). Покрытие строк ≥75% через make coverage-check (llvm-cov) — часть Definition of Done. cargo clippy -D warnings — 0 предупреждений, когнитивная сложность ниже 25.
Технический стек
| Компонент | Технология |
|---|---|
| HTTP-сервер | Axum 0.8 + Tokio |
| Шаблоны | Tera 2 |
| Markdown → HTML | pulldown-cmark 0.13 |
| SCSS → CSS | grass 0.13 |
| Конфигурация | TOML (serde) |
| i18n | Собственная система с plural-формами |
| OAuth | Google + Yandex (reqwest, HMAC-SHA256 JWT) |
| База данных | SQLite (sqlx 0.9) — просмотры, сессии, аудит |
| Поиск | Встроенный серверный (scoring + <mark>) |
| Rate limiting | sliding window per IP (glob-правила) |
| Безопасность | CSP + security headers |
| Сжатие | gzip/brotli (tower-http) |
| TLS | file / self-signed / Let's Encrypt (TLS-ALPN-01) + cert_watch |
| Логирование | tracing + файл (JSON-опция), ротация, zip-архив |
| Мониторинг | /metrics (Prometheus), tokio-metrics (опционально) |
| Клиентские | htmx, Chart.js |
| Тесты | unit + integration (axum), llvm-cov ≥75% |
| Docker | dev/prod/runtime compose + zigbuild (glibc 2.17) |
| Деплой | make dist → build.zip, systemd, HAProxy, Phusion Passenger |