Устали запоминать, что Proxmox висит на 192.168.1.10:8006, Nextcloud — на 192.168.1.15:8080, а Pi-hole — на 192.168.1.20:80? Это нормально в первый месяц. Через год это превращается в боль. Nginx Proxy Manager (NPM) решает проблему раз и навсегда: все ваши сервисы получают красивые доменные имена, валидный SSL и единую точку входа.
В этом гайде — полные конфигурации для десяти популярных self-hosted сервисов: Proxmox VE, Proxmox Backup Server, Zimbra, MailCow, Pi-hole, Nextcloud, OpenMediaVault, Vaultwarden и Grafana. Готовые конфиги — копируй и вставляй.
После прочтения вы получите: рабочий reverse proxy с автоматическим SSL, красивые доменные имена для всех сервисов и понимание, какие заголовки нужны каждому конкретному приложению.
Что такое Nginx Proxy Manager и зачем он нужен
Nginx Proxy Manager — это веб-интерфейс поверх Nginx, который позволяет управлять reverse proxy через браузер без ручного редактирования конфигов. Под капотом — обычный Nginx, но с удобным UI, автоматическим получением SSL-сертификатов через Let’s Encrypt и встроенной защитой от атак.
Ключевые возможности:
- SSL-сертификаты Let’s Encrypt в один клик (включая wildcard через DNS-challenge)
- Поддержка WebSocket и HTTP/2
- Кастомные конфигурации Nginx для нестандартных случаев
- Access Lists — ограничение доступа по IP или Basic Auth
- Редиректы и 404-страницы
- Работает в Docker — обновление одной командой
Что вы получите после настройки:
- Все сервисы по доменным именам:
pve.domain.com,cloud.domain.com,nas.domain.com - Автоматическое обновление SSL-сертификатов
- Единая точка входа с возможностью добавить SSO (Authelia/Authentik)
- Защита от распространённых атак «из коробки»
Установка Nginx Proxy Manager через Docker
Рекомендуемый способ — Docker Compose. Минимальный docker-compose.yml:
version: '3.8'
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
container_name: nginx-proxy-manager
restart: unless-stopped
ports:
- '80:80' # HTTP трафик
- '81:81' # Веб-интерфейс NPM
- '443:443' # HTTPS трафик
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
networks:
- proxy-network
networks:
proxy-network:
driver: bridge
Первые шаги:
- Создайте папку:
mkdir nginx-proxy-manager && cd nginx-proxy-manager - Создайте файл
docker-compose.ymlс содержимым выше - Запустите:
docker compose up -d - Откройте браузер:
http://ваш-сервер:81 - Логин по умолчанию:
admin@example.com/changeme
Важно! Сразу после первого входа смените email и пароль администратора. Если сервер доступен из интернета — ограничьте доступ к порту 81 только с доверенных IP через Access List или firewall.
Как работает проксирование: базовые понятия
Прежде чем настраивать конкретные сервисы, важно понять несколько ключевых понятий.
Scheme — схема подключения к бэкенду
NPM подключается к вашему сервису либо по http, либо по https. Если сервис использует самоподписанный сертификат (как Proxmox) — выбирайте https и добавляйте proxy_ssl_verify off;. Для большинства Docker-сервисов внутри одной сети достаточно http.
WebSocket Support
Многие современные веб-интерфейсы используют WebSocket для real-time обновлений: консоли виртуальных машин в Proxmox, live-статистика Pi-hole, уведомления в Nextcloud Talk. Если не включить эту опцию — эти функции просто не будут работать.
Заголовки X-Forwarded-*
Когда NPM проксирует запрос, бэкенд видит IP-адрес NPM, а не реального пользователя. Заголовки X-Forwarded-For, X-Real-IP и X-Forwarded-Proto передают информацию о реальном клиенте. Без них: некорректные логи, сломанный CSRF в некоторых приложениях, неправильные редиректы.
Docker-сеть как транспорт
Если NPM и проксируемый сервис находятся в одной Docker-сети, можно обращаться к контейнеру по его имени (nextcloud-app) вместо IP-адреса. Это удобнее и надёжнее — IP контейнера может меняться при перезапуске.
Proxmox VE: настройка reverse proxy (порт 8006)
Proxmox — один из самых капризных сервисов для проксирования из-за самоподписанного сертификата и требования к WebSocket для работы консолей VM и LXC.
Особенности:
- Порт 8006, схема HTTPS
- Самоподписанный сертификат — нужен
proxy_ssl_verify off - WebSocket обязателен для консолей виртуальных машин
- Большие лимиты для загрузки ISO-образов
Настройка Proxy Host в NPM:
- Domain Names:
pve.yourdomain.com - Scheme:
https - Forward Hostname/IP: IP вашего Proxmox сервера
- Forward Port:
8006 - Включить: WebSocket Support, Block Common Exploits
- SSL Tab: Let’s Encrypt, Force SSL
Вкладка Advanced — Custom Nginx Configuration:
# Отключаем проверку самоподписанного сертификата Proxmox proxy_ssl_verify off; # Заголовки для корректной работы авторизации и WebSocket proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Port 443; # Увеличенные таймауты для консолей VM (socat/novnc держит соединение) proxy_read_timeout 3600s; proxy_send_timeout 3600s; # Отключаем буферизацию — консоль должна работать в реальном времени proxy_buffering off; # Для загрузки ISO-образов и дисков client_max_body_size 50G;
Проверка: Откройте https://pve.yourdomain.com — должна появиться страница входа Proxmox. Зайдите и убедитесь, что консоль виртуальной машины открывается без ошибок. Если консоль не работает — первым делом проверьте, включён ли WebSocket Support в настройках Proxy Host.
Proxmox Backup Server: настройка reverse proxy (порт 8007)
PBS очень похож на PVE, но добавляет требования к работе с большими объёмами данных при бэкапах.
Настройка Proxy Host в NPM:
- Domain Names:
pbs.yourdomain.com - Scheme:
https - Forward Hostname/IP: IP PBS сервера
- Forward Port:
8007 - Включить: WebSocket Support, Block Common Exploits
Custom Nginx Configuration:
proxy_ssl_verify off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Port 443; proxy_set_header X-Forwarded-Host $host; # WebSocket для консоли и real-time статуса задач proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; # Без ограничений на размер — бэкапы бывают очень большими client_max_body_size 0; # 24 часа — для длительных задач резервного копирования proxy_read_timeout 86400s; proxy_send_timeout 86400s; # Отключаем компрессию для бинарных данных бэкапов proxy_set_header Accept-Encoding "";
Zimbra Collaboration: настройка reverse proxy (порты 8443 и 7071)
Zimbra имеет два отдельных веб-интерфейса: пользовательский почтовый клиент и административная панель. Каждый требует своего Proxy Host.
Порты Zimbra:
8443— веб-клиент пользователей (HTTPS)7071— административная панель (HTTPS)8080— веб-клиент (HTTP, для редиректа)
Proxy Host для веб-клиента:
- Domain Names:
mail.yourdomain.com - Scheme:
https - Forward Hostname/IP: IP Zimbra сервера
- Forward Port:
8443 - Включить: Block Common Exploits
Custom Nginx Configuration для веб-клиента:
proxy_ssl_verify off; # Zimbra чувствителен к этим заголовкам — не убирать proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Port 443; # Для загрузки вложений — Zimbra позволяет большие файлы client_max_body_size 1024M; # Zimbra держит долгие соединения при работе с большими ящиками proxy_read_timeout 300s; proxy_connect_timeout 300s; proxy_send_timeout 300s; # Отключаем перекодирование — Zimbra сам управляет сжатием proxy_set_header Accept-Encoding "";
Proxy Host для административной панели:
Создайте отдельный Proxy Host: zimbra-admin.yourdomain.com → порт 7071, схема https, конфигурация аналогична веб-клиенту. Обязательно ограничьте доступ к этому домену через Access List — только для администраторов.
MailCow Dockerized: настройка reverse proxy
MailCow — полноценный почтовый стек в Docker. Главная особенность: его внутренний Nginx слушает на 127.0.0.1:80/443 и не доступен снаружи напрямую. Правильный способ — объединить NPM и MailCow в одну Docker-сеть.
Особенности:
- MailCow слушает только на localhost внутри контейнера
- Необходима общая Docker-сеть с NPM
- Требует корректные заголовки
X-Forwarded-*для CSRF-защиты - SMTP/IMAP/POP3 порты NPM не проксирует — они открываются напрямую на хосте
Шаг 1: создаём общую Docker-сеть:
docker network create proxy-network
Шаг 2: в mailcow.conf отвязываем MailCow от внешних портов 80/443:
HTTP_PORT=8081 HTTPS_PORT=8443 HTTP_BIND=127.0.0.1 HTTPS_BIND=127.0.0.1
Шаг 3: подключаем nginx-контейнер MailCow к общей сети (в docker-compose.override.yml):
version: '3.8'
services:
nginx-mailcow:
networks:
- proxy-network
networks:
proxy-network:
external: true
Настройка Proxy Host в NPM:
- Domain Names:
mail.yourdomain.com - Scheme:
http - Forward Hostname/IP:
nginx-mailcow(имя контейнера) - Forward Port:
80 - Включить: WebSocket Support, Block Common Exploits
Custom Nginx Configuration:
proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # Критически важно для CSRF-защиты MailCow proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Port 443; # WebSocket для real-time уведомлений в интерфейсе proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; # Отключаем буферизацию для корректной работы UI proxy_buffering off;
Pi-hole: настройка reverse proxy (порт 80)
Pi-hole — простой в проксировании сервис, но требует отдельной обработки WebSocket для live-статистики на главном дашборде.
Настройка Proxy Host в NPM:
- Domain Names:
pihole.yourdomain.com - Scheme:
http - Forward Hostname/IP: IP сервера с Pi-hole
- Forward Port:
80 - Включить: WebSocket Support, Block Common Exploits
- SSL: Let’s Encrypt
Custom Nginx Configuration:
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# WebSocket для live-статистики на дашборде Pi-hole v6+
location /ws {
proxy_pass http://pihole-ip:80;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
}
# Кэшируем статику
location /admin/img/ {
expires 30d;
add_header Cache-Control "public, immutable";
}
# Защитные заголовки
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
Примечание для Pi-hole v6: В шестой версии полностью переработан веб-интерфейс. Если используете v6 — проверьте актуальные пути WebSocket в официальной документации, они могут отличаться от v5.
Nextcloud: настройка reverse proxy (Docker)
Nextcloud — самый требовательный к конфигурации сервис в этом списке. Он проверяет заголовки, требует правильной настройки trusted proxies и имеет множество под-путей для разных протоколов.
Особенности:
- Строгая проверка
trusted_proxiesв config.php - WebDAV на
/remote.php/dav/ - WebSocket для Nextcloud Talk на
/push/ - Большие лимиты для загрузки файлов
- Специфичные security-заголовки
Настройка Proxy Host в NPM:
- Domain Names:
cloud.yourdomain.com - Scheme:
http(SSL терминируется на NPM) - Forward Hostname/IP:
nextcloud-app(имя контейнера) или IP - Forward Port:
80 - Включить: WebSocket Support, Block Common Exploits
- SSL: Let’s Encrypt, Force SSL, HTTP/2
Custom Nginx Configuration:
# Базовые заголовки прокси
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port 443;
# Security-заголовки, которые требует Nextcloud
# (убирают предупреждения в /settings/admin/overview)
add_header Referrer-Policy "no-referrer" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-Download-Options "noopen" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Permitted-Cross-Domain-Policies "none" always;
add_header X-Robots-Tag "none" always;
add_header X-XSS-Protection "1; mode=block" always;
# Для загрузки больших файлов
client_max_body_size 10G;
proxy_request_buffering off;
# Увеличенные таймауты
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
# WebSocket для Nextcloud Talk и уведомлений
location /push/ {
proxy_pass http://nextcloud-app:80;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header Host $host;
}
# WebDAV для клиентов синхронизации
location /remote.php/dav/ {
proxy_pass http://nextcloud-app:80;
client_max_body_size 10G;
proxy_read_timeout 3600s;
}
# Корректные редиректы .well-known для CalDAV/CardDAV
location /.well-known/carddav {
return 301 /remote.php/dav/;
}
location /.well-known/caldav {
return 301 /remote.php/dav/;
}
Обязательные изменения в Nextcloud config/config.php:
// Указываем протокол — без этого Nextcloud будет генерировать http:// ссылки
'overwriteprotocol' => 'https',
'overwritehost' => 'cloud.yourdomain.com',
'overwritewebroot' => '/',
// Доверенные прокси — подсеть Docker или IP NPM
'trusted_proxies' => ['172.20.0.0/16'],
// Заголовок для получения реального IP клиента
'forwarded_for_headers' => ['HTTP_X_FORWARDED_FOR'],
// Домен должен быть в trusted_domains
'trusted_domains' => [
'cloud.yourdomain.com',
],
Проверка: Откройте https://cloud.yourdomain.com/settings/admin/overview — раздел «Безопасность и настройка» не должен содержать предупреждений о заголовках или протоколе.
OpenMediaVault: настройка reverse proxy (порт 80 или 8080)
OMV — веб-интерфейс для управления NAS. Работает на стандартном порту 80, что может создавать конфликты, если на том же хосте уже запущен другой веб-сервер.
Особенности:
- Стандартный порт 80 — может конфликтовать с другими сервисами
- Использует cookie-сессии
- WebSocket для real-time уведомлений
- Требует точный заголовок Host —
$http_host, а не$host
Если порт 80 занят — меняем порт OMV:
# Меняем порт через omv-env и пересобираем конфиг sudo omv-env set OMV_WEBGUI_HTTP_PORT 8080 sudo omv-salt deploy run webgui
Custom Nginx Configuration:
# OMV требует точный Host — используем $http_host, а не $host
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# WebSocket для real-time уведомлений (статус задач, события)
location /ws {
proxy_pass http://omv-server:80;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
}
# Security-заголовки
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
Vaultwarden: настройка reverse proxy (Bitwarden self-hosted)
Vaultwarden — облегчённая реализация Bitwarden-сервера. Требует HTTPS в обязательном порядке: без валидного SSL клиентские приложения Bitwarden не подключатся.
Особенности:
- HTTPS обязателен — HTTP работает только для localhost
- WebSocket для real-time синхронизации между устройствами
- Порт 3012 — отдельный WebSocket endpoint
Настройка Proxy Host в NPM:
- Domain Names:
vault.yourdomain.com - Scheme:
http - Forward Hostname/IP: IP или имя контейнера Vaultwarden
- Forward Port:
80 - Включить: WebSocket Support, Block Common Exploits
- SSL: Let’s Encrypt, Force SSL, HSTS
Custom Nginx Configuration:
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# WebSocket для синхронизации между устройствами в реальном времени
location /notifications/hub {
proxy_pass http://vaultwarden:3012;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
}
location /notifications/hub/negotiate {
proxy_pass http://vaultwarden:80;
}
# Security-заголовки (особенно важно для менеджера паролей)
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "same-origin" always;
Переменные среды в docker-compose.yml Vaultwarden:
environment: - WEBSOCKET_ENABLED=true - DOMAIN=https://vault.yourdomain.com
Grafana: настройка reverse proxy (порт 3000)
Grafana — относительно простой сервис для проксирования, но требует правильного root_url в конфигурации, иначе ломаются ссылки в дашбордах и алертах.
Настройка Proxy Host в NPM:
- Domain Names:
grafana.yourdomain.com - Scheme:
http - Forward Hostname/IP: IP или имя контейнера Grafana
- Forward Port:
3000 - Включить: WebSocket Support, Block Common Exploits
- SSL: Let’s Encrypt
Custom Nginx Configuration:
proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # WebSocket для live-обновления графиков и алертов proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade";
Настройка в grafana.ini или через переменные среды:
# grafana.ini [server] domain = grafana.yourdomain.com root_url = https://grafana.yourdomain.com serve_from_sub_path = false # Или через переменные среды в docker-compose.yml: environment: - GF_SERVER_DOMAIN=grafana.yourdomain.com - GF_SERVER_ROOT_URL=https://grafana.yourdomain.com
Продвинутые настройки
SSO с Authelia: единый вход для всех сервисов
Authelia — прокси для аутентификации с поддержкой 2FA и LDAP. Интегрируется с NPM через auth_request.
# В Custom Nginx Configuration нужного Proxy Host
location / {
# Проверяем аутентификацию через Authelia
auth_request /authelia;
auth_request_set $user $upstream_http_remote_user;
auth_request_set $groups $upstream_http_remote_groups;
proxy_set_header Remote-User $user;
proxy_set_header Remote-Groups $groups;
# Редирект на страницу входа при 401
error_page 401 =302 https://auth.yourdomain.com/?rd=$scheme://$host$request_uri;
proxy_pass http://целевой-сервис:порт;
}
location = /authelia {
internal;
proxy_pass http://authelia:9091/api/verify;
proxy_pass_request_body off;
proxy_set_header Content-Length "";
proxy_set_header X-Original-URL $scheme://$http_host$request_uri;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
Ограничение доступа по IP
# Разрешаем только из локальной сети и VPN allow 192.168.1.0/24; allow 10.8.0.0/24; deny all; # Дополнительно — Basic Auth как второй фактор auth_basic "Restricted Area"; auth_basic_user_file /data/nginx/basic-auth/.htpasswd;
Docker Compose для всей инфраструктуры
version: '3.8'
networks:
proxy-net:
name: proxy-network
driver: bridge
services:
npm:
image: jc21/nginx-proxy-manager:latest
container_name: nginx-proxy-manager
restart: unless-stopped
ports:
- "80:80"
- "443:443"
- "81:81"
volumes:
- ./npm/data:/data
- ./npm/letsencrypt:/etc/letsencrypt
networks:
- proxy-net
nextcloud:
image: nextcloud:latest
container_name: nextcloud-app
restart: unless-stopped
volumes:
- ./nextcloud/html:/var/www/html
- ./nextcloud/data:/var/www/html/data
networks:
- proxy-net
vaultwarden:
image: vaultwarden/server:latest
container_name: vaultwarden
restart: unless-stopped
environment:
- WEBSOCKET_ENABLED=true
- DOMAIN=https://vault.yourdomain.com
volumes:
- ./vaultwarden/data:/data
networks:
- proxy-net
pihole:
image: pihole/pihole:latest
container_name: pihole
restart: unless-stopped
environment:
- TZ=Europe/Moscow
- WEBPASSWORD=ваш_пароль
volumes:
- ./pihole/etc-pihole:/etc/pihole
- ./pihole/etc-dnsmasq.d:/etc/dnsmasq.d
networks:
- proxy-net
Диагностика и решение типичных проблем
Ошибка: «Invalid CSRF token» в MailCow или Zimbra
Причина: Приложение не получает корректные заголовки о реальном хосте и протоколе.
Решение:
proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Port 443; proxy_set_header X-Forwarded-Proto https;
Ошибка: не работают консоли VM в Proxmox
Причина: Не включён WebSocket или слишком маленький таймаут.
Решение: В настройках Proxy Host включите WebSocket Support. Добавьте в конфигурацию:
proxy_read_timeout 3600s; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_buffering off;
Ошибка 413: Request Entity Too Large
Причина: Nginx блокирует загрузку файлов, превышающих лимит по умолчанию (1 МБ).
Решение:
# Для Nextcloud, Zimbra — указываем конкретный лимит client_max_body_size 10G; # Для <a href="https://it-apteka.com/proxmox-backup-server-stavim-nastraivaem-ne-terjaem-vm/" target="_blank" rel="noopener" data-wpil-monitor-id="1200">Proxmox Backup Server</a> — без ограничений client_max_body_size 0;
Ошибка: Nextcloud показывает «Untrusted domain» или «Доступ запрещён»
Причина: Домен не добавлен в trusted_domains или NPM не в trusted_proxies.
Решение: Отредактируйте config/config.php:
'trusted_domains' => ['cloud.yourdomain.com'], 'trusted_proxies' => ['172.20.0.0/16'], 'overwriteprotocol' => 'https',
Ошибка: реальные IP не отображаются в логах
Причина: Сервис видит IP-адрес NPM вместо реального клиента.
Решение:
proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
Диагностические команды
# Проверить синтаксис конфигурации Nginx внутри NPM docker exec nginx-proxy-manager nginx -t # Посмотреть последние 100 строк логов NPM docker logs --tail 100 nginx-proxy-manager # Проверить SSL-сертификат openssl s_client -connect cloud.yourdomain.com:443 -servername cloud.yourdomain.com # Проверить WebSocket соединение curl -i \ -H "Connection: Upgrade" \ -H "Upgrade: websocket" \ -H "Sec-WebSocket-Key: SGVsbG8sIHdvcmxkIQ==" \ -H "Sec-WebSocket-Version: 13" \ https://pve.yourdomain.com # Проверить заголовки ответа curl -I https://cloud.yourdomain.com # Посмотреть access-лог конкретного proxy host (номер — из URL в интерфейсе NPM) docker exec nginx-proxy-manager tail -f /data/logs/proxy-host-1_access.log
Безопасность: обязательный минимум
Nginx Proxy Manager — единая точка входа в вашу инфраструктуру. Несколько обязательных мер безопасности:
- Смените пароль по умолчанию сразу после установки. Логин
admin@example.com/changeme— публично известен. - Закройте порт 81 от внешнего мира. Веб-интерфейс NPM должен быть доступен только из локальной сети или через VPN.
- Используйте Access Lists для административных сервисов: Proxmox, Zimbra Admin, OMV. Не выставляйте их напрямую в интернет.
- Включайте HSTS для сервисов с чувствительными данными — особенно для Vaultwarden.
- Регулярно обновляйте NPM — в новых версиях исправляются уязвимости:
docker compose pull && docker compose up -d
- Настройте бэкап директории с данными NPM — там хранятся все конфиги и сертификаты:
tar -czf npm-backup-$(date +%Y%m%d).tar.gz ./data ./letsencrypt
Сравнительная таблица настроек всех сервисов
| Сервис | Домен | Порт | Scheme | WebSocket | Ключевые особенности |
|---|---|---|---|---|---|
| Proxmox VE | pve.* | 8006 | https | Да | proxy_ssl_verify off, client_max_body_size 50G |
| Proxmox Backup Server | pbs.* | 8007 | https | Да | proxy_ssl_verify off, client_max_body_size 0, timeout 24h |
| Zimbra (webmail) | mail.* | 8443 | https | Нет | proxy_ssl_verify off, client_max_body_size 1G |
| Zimbra (admin) | zimbra-admin.* | 7071 | https | Нет | Ограничить доступ по IP |
| MailCow | mail.* | 80 (контейнер) | http | Да | X-Forwarded-Host, общая Docker-сеть |
| Pi-hole | pihole.* | 80 | http | Да (/ws) | Отдельный location для /ws |
| Nextcloud | cloud.* | 80 (контейнер) | http | Да (/push/) | trusted_proxies в config.php, client_max_body_size 10G |
| OpenMediaVault | nas.* | 80 или 8080 | http | Да (/ws) | Host $http_host вместо $host |
| Vaultwarden | vault.* | 80 | http | Да (порт 3012) | HTTPS обязателен, DOMAIN в env |
| Grafana | grafana.* | 3000 | http | Да | root_url в grafana.ini |
Итоговый чеклист
- Все сервисы доступны по своим доменным именам
- SSL-сертификаты действительны и автоматически обновляются
- WebSocket соединения работают: консоли Proxmox, live-статистика Pi-hole, Talk в Nextcloud
- Загрузка больших файлов работает в Nextcloud и Zimbra
- Нет ошибок CSRF в MailCow и Zimbra
- Реальные IP пользователей отображаются в логах
- Порт 81 (интерфейс NPM) закрыт от внешнего мира
- Бэкап конфигурации NPM настроен
FAQ: часто задаваемые вопросы
Q: Нужен ли белый IP для получения Let’s Encrypt сертификата?
A: Для HTTP-challenge — да, порт 80 должен быть доступен из интернета. Для DNS-challenge — нет. DNS-challenge поддерживает Cloudflare, Namecheap, Route53 и другие. Позволяет получать wildcard-сертификаты для полностью изолированных серверов.
Q: Можно ли использовать NPM для сервисов без публичного доступа?
A: Да. Используйте локальный DNS (Pi-hole, AdGuard Home) для разрешения ваших доменов внутри сети. Сертификаты получайте через DNS-challenge.
Q: Как обновить NPM без потери конфигурации?
A: Вся конфигурация хранится в примонтированных директориях ./data и ./letsencrypt. Выполните docker compose pull && docker compose up -d — конфиги сохранятся.
Q: NPM или Traefik — что выбрать?
A: NPM проще в настройке и имеет удобный UI — идеален для домашней лаборатории. Traefik лучше интегрирован с Docker Labels и автоматически определяет контейнеры — лучше для CI/CD и кластеров. Если не пишете код и не управляете Kubernetes — берите NPM.
Q: Что делать, если сертификат Let’s Encrypt не обновляется?
A: Проверьте, что порт 80 открыт и доступен снаружи. Посмотрите логи: docker logs nginx-proxy-manager | grep -i "cert\|renew\|error". NPM пытается обновить сертификаты за 30 дней до истечения.
Вывод
Мы разобрали настройку Nginx Proxy Manager для десяти популярных self-hosted сервисов. Ключевые выводы:
- WebSocket — включайте для всего, что имеет live-обновления: Proxmox, Nextcloud Talk, Pi-hole, Vaultwarden.
- proxy_ssl_verify off — обязателен для сервисов с самоподписанными сертификатами: Proxmox VE и PBS.
- trusted_proxies — настройте в Nextcloud, иначе ошибки доступа и сломанные редиректы.
- client_max_body_size — увеличивайте для Nextcloud (10G), Zimbra (1G), PBS (0 = безлимит).
- Docker-сеть — объединяйте NPM и сервисы в одну сеть, обращайтесь к контейнерам по именам.
Вместо десяти IP-адресов и портов у вас теперь аккуратный список: https://pve.domain.com, https://cloud.domain.com, https://vault.domain.com — все с валидным SSL и нормальными доменами.
Остались вопросы по конкретному сервису? Пишите в комментарии — разберём. В следующей статье разберём Authelia: единый вход и двухфакторная аутентификация для всего self-hosted стека.
Оставайтесь на связи
Рецепты от IT-боли. Без воды, без рекламы, без маркетинговой шелухи.
Подписаться на IT-Аптеку →



