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

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

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

Начать курс

Деплой 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

Блоги

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