Налаштування розгортання сайту на Hetzner
Hetzner — німецький облачний провайдер з найкращим співвідношенням ціни до продуктивності в Європі. Cloud VPS дешевша за AWS/GCP в 3–5 разів при порівнюваних характеристиках. GDPR-compliant серверы в ЄС.
Створення сервера через hcloud CLI
# Установка CLI
brew install hetzner-cloud/tap/hcloud
# Створити сервер
hcloud server create \
--name myapp-prod \
--type cpx21 \ # 3 vCPU, 4 GB RAM — ~9€/мес
--image ubuntu-22.04 \
--location nbg1 \ # Нюрнберг
--ssh-key my-key \
--user-data-file cloud-init.yaml
Terraform для Hetzner
# main.tf
terraform {
required_providers {
hcloud = {
source = "hetznercloud/hcloud"
version = "~> 1.44"
}
}
}
provider "hcloud" {
token = var.hcloud_token
}
resource "hcloud_server" "app" {
name = "myapp-prod"
image = "ubuntu-22.04"
server_type = "cpx21"
location = "nbg1"
ssh_keys = [hcloud_ssh_key.default.id]
user_data = file("cloud-init.yaml")
labels = {
env = "production"
app = "myapp"
}
}
resource "hcloud_firewall" "app" {
name = "myapp-firewall"
rule {
direction = "in"
protocol = "tcp"
port = "22"
source_ips = ["10.0.0.0/8"] # тільки через VPN
}
rule {
direction = "in"
protocol = "tcp"
port = "80"
source_ips = ["0.0.0.0/0", "::/0"]
}
rule {
direction = "in"
protocol = "tcp"
port = "443"
source_ips = ["0.0.0.0/0", "::/0"]
}
}
resource "hcloud_load_balancer" "lb" {
name = "myapp-lb"
load_balancer_type = "lb11"
location = "nbg1"
}
resource "hcloud_load_balancer_target" "server" {
type = "server"
load_balancer_id = hcloud_load_balancer.lb.id
server_id = hcloud_server.app.id
}
GitHub Actions деплой
- name: Deploy to Hetzner
uses: appleboy/ssh-action@v1
with:
host: ${{ secrets.HETZNER_IP }}
username: deploy
key: ${{ secrets.SSH_PRIVATE_KEY }}
script: |
set -e
cd /var/www/myapp
# Забрати зміни
git fetch origin main
git reset --hard origin/main
# Обновити залежності
composer install --no-dev --optimize-autoloader
npm ci --omit=dev
npm run build
# Миграції і кеш
php artisan migrate --force
php artisan optimize
# Перезагрузити
sudo systemctl reload php8.3-fpm nginx
php artisan queue:restart
Hetzner Object Storage (S3-сумісне)
# Настройка AWS CLI для Hetzner
aws configure set aws_access_key_id $HETZNER_S3_KEY
aws configure set aws_secret_access_key $HETZNER_S3_SECRET
aws configure set region eu-central
# Створити бакет
aws --endpoint-url https://fsn1.your-objectstorage.com \
s3 mb s3://myapp-assets
# Загрузити статичні файли
aws --endpoint-url https://fsn1.your-objectstorage.com \
s3 sync ./dist/assets s3://myapp-assets/assets \
--cache-control "public, max-age=31536000, immutable"
Hetzner + Docker Swarm (кілька серверів)
# Ініціалізувати Swarm на першому сервері
ssh server1 "docker swarm init"
# Додати рабочі вузли
JOIN_TOKEN=$(ssh server1 "docker swarm join-token worker -q")
ssh server2 "docker swarm join --token $JOIN_TOKEN server1:2377"
ssh server3 "docker swarm join --token $JOIN_TOKEN server1:2377"
# Розгортання стека
docker -H ssh://deploy@server1 stack deploy \
-c docker-compose.prod.yml \
myapp
Терміни реалізації
- Один VPS + Nginx + деплой: 1–2 дні
- Terraform + Load Balancer: 3–4 дні
- Docker Swarm кластер: 4–5 днів







