Деплой Rust приложения на VPS: пошагово от А до Я

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Введение

Вы написали крутое приложение на 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 сервера (или домену) без указа

Блоги

Рекомендаций по книгам