Один бинарник + директории
Вся логика — в одном бинарнике (~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) для неавторизованных посетителей.