Технологии

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. Это стало для меня главным открытием — видимо, конструкторы не всегда оптимизируют страницы должным образом.

Фильтры и сортировка