← Назад к обзору

Динамический рендеринг

Сервер читает 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 → HTMLpulldown-cmark 0.13
SCSS → CSSgrass 0.13
КонфигурацияTOML (serde)
i18nСобственная система с plural-формами
OAuthGoogle + Yandex (reqwest, HMAC-SHA256 JWT)
База данныхSQLite (sqlx 0.9) — просмотры, сессии, аудит
ПоискВстроенный серверный (scoring + <mark>)
Rate limitingsliding window per IP (glob-правила)
БезопасностьCSP + security headers
Сжатиеgzip/brotli (tower-http)
TLSfile / 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%
Dockerdev/prod/runtime compose + zigbuild (glibc 2.17)
Деплойmake dist → build.zip, systemd, HAProxy, Phusion Passenger