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, но при аккуратной настройке экономит время и снижает риск случайных ошибок.

Насколько публикация полезна?

Нажмите на звезду, чтобы оценить!

Средняя оценка 0 / 5. Количество оценок: 0

Оценок пока нет. Поставьте оценку первым.

Поделиться: Telegram ВКонтакте