Деплой Swift приложения на VPS: продвинутое руководство

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

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

Начать курс

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

Блоги

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