Деплой Swift приложения на VPS: пошаговое руководство для продвинутых
Вы создали отличное серверное приложение на Swift с использованием фреймворка Vapor. Теперь его нужно запустить в production. Деплой Swift-приложения на VPS требует понимания специфики работы Swift на Linux, настройки серверного окружения и использования правильных инструментов для обеспечения стабильности и производительности. В этом продвинутом руководстве мы разберем полный цикл: от компиляции под Linux до настройки CI/CD, работы с Docker и Supervisor.
1. Подготовка сервера и компиляция Swift для Linux
Первое, что нужно понять: Swift на macOS и Linux — это разные экосистемы. Для деплоя на VPS (Ubuntu 22.04 LTS) требуется кросскомпиляция или сборка непосредственно на сервере. Рекомендуется собирать на сервере, чтобы избежать проблем с библиотеками.
1.1 Установка Swift на Ubuntu
Подключаемся к серверу по SSH и устанавливаем необходимые зависимости:
sudo apt update
sudo apt install -y curl git clang libicu-dev libcurl4-openssl-dev libssl-dev \
libsqlite3-dev libxml2-dev pkg-config uuid-dev
# Скачиваем последнюю версию Swift Toolchain
wget https://download.swift.org/swift-5.9.2-release/ubuntu2204/swift-5.9.2-RELEASE/swift-5.9.2-RELEASE-ubuntu22.04.tar.gz
tar -xzf swift-5.9.2-RELEASE-ubuntu22.04.tar.gz
sudo mv swift-5.9.2-RELEASE-ubuntu22.04 /usr/share/swift
# Добавляем в PATH
echo 'export PATH=/usr/share/swift/usr/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
swift --version
1.2 Клонирование и сборка проекта
Клонируем репозиторий и собираем релизную версию приложения:
git clone https://github.com/your-username/your-swift-app.git
cd your-swift-app
swift build --configuration release
После успешной сборки бинарник будет находиться в .build/release/YourApp. Проверьте его запуск вручную:
./.build/release/YourApp serve --hostname 0.0.0.0 --port 8080
2. Настройка Production-окружения: Nginx и Supervisor
Запускать Swift-приложение напрямую на 80 порту — плохая практика. Используем связку Nginx (reverse proxy) + Supervisor (менеджер процессов).
2.1 Конфигурация Nginx
Устанавливаем Nginx и создаем конфигурацию для проксирования запросов к нашему Swift-приложению:
sudo apt install nginx
sudo nano /etc/nginx/sites-available/yourapp
Содержимое файла:
server {
listen 80;
server_name yourdomain.com www.yourdomain.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;
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;
}
# Настройка для больших файлов (если нужно)
client_max_body_size 50m;
}
Активируем конфигурацию и проверяем:
sudo ln -s /etc/nginx/sites-available/yourapp /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx
2.2 Настройка Supervisor для автоматического перезапуска
Supervisor будет следить за процессом и перезапускать его в случае падения. Устанавливаем и создаем конфиг:
sudo apt install supervisor
sudo nano /etc/supervisor/conf.d/yourapp.conf
Содержимое конфигурации:
[program:yourapp]
command=/home/ubuntu/your-swift-app/.build/release/YourApp serve --hostname 0.0.0.0 --port 8080
directory=/home/ubuntu/your-swift-app
user=ubuntu
autostart=true
autorestart=true
startretries=3
stderr_logfile=/var/log/yourapp.err.log
stdout_logfile=/var/log/yourapp.out.log
environment=ENVIRONMENT="production",DB_HOST="localhost"
Применяем настройки:
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start yourapp
sudo supervisorctl status
3. Контейнеризация с Docker и Docker Compose
Для изоляции и воспроизводимости окружения используем Docker. Создаем Dockerfile:
FROM swift:5.9.2-jammy AS build
WORKDIR /app
COPY . .
RUN swift build --configuration release --static-swift-stdlib
FROM ubuntu:22.04
RUN apt-get update && apt-get install -y libsqlite3-0 libicu70 libcurl4 openssl ca-certificates && rm -rf /var/lib/apt/lists/*
WORKDIR /app
COPY --from=build /app/.build/release/YourApp .
COPY --from=build /app/Public ./Public
COPY --from=build /app/Resources ./Resources
EXPOSE 8080
CMD ["./YourApp", "serve", "--hostname", "0.0.0.0", "--port", "8080"]
Создаем docker-compose.yml для управления сервисами (база данных + приложение):
version: '3.8'
services:
app:
build: .
ports:
- "8080:8080"
environment:
- ENVIRONMENT=production
- DB_HOST=postgres
depends_on:
- postgres
restart: unless-stopped
postgres:
image: postgres:15
environment:
POSTGRES_DB: myapp
POSTGRES_USER: user
POSTGRES_PASSWORD: secret
volumes:
- pgdata:/var/lib/postgresql/data
restart: unless-stopped
volumes:
pgdata:
Запускаем:
docker-compose up -d --build
4. Настройка CI/CD и мониторинга
Автоматизируем деплой с помощью GitHub Actions. Создаем файл .github/workflows/deploy.yml:
name: Deploy Swift App
on:
push:
branches: [ main ]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Build Docker image
run: docker