Сайты и приложения
Как выложить приложение на Rust в интернет
Коротко
Чтобы выложить приложение на Rust в интернет, нужен сервер, который соберёт проект из исходников и будет держать его запущенным. Проще всего загрузить папку с кодом в Netrun: платформа увидит Cargo.toml, сама соберёт проект и выдаст публичную ссылку с HTTPS. От кода требуется одно — читать порт из переменной окружения PORT и слушать адрес 0.0.0.0. Первая сборка идёт долго, дольше, чем у проекта на Python или Node.js: компилятор собирает все зависимости с нуля, дальше публикации проходят быстрее.
Обычно хостинг приложения на Rust выглядит так: арендовать сервер, поставить на него тулчейн, собрать проект, положить перед ним nginx, получить сертификат и придумать, как перезапускать процесс после падения или перезагрузки. Сам язык тут ни при чём: Rust честно компилируется в один исполняемый файл. Вся возня начинается вокруг этого файла, и обычно она достаётся вам.
В Netrun этот слой исчезает: вы загружаете исходный код, платформа видит Cargo.toml, сама собирает проект и выдаёт публичную ссылку с HTTPS (защищённое соединение, замочек в браузере). Ни сервера, ни nginx, ни ручного сертификата. Ниже о том, что стоит поправить в коде перед публикацией и чего ждать от первой сборки, потому что у Rust она заметно дольше, чем у остальных языков.
Проверьте, что Cargo.toml лежит в корне проекта#
Файл Cargo.toml перечисляет зависимости и говорит платформе, что перед ней проект на Rust. Именно по нему мы собираем проект: тулчейн и библиотеки подтягиваются на нашей стороне, ставить Rust у себя не нужно. Кладите в архив содержимое папки проекта, чтобы Cargo.toml оказался на верхнем уровне, а не внутри лишней обёртки.
Уберите папку target из архива#
Папка target — это результат вашей локальной сборки. Она весит очень много и на нашей стороне всё равно создаётся заново, так что смысла загружать её нет: без неё архив становится в разы легче. Готовый бинарь, собранный на вашем компьютере, присылать тоже не нужно — мы собираем проект из исходников.
Читайте порт из переменной окружения и слушайте 0.0.0.0#
Веб-приложение должно слушать порт, который платформа задаёт в переменной окружения PORT, а не число, прописанное в коде намертво. В Rust это std::env::var("PORT"), а адрес для прослушивания — 0.0.0.0, а не 127.0.0.1: иначе приложение отвечает только внутри контейнера и ссылка остаётся пустой. В Axum это адрес в TcpListener::bind, в Actix Web — аргумент bind, а в Rocket настройки проще собрать прямо в коде из PORT, чем держать их в файле Rocket.toml.
Вынесите ключи и токены в секреты#
Ключи API, токен бота и строку подключения к базе читайте из переменных окружения через std::env::var, а не из констант в коде. При настройке проекта Netrun спросит эти значения, подставит их в переменные окружения и будет хранить зашифрованными, поэтому в архиве и в репозитории на GitHub они лежать не будут. Файл .env в архив класть не нужно.
Загрузите код и дождитесь первой сборки#
Принесите проект ZIP-архивом или импортом репозитория с GitHub, в том числе приватного. Дальше честное предупреждение: первая сборка Rust-проекта идёт долго, дольше, чем у проекта на Python или Node.js, потому что компилятор собирает с нуля не только ваш код, но и все зависимости. Это нормально, а не признак поломки: статус и живые логи в кабинете показывают, что работа идёт.
Заберите ссылку и обновляйте код из кабинета#
Когда сборка закончится, вы получите публичный адрес с HTTPS — его можно открывать и отправлять кому угодно. Новая версия выкладывается тем же способом: загрузите свежий архив или обновите проект из GitHub, ссылка при этом останется прежней. Повторные публикации, как правило, проходят быстрее первой.
Приложение на Rust доступно в интернете по обычной ссылке, без аренды сервера, nginx и ручного сертификата. На бесплатном тарифе доступен один проект: сайт на нём засыпает при простое и просыпается, когда кто-то открывает ссылку, а фоновый сервис без веб-адреса работает три дня и потом выключается — код, настройки и секреты при этом остаются. Если приложение должно отвечать круглосуточно и без задержки на пробуждение, подойдёт тариф Pro; актуальные цены и лимиты видны в кабинете. Попробовать Netrun.
Частые вопросы
Почему первая публикация Rust-проекта идёт так долго?
Компилятор собирает не только ваш код, но и все зависимости с нуля, причём с оптимизациями, поэтому сборка занимает больше времени, чем у проекта на Python или Node.js. Это ожидаемо и не значит, что что-то сломалось: прогресс видно в логах в кабинете. Повторные публикации, как правило, проходят заметно быстрее.
Нужно ли собирать бинарь у себя и загружать готовый файл?
Нет, загружайте исходники: Cargo.toml, папку src и остальные файлы проекта. Сборка происходит на нашей стороне, ставить Rust и настраивать тулчейн у себя не требуется. Бинарь, собранный на macOS или Windows, на сервере всё равно не запустился бы.
Работают ли Axum, Actix Web и Rocket?
Да, фреймворк может быть любым: проект опознаётся по Cargo.toml, а не по названию библиотеки. Требование ко всем одинаковое — слушать адрес 0.0.0.0 и порт из переменной окружения PORT. Для Rocket это удобнее всего сделать, собрав конфигурацию в коде, а не в файле Rocket.toml.
Что делать, если в проекте несколько исполняемых файлов?
Укажите основной в Cargo.toml через default-run, чтобы было однозначно понятно, что запускать. То же касается проекта из нескольких пакетов: сделайте так, чтобы точка входа была одна. Иначе при сборке может быть выбран не тот бинарь, который вы имели в виду.
Ссылка не открывается, хотя сборка прошла — что проверить?
Сначала порт и адрес: приложение должно слушать 0.0.0.0 и порт из переменной PORT, а не 127.0.0.1 и число из кода. Вторая частая причина — приложение упало сразу после старта, например из-за отсутствующего ключа или недоступной базы. И то и другое видно в логах в кабинете: там есть и текст ошибки, и момент, когда процесс остановился.
Какие языки и технологии поддерживаются?
Python, Node.js, Go, Rust, Ruby, PHP, Java, .NET, Deno, Bun, Elixir, статические сайты и bash-скрипты. Можно принести свой Dockerfile или docker-compose, но чаще стек определяется по коду автоматически.
Нужен ли свой сервер или VPS?
Нет. Netrun разворачивает проект на своих серверах. Не нужно арендовать VPS, настраивать systemd и nginx или продлевать сертификаты — всё это работает за вас.
Нужно ли уметь работать с Docker?
Нет. Netrun сам определяет язык проекта и собирает его. Если у вас уже есть Dockerfile или docker-compose, мы их поддержим, но писать их специально не требуется.
Почему мой сайт иногда засыпает?
На бесплатном тарифе сайты засыпают после простоя и просыпаются за пару секунд при первом запросе. На тарифе Pro проект работает без сна.