Введение
Вы написали крутое приложение на Rust. Оно быстрое, безопасное и не падает. Но как сделать так, чтобы оно работало 24/7 на удалённом сервере и было доступно пользователям? Деплой Rust-приложения на VPS (Virtual Private Server) — это процесс, который включает компиляцию бинарника, настройку окружения, запуск как системного сервиса и, часто, установку reverse proxy.
В этой статье мы пройдем весь путь от нуля до полностью работающего приложения на Rust, развернутого на VPS с Ubuntu. Вы узнаете, как подготовить сервер, собрать проект, настроить автозапуск и обеспечить безопасность. Это руководство подойдет как для веб-серверов (Actix-web, Axum, Rocket), так и для любых других демонов на Rust.
Давайте начнем.
1. Подготовка сервера и окружения
Прежде чем деплоить код, нужно подготовить «почву». Мы будем использовать Ubuntu 22.04 LTS, но инструкции подойдут и для Debian.
Подключение к серверу и базовая настройка
Подключитесь к вашему VPS по SSH:
ssh root@ваш-ip-сервера
Обновите пакеты и создайте пользователя (работать под root — плохая практика):
apt update && apt upgrade -y
adduser deployer
usermod -aG sudo deployer
Настройте SSH-ключи для нового пользователя, чтобы не вводить пароль каждый раз.
Установка Rust на сервере
Самый надежный способ — использовать официальный скрипт rustup. Переключитесь на пользователя deployer и выполните:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
После установки перезагрузите shell или выполните:
source $HOME/.cargo/env
Проверьте версию:
rustc --version
Для production-сборки нам понадобится статическая линковка (чтобы бинарник работал на любом Linux без лишних библиотек). Установите musl-tools:
sudo apt install musl-tools -y
rustup target add x86_64-unknown-linux-musl
2. Сборка и передача бинарника на сервер
Лучше собирать приложение на вашей локальной машине (или в CI/CD), а затем копировать готовый бинарник на сервер. Это быстрее и не нагружает VPS.
Сборка production-версии
На вашем локальном компьютере, в папке проекта выполните:
cargo build --release --target x86_64-unknown-linux-musl
Это создаст статически слинкованный бинарник без зависимостей от glibc. Размер будет больше, но он запустится на любом Linux.
Пример простого веб-сервера на Actix-web для теста (файл src/main.rs):
use actix_web::{web, App, HttpServer, Responder};
async fn hello() -> impl Responder {
"Hello from Rust on VPS!"
}
#[actix_web::main]
async fn main() -> std::io::Result<()> {
HttpServer::new(|| {
App::new().route("/", web::get().to(hello))
})
.bind("0.0.0.0:8080")?
.run()
.await
}
Копирование на сервер
Используйте scp для безопасного копирования:
scp ./target/x86_64-unknown-linux-musl/release/ваш_проект deployer@ваш-ip-сервера:/home/deployer/
На сервере переместите бинарник в /usr/local/bin:
sudo mv /home/deployer/ваш_проект /usr/local/bin/my-rust-app
sudo chmod +x /usr/local/bin/my-rust-app
3. Настройка systemd для автозапуска
Чтобы приложение запускалось при старте системы, перезапускалось после сбоя и работало в фоне, создадим systemd-сервис.
Создайте файл сервиса:
sudo nano /etc/systemd/system/rust-app.service
Вставьте следующий конфиг (замените deployer на вашего пользователя):
[Unit]
Description=Rust Application
After=network.target
[Service]
Type=simple
User=deployer
WorkingDirectory=/home/deployer
ExecStart=/usr/local/bin/my-rust-app
Restart=on-failure
RestartSec=10
Environment=RUST_LOG=info
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
Теперь зарегистрируйте и запустите сервис:
sudo systemctl daemon-reload
sudo systemctl enable rust-app
sudo systemctl start rust-app
Проверьте статус:
sudo systemctl status rust-app
Логи можно смотреть через journalctl:
sudo journalctl -u rust-app -f
4. Настройка Nginx как reverse proxy
Ваше приложение работает на порту 8080. Чтобы открыть его по 80-му порту (HTTP) и, в будущем, добавить HTTPS, используем Nginx.
Установка Nginx
sudo apt install nginx -y
Создание конфигурации для вашего домена (или IP)
sudo nano /etc/nginx/sites-available/rust-app
Содержимое:
server {
listen 80;
server_name ваш-домен.com или _;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Активируйте сайт и перезагрузите Nginx:
sudo ln -s /etc/nginx/sites-available/rust-app /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
Теперь ваше Rust-приложение доступно по IP сервера (или домену) без указа