Easypanel: панель управления для Docker-приложений
Easypanel — это self-hosted панель управления, которая ставится поверх Docker и облегчает запуск и управление приложениями. Она не привязана к конкретному облачному провайдеру (AWS, DigitalOcean, Hetzner и т.д.) и может быть установлена на любой Linux-сервер.
Основные возможности:
- Удобный Web UI для управления приложениями.
- Автоматическая конфигурация Docker и Traefik (reverse proxy).
- Автоматический выпуск SSL-сертификатов (Let's Encrypt).
- Поддержка Git-деплоя, webhooks и CI/CD.
- Запуск множества приложений на одном сервере без конфликтов портов.
Как Easypanel взаимодействует с AWS
Easypanel не управляет AWS напрямую. Взаимодействие выглядит так:
- Мы создаём EC2-сервер (или Lightsail) в AWS.
- На этот сервер ставим Easypanel.
- Easypanel управляет контейнерами внутри EC2 через Docker, но не управляет firewall или DNS AWS.
- Все настройки безопасности (открытие портов, security groups) делаются в AWS.
Как Easypanel работает внутри сервера
Easypanel использует Docker и Traefik. Каждый «сервер» или «сервис» в Easypanel — это просто контейнер.
Схема работы:
Интернет
│
┌──────────────┴──────────────┐
│ IP: 3.149.x.x (EC2 сервер) │
└──────────────┬──────────────┘
│
[ Порт 80 / 443 ]
│
┌─────┴─────┐
│ Traefik │
│ (Reverse │
│ Proxy) │
└─────┬─────┘
┌───────────┼────────────┐
│ │ │
domain: app1.example.com app2.example.com
│ │ │
┌───┴───┐ ┌───┴───┐ ┌───┴───┐
│Container│ │Container│ │Container│
│ (App1) │ │ (App2) │ │ (App3) │
│ Port3000│ │ Port3000│ │ Port3000│
└─────────┘ └─────────┘ └─────────┘
- Все запросы извне приходят на 80/443.
- Traefik маршрутизирует трафик по доменам на нужные контейнеры.
- Внутри каждого контейнера может быть свой порт (например, 3000), и это не создаёт конфликтов.
Проблема портов
- Два контейнера могут использовать один и тот же внутренний порт (3000), так как Traefik их развязывает.
- Извне приложения доступны только по 80/443 и своему доменному имени.
CI/CD с GitHub Actions и Easypanel
Обычный процесс деплоя выглядит так:
- GitHub Actions собирает Docker-образ проекта.
- Образ заливается в GitHub Container Registry (GHCR).
- После успешной сборки GitHub Actions вызывает webhook-триггер Easypanel, чтобы обновить контейнер.
- Easypanel тянет свежий образ из GHCR и перезапускает контейнер.
Схема:
┌────────────────────┐
│ GitHub Actions │
└───────┬────────────┘
│
[1] Build Docker Image
[2] Push to GHCR (ghcr.io)
│
▼
┌────────────────────┐
│ GitHub Container │
│ Registry (GHCR) │
└─────────┬──────────┘
│
[3] Trigger Webhook
curl -X POST DEPLOY_URL
│
▼
┌────────────────────┐
│ Easypanel │
│ (on EC2 server) │
└─────────┬──────────┘
│
[4] Pull Docker Image
(ghcr.io/org/app:latest)
│
▼
┌────────────────────┐
│ Docker Engine │
│ (Containers/Apps) │
└───┬─────────┬──────┘
│ │
▼ ▼
App1 Container App2 Container
Webhook Easypanel
Easypanel генерирует URL вида:
http://<ip>:3000/api/deploy/<token>
Этот URL вызывает деплой определённого проекта по токену.
Проблема:
Порт 3000 часто закрыт в AWS (по умолчанию Security Groups разрешают только 22, 80, 443). GitHub Actions не сможет достучаться напрямую.
Как сделать деплой через HTTPS-домен
Чтобы не открывать порт 3000 наружу, можно использовать Traefik (или Nginx), чтобы проксировать API Easypanel на поддомен.
Пример идеи:
https://infra.showmojo.com/deploy/<token>
→ проксируется на 127.0.0.1:3000/api/deploy/<token>
Nginx-конфигурация:
server {
listen 80;
server_name infra.showmojo.com;
location /deploy/ {
proxy_pass http://127.0.0.1:3000/api/deploy/;
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;
}
}
Теперь можно запускать деплой из GitHub Actions:
- name: Deploy to Easypanel
run: curl -X POST https://infra.showmojo.com/deploy/${{ secrets.DEPLOY_TOKEN }}
Зачем нужен Easypanel, если есть AWS
- AWS даёт «железо» (EC2), но не управляет приложениями.
- Easypanel автоматизирует управление контейнерами, SSL и маршрутами.
- Тебе не нужно писать docker-compose и nginx-конфиги вручную.
Вывод
- Easypanel — удобный слой над Docker, который превращает один EC2 в «мини-хостинг» для множества приложений.
- Все приложения работают на одном IP и портах 80/443, различаются по доменам.
- Для CI/CD GitHub Actions можно настроить деплой через GHCR + webhook Easypanel, проксируя API через домен.
Шпаргалка: деплой через Easypanel и GitHub Actions
1. Проксируем Easypanel API через Traefik
В Easypanel → Settings → Traefik Custom Config добавь:
http:
routers:
deploy-api:
rule: "Host(`infra.example.com`) && PathPrefix(`/api/deploy/`)"
service: deploy-api
entryPoints:
- websecure
tls:
certResolver: lets-encrypt
services:
deploy-api:
loadBalancer:
servers:
- url: "http://127.0.0.1:3000"
infra.example.com— домен, указывающий на сервер с Easypanel.3000— внутренний порт Easypanel API.
Сохрани и перезапусти Traefik.
2. Проверяем деплой вручную
На сервере:
curl -X POST http://localhost:3000/api/deploy/<token>
Извне (через домен):
curl -X POST https://infra.example.com/api/deploy/<token>
Если получен ответ 200 OK — маршрут работает.
3. Настраиваем GitHub Secrets
В репозитории GitHub: Settings → Secrets and variables → Actions → New repository secret Добавь:
DEPLOY_URL = https://infra.example.com/api/deploy/<token>
4. Пример workflow (deploy.yml)
name: Deploy
on:
push:
branches:
- main
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Trigger deployment on Easypanel
run: curl -X POST ${{ secrets.DEPLOY_URL }}
Этот workflow вызовет деплой при каждом пуше в main.
5. Рекомендации по безопасности
- Не открывай порт 3000 наружу — Traefik + HTTPS достаточно.
- Храни
DEPLOY_URLс токеном только в GitHub Secrets. - Если домен
infra.example.comиспользуется для доступа к Easypanel UI, можно настроить Basic Auth или IP-ограничение для/api/deploy/.
6. Как отладить
Если деплой не срабатывает:
-
Проверь логи Easypanel:
docker logs easypanel -
Проверь Traefik:
docker logs traefik