Зачем?
Предыдущая версия сайта работала на Hugo — отличном генераторе статических сайтов. Но со временем накопилось несколько проблем:
-
PHP-зависимость для OAuth и контактов. Hugo генерирует статический HTML, а для динамических фич (авторизация через Google/Yandex, отображение контактов после входа) требовался отдельный PHP-бэкенд. Два рантайма — двойная сложность.
-
Ручная пересборка при каждом изменении. Написал статью — нужно пересобрать сайт и задеплоить. Это отбивает желание писать.
-
Дублирование кода. PHP-обработка шорткодов и Hugo-шаблоны жили в разных мирах, но по сути делали одно дело.
Захотелось чего-то более цельного. Чтобы один бинарник содержал в себе всё: и блог, и авторизацию, и отдачу статики.
Почему Rust?
Я пишу на Rust в свободное время, и мне нравится его подход: zero-cost абстракции, безопасность памяти без сборщика мусора, отличная экосистема для веба (Axum, Tera, pulldown-cmark).
Rust-сервер стартует за миллисекунды, ест минимум памяти и держит весь контент в памяти — без внешних сервисов. Единственная локальная БД (SQLite) нужна для счётчика просмотров, сессий и аудита входа.
Архитектура
Один бинарник (~18 MB) + директории = весь сайт:
content/— Markdown-файлы с TOML-фронтматтеромbase/themes/{theme}/— Tera-шаблоны, SCSS и i18n активной темыbase/static/— юзерский overlay для статикиconfig.toml— конфигурация.env— OAuth-ключи
Темы обязательны и переключаются через theme в конфиге. Код организован по MVC-слоям: model/, view/, controller/, service/, router//middleware/, server/.
Никакого PHP. Никакой пересборки. Изменил .md файл — сайт мгновенно обновился через hot reload.
Подробное описание возможностей, архитектуры и технического стека — на странице проекта Blog server.
Результат
Сайт работает быстро, собирается без ошибок, не требует внешних зависимостей и легко разворачивается. Писать статьи стало проще: сохранил Markdown — и изменения сразу на сайте.
Проект вышел из стадии «пет-проекта»: разветвлённый набор тестов, покрытие строк ≥75%, ноль предупреждений clippy — и каждый коммит проходит весь набор проверок.
Бинарник кросс-компилируется под glibc 2.17 через cargo zigbuild — работает на CentOS 7+ и любом современном Linux. Деплой — один build.zip (~18 MB), Docker-образ или systemd unit.
Было полезным инженерным упражнением. Проект остаётся интересным и развивается.