NPV-AM

← Все руководства

Let's Encrypt + Caddy: автоматический TLS

22 июля 2026 · 8 мин чтения · Начальный

Caddy автоматически получает и обновляет TLS-сертификаты Let's Encrypt без каких-либо дополнительных скриптов. Это самый простой способ получить HTTPS на вашем сервере.

Шаг 1: Установка Caddy

# Ubuntu/Debian
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update
sudo apt install caddy

# Проверка
caddy version

Caddy уже установлен и работает как systemd-сервис. Порты 80 и 443 заняты.

Шаг 2: Базовый Caddyfile

# /etc/caddy/Caddyfile
example.com {
    root * /var/www/html
    file_server
}

Это всё. Caddy автоматически получит сертификат при первом запросе. Убедитесь, что DNS указывает на ваш сервер:

dig +short example.com

Шаг 3: Reverse proxy

Для проксирования на backend-сервис:

example.com {
    reverse_proxy localhost:3000
}

api.example.com {
    reverse_proxy localhost:8080
    log {
        output file /var/log/caddy/api.log
    }
}

Caddy автоматически обрабатывает WebSocket-соединения:

ws.example.com {
    reverse_proxy localhost:8080 {
        header_up Connection {>Connection}
        header_up Upgrade {>Upgrade}
    }
}

Шаг 4: Базовая авторизация

Создайте файл паролей:

# Генерация хеша пароля
caddy hash-password --plaintext "my-secret-password"
# /etc/caddy/Caddyfile
admin.example.com {
    basicauth {
        admin $2a$14$GENERATED_HASH_HERE
    }
    reverse_proxy localhost:3000
}

При запросе браузер запросит логин/пароль.

Шаг 5: Статические файлы и SPA

# Статический сайт
static.example.com {
    root * /var/www/static
    file_server
    encode gzip zstd
}

# SPA (Vue/React)
app.example.com {
    root * /var/www/app
    try_files {path} /index.html
    file_server
    encode gzip zstd
    header {
        X-Frame-Options DENY
        X-Content-Type-Options nosniff
        Referrer-Policy strict-origin-when-cross-origin
    }
}

Шаг 6: Журналирование и метрики

# /etc/caddy/Caddyfile
{
    email admin@example.com
    admin off
}

example.com {
    log {
        output file /var/log/caddy/access.log {
            roll_size 100mb
            roll_keep 5
        }
    }

    metrics

    reverse_proxy localhost:3000
}

Метрики доступны на /metrics для Prometheus:

# В prometheus.yml
- job_name: 'caddy'
  static_configs:
    - targets: ['localhost:2019']

Шаг 7: Проверка и перезагрузка

# Валидация конфигурации
caddy validate --config /etc/caddy/Caddyfile

# Перезагрузка без даунтайма
sudo systemctl reload caddy

# Просмотр логов
sudo journalctl -u caddy -f

# Проверка сертификата
curl -I https://example.com | grep -i "ssl"

Для изменения конфига без перезапуска сервиса используйте API:

# Отправка конфигурации через API
curl -X POST -H "Content-Type: application/json" -d @caddyconfig.json http://localhost:2019/config/
Caddy автоматически продлевает сертификаты за 30 дней до истечения. Не нужно настраивать cron-задачи для обновления.

Шаг 8: Мультидоменная конфигурация

# /etc/caddy/Caddyfile
{
    email admin@example.com
}

# Сайт
example.com {
    reverse_proxy localhost:3000
    log { output file /var/log/caddy/example.log }
}

# API
api.example.com {
    reverse_proxy localhost:8080
    log { output file /var/log/caddy/api.log }
}

# Админ-панель
admin.example.com {
    basicauth {
        admin $2a$14$HASH
    }
    reverse_proxy localhost:9090
}

Каждый домен получит собственный сертификат автоматически.