Portainer — веб-панель для управления Docker и Kubernetes, которая превращает набор команд в понятный интерфейс: контейнеры, образы, тома, сети, стеки Compose и журналы. Для домашнего сервера и небольшой команды это способ выдать коллегам ограниченный доступ, не заставляя учить длинные команды. В 2026 году панель остаётся практичным решением такого класса, но требует аккуратной установки и защиты. Ниже — проверенная схема развёртывания, настройки прав, резервного копирования и диагностики.
Что даёт Portainer и когда он не нужен
Панель подключается к Docker-демону через сокет, TCP или агента и показывает состояние хоста в реальном времени. Через неё удобно смотреть потребление ресурсов, открывать консоль контейнера, поднимать стек из compose-файла, менять переменные окружения и откатывать образ на предыдущую версию. Отдельная ценность — единый список окружений: домашний сервер, VPS и удалённый стенд оказываются в одном окне.
Если на сервере живёт один контейнер и вы единственный администратор, панель добавляет лишний слой и ещё одну поверхность атаки. В таком случае достаточно docker compose и systemd. Portainer оправдан, когда контейнеров десятки, доступ нужен нескольким людям или требуется быстрый обзор без SSH.
Установка на отдельный хост
Панель сама работает в контейнере. Данные хранятся в томе, поэтому обновление сводится к замене контейнера. Для начала создайте том и запустите Portainer CE с тегом lts: он предсказуемее, чем latest.
docker volume create portainer_data
docker run -d --name portainer --restart=always \
-p 9443:9443 -p 8000:8000 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v portainer_data:/data portainer/portainer-ce:lts
docker ps --filter name=portainer
curl -k https://127.0.0.1:9443/api/status
Порт 9443 — веб-интерфейс с самоподписанным сертификатом, 8000 нужен только для Edge Agent. Если удалённые хосты не используются, второй порт лучше не публиковать. На системах с SELinux добавьте к монтированию сокета суффикс :z, иначе контейнер не получит доступ.
Вариант через compose удобнее для сопровождения: файл лежит в git, обновление выполняется одной командой.
services:
portainer:
image: portainer/portainer-ce:lts
container_name: portainer
restart: unless-stopped
ports:
- "127.0.0.1:9443:9443"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- portainer_data:/data
volumes:
portainer_data:
Привязка к 127.0.0.1 закрывает панель от внешней сети: снаружи её опубликует reverse proxy. Это заметно безопаснее, чем открывать 9443 в интернет напрямую.
HTTPS и reverse proxy
Nginx закроет панель сертификатом и добавит базовую защиту. Важно передавать заголовки Upgrade и Connection, иначе часть запросов и консоль работают нестабильно. Для внутреннего самоподписанного сертификата проверку отключают только на участке proxy → панель.
server {
listen 443 ssl;
server_name panel.example.ru;
ssl_certificate /etc/letsencrypt/live/panel.example.ru/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/panel.example.ru/privkey.pem;
location / {
proxy_pass https://127.0.0.1:9443;
proxy_ssl_verify off;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
}
}
nginx -t && systemctl reload nginx
Панель хранит хеш пароля администратора в собственной базе, поэтому после первого входа включите двухфакторную аутентификацию. Учётную запись admin не стоит использовать для повседневной работы: создайте личную и оставьте служебную только для аварийного доступа.
Пользователи, команды и окружения
В бесплатной версии ролей две: администратор и обычный пользователь, доступ выдаётся к конкретным окружениям. Коммерческая редакция добавляет тонкие политики и промежуточные роли. На практике достаточно завести группу на каждый сервер и не смешивать доступы.
- Администратор — управляет пользователями, реестрами и настройками панели.
- Оператор — смотрит ресурсы, журналы и консоль, но не создаёт и не удаляет контейнеры.
- Наблюдатель — читает журналы и метрики без права изменений.
Последние две роли доступны в платной редакции; в бесплатной их заменяет обычный пользователь с доступом к окружению.
Отдельно настройте реестр образов, если используете приватные сборки. Учётные данные реестра хранятся в базе Portainer и подставляются при развёртывании стеков.
Стеки и обновление
Стек — это compose-файл, которым управляет панель. Переменные окружения задаются в интерфейсе и не попадают в репозиторий. При обновлении образа Portainer пересоздаёт контейнер, сохраняя тома; данные приложения при этом не теряются, если они вынесены в именованный том.
docker pull portainer/portainer-ce:lts
docker stop portainer && docker rm portainer
docker run -d --name portainer --restart=always -p 127.0.0.1:9443:9443 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v portainer_data:/data portainer/portainer-ce:lts
docker logs --tail 50 portainer
Перед обновлением прочитайте примечания к выпуску: миграции схемы базы выполняются автоматически, но откат на старую версию после них не поддерживается. Именно поэтому резервная копия тома обязательна.
Резервное копирование
Все настройки, пользователи и стеки лежат в томе portainer_data. Корректный бэкап делается при остановленной панели, иначе часть файлов может попасть в архив в несогласованном виде.
docker stop portainer
docker run --rm -v portainer_data:/data -v "$PWD":/backup alpine \
tar czf /backup/portainer-$(date +%F).tar.gz -C /data .
docker start portainer
tar tzf portainer-$(date +%F).tar.gz | head
Восстановление выполняют в обратном порядке: останавливают контейнер, распаковывают архив в том и запускают панель. Проверьте, что владелец файлов соответствует ожиданиям Portainer, иначе интерфейс запустится, но настройки не подхватит.
Диагностика типичных сбоев
Если панель открывается, но не видит контейнеры, почти всегда виноват доступ к сокету. Проверьте права, группу docker и сообщения в журнале. Ошибка «failed to connect to the Docker daemon» означает, что сокет не смонтирован или демон недоступен.
docker logs --tail 100 portainer
docker inspect portainer --format '{{json .Mounts}}'
ss -ltnp | grep -E '9443|8000'
getent group docker && id
Пустая страница после reverse proxy обычно связана с неверным сертификатом или отсутствием заголовков WebSocket. Проверяйте сначала прямой адрес https://127.0.0.1:9443, затем цепочку через nginx. Если панель отвечает 502, смотрите журнал nginx и состояние контейнера, а не настройки браузера.
Отдельный случай — закончившееся место на диске. Docker при этом может работать, а Portainer терять возможность записать состояние. Контролируйте df -h и размер журналов контейнеров, особенно при включённом подробном логировании.
Итог
Portainer закрывает рутинные задачи управления контейнерами и делает инфраструктуру понятной для команды. Минимальный безопасный набор: тег lts, привязка к localhost, reverse proxy с TLS, отдельные учётные записи, включённая двухфакторная аутентификация и регулярный бэкап тома. Панель не заменяет понимание Docker, но при аккуратной настройке экономит время и снижает риск случайных ошибок.