Почему Swift — это не только про мобильную разработку
Когда слышишь «Swift», первая ассоциация — iOS-приложения, Xcode и симулятор айфона. Но за последние пять лет язык превратился в полноценный инструмент для серверной разработки. Vapor, Hummingbird, SwiftNIO — это не просто библиотеки, а экосистема, способная конкурировать с Go и Rust. Проблема в другом: многие разработчики пишут крутой бэкенд на Swift, но стопорятся на этапе деплоя. Знакомо?
Я сам прошёл этот путь: от «залей на Heroku и забудь» до собственного VPS с Docker и CI/CD. В этой статье я расскажу, как правильно деплоить Swift-приложения, чтобы они не падали в 3 часа ночи, а пользователи не писали гневные письма. Спойлер: облака — не всегда серебряная пуля, а VPS может быть надёжнее, чем кажется.
Что мы будем деплоить: пример приложения на Vapor
Для наглядности возьмём типичное REST API на Vapor 4. Это будет простой сервер с одной ручкой, который возвращает JSON. Код — минимальный, но достаточный, чтобы показать все этапы деплоя.
// Sources/App/routes.swift
import Vapor
func routes(_ app: Application) throws {
app.get { req async in
return "Hello, Swift on Server!"
}
app.get("api", "health") { req -> HTTPStatus in
return .ok
}
}
Запускается это всё через swift run или vapor run. Но в продакшене так никто не делает. Нам нужен стабильный процесс: сборка, упаковка, запуск и мониторинг.
Вариант 1: VPS — старый друг лучше новых двух
Виртуальный частный сервер (VPS) — это как собственная квартира: полный контроль, но и ответственность за уборку. Для Swift это идеальный вариант, если вы хотите понять, как работает система под капотом.
Как подготовить VPS для Swift
Берём Ubuntu 22.04 (или 24.04) на DigitalOcean, Hetzner или Vscale. Swift официально поддерживает Ubuntu, поэтому проблем не будет.
- Подключаемся по SSH:
ssh root@your-server-ip - Ставим зависимости:
apt update && apt install -y clang libicu-dev libcurl4-openssl-dev libssl-dev - Скачиваем Swift 5.9+ с swift.org и распаковываем в
/usr/local
# Пример установки Swift на Ubuntu
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
mv swift-5.9.2-RELEASE-ubuntu22.04 /usr/local/swift
echo 'export PATH=/usr/local/swift/usr/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
swift --version
Деплой через Git + systemd
Самый простой способ: клонируем репозиторий на сервер, собираем бинарник и запускаем как сервис.
# На сервере
git clone https://github.com/yourname/your-swift-app.git
cd your-swift-app
swift build -c release
cp .build/release/Run /usr/local/bin/myapp
# Создаём systemd unit
sudo nano /etc/systemd/system/myapp.service
[Unit]
Description=My Swift App
After=network.target
[Service]
ExecStart=/usr/local/bin/myapp
WorkingDirectory=/root/your-swift-app
Restart=always
User=root
Environment="PORT=8080"
[Install]
WantedBy=multi-user.target
Запускаем: systemctl enable myapp && systemctl start myapp. Готово! Теперь ваше приложение работает как демон и перезапускается при падении.
Плюсы VPS: полный контроль, низкая цена ($5–10/мес), можно ставить любые утилиты. Минусы: нужно самому настраивать мониторинг, обновления и безопасность. Если ваше приложение вырастет — придётся вручную масштабировать.
Вариант 2: Docker — контейнеризируем Swift
Docker решает проблему «на моей машине работает». Вы упаковываете приложение вместе с окружением и запускаете где угодно. Для Swift это особенно актуально, потому что версии Swift на сервере и локально могут отличаться.
Пишем Dockerfile для Swift
Используем многоступенчатую сборку (multistage build) — это стандарт индустрии: первый контейнер собирает бинарник, второй — минимальный рантайм.
# ---- Build stage ----
FROM swift:5.9-focal AS build
WORKDIR /app
COPY . .
RUN swift build -c release --product Run
# ---- Run stage ----
FROM ubuntu:22.04
RUN apt-get update && apt-get install -y libicu-dev libcurl4-openssl-dev libssl-dev && rm -rf /var/lib/apt/lists/*
COPY --from=build /app/.build/release/Run /usr/local/bin/Run
EXPOSE 8080
CMD ["Run"]
Собираем и запускаем:
docker build -t swift-api .
docker run -d -p 8080:8080 --name my-swift-app swift-api
Теперь ваше приложение живёт в контейнере. Если сервер упадёт — Docker автоматически не перезапустит, но вы можете добавить флаг --restart always.
Docker Compose для сложных проектов
Если у вас есть база данных, Redis или Nginx — используйте docker-compose.yml:
version: '3.8'
services:
app:
build: .
ports:
- "8080:8080"
environment:
- DATABASE_URL=postgres://user:pass@db:5432/swiftdb
depends_on:
- db
db:
image: postgres:15
environment:
POSTGRES_DB: swiftdb
POSTGRES_USER: user
POSTGRES_PASSWORD: pass
Запуск одной командой: docker-compose up -d. Красота!
Плюсы Docker: изолированность, воспроизводимость, лёгкость масштабирования (Kubernetes). Минусы: образы Swift весят ~500 МБ, нужно разбираться с Docker-сетями и томами.
Вариант 3: Облачные платформы — деплой в один клик
Если не хотите возиться с серверами — используйте облачные PaaS-решения. Они берут на себя инфраструктуру: балансировку, логи, мониторинг. Для Swift выбор невелик, но есть рабочие варианты.
Fly.io — Swift-френдли облако
Fly.io поддерживает Docker-образы и даёт бесплатный лимит. Идеально для стар