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
}

Наступні кроки

Див. також

Шлях: step-by-step/caddy-reverse-proxy.md

UMTC Wiki © 2026 | Ukrainian Military Tactical Communications