Portainer — это лёгкая и мощная веб-панель, которая позволяет управлять Docker-окружением через удобный графический интерфейс. Она избавляет от необходимости постоянно использовать командную строку и даёт полную картину происходящего.
Внимание!!! Если вы тупой или очень ленивый, чтобы читать всю эту нудятину статью и вам нужна лишь быстрая инструкция, то вам надо жмакнуть сюда, там есть все, что вам необходимо. Берите и валите нафиг, как это сказано в S.T.A.L.K.E.R. - проходи, не задерживайся! 🤣 Нууу, может быть вы еще безоговорочно доверяете мне, но это уже другой вопрос. 🙂 Вообще, статья написана как для тех, кто интересуется, так и для тех, кому нужен быстрый результат. Для меня нет разницы, тупой или умный, трудоголик или лентяй - все мы люди-человеки и под одним Богом ходим… Я просто троллю. 🤣
Это самый распространенный сценарий для одиночного хоста. Portainer Server и Portainer Agent запускаются как обычные Docker-контейнеры.
docker run (простой и быстрый):
Сначала создается том для данных, затем запускается контейнер.
docker volume create portainer_data docker run -d -p 8000:8000 -p 9443:9443 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:lts
Где:
Docker Compose (для удобства управления и не менее быстрый):
Конфигурация описывается в YAML-файле, что упрощает обновление и хранение настроек.
services: portainer: container_name: portainer image: portainer/portainer-ce:lts restart: always volumes: - /var/run/docker.sock:/var/run/docker.sock - portainer_data:/data ports: - 9443:9443 - 8000:8000 volumes: portainer_data: name: portainer_data
Запуск: docker compose up -d.
Развернуть за обратным прокси (Nginx, Traefik):
Portainer можно развернуть за реверс-прокси для организации доступа через домен и централизованного управления SSL-сертификатами. В документации есть готовые примеры с использованием docker-compose для связки с Nginx и Traefik .
Для кластера Swarm используется стек (stack). Метод автоматически разворачивает Portainer Server (реплика) и Portainer Agent (глобальный сервис на каждой ноде).
curl -L https://downloads.portainer.io/ce-lts/portainer-agent-stack.yml -o portainer-agent-stack.yml docker stack deploy -c portainer-agent-stack.yml portainer
По умолчанию UI будет доступен на порту 9443.
Portainer разворачивается в кластере Kubernetes через Helm-чарты или готовые YAML-манифесты.
Предварительное условие: Кластер должен иметь StorageClass для хранения данных Portainer (по умолчанию или заданный явно).
Способы доступа: Можно настроить через NodePort (порты 30777/30779), LoadBalancer (порты 9000/9443) или Ingress.
Способ через Helm (пример):
helm repo add portainer https://portainer.github.io/k8s/ helm repo update helm upgrade --install --create-namespace -n portainer portainer portainer/portainer \ --set service.type=LoadBalancer \ --set tls.force=true
Этот пример разворачивает Portainer с доступом через LoadBalancer на порту 9443 .
Независимо от способа установки, у Portainer есть несколько общих требований:
Здесь показан способ, как за 10-15 минут развернуть Portainer, не думая, как это работает, тупо копипастите что надо и все готово! 😄
Необходимые условия:
Итак:
certbot certonly --nginx -d pm.example.tld
Именно этот этап может быть самым затяжным, если DNS-записи резолвятся долго… Затем создаем рабочий каталог для Portainer. Заходим в него:
mkdir -p docker/portainer && cd docker/portainer
Я не помню, почему я вложил его в docker, возможно хотел там размещать все остальные докеры. 😄 История умалчивает об этом… 🤣
Создаем docker-compose.yml:
nano docker-compose.yml
Вставляем это содержимое:
services: portainer: image: portainer/portainer-ce:latest container_name: portainer restart: always ports: - "8000:8000" - "9080:9000" - "9443:9443" volumes: - /var/run/docker.sock:/var/run/docker.sock:ro - portainer_data:/data networks: - portainer_net networks: portainer_net: driver: bridge volumes: portainer_data: external: true
Управляем сервисом в этой же директории:
docker compose up -d
docker compose down
docker compose down
docker compose pull
docker compose up -d
Создаем vhost (виртуальный хост) для nginx:
nano /etc/nginx/sites-available/pm.example.tld.vhost
server { listen 80; server_name pm.example.tld; location / { proxy_pass http://127.0.0.1:9080; 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; } return 301 https://$server_name$request_uri; } server { listen 443 quic; listen 443 ssl; http3 on; http2 on; quic_retry on; quic_gso on; add_header alt-svc 'h3=":443"; ma=864000; persist=1' always; server_name pm.example.tld; ssl_certificate /etc/letsencrypt/live/pm.example.tld/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/pm.example.tld/privkey.pem; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305; ssl_ecdh_curve X25519:prime256v1:secp384r1; ssl_prefer_server_ciphers on; ssl_dhparam /etc/ssl/dhparam.pem; ssl_session_timeout 1d; ssl_session_cache builtin:1000 shared:MozSSL:10m; ssl_session_tickets off; ssl_early_data on; resolver 8.8.8.8 1.1.1.1 valid=300s; add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always; add_header X-Content-Type-Options "nosniff" always; add_header X-Frame-Options "SAMEORIGIN"; add_header X-XSS-Protection "1; mode=block"; add_header Referrer-Policy "strict-origin-when-cross-origin"; access_log /var/log/nginx/pm.example.tld_access.log combined; error_log /var/log/nginx/pm.example.tld_error.log info; location / { proxy_pass https://127.0.0.1:9443; 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; } }
Создаем симлинк в vhost для его «активации»:
ln -s /etc/nginx/sites-available/pm.example.tld.vhost /etc/nginx/sites-enabled/pm.example.tld.vhost
Проверяем, не напороли ли где-то в конфиге косяков:
nginx -t
Если все ОК, то перезагружаем NGINX:
systemctl restart nginx.service
При первом посещении страницы Portainer будет предложено создать аккаунт администратора,
Поэтому:
Надеюсь, вам не надо напоминать, что создание и использование логин-пары типа «root-qwerty» или «user-1234567890» карается виртуально-анальным фистингом и если вы так и сделали, то вы ССЗБ, каких свет не еще видел… В таком случае просто расслабьтесь и получайте удовольствие, IT точно не для вас.🤣
Успехов, с уважением: — Luciferus 2026/07/30 22:09