Caddy reverse proxy¶
Час: ~15 хвилин
Рівень: Початківець
Потрібно: VPS з публічним IP, доменне ім'я
Що отримаємо¶
Reverse proxy з автоматичним HTTPS сертифікатом Let's Encrypt.
┌─────────────────────────────────────────────────────┐
│ VPS │
│ ┌─────────────┐ ┌──────────────────────────┐ │
│ │ Caddy │ │ Ваш сервіс │ │
│ │ :80/:443 │─────►│ localhost:3001 │ │
│ │ HTTPS │ │ │ │
│ └─────────────┘ └──────────────────────────┘ │
└─────────────────────────────────────────────────────┘
▲
│ HTTPS
│
app.example.com
Передумови¶
- [ ] VPS з Ubuntu
- [ ] Доменне ім'я, що вказує на IP сервера
- [ ] Порти 80 і 443 відкриті
Крок 1: Налаштування DNS¶
Додайте A-запис у вашого DNS провайдера:
| Type | Name | Value |
|---|---|---|
| A | app | 123.45.67.89 |
Або для кореневого домену:
| Type | Name | Value |
|---|---|---|
| A | @ | 123.45.67.89 |
Перевірка:
dig +short app.example.com
# Має повернути ваш IP
Крок 2: Встановлення Caddy¶
# Встановити залежності
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
# Додати репозиторій Caddy
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 -y
Перевірка:
caddy version
Крок 3: Базовий Caddyfile¶
Створіть або відредагуйте Caddyfile:
sudo nano /etc/caddy/Caddyfile
Простий reverse proxy:¶
app.example.com {
reverse_proxy localhost:3001
}
Це все! Caddy автоматично:
- Отримає сертифікат Let's Encrypt
- Налаштує HTTPS
- Перенаправить HTTP на HTTPS
Крок 4: Перезапуск Caddy¶
# Перевірити конфігурацію
caddy validate --config /etc/caddy/Caddyfile
# Перезавантажити
sudo systemctl reload caddy
# Або перезапустити
sudo systemctl restart caddy
Перевірка статусу:
sudo systemctl status caddy
Крок 5: Відкриття портів¶
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
Крок 6: Перевірка¶
Відкрийте в браузері: https://app.example.com
Перевірте сертифікат — має бути від Let's Encrypt.
Розширена конфігурація¶
Кілька доменів¶
app1.example.com {
reverse_proxy localhost:3001
}
app2.example.com {
reverse_proxy localhost:3002
}
# Wildcard (потребує DNS challenge)
*.example.com {
reverse_proxy localhost:8080
}
З заголовками¶
app.example.com {
reverse_proxy localhost:3001 {
header_up Host {host}
header_up X-Real-IP {remote}
header_up X-Forwarded-For {remote}
header_up X-Forwarded-Proto {scheme}
}
}
Статичні файли + API¶
example.com {
# API на /api/*
handle /api/* {
reverse_proxy localhost:8080
}
# Статичні файли
handle {
root * /var/www/html
file_server
}
}
Базова авторизація¶
admin.example.com {
basicauth {
admin $2a$14$hashedpassword...
}
reverse_proxy localhost:8080
}
Генерація хешу пароля:
caddy hash-password
WebSocket¶
app.example.com {
reverse_proxy localhost:3001 {
# WebSocket автоматично підтримується
}
}
CORS¶
api.example.com {
header Access-Control-Allow-Origin *
header Access-Control-Allow-Methods "GET, POST, OPTIONS"
header Access-Control-Allow-Headers "Content-Type, Authorization"
reverse_proxy localhost:8080
}
Корисні команди¶
# Валідація конфігурації
caddy validate --config /etc/caddy/Caddyfile
# Форматування Caddyfile
caddy fmt --overwrite /etc/caddy/Caddyfile
# Перезавантаження без даунтайму
sudo systemctl reload caddy
# Логи
sudo journalctl -u caddy -f
# Статус сертифікатів
sudo caddy trust
Приклад: Docker + Caddy¶
docker-compose.yml¶
version: "3.8"
services:
caddy:
image: caddy:2
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
- caddy_data:/data
- caddy_config:/config
app:
image: your-app:latest
restart: unless-stopped
# Не відкриваємо порт назовні
expose:
- "3001"
volumes:
caddy_data:
caddy_config:
Caddyfile для Docker¶
app.example.com {
reverse_proxy app:3001
}
Типові проблеми¶
Сертифікат не отримується¶
Симптоми: HTTP працює, HTTPS — ні
Рішення:
1. Перевірте DNS: dig +short app.example.com
2. Перевірте порти 80 і 443
3. Перегляньте логи: sudo journalctl -u caddy
502 Bad Gateway¶
Симптоми: Caddy працює, але сервіс недоступний
Рішення:
1. Перевірте що сервіс запущений
2. Перевірте правильність порту
3. Перевірте що сервіс слухає на localhost
Permission denied¶
Симптоми: Caddy не може біндитись на порт
Рішення:
# Дозволити біндинг на привілейовані порти
sudo setcap 'cap_net_bind_service=+ep' /usr/bin/caddy
Rate limit Let's Encrypt¶
Симптоми: Помилка отримання сертифіката
Рішення:
- Зачекайте годину
- Використовуйте staging для тестування:
{
acme_ca https://acme-staging-v02.api.letsencrypt.org/directory
}
Наступні кроки¶
- Docker Compose деплой — контейнеризація
- VPS налаштування — безпека
Див. також¶
Шлях: step-by-step/caddy-reverse-proxy.md