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.
🧪 Проверка работы
- Открыть: https://panel.svyx.net
- Проверить:
- открывается интерфейс 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