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

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

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

Начать курс

Введение: почему Rust идеален для продакшна

Rust — это не просто модный язык программирования. Его главные преимущества — безопасность памяти, высокая производительность и предсказуемое поведение. Когда вы пишете на Rust, вы получаете бинарный файл, который можно запустить на любом Linux-сервере без установки виртуальной машины или интерпретатора. Это делает деплой Rust-приложений на VPS невероятно простым и эффективным.

В этой статье мы разберём полный процесс: от сборки проекта до настройки продакшн-окружения с Nginx и systemd. Вы узнаете, как правильно скомпилировать приложение, настроить автозапуск и обеспечить безопасность.

Подготовка VPS и окружения

Выбор и настройка сервера

Для деплоя Rust-приложения подойдёт любой VPS с Linux (Ubuntu 22.04 LTS — оптимальный выбор). Минимальные требования: 1 vCPU, 1 ГБ RAM, 20 ГБ SSD. Этого достаточно для большинства веб-сервисов на Rust.

Первым делом подключаемся к серверу по SSH:

ssh root@ваш-ip-адрес

Обновляем пакеты и устанавливаем необходимые инструменты:

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

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

Хотя мы будем собирать бинарник локально, иногда удобно компилировать прямо на сервере. Устанавливаем Rust:

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

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

rustc --version
cargo --version

Сборка Rust-приложения для продакшна

Оптимизация сборки

Для продакшна нужно собрать приложение с флагом --release. Это включает оптимизации, которые уменьшают размер бинарника и ускоряют его работу. Добавьте в Cargo.toml следующие настройки:

[profile.release]
opt-level = 3
lto = true
codegen-units = 1
strip = true
  • opt-level = 3 — максимальная оптимизация скорости
  • lto = true — Link Time Optimization, уменьшает размер и ускоряет
  • codegen-units = 1 — увеличивает время сборки, но улучшает оптимизацию
  • strip = true — удаляет отладочную информацию, уменьшая бинарник на 30-50%

Сборка бинарника

Выполняем команду на локальной машине (или CI-сервере):

cargo build --release

Готовый бинарник находится в target/release/название-проекта. Его размер должен быть небольшим — от 2 до 10 МБ для типичного веб-приложения.

Копирование на сервер

Используем scp или rsync для передачи файла:

scp target/release/ваше-приложение root@ваш-ip-адрес:/opt/app/

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

mkdir -p /opt/app
mkdir -p /opt/app/static   # если есть статические файлы

Настройка systemd для автозапуска

Создание сервиса

Systemd — стандартный менеджер служб в Linux. Он автоматически запустит ваше приложение после перезагрузки сервера и будет перезапускать его в случае падения.

Создаём файл сервиса:

nano /etc/systemd/system/rust-app.service

Добавляем конфигурацию:

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

[Service]
Type=simple
User=www-data
Group=www-data
WorkingDirectory=/opt/app
ExecStart=/opt/app/ваше-приложение
Restart=always
RestartSec=5
Environment=RUST_LOG=info
Environment=DATABASE_URL=postgres://user:pass@localhost/dbname

[Install]
WantedBy=multi-user.target

Важные параметры:

  • User — запускаем от непривилегированного пользователя www-data
  • Restart=always — автоматический перезапуск при сбое
  • RestartSec=5 — задержка перед перезапуском
  • Environment — переменные окружения для конфигурации

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

systemctl daemon-reload
systemctl enable rust-app
systemctl start rust-app
systemctl status rust-app

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

Настройка Nginx как reverse proxy

Зачем нужен Nginx

Rust-приложения обычно слушают на локальном порту (например, 8000). Nginx выступает в роли прокси, обеспечивая:

  • Раздачу статических файлов (CSS, JS, изображения)
  • SSL-терминацию (HTTPS через Let's Encrypt)
  • Балансировку нагрузки
  • Защиту от DDoS (лимиты запросов)

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

Создаём файл:

nano /etc/nginx/sites-available/ваш-домен

Добавляем настройки:

server {
    listen 80;
    server_name ваш-домен.ru;

    location / {
        proxy_pass http://127.0.0.1:8000;
        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;
    }

    location /static/ {
        alias /opt/app/static/;
        expires 30d;
    }
}

Активируем сайт и перезагружаем Nginx:

ln -s /etc/nginx/sites-available/ваш-домен /etc/nginx/sites-enabled/
nginx -t
systemctl reload nginx

Блоги

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