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

Один бинарник + директории

Вся логика — в одном бинарнике (~25 MB). Сайт описывается несколькими директориями:

  • content/ — Markdown-файлы с TOML-фронтматтером
  • base/themes/{theme}/ — Tera-шаблоны, SCSS и i18n активной темы
  • base/static/ — юзерский overlay: выигрывает над темой для статики (CSS, JS, шрифты, изображения)
  • config.toml — конфигурация
  • .env — OAuth-ключи

Темы обязательны и переключаются через theme в конфиге: все шаблоны, стили и переводы берутся только из активной темы, а юзерский base/static/ перекрывает тему для остальных ассетов.

MVC-слои

Код организован по слоям:

  • model/ — данные и бизнес-логика (Page/Section/Taxonomy, парсер Markdown, поиск, XML-экранирование)
  • view/ — view-model (build_*_context) и рендер-движок Tera (render_page, render_404)
  • controller/ — HTTP-хендлеры (home, section, tags, search, rss, sitemap, auth)
  • service/ — AppState/SharedState, сессии, OAuth, статика, SQLite, SCSS, метрики
  • router/ и middleware/ — маршрутизация и промежуточные слои (counter, ratelimit, security, timing)
  • server/ — оркестрация запуска: инициализация разбита на независимые подсистемы (server/init/), TLS поддерживает четыре режима через отдельные модули (server/tls/)

Запуск и hot reload

При старте сервер читает конфиг, сканирует content/, компилирует Tera-шаблоны и SCSS, поднимает SQLite. Всё держится в памяти. Watcher отслеживает изменения в content/ и каталогах темы — сайт обновляется без пересборки.

Производительность

Rust-сервер стартует за миллисекунды, ест минимум памяти и держит весь контент в памяти — без внешних сервисов. SQLite (WAL, батч-запись) нужна для счётчика просмотров, сессий и аудита входа. Полностью отрендеренный HTML кэшируется (LRU) для неавторизованных посетителей.