Portainer идеально работает за reverse‑proxy, включая Apache, Nginx и Caddy. Ниже — идеальная конфигурация Apache для вашей архитектуры (TLS на 192.168.0.12, backend Portainer на 192.168.0.162:9000), плюс пояснения по WebSocket, заголовкам и безопасности.

🟦 /etc/apache2/sites-available/panel.svyx.net.conf

Код

<VirtualHost *:443>
    ServerName panel.svyx.net

    # TLS обслуживается на шлюзе 192.168.0.12
    SSLEngine on
    SSLCertificateFile /etc/letsencrypt/live/panel.svyx.net/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/panel.svyx.net/privkey.pem

    # Важно для WebSocket
    ProxyPreserveHost On
    ProxyRequests Off

    # WebSocket Upgrade
    RewriteEngine On
    RewriteCond %{HTTP:Upgrade} =websocket [NC]
    RewriteRule /(.*) ws://192.168.0.162:9000/$1 [P,L]

    # Основной HTTP‑трафик
    ProxyPass        / http://192.168.0.162:9000/
    ProxyPassReverse / http://192.168.0.162:9000/

    # Заголовки для корректной работы Portainer
    RequestHeader set X-Forwarded-Proto "https"
    RequestHeader set X-Forwarded-Ssl "on"
    RequestHeader set X-Forwarded-For "%{REMOTE_ADDR}s"
    RequestHeader set X-Forwarded-Host "%{HTTP_HOST}s"

    # Защита
    Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"
</VirtualHost>

<VirtualHost *:80>
    ServerName panel.svyx.net
    Redirect permanent / https://panel.svyx.net/
</VirtualHost>

🧠 Почему эта конфигурация идеальна для Portainer

1) WebSocket поддерживается полностью

Portainer активно использует WebSocket для live‑логов, терминала, статистики контейнеров. Apache требует ручного Upgrade‑правила:

Код

RewriteCond %{HTTP:Upgrade} =websocket
RewriteRule /(.*) ws://192.168.0.162:9000/$1 [P,L]

Без этого терминал и live‑metrics не работают.

2) Portainer не делает HTTPS‑редиректов

В отличие от Cockpit, Portainer не навязывает TLS → backend может работать по HTTP. Это идеально для вашей схемы:

  • TLS на шлюзе 192.168.0.12
  • backend Portainer на 192.168.0.162:9000 по HTTP

3) Корректные X‑Forwarded заголовки

Portainer использует их для:

  • корректного формирования URL;
  • работы агента;
  • правильного отображения внешнего адреса.

🧱 Настройка Portainer на целевой машине (192.168.0.162)

Вариант 1: Docker (рекомендуется)

Код

docker volume create portainer_data

docker run -d \
  -p 9000:9000 \
  -p 8000:8000 \
  --name portainer \
  --restart=always \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v portainer_data:/data \
  portainer/portainer-ce:latest

Вариант 2: Standalone binary

Если Docker не используется — скажи, подготовлю конфиг systemd.

🧪 Проверка работы

  1. Открыть: https://panel.svyx.net
  2. Проверить:
    • открывается интерфейс Portainer;
    • терминал контейнера работает;
    • live‑metrics обновляются;
    • нет редиректов на HTTP.

Если что‑то не работает — чаще всего проблема в WebSocket.

Установка Portainer на сервере 192.168.0.162 (Debian/Ubuntu)

Алексей, ниже — идеальная, пошаговая инструкция установки Portainer на целевой машине 192.168.0.162, оформленная как технический гайд. Ты как системный администратор оценишь точность команд, порядок действий и отсутствие лишней воды.

🚀 Установка Portainer на сервере 192.168.0.162 (Debian/Ubuntu)

01 Обновить систему

Перед установкой Docker и Portainer важно обновить пакеты, чтобы избежать конфликтов.

sudo apt update && sudo apt upgrade -y
  • Обновляет список пакетов
  • Устанавливает последние версии системных компонентов
  • Готовит систему к установке Docker

02 Установить Docker Engine

Обязательный шаг

Portainer работает поверх Docker, поэтому сначала нужно установить Docker Engine.

sudo apt install docker.io -y
  • Устанавливает Docker Engine
  • Автоматически запускает службу docker
  • Проверка: sudo systemctl status docker

03 Создать volume для Portainer

Volume хранит данные Portainer: пользователей, настройки, endpoints.

docker volume create portainer_data
  • Создаёт постоянное хранилище /var/lib/docker/volumes/portainer_data
  • Обеспечивает сохранность данных при обновлениях контейнера

04 Запустить контейнер Portainer

Основной запуск

Запускаем Portainer CE на порту 9000 — именно его ты будешь проксировать через Apache.

docker run -d -p 9000:9000 -p 8000:8000 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:latest
  • Порт 9000: веб‑интерфейс Portainer
  • Порт 8000: агент Portainer (если нужен)
  • Автозапуск при перезагрузке
  • Доступен локально: http://192.168.0.162:9000

05 Проверить работу Portainer

Убедимся, что контейнер запущен и отвечает.

docker ps
  • В списке должен быть контейнер portainer
  • Проверка локально: открыть http://192.168.0.162:9000
  • Создать первого администратора

06 Подготовить сервер к работе через reverse proxy

Важно

Portainer должен работать по HTTP, чтобы Apache на 192.168.0.12 мог выполнять TLS‑терминацию.

  • Не включать HTTPS внутри Portainer
  • Не менять порт 9000
  • Не включать SSL‑редиректы в Portainer

🧩 Что дальше?

Теперь сервер 192.168.0.162 полностью готов к публикации через Apache reverse proxy на шлюзе 192.168.0.12.

Панель требует «Setup token»

Setup Token в Portainer появляется только в одном случае — когда панель считает, что это первый запуск и нужно создать учётную запись администратора.

Если ты видишь окно “Setup token”, значит:

  • Portainer запустился в режиме инициализации;
  • он не может создать админа без токена;
  • токен должен быть в логах контейнера или в файле на диске, если это standalone‑установка.

Ниже — точная инструкция, как получить этот токен.

✅ 1. Если Portainer установлен через Docker

Получить Setup Token:

Код

docker logs portainer 2>&1 | grep -i "setup token"

Ты увидишь строку вида:

Код

2024/xx/xx xx:xx:xx Setup token: abcdef1234567890abcdef1234567890

Это и есть токен, который нужно вставить в веб‑интерфейсе.

Если токена нет в логах

Portainer мог его уже записать в файл:

Код

docker exec -it portainer cat /data/portainer.init

Файл содержит примерно:

Код

{"setup_token":"abcdef1234567890abcdef1234567890"}

Если файла нет — значит Portainer думает, что админ уже создан

Проверка:

Код

docker exec -it portainer ls -l /data

Если там есть файл:

Код

portainer.db

— значит админ уже создан, и Setup Token не нужен.

В этом случае панель должна показывать экран логина, а не Setup Token.

🛠 2. Если Portainer установлен как standalone (systemd)

Setup Token лежит здесь:

Код

/var/lib/portainer/portainer.init

Посмотреть:

Код

cat /var/lib/portainer/portainer.init

🔥 3. Если токен не появляется вообще

Это бывает, если:

  • каталог /data пустой или повреждён;
  • Portainer не может записать файл;
  • контейнер перезапускался слишком быстро.

Решение:

Код

docker stop portainer
docker rm portainer
docker volume rm portainer_data

И затем установить заново:

Код

docker volume create portainer_data

docker run -d \
  -p 9000:9000 \
  -p 8000:8000 \
  --name portainer \
  --restart=always \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v portainer_data:/data \
  portainer/portainer-ce:latest

После первого запуска токен появится в логах.

📌 4. Почему Portainer требует Setup Token

Portainer ввёл Setup Token начиная с версии 2.19+ для защиты от:

  • автоматизированных атак на первый запуск;
  • случайного создания админа через reverse proxy;
  • MITM‑атак при первичной настройке.

Токен генерируется один раз, и после создания админа больше не нужен.

🎯 Хочешь — могу сразу проверить твой контейнер

Если пришлёшь вывод:

Код

docker logs portainer --tail 50

От alex

Обучаемый.