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