Деплой SaaS-продуктів з Docker на Hetzner Cloud
Практичний гайд з розгортання контейнеризованих SaaS-додатків на Hetzner Cloud з Docker Compose, автоматизованим CI/CD та деплоєм без даунтайму.
Вступ
У fluxLab.dev всі шість наших продакшн SaaS-продуктів працюють на Hetzner Cloud. Ми обрали Hetzner замість AWS з простої причини: вартість. Інстанс CX31 (4 vCPU, 8ГБ RAM) коштує €8.50/місяць — приблизно в 5 разів дешевше за еквівалентні інстанси на AWS. Для бутстреп SaaS-продуктів це має значення.
Наш стек
Кожен продукт використовує однаковий патерн деплою:
- Docker Compose для оркестрації контейнерів
- Caddy як реверс-проксі з автоматичним HTTPS
- GitHub Actions для CI/CD
- Hetzner Object Storage для завантаження файлів (S3-сумісний)
Налаштування Docker Compose
Типовий продакшн docker-compose.yml для наших продуктів:
services:
app:
image: registry/app:latest
restart: unless-stopped
environment:
- DATABASE_URL=postgres://...
- REDIS_URL=redis://redis:6379
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_healthy
postgres:
image: postgres:16-alpine
restart: unless-stopped
volumes:
- pgdata:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 10s
redis:
image: redis:7-alpine
restart: unless-stopped
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 10s
caddy:
image: caddy:2-alpine
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
- caddy_data:/data
Чому Caddy замість Nginx
Caddy надає автоматичний HTTPS з Let's Encrypt — без налаштування certbot, без крон-задач на поновлення сертифікатів. Caddyfile простий і читабельний:
jobber-app.com {
reverse_proxy app:3000
}
Це все. HTTPS просто працює.
CI/CD пайплайн
Наш workflow у GitHub Actions білдить Docker-образи, пушить їх у реєстр та деплоїть через SSH:
Етап білду
Етап білду використовує Docker Buildx з кешуванням шарів. Для наших Next.js-фронтендів це скорочує час білду з 8 хвилин до менш ніж 2 хвилин на наступних білдах.
Етап деплою
Деплой — це простий SSH-скрипт: підтягнути новий образ, перезапустити сервіс. Решту бере на себе Docker Compose.
- name: Deploy
run: |
ssh deploy@${{ secrets.SERVER_IP }} << 'EOF'
cd /opt/app
docker compose pull app
docker compose up -d app
EOF
Деплой без даунтайму
Для деплою без даунтайму ми покладаємось на поведінку Docker Compose під час rolling update разом із health checks. Новий контейнер стартує, проходить health check, і лише тоді старий контейнер зупиняється.
Моніторинг
Health checks
Кожен сервіс виставляє ендпоінт /health, що перевіряє з'єднання з базою даних та Redis. Ми перевіряємо цей ендпоінт кожні 30 секунд.
Логи
Усі сервіси виводять структуровані JSON-логи. Для дебагу в реальному часі ми використовуємо docker compose logs -f --since 1h і ротуємо логи вбудованим механізмом ротації Docker.
Вартість
Запуск Jobber на продакшні на Hetzner:
- CX31 сервер (4 vCPU, 8ГБ RAM): €8.50/місяць
- 100ГБ volume для PostgreSQL: €4.40/місяць
- Object Storage (S3): ~€2/місяць
- Всього: ~€15/місяць
Порівняйте це з AWS (t3.medium + RDS + S3): щонайменше ~€80/місяць. Для бутстреп SaaS-продукту ця різниця у 5 разів — суттєва.
Уроки
- Health checks обов'язкові — без них Docker миттєво перезапускає зламані контейнери, спричиняючи цикли перезапуску
- Завжди використовуй volumes для баз даних — втрата даних PostgreSQL невідновна
- Фіксуй версії образів —
postgres:16-alpine, а неpostgres:latest - Автоматизуй все — ручні деплої — джерело №1 інцидентів на продакшні
- Тримай секрети у змінних середовища — ніколи не додавай файли
.envу git
Висновок
Docker на Hetzner Cloud дає fluxLab.dev інфраструктуру продакшн-класу за частину вартості хмарних провайдерів. Для SaaS-продуктів із передбачуваними патернами трафіку виділені сервери з Docker Compose простіші й дешевші за Kubernetes або serverless-архітектури.
Хочете, щоб хтось незалежний подивився на ваш деплой? Аудит інфраструктури — частина нашого технічного консалтингу.
Читайте також
Як побудувати SaaS-продукт від нуля до запуску за 8 тижнів
Покроковий плейбук fluxLab.dev для створення SaaS-продуктів від ідеї до продакшну — архітектура, визначення MVP, деплой та запуск.
Чому варто аутсорсити розробку в продуктову студію в Україні
Чому продуктова студія краща за традиційну аутсорсингову агенцію і що шукати в партнері в Україні. Практичний гайд від київської студії.