Portainer — это популярный веб-интерфейс для управления Docker и Kubernetes. В этой статье мы рассмотрим, как установить Portainer и настроить его работу за Traefik в качестве reverse proxy.
В данном гайде рассмотрим установку в docker совместно с Traefik.
Предварительные требования
- Docker и Docker Compose установлены на сервере
- Доменное имя для Portainer (например,
portainer.example.com) - Email адрес для Let’s Encrypt (для получения SSL сертификатов)
Установка Traefik
Перед установкой Portainer необходимо настроить Traefik. Traefik будет работать как reverse proxy и автоматически получать SSL сертификаты от Let’s Encrypt.
Создание структуры директорий
Создайте директорию для Traefik и перейдите в неё:
mkdir -p traefik
cd traefik
Создание docker-compose.yml для Traefik
Создайте файл docker-compose.yml со всей конфигурацией Traefik:
version: '3.8'
services:
traefik:
image: traefik:v2.10
container_name: traefik
restart: unless-stopped
security_opt:
- no-new-privileges:true
ports:
- "80:80"
- "443:443"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./acme.json:/acme.json
- /etc/localtime:/etc/localtime:ro
networks:
- traefik
command:
# API и Dashboard
- --api.dashboard=true
- --api.insecure=false
# Entrypoints
- --entrypoints.web.address=:80
- --entrypoints.websecure.address=:443
# HTTP to HTTPS redirect
- --entrypoints.web.http.redirections.entrypoint.to=websecure
- --entrypoints.web.http.redirections.entrypoint.scheme=https
- --entrypoints.web.http.redirections.entrypoint.permanent=true
# Docker provider
- --providers.docker=true
- --providers.docker.exposedbydefault=false
- --providers.docker.network=traefik
# Let's Encrypt
- --certificatesresolvers.letsencrypt.acme.email=your-email@example.com
- --certificatesresolvers.letsencrypt.acme.storage=/acme.json
- --certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web
labels:
- "traefik.enable=true"
- "traefik.http.routers.traefik.rule=Host(`traefik.example.com`)"
- "traefik.http.routers.traefik.entrypoints=websecure"
- "traefik.http.routers.traefik.tls.certresolver=letsencrypt"
- "traefik.http.services.traefik.loadbalancer.server.port=8080"
networks:
traefik:
name: traefik
external: false
Важно: Замените your-email@example.com на ваш реальный email адрес в строке с certificatesresolvers.letsencrypt.acme.email.
Создание файла для SSL сертификатов
Создайте файл acme.json и установите правильные права доступа:
touch acme.json
chmod 600 acme.json
Запуск Traefik
Запустите Traefik:
docker-compose up -d
Проверьте статус контейнера:
docker-compose ps
docker logs traefik
Проверка работы Traefik
- Проверьте, что контейнер запущен:
docker ps | grep traefik - Проверьте логи:
docker logs traefik - Traefik должен быть доступен по адресу
https://traefik.example.com(если вы настроили домен)
Установка Portainer
После того как Traefik успешно запущен, можно приступать к установке Portainer.
Шаг 1: Создание docker-compose.yml для Portainer
Создайте файл docker-compose.yml для Portainer:
version: '3.8'
services:
portainer:
image: portainer/portainer-ce:latest
container_name: portainer
restart: unless-stopped
security_opt:
- no-new-privileges:true
volumes:
- /etc/localtime:/etc/localtime:ro
- /var/run/docker.sock:/var/run/docker.sock:ro
- portainer_data:/data
networks:
- traefik
labels:
# Traefik labels
- "traefik.enable=true"
# HTTP Router
- "traefik.http.routers.portainer.rule=Host(`portainer.example.com`)"
- "traefik.http.routers.portainer.entrypoints=websecure"
- "traefik.http.routers.portainer.tls.certresolver=letsencrypt"
# HTTP Service
- "traefik.http.services.portainer.loadbalancer.server.port=9000"
# Middleware (опционально)
- "traefik.http.routers.portainer.middlewares=portainer-auth"
# Redirect HTTP to HTTPS (если нужен)
- "traefik.http.routers.portainer-http.rule=Host(`portainer.example.com`)"
- "traefik.http.routers.portainer-http.entrypoints=web"
- "traefik.http.routers.portainer-http.middlewares=redirect-to-https"
- "traefik.http.routers.portainer-http.middlewares=redirect-to-https@file"
networks:
traefik:
external: true
volumes:
portainer_data:
Шаг 2: Настройка доменного имени
Замените portainer.example.com на ваше реальное доменное имя в файле docker-compose.yml.
Шаг 3: Подключение к сети Traefik
Убедитесь, что Traefik работает в сети с именем traefik. Если ваша сеть называется иначе, измените название в секции networks:
# Проверить существующие сети
docker network ls
# Если сеть traefik не существует, создайте её
docker network create traefik
Шаг 4: Запуск Portainer
Запустите контейнер Portainer:
docker-compose up -d
Проверьте статус контейнера:
docker-compose ps
docker logs portainer
Шаг 5: Первоначальная настройка Portainer
- Откройте браузер и перейдите по адресу
https://portainer.example.com - При первом запуске вам будет предложено создать администратора
- Выберите тип окружения: Docker или Kubernetes
- Для Docker выберите Local и нажмите Connect
Дополнительные настройки
Базовая аутентификация (опционально)
Если вы хотите добавить дополнительный уровень защиты, можно использовать базовую аутентификацию Traefik. Добавьте в docker-compose.yml:
labels:
# ... другие labels ...
- "traefik.http.middlewares.portainer-auth.basicauth.users=admin:$$apr1$$..."
Для генерации хеша пароля используйте:
htpasswd -nb admin password | sed s/\\$/\\$\\$/g
Ограничение доступа по IP (опционально)
Добавьте middleware для ограничения доступа:
labels:
- "traefik.http.middlewares.portainer-ipwhitelist.ipwhitelist.sourcerange=192.168.1.0/24,10.0.0.0/8"
- "traefik.http.routers.portainer.middlewares=portainer-ipwhitelist"
Headers (опционально)
Для безопасности можно добавить security headers:
labels:
- "traefik.http.middlewares.portainer-headers.headers.customrequestheaders.X-Forwarded-Proto=https"
- "traefik.http.middlewares.portainer-headers.headers.customrequestheaders.X-Real-IP="
- "traefik.http.routers.portainer.middlewares=portainer-headers"
Структура файлов
После создания файлов у вас должна быть следующая структура:
portainer/
├── docker-compose.yml
└── .env (опционально, для переменных окружения)
Проверка работы
- Проверьте, что контейнер запущен:
docker ps | grep portainer - Проверьте логи:
docker logs portainer - Откройте в браузере
https://portainer.example.com - Убедитесь, что SSL сертификат работает корректно
Обновление Portainer
Для обновления Portainer выполните:
docker-compose pull
docker-compose up -d
Устранение неполадок
Portainer недоступен
- Проверьте логи Traefik:
docker logs traefik - Проверьте логи Portainer:
docker logs portainer - Убедитесь, что домен правильно настроен в DNS
- Проверьте, что контейнеры находятся в одной сети:
docker network inspect traefik
Проблемы с SSL сертификатом
- Убедитесь, что
certresolver=letsencryptнастроен в Traefik - Проверьте, что домен указывает на ваш сервер
- Проверьте логи Traefik для ошибок получения сертификата
Ошибка подключения к Docker
Если Portainer не может подключиться к Docker:
- Проверьте, что
/var/run/docker.sockправильно смонтирован - Убедитесь, что у пользователя есть права на доступ к Docker socket
Безопасность
- Всегда используйте HTTPS для доступа к Portainer
- Регулярно обновляйте Portainer до последней версии
- Используйте сильные пароли для администратора
- Рассмотрите возможность добавления базовой аутентификации Traefik
- Ограничьте доступ по IP, если это возможно
Заключение
Теперь Portainer установлен и настроен для работы за Traefik. Вы можете управлять вашими Docker контейнерами через удобный веб-интерфейс, доступный по защищенному HTTPS соединению.