← Все руководства
Let's Encrypt + Caddy: автоматический TLS
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
}
Каждый домен получит собственный сертификат автоматически.