Nginx Proxy Manager: Конфигурация reverse-proxy для популярных веб-интерфейсов

Устали запоминать, что 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

Первые шаги:

  1. Создайте папку: mkdir nginx-proxy-manager && cd nginx-proxy-manager
  2. Создайте файл docker-compose.yml с содержимым выше
  3. Запустите: docker compose up -d
  4. Откройте браузер: http://ваш-сервер:81
  5. Логин по умолчанию: 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:

  1. Domain Names: pve.yourdomain.com
  2. Scheme: https
  3. Forward Hostname/IP: IP вашего Proxmox сервера
  4. Forward Port: 8006
  5. Включить: WebSocket Support, Block Common Exploits
  6. 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:

  1. Domain Names: pbs.yourdomain.com
  2. Scheme: https
  3. Forward Hostname/IP: IP PBS сервера
  4. Forward Port: 8007
  5. Включить: 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 для веб-клиента:

  1. Domain Names: mail.yourdomain.com
  2. Scheme: https
  3. Forward Hostname/IP: IP Zimbra сервера
  4. Forward Port: 8443
  5. Включить: 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:

  1. Domain Names: mail.yourdomain.com
  2. Scheme: http
  3. Forward Hostname/IP: nginx-mailcow (имя контейнера)
  4. Forward Port: 80
  5. Включить: 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:

  1. Domain Names: pihole.yourdomain.com
  2. Scheme: http
  3. Forward Hostname/IP: IP сервера с Pi-hole
  4. Forward Port: 80
  5. Включить: WebSocket Support, Block Common Exploits
  6. 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:

  1. Domain Names: cloud.yourdomain.com
  2. Scheme: http (SSL терминируется на NPM)
  3. Forward Hostname/IP: nextcloud-app (имя контейнера) или IP
  4. Forward Port: 80
  5. Включить: WebSocket Support, Block Common Exploits
  6. 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:

  1. Domain Names: vault.yourdomain.com
  2. Scheme: http
  3. Forward Hostname/IP: IP или имя контейнера Vaultwarden
  4. Forward Port: 80
  5. Включить: WebSocket Support, Block Common Exploits
  6. 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:

  1. Domain Names: grafana.yourdomain.com
  2. Scheme: http
  3. Forward Hostname/IP: IP или имя контейнера Grafana
  4. Forward Port: 3000
  5. Включить: WebSocket Support, Block Common Exploits
  6. 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:

&#039;trusted_domains&#039; =&gt; [&#039;cloud.yourdomain.com&#039;],
&#039;trusted_proxies&#039; =&gt; [&#039;172.20.0.0/16&#039;],
&#039;overwriteprotocol&#039; =&gt; &#039;https&#039;,

Ошибка: реальные 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 &quot;Connection: Upgrade&quot; \
  -H &quot;Upgrade: websocket&quot; \
  -H &quot;Sec-WebSocket-Key: SGVsbG8sIHdvcmxkIQ==&quot; \
  -H &quot;Sec-WebSocket-Version: 13&quot; \
  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 &amp;&amp; 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-Аптеку →

Мы ВКонтакте

IT-Аптека — советы, новости и помощь рядом.

Вступить в группу ВКонтакте →
Поделитесь:

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Прокрутить вверх