Safe Rust: Build a Real Backend (Axum + SQLx)

Соберёте сервис заметок с базой данных, который проходит приёмку: создание, чтение, правка, удаление, понятные коды ошибок и ответ 503 вместо зависания при недоступной базе. Синтаксис Rust знаком, но первый же сервис спотыкается: компилятор спорит из-за владения, а дубль в базе обрывает соединение без ответа. Ставить ничего не нужно: проверка сама собирает ваш main.rs в контейнере с Rust 1.90 и поднимает рядом PostgreSQL.

Чему вы научитесь

Что у вас будет в конце

Сервис, который можно отдать фронтенду. POST /notes создаёт заметку, PATCH меняет только присланные поля, DELETE отвечает 204, повторное чтение удалённой — 404 с машиночитаемым кодом ошибки.

Готовность сервис сообщает двумя ручками: /health отвечает, не трогая базу, а /ready делает настоящий запрос. Когда PostgreSQL остановлен, процесс жив, /ready честно отдаёт 503 через секунду, и оркестратор уводит с него трафик.

Для кого

Для тех, кто знает синтаксис Rust, но ещё не собирал из него сервис с базой, авторизацией и деплоем.

Для бэкендеров из Go, Python или Java, которым нужно понять, где владение спорит с привычным кодом и во что обходится async.

Для тех, кто уже написал первый сервис на Axum и упёрся в вопросы про слои, ошибки, транзакции и тесты на живой базе.

Что нужно знать

Базовый Rust: владение и заимствование, трейты, Result и Option. Языку курс не учит.

Начальный SQL: SELECT с условием, JOIN, представление об индексе.

HTTP на уровне пользователя чужого API: методы, коды ответов, заголовки, JSON.

Как его собираем

Сервис растёт слоями: первый хендлер и /health, роутинг и экстракторы, SQLx и миграции, свой тип ошибки, авторизация, тесты, Docker. На каждом слое ваш код компилируется и отвечает на настоящие запросы.

Ошибки разбираются на реальном выводе. Здесь .unwrap() на вставке превращает дубль в оборванное соединение: паника убивает задачу этого запроса, и клиент не получает даже 500. Правка возвращает ошибку значением и отвечает 409 по коду 23505.

Первая версия правки не собралась, и это полезный момент: E0382 поймал перемещённую строку ещё до запуска. Сообщения rustc в курсе приводятся дословно, с объяснением, от чего именно защищает компилятор.

Что он обязан выдержать

Компилируется — ещё не значит готово. Сервис обязан выдержать дубль в другом регистре, параллельные запросы с одним заголовком, кириллицу в лимите длины и чтение несуществующей записи.

Правила для такого разбора — из уроков: длину считают через chars().count(), дубль ловит ограничение UNIQUE в самой базе, клиенту отдают код ошибки без имени ограничения, для «может не найтись» берут fetch_optional.

Самое неочевидное — гонка. В шести сериях по 20 параллельных POST успешный ответ всегда один, но 4 ответа из 120 оказались 500 с текстом ошибки базы внутри.

Как принимают работу

Решение принимает автоматическая проверка, и она ищет обходы. Она пересоздаёт базу с другими данными, шлёт запрос на случайный путь, запускает сервис на случайном порту из PORT и останавливает PostgreSQL, чтобы убедиться, что /health не ходит в базу.

Если код не собирается, проверка сразу показывает текст ошибки компилятора. На картинке — две сдачи одного сервиса: первая не прошла четыре проверки по двум причинам, вторая прошла все.

Поддержка

Вы также можете задать любой вопрос по курсу у поддержки t.me/mentorix_support

Программа курса

Модулей: 7, уроков: 57. Задачи с кодом проверяются автоматически.

  1. Введение и подготовка

  2. Архитектура приложения

  3. Роутинг и обработка запросов

  4. База данных: PostgreSQL и SQLx

  5. Ошибки и безопасность

  6. Тестирование и устойчивость

  7. Финальный проект: сервис заметок

Стоимость курса: 24990 ₽

Открыть курс на Mentorix · Все курсы