Настройка деплоя сайта на 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-compatible)
# Настройка 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 дней







