Зачем?

Предыдущая версия сайта работала на Hugo — отличном генераторе статических сайтов. Но со временем накопилось несколько проблем:

  1. PHP-зависимость для OAuth и контактов. Hugo генерирует статический HTML, а для динамических фич (авторизация через Google/Yandex, отображение контактов после входа) требовался отдельный PHP-бэкенд. Два рантайма — двойная сложность.

  2. Ручная пересборка при каждом изменении. Написал статью — нужно пересобрать сайт и задеплоить. Это отбивает желание писать.

  3. Дублирование кода. 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.

Было полезным инженерным упражнением. Проект остаётся интересным и развивается.