БД

База данных это то, где лежат все данные. Посты, настройки, просмотры. Всё, что не картинки и не файлы.

Обычно для этого поднимают сервер. PostgreSQL, MySQL. Отдельная программа, которая крутится рядом, жрёт память, требует настройки, паролей, подключений. Для блога это как грузовик для поездки за хлебом.

Всё зависит от твоей цели. Определись! Не усложняй.

Но я SQLite не выбирал. Мне его подсунул AI.

Я сказал: хочу без JavaScript. Хочу, чтобы быстро. Хочу, чтобы просто. AI сказал: тогда Rust, тогда Leptos, тогда SQLite. Я согласился. Потому что сам не знал, что выбрать.

И оказалось, что SQLite это не сервер. Это файл.

Один файл. data/hitin.db. Внутри вся база. Таблицы, данные, индексы. Всё.

Хочешь забэкапить? Скопировал файл. Хочешь восстановить? Скопировал обратно. Хочешь посмотреть, что внутри? Открыл любым редактором. Не надо поднимать сервер, не надо настраивать доступы, не надо думать, где он живёт и сколько ест.

И знаешь что. Он быстрый. Правда быстрый. Потому что нет сети. Данные не летят по сокету, они в том же процессе. Функция вызвала функцию, и всё. Никаких задержек на передачу.

Для блога этого хватает с головой. Один автор, редкие записи, много чтений. SQLite в режиме WAL даёт неограниченное число читателей и одного писателя. Этого более чем достаточно, когда ты пишешь пост раз в день, а читают его сто человек.

Люди говорят: «SQLite не для продакшена». Это миф. Он тянет сайты с сотнями тысяч просмотров в день. Просто потому что чтение там быстрое, а запись редкая. А если запись частая, то да, он начинает задыхаться. Но у меня не тот случай.

Я не знал, что он мне подойдёт. Я просто согласился. А теперь понимаю, почему это было правильно.

Axum

Сервер это то, что принимает запросы от браузера и отдаёт ответы. Ты открываешь сайт, браузер стучится на сервер, сервер говорит: «Вот HTML». Или «Вот картинка». Или «Пошёл нафиг, у тебя нет прав».

Обычно для этого берут фреймворк. Чтобы не писать всё с нуля. Чтобы было удобно.

Я взял Axum. Точнее, тоже взял не сам. AI предложил. Я согласился.

Почему согласился, хотя ничего про него не знал. Потому что он был в паре с Leptos. Одна экосистема, одни зависимости, одни правила. Если Leptos работает с Axum, значит, не надо мучиться с мостами между разными мирами.

Axum это часть экосистемы Tokio. Tokio это штука, которая делает асинхронность в Rust. Асинхронность это когда сервер может делать несколько дел одновременно, не тормозя. Один запрос ждёт базу, в это время обрабатывается другой. Без этого сервер бы стоял в очереди и тупил.

Axum простой. Вот URL, вот функция, которая его обрабатывает. Всё. Никаких макросов, которые превращают код в заклинание. Никаких аннотаций, которые надо помнить. Просто Rust.

Обработчик это функция. Принимает запрос, возвращает ответ. Всё, что между, это детали.

Middleware это слои. Один слой логирует, другой сжимает, третий проверяет права. Накладываются друг на друга, как пирог. Можно добавлять, убирать, менять порядок. Не надо лезть в ядро.

Axum не имеет своего middleware. Он использует Tower. Tower это библиотека для построения сетевых сервисов. Звучит сложно, но на деле: берёшь готовые слои и подключаешь. Timeouts, tracing, compression, authorization. Всё уже есть. Не надо изобретать.

Почему не Actix? Actix быстрый, но сложный. Он использует акторную модель, которую я не понимаю. Почему не Rocket? Rocket строгий, он заставляет следовать своим правилам. Мне это не подходит. Axum даёт свободу. Делай как хочешь, но если что-то не так, компилятор скажет.

И знаешь что. Он лёгкий. Не жрёт память как не в себя. На моём дешёвом VPS с двумя гигами он живёт спокойно. А это важно, когда рядом ещё Caddy и база.

Я не выбирал Axum, потому что он самый быстрый. Я выбрал, потому что AI сказал: он надёжный. И потому что он не мешает. Просто делает свою работу.