Деплой Swift приложения на VPS: пошагово от А до Я
Swift давно перестал быть языком только для iOS-разработки. Благодаря фреймворку Vapor и официальной поддержке Linux, вы можете создавать высокопроизводительные серверные приложения на Swift и разворачивать их на VPS. В этом руководстве мы пройдем весь путь от настройки сервера до запуска production-версии вашего Swift-приложения.
1. Подготовка VPS и установка Swift
Для начала вам понадобится VPS с Ubuntu 22.04 LTS (или 20.04). Подключитесь по SSH и выполните обновление системы:
ssh root@ваш-сервер-ip
apt update && apt upgrade -y
Установите необходимые зависимости для Swift:
apt install -y curl git build-essential libssl-dev libcurl4-openssl-dev
apt install -y libxml2-dev libicu-dev libsqlite3-dev libz-dev
Теперь скачайте и установите Swift для Ubuntu. Проверьте актуальную версию на swift.org. На момент написания статьи это Swift 5.9:
cd /opt
wget https://download.swift.org/swift-5.9-release/ubuntu2204/swift-5.9-RELEASE/swift-5.9-RELEASE-ubuntu22.04.tar.gz
tar xzf swift-5.9-RELEASE-ubuntu22.04.tar.gz
echo 'export PATH=/opt/swift-5.9-RELEASE-ubuntu22.04/usr/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
Проверьте установку:
swift --version
Вы должны увидеть версию Swift 5.9.
2. Создание и сборка Swift/Vapor приложения
Установите Vapor Toolbox (опционально, но удобно):
git clone https://github.com/vapor/toolbox.git
cd toolbox
swift build -c release
cp .build/release/vapor /usr/local/bin/
Создадим тестовое приложение Vapor. Если у вас уже есть проект — просто скопируйте его на сервер через SCP или Git.
cd ~
vapor new HelloServer
cd HelloServer
Отредактируем Sources/App/routes.swift, чтобы добавить простой endpoint:
import Vapor
func routes(_ app: Application) throws {
app.get { req async in
"Hello from Swift on VPS!"
}
app.get("status") { req async -> HTTPStatus in
return .ok
}
}
Соберите проект в production-режиме:
swift build -c release
Бинарник появится в .build/release/HelloServer.
3. Настройка запуска и systemd сервиса
Чтобы приложение автоматически запускалось после перезагрузки сервера, создадим systemd-сервис. Сначала создайте пользователя для приложения (безопасность):
useradd -m -s /bin/bash swiftuser
chown -R swiftuser:swiftuser /root/HelloServer
Создайте файл сервиса:
nano /etc/systemd/system/helloserver.service
Вставьте следующее содержимое:
[Unit]
Description=HelloServer Swift App
After=network.target
[Service]
Type=simple
User=swiftuser
WorkingDirectory=/root/HelloServer
ExecStart=/root/HelloServer/.build/release/HelloServer --host 127.0.0.1 --port 8080
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
Запустите сервис:
systemctl daemon-reload
systemctl enable helloserver
systemctl start helloserver
systemctl status helloserver
Проверьте, что приложение отвечает локально:
curl http://127.0.0.1:8080
4. Настройка Nginx как обратного прокси
Для production-среды не рекомендуется открывать порт 8080 напрямую. Установим Nginx и настроим проксирование с SSL (Let's Encrypt).
apt install -y nginx certbot python3-certbot-nginx
Создайте конфигурацию Nginx:
nano /etc/nginx/sites-available/helloserver
Вставьте:
server {
listen 80;
server_name ваш-домен.com www.ваш-домен.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;
}
}
Активируйте сайт и получите SSL-сертификат:
ln -s /etc/nginx/sites-available/helloserver /etc/nginx/sites-enabled/
nginx -t
systemctl reload nginx
certbot --nginx -d ваш-домен.com -d www.ваш-домен.com
После успешного получения сертификата Nginx будет автоматически перенаправлять HTTP на HTTPS.
5. Дополнительные советы для production
- Логирование: Настройте Vapor на запись логов в файл, добавив параметр
--log-level debugв ExecStart. - База данных: Если используете PostgreSQL или MySQL, установите соответствующие пакеты и настройте подключение через переменные окружения.
- Мониторинг: Установите
prometheusиgrafanaдля отслеживания метрик приложения. - Безопасность: Закройте порт 8080 в фаерволе (
ufw deny 8080), оставьте только 80 и 443. - Автозапуск: Проверьте, что systemd сервис работает после перезагрузки:
systemctl is-enabled helloserver.
Пример настройки переменных окружения в systemd:
Environment="DB_HOST=localhost"
Environment="DB_USER=swiftuser"
Environment="DB_PASSWORD=securepass"
Заключение
Мы прошли полный цикл деплоя Swift-приложения на VPS: от установки компилятора до настройки production-окружения с Nginx и SSL