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

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

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

Начать курс

Введение

Rust — это системный язык программирования, который славится своей производительностью и безопасностью памяти. Однако написать приложение — это только половина дела. Чтобы ваш проект стал доступен пользователям в интернете, его необходимо развернуть (задеплоить) на сервере. В этой статье мы рассмотрим пошаговый процесс деплоя Rust-приложения на VPS (Virtual Private Server).

Мы будем использовать типовой веб-сервер на базе фреймворка actix-web, настроим окружение, скомпилируем релизную сборку, запустим приложение как systemd-сервис и настроим обратный прокси-сервер Nginx с SSL-сертификатом. Следуя этому руководству, вы сможете развернуть любое Rust-приложение на удалённом сервере под управлением Linux.

1. Подготовка сервера и окружения

1.1. Подключение к серверу

Первым делом подключитесь к вашему VPS по SSH:

ssh root@your_server_ip

Рекомендуется создать отдельного пользователя с ограниченными правами (sudo) для безопасности, но для простоты в этом руководстве будем работать от root.

1.2. Установка Rust на сервер

Хотя мы можем скомпилировать приложение локально и просто скопировать бинарник, удобнее установить Rust на сервер для возможной пересборки под целевую архитектуру. Используем официальный скрипт:

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source $HOME/.cargo/env

Проверьте установку:

rustc --version
cargo --version

1.3. Установка системных зависимостей

Для сборки некоторых крейтов (например, openssl) могут потребоваться системные библиотеки. Установите их:

apt update
apt install build-essential pkg-config libssl-dev git -y

2. Сборка и подготовка приложения

2.1. Пример простого веб-сервера на actix-web

Создадим минимальное приложение. Если у вас уже есть проект — пропустите этот шаг.

Cargo.toml:

[package]
name = "my_rust_app"
version = "0.1.0"
edition = "2021"

[dependencies]
actix-web = "4"
serde = { version = "1", features = ["derive"] }

src/main.rs:

use actix_web::{get, web, App, HttpServer, Responder};

#[get("/")]
async fn index() -> impl Responder {
    "Hello from Rust on VPS!"
}

#[actix_web::main]
async fn main() -> std::io::Result<()> {
    println!("Starting server at 0.0.0.0:8080");
    HttpServer::new(|| {
        App::new()
            .service(index)
    })
    .bind("0.0.0.0:8080")?
    .run()
    .await
}

2.2. Компиляция в релизном режиме

Соберите приложение на своей локальной машине или прямо на сервере. Для максимальной производительности используйте флаг --release:

cargo build --release

Готовый бинарник будет находиться в target/release/my_rust_app (имя совпадает с именем пакета).

2.3. Копирование бинарника на сервер (если собирали локально)

Если вы собирали приложение на локальной машине, скопируйте его через SCP:

scp target/release/my_rust_app root@your_server_ip:/opt/my_rust_app/

На сервере создайте директорию /opt/my_rust_app заранее:

mkdir -p /opt/my_rust_app

3. Настройка запуска через systemd

Чтобы приложение автоматически запускалось при старте системы и перезапускалось в случае сбоя, создадим systemd-сервис.

3.1. Создание unit-файла

Создайте файл /etc/systemd/system/my_rust_app.service:

[Unit]
Description=My Rust Web Application
After=network.target

[Service]
Type=simple
User=root
WorkingDirectory=/opt/my_rust_app
ExecStart=/opt/my_rust_app/my_rust_app
Restart=on-failure
RestartSec=10

[Install]
WantedBy=multi-user.target

3.2. Запуск и проверка сервиса

Выполните команды:

systemctl daemon-reload
systemctl enable my_rust_app
systemctl start my_rust_app
systemctl status my_rust_app

Если всё прошло успешно, вы увидите статус active (running). Приложение будет слушать порт 8080.

4. Настройка Nginx как обратного прокси

Прямой доступ к порту 8080 небезопасен и неудобен. Используем Nginx для проксирования запросов с 80/443 портов на наше приложение.

4.1. Установка Nginx

apt install nginx -y

4.2. Конфигурация виртуального хоста

Создайте файл конфигурации /etc/nginx/sites-available/my_rust_app:

server {
    listen 80;
    server_name your_domain.com www.your_domain.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;
    }
}

Активируйте конфигурацию:

ln -s /etc/nginx/sites-available/my_rust_app /etc/nginx/sites-enabled/
nginx -t
systemctl reload nginx

4.3. Настройка SSL через Let's Encrypt (опционально, но рекомендуется)

Установите Certbot:

apt install certbot python3-certbot-nginx -y

Получите сертификат:

certbot --nginx -d your_domain.com -d www.your_domain.com

После успешной установки Certbot автоматически обновит конфигурацию Nginx для работы по HTTPS.

Зак

Блоги

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