Настройка Caddy для веб-сервера
Caddy — современный веб-сервер на Go с автоматическим HTTPS через Let's Encrypt. Получает и обновляет SSL-сертификаты без настройки certbot. Конфигурация в разы проще Nginx.
Установка
apt install -y debian-keyring debian-archive-keyring apt-transport-https
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/caddy-stable-archive-keyring.gpg] https://dl.cloudsmith.io/public/caddy/stable/deb/debian any-main main" | tee /etc/apt/sources.list.d/caddy-stable.list
apt update && apt install caddy
Caddyfile
# /etc/caddy/Caddyfile
# Автоматический HTTPS — просто указать домен
example.com {
root * /var/www/myapp/public
# PHP-FPM
php_fastcgi unix//var/run/php/php8.3-fpm.sock
# SPA: все запросы на index.html
try_files {path} /index.php?{query}
# Сжатие
encode gzip
# Заголовки безопасности
header {
Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
X-Frame-Options "DENY"
X-Content-Type-Options "nosniff"
Referrer-Policy "strict-origin-when-cross-origin"
-Server # убрать заголовок Server
}
# Статика
@static {
path *.css *.js *.jpg *.png *.gif *.ico *.svg *.woff2
}
header @static Cache-Control "public, max-age=31536000, immutable"
# Запретить .env
@dotfiles {
path /.*
}
respond @dotfiles 403
log {
output file /var/log/caddy/access.log
format json
}
}
# Reverse proxy для Node.js
api.example.com {
reverse_proxy localhost:3000 {
header_up X-Real-IP {remote_host}
header_up X-Forwarded-Proto {scheme}
}
}
# Редирект www → non-www
www.example.com {
redir https://example.com{uri} permanent
}
Несколько сайтов
# Всё в одном файле
site1.com {
root * /var/www/site1/public
php_fastcgi unix//var/run/php/php8.3-fpm.sock
encode gzip
}
site2.com {
reverse_proxy localhost:4000
}
# Wildcard (нужен DNS-провайдер с поддержкой ACME DNS challenge)
*.example.com {
tls {
dns cloudflare {env.CLOUDFLARE_API_TOKEN}
}
reverse_proxy localhost:8080
}
Caddy API (JSON config)
# Перезагрузить конфиг через API
curl -X POST "http://localhost:2019/load" \
-H "Content-Type: application/json" \
-d @caddy.json
# Проверить текущую конфигурацию
curl http://localhost:2019/config/
Docker
# docker-compose.yml
services:
caddy:
image: caddy:2-alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
- caddy_data:/data # хранит сертификаты
- caddy_config:/config
restart: unless-stopped
volumes:
caddy_data:
caddy_config:
Срок реализации
Caddy — самый быстрый в настройке веб-сервер: базовая конфигурация с SSL занимает 1–2 часа.







