Overkill as a service: лендинг на Rust вместо конструктора
Краткое резюме
Автор переписал лендинг проекта CyberBusinessLeague с Tilda на Rust с использованием Leptos для рендеринга на стороне сервера. Разработка заняла около 20–30 часов, сайт стал статическим и работает на простой виртуальной машине.
**Как я переписал сайт с Tilda на Rust: опыт и результаты**
**Введение**
Год назад мы запустили проект CyberBusinessLeague — платформу для организации киберспортивных турниров среди юридических лиц. На начальном этапе мы решили не тратить время на сложные разработки и создали лендинг на Tilda. Он выполнял свои функции в течение года, но этим летом нам предложили провести кибертурнир по Dota 2 на форуме «Мой бизнес 2025», и старый сайт уже не соответствовал нашим требованиям и вредил репутации.
**Выбор технологии**
В нашей команде был человек с технической экспертизой — я. Я хотел переписать сайт на чём-то «своём»: лёгком, настраиваемом и независимом от платформ. Мы рассматривали различные комбинации фронтенда и бэкенда, но в итоге остановились на Rust + Leptos.
У меня уже был опыт работы с Rust, и я решил рискнуть. Leptos был выбран из-за лучшей поддержки SSR (рендеринг на стороне сервера), что позволяло сократить время до первого отображения контента и уменьшить размер wasm-бандла. Это было идеально для наших задач.
**Процесс разработки**
Следующие несколько вечеров были посвящены созданию сайта. Всего сайт содержит около 10–12 страниц, поэтому я сделал его полностью статическим. Бэкенд ничего не хранит, сборка представляет собой один Dockerfile с бинарным файлом и статическим контентом.
Leptos хорошо интегрируется с Axum, что позволяет добиться аккуратной реализации SSR и роутинга. Вот пример кода, который инициализирует маршрутизацию и добавляет GZIP-компрессию:
```
let app = Router::new()
.leptos_routes(&leptos_options, routes, {
let leptos_options = leptos_options.clone();
move || shell(leptos_options.clone())
})
.fallback(leptos_axum::file_and_error_handler(shell))
.with_state(leptos_options)
.layer(CompressionLayer::new().gzip(true));
```
На разработку ушло около 20–30 часов, из которых две трети были потрачены на диалог с Claude Code, который помогал с вёрсткой.
**Результаты**
Сайт работает на самой простой виртуальной машине, которую я смог найти: 512 MB RAM, 1 shared vCPU, стоимость — 400 рублей в месяц (для сравнения: Tilda — около 1200 рублей в месяц). CPU-загрузка не превышает 3%, даже с SSR, RAM — до 10%, wasm-бандл — около 350 KB.
Хотя это не место для оценки производительности, было интересно, как поведет себя сайт, полностью написанный на Rust. Скорость загрузки осталась примерно на том же уровне, но я неожиданно обнаружил, что сайт на Rust оказался более дружелюбным к SEO, чем версия на Tilda. Это стало для меня главным открытием — видимо, конструкторы не всегда оптимизируют страницы должным образом.