Skip to main content

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 напрямую. Взаимодействие выглядит так:

  1. Мы создаём EC2-сервер (или Lightsail) в AWS.
  2. На этот сервер ставим Easypanel.
  3. Easypanel управляет контейнерами внутри EC2 через Docker, но не управляет firewall или DNS AWS.
  4. Все настройки безопасности (открытие портов, 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​

Обычный процесс деплоя выглядит так:

  1. GitHub Actions собирает Docker-образ проекта.
  2. Образ заливается в GitHub Container Registry (GHCR).
  3. После успешной сборки GitHub Actions вызывает webhook-триггер Easypanel, чтобы обновить контейнер.
  4. 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