🧩 Интеграция Marzban с Caddy: HTTPS и красивый веб-интерфейс
- Получить ссылку
- X
- Электронная почта
- Другие приложения
В прошлых статьях мы настроили Marzban и разобрались с подписками. Но есть один нюанс, который часто упускают: по умолчанию панель Marzban работает по HTTP. Это значит, что пароль администратора передаётся по сети в открытом виде. А без HTTPS не будут работать ссылки-подписки, QR-коды и Deep Links. Сегодня мы решим эту проблему раз и навсегда — с помощью Caddy.
🎯 Вместо введения: почему без HTTPS
никуда
Представьте,
что вы оставляете ключи от квартиры под ковриком у двери. Удобно? Да.
Безопасно? Нет. То же самое с HTTP. Когда вы входите в панель Marzban по HTTP,
ваш логин и пароль передаются по сети в открытом виде. Любой, кто находится в
той же сети (например, в кафе или аэропорту), может их перехватить.
HTTPS решает
эту проблему, шифруя весь трафик между вашим браузером и сервером. Но чтобы
включить HTTPS, нужен SSL-сертификат. И тут начинается самое
интересное.
Традиционный
путь: получить сертификат через Let's Encrypt → настроить Nginx → прописать
кучу директив → настроить автообновление → следить, чтобы сертификат не истёк.
Звучит утомительно? Именно поэтому существует Caddy.
🧠 Часть 1. Что такое Caddy и почему он
лучше Nginx
Коротко о
главном
Caddy — это веб-сервер с открытым
исходным кодом, написанный на Go. Его главная особенность — автоматический
HTTPS из коробки.
Вы просто пишете в конфиге:
example.com {
reverse_proxy localhost:8000
}
И Caddy сам:
- Получает SSL-сертификат от Let's
Encrypt
- Настраивает HTTPS на порту 443
- Перенаправляет HTTP на HTTPS
- Продлевает сертификат перед
истечением срока
Никаких certbot, acme.sh, cron и
ручных настроек. Всё автоматически.
Caddy vs
Nginx: сравнение
📋 Сравнение Caddy и Nginx
| Критерий | Nginx | Caddy |
|---|---|---|
| Автоматический HTTPS | ❌ Нужен Certbot | ✅ Встроено |
| Настройка HTTPS | 20+ строк | 3 строки |
| Продление сертификата | Вручную через cron | Автоматически |
| HTTP → HTTPS редирект | Нужно прописывать | Автоматически |
| Синтаксис конфига | Сложный | Простой |
| Потребление памяти | ~50 МБ | ~30 МБ |
| Скорость | Высокая | Сопоставимая |
Таблица обновлена в рамках серии статей о WireGuard и Marzban
Главное
преимущество Caddy —
он убирает 80% рутинных операций, связанных с сертификатами. Для небольшого
проекта это идеальный выбор.
🛠 Часть 2. Установка Caddy
Требования
- Сервер с Ubuntu 22.04 / Debian 12
- Домен, указывающий на IP сервера
(A-запись)
- Открытые порты 80 и 443
Установка на Ubuntu/Debian
sudo apt install -y debian-keyring
debian-archive-keyring apt-transport-https curl
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 автоматически запустится и будет слушать порты 80 и 443.
Проверка:
sudo systemctl status caddy
Вы должны
увидеть active (running).
🔧 Часть 3. Базовая настройка Caddy
Где
находится конфиг
Главный
конфигурационный файл — /etc/caddy/Caddyfile. Именно здесь мы будем
прописывать все правила.
Минимальный
Caddyfile для Marzban
Откройте файл:
sudo nano /etc/caddy/Caddyfile
Замените его содержимое на:
panel.example.com
{
reverse_proxy localhost:8000
}
Что это
значит:
- panel.example.com — ваш домен
(или поддомен)
- reverse_proxy localhost:8000 —
Caddy будет проксировать все запросы на локальный порт 8000, где работает
Marzban
Сохраните файл и перезагрузите Caddy:
sudo systemctl reload caddy
Что произойдёт:
- Caddy увидит новый домен
- Автоматически запросит
SSL-сертификат у Let's Encrypt
- Настроит HTTPS
- Начнёт проксировать трафик на
Marzban
Проверка:
curl -I https://panel.example.com
Должен
быть HTTP/2 200 и заголовок server: Caddy.
🚀 Часть 4. Продвинутая настройка:
подписки и API
Если вы хотите,
чтобы панель, подписки и API работали через один домен, можно
использовать path-based routing.
Пример Caddyfile
panel.example.com {
# Подписки Marzban
handle
/sub/* {
reverse_proxy localhost:8000
}
# API
Marzban
handle
/api/* {
reverse_proxy localhost:8000
}
# Основной статический сайт
handle {
root *
/opt/vpn-service/static
file_server
}
}
Как это
работает:
- Запросы к https://panel.example.com/sub/... →
идут в Marzban
- Запросы к https://panel.example.com/api/... →
идут в Marzban
- Все остальные запросы → отдаются из
папки /opt/vpn-service/static
Использование
Unix-сокета вместо порта
Marzban может
работать через Unix-сокет — это быстрее и безопаснее, чем TCP-порт.
В Caddyfile:
panel.example.com {
reverse_proxy unix//var/lib/marzban/marzban.socket
}
В .env Marzban нужно указать:
UVICORN_UDS = /var/lib/marzban/marzban.socket
XRAY_SUBSCRIPTION_URL_PREFIX =
https://panel.example.com
🔒 Часть 5. Безопасность: что можно
улучшить
1. Скрыть
заголовок Server
По умолчанию Caddy показывает Server: Caddy. Злоумышленники могут использовать эту информацию. Уберите заголовок:
panel.example.com {
header {
-Server
}
reverse_proxy localhost:8000
}
2. Добавить
HSTS
HSTS заставляет браузер всегда использовать HTTPS:
panel.example.com {
header {
Strict-Transport-Security "max-age=31536000;
includeSubDomains"
}
reverse_proxy localhost:8000
}
3. Ограничить доступ по IP (опционально)
Если панель нужна только вам, можно ограничить доступ:
panel.example.com {
@allowed {
remote_ip 203.0.113.5
remote_ip 127.0.0.1
}
handle
@allowed {
reverse_proxy localhost:8000
}
handle {
respond
"Access Denied" 403
}
}
🔍 Что такое @allowed
В Caddy @allowed —
это именованный матчер (named matcher). Это способ дать имя
набору условий, чтобы потом ссылаться на него в других директивах.
Синтаксис:
caddy
@имя_матчера {
условие1
условие2
}
В нашем случае
имя — allowed. Внутри — два условия remote_ip.
🔍 Что делает remote_ip
remote_ip —
это условие, которое проверяет IP-адрес клиента, отправившего
запрос.
caddy
remote_ip 203.0.113.5
remote_ip 127.0.0.1
Это
значит: «запрос пришёл с одного из этих IP-адресов».
- 203.0.113.5 — пример
публичного IP-адреса. В документации этот адрес зарезервирован для
примеров (TEST-NET-3). В реальной конфигурации здесь должен быть ваш
личный IP или IP офиса.
- 127.0.0.1 — это localhost. То
есть запросы с самого сервера (например, при локальном обращении) тоже
разрешены.
🔍 Как это работает вместе
Сам по себе
матчер @allowed ничего не делает — он просто определяет
условие. Чтобы он заработал, его нужно использовать в директивах handle, respond, reverse_proxy и
т.д.
Полный
пример:
caddy
panel.example.com
{
@allowed {
remote_ip 203.0.113.5
remote_ip 127.0.0.1
}
handle
@allowed {
reverse_proxy
localhost:8000
}
handle {
respond
"Access Denied" 403
}
}
Что происходит:
- Caddy получает запрос к panel.example.com.
- Срабатывает матчер @allowed:
проверяется IP клиента.
- Если IP совпадает с
одним из указанных (203.0.113.5 или 127.0.0.1) → выполняется handle
@allowed → запрос проксируется на Marzban (порт 8000).
- Если IP не совпадает →
выполняется второй handle (без условия) → сервер
возвращает 403 Access Denied.
🎯 Зачем это нужно
Это простая
и надёжная защита панели администратора:
- Панель Marzban доступна только
с вашего IP.
- Все остальные (боты, сканеры,
случайные люди) получают 403 Forbidden.
- Даже если кто-то узнает URL панели,
он не сможет даже увидеть страницу входа.
Особенно полезно, если панель не должна быть доступна публично, а только для вас или узкого круга администраторов.
📊 Часть 6. Сравнение: HTTP vs HTTPS
📋 Сравнение HTTP и HTTPS
| Критерий | HTTP | HTTPS |
|---|---|---|
| Шифрование | ❌ Нет | ✅ Да |
| Пароль в открытом виде | ✅ Да | ❌ Нет |
| QR-коды работают | ❌ Нет | ✅ Да |
| Подписки работают | ❌ Нет | ✅ Да |
| Доверие браузера | ❌ «Небезопасно» | ✅ «Защищено» |
| SEO | ❌ Штраф | ✅ Бонус |
Таблица обновлена в рамках серии статей о WireGuard и Marzban
🧪 Часть 7. Проверка и отладка
Проверить сертификат
curl -vI https://panel.example.com 2>&1
| grep -E "issuer|expire"
Посмотреть логи Caddy
journalctl -u caddy -n 50 --no-pager
Проверить синтаксис Caddyfile
caddy validate --config /etc/caddy/Caddyfile
Перезагрузить Caddy после изменений
sudo systemctl reload caddy
💎 Часть 8. Что мы узнали?
- Caddy — это веб-сервер с автоматическим
HTTPS.
- Он сам получает и
продлевает SSL-сертификаты, избавляя от рутины.
- Настройка Caddy для Marzban занимает 3
строки.
- Path-based routing позволяет раздавать панель,
подписки и статику через один домен.
- Unix-сокет быстрее и безопаснее
TCP-порта.
📚 Читайте также:
🔜 Что дальше?
В следующей
статье мы разберём мониторинг и резервное копирование Marzban: как
следить за состоянием панели, настроить автоматические бэкапы и получать
уведомления в Telegram.
Оставайтесь на
связи! 🚀
📚 Источники
Материалы
подготовлены на основе открытых источников:
- Marzban
Docs — SSL activation with Caddy
- GitHub
— Gozargah/Marzban — Issue #1969: Reverse proxy path
isolation
- Caddy Documentation — Automatic HTTPS
- OneUptime
Blog — How to Set Up Caddy with
Automatic HTTPS
- Pikabu — Marzban: обзор
панели управления
- Tencent
Cloud — Caddy vs Nginx: production guide
- HostEase — Caddy reverse proxy
deployment
- Получить ссылку
- X
- Электронная почта
- Другие приложения
Популярные сообщения
🧬 ChaCha20 и Curve25519: Криптография под капотом WireGuard
Немного о том, зачем это нужно.
🔌 L2TP: протокол, который объединил лучшее от двух миров
⚡ ИИ-помощник (на OpenRouter)
Спросите про VPN, протоколы или настройку серверов.
Комментарии
Отправить комментарий