Деплой Swift приложения на VPS: пошаговое руководство
Разработка серверных приложений на Swift с использованием фреймворка Vapor набирает популярность. Однако после написания кода встаёт вопрос: как разместить Swift-приложение на удалённом сервере? В этой статье мы разберём полный процесс деплоя Swift-приложения на VPS (Ubuntu 22.04) — от установки необходимых компонентов до настройки reverse proxy и запуска в production-режиме.
1. Подготовка сервера и установка Swift
Первым делом подключаемся к VPS по SSH и обновляем пакетную базу:
sudo apt update && sudo apt upgrade -y
Swift требует зависимости для сборки. Устанавливаем их:
sudo apt install clang libicu-dev libcurl4-openssl-dev libssl-dev python3 pkg-config -y
Затем скачиваем и устанавливаем Swift для Ubuntu. На момент написания статьи актуальна версия 5.9. Загружаем архив:
wget https://download.swift.org/swift-5.9-release/ubuntu2204/swift-5.9-RELEASE/swift-5.9-RELEASE-ubuntu22.04.tar.gz
Распаковываем и перемещаем в /usr/share:
tar xzf swift-5.9-RELEASE-ubuntu22.04.tar.gz
sudo mv swift-5.9-RELEASE-ubuntu22.04 /usr/share/swift
Добавляем Swift в PATH. Откройте ~/.bashrc:
nano ~/.bashrc
Добавьте строку в конец файла:
export PATH="/usr/share/swift/usr/bin:$PATH"
Примените изменения:
source ~/.bashrc
Проверяем установку:
swift --version
Должна отобразиться версия Swift 5.9.
2. Сборка Swift-приложения (Vapor) на сервере
Клонируем репозиторий с приложением или копируем файлы через SCP. Для примера создадим тестовый проект Vapor:
mkdir ~/myapp && cd ~/myapp
swift package init --type executable
Добавим Vapor в Package.swift (пример минимального сервера):
// swift-tools-version:5.9
import PackageDescription
let package = Package(
name: "myapp",
platforms: [.macOS(.v13)],
dependencies: [
.package(url: "https://github.com/vapor/vapor.git", from: "4.89.0")
],
targets: [
.executableTarget(name: "myapp", dependencies: [
.product(name: "Vapor", package: "vapor")
])
]
)
Создадим файл Sources/myapp/main.swift:
import Vapor
let app = try Application(.detect())
app.get { req in
return "Hello, Swift on VPS!"
}
try app.run()
Собираем проект в режиме release:
swift build -c release
После сборки бинарник будет находиться в .build/release/myapp. Скопируем его в удобное место:
cp .build/release/myapp /usr/local/bin/myapp
3. Настройка Nginx как reverse proxy
Swift-приложение будет слушать порт 8080, а Nginx будет перенаправлять трафик с порта 80 (или 443 для HTTPS). Устанавливаем Nginx:
sudo apt install nginx -y
Создаём конфигурационный файл для нашего приложения:
sudo nano /etc/nginx/sites-available/myapp
Содержимое файла:
server {
listen 80;
server_name your-domain.com;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
Активируем конфигурацию и перезапускаем Nginx:
sudo ln -s /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx
Не забудьте настроить DNS-запись A для вашего домена, указывающую на IP-адрес VPS.
4. Запуск приложения через Supervisor (production)
Чтобы приложение автоматически перезапускалось при сбоях и стартовало после перезагрузки сервера, используем Supervisor. Устанавливаем:
sudo apt install supervisor -y
Создаём конфигурацию:
sudo nano /etc/supervisor/conf.d/myapp.conf
Содержимое:
[program:myapp]
command=/usr/local/bin/myapp
directory=/root/myapp
autostart=true
autorestart=true
stderr_logfile=/var/log/myapp.err.log
stdout_logfile=/var/log/myapp.out.log
user=root
Перечитываем конфигурацию Supervisor и запускаем приложение:
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start myapp
Проверяем статус:
sudo supervisorctl status myapp
Если всё настроено правильно, вы увидите статус RUNNING. Теперь ваше Swift-приложение доступно по адресу http://your-domain.com.
5. Дополнительные рекомендации
- Настройка HTTPS: Используйте Certbot для получения бесплатного SSL-сертификата от Let's Encrypt.
- Логирование: Настройте ротацию логов через
logrotate, чтобы логи не занимали всё место на диске. - Мониторинг: Добавьте health-check endpoint в ваше приложение и мониторьте его через UptimeRobot или аналоги.
- Переменные окружения: Для хранения чувствительных данных (пароли БД, API-ключи) используйте переменные окружения, передавая их через Supervisor:
environment=DB_PASSWORD="secret".
Заключение
Мы прошли полный цикл деплоя Swift-приложения на VPS: от установки Swift и