Введение: почему 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