Overview of Deploying EasyPanel on Server¶
Prerequisites and Basic Requirements¶
- Operating System – A recent Ubuntu release (tested on 20.04 LTS and newer).
- Root Access – All installation steps must be performed as the root user.
- Docker – Docker Engine 19.03+ is required. The installer script pulls the official EasyPanel image, so Docker must be installed before running the installation script.
- Network – Ports 80 and 443 must be free (no other web servers or containers exposing those ports).
- Domain and DNS – A fully‑qualified domain name that resolves to the server’s public IP. The domain will be used for HTTPS with Let’s Encrypt certificates.
- Email – An email address that can receive Let’s Encrypt renewal notifications (used by the Nginx‑Certbot container).
File and Directory Structure¶
After the installation script has finished, the following key directories are created on the server:
| Path | Purpose | Owner | Permissions |
|---|---|---|---|
/root/nginx | Holds the Nginx‑Certbot docker‑compose file and runtime data | root | 0755 |
/root/nginx/compose.yml | Docker‑Compose definition for the Nginx‑Certbot proxy | root | 0644 |
/data/nginx | Shared volume for Nginx‑Certbot (contains certs and user configs) | root | 0755 |
/data/nginx/user_conf.d | Per‑domain Nginx configuration snippets | root | 0755 |
/data/nginx/nginx-certbot.env | Environment file for the Certbot container (contains email, etc.) | root | 0644 |
/etc/traefik (optional) | Traefik configuration directory if you choose to run Traefik | root | 0755 |
/etc/traefik/dynamic (optional) | Dynamic Traefik configuration files | root | 0755 |
/etc/traefik/acme.json (optional) | Certificate storage for Traefik | root | 0600 |
The EasyPanel installation script creates its own Docker environment, typically placing the main container under /data/easypanel (the exact path is not exposed in the configuration files, but the container is named easypanel and listens on port 3000 internally).
Access Rights and Security¶
All critical configuration directories are owned by the root user.
- The Nginx‑Certbot container runs with network_mode: host, so it listens directly on the host’s 80/443 ports.
- The Nginx‑Certbot image stores certificates in the nginx_secrets Docker volume, which is an external volume mounted to /etc/letsencrypt.
- Traefik’s ACME storage file (acme.json) is created with 0600 permissions, limiting read/write access to root only.
No user‑level processes are exposed to the network; all traffic to the application is forwarded through the HTTPS proxy.
Databases¶
EasyPanel itself does not expose or require a separate database service. All data is stored inside the EasyPanel Docker container’s persistent volumes, which the installation script mounts under /data/easypanel. There is no external database server configuration in the provided templates.
Docker Containers and Their Deployment¶
Nginx‑Certbot¶
The Nginx‑Certbot container is deployed via Docker‑Compose:
Container details
- Image –
jonasal/nginx-certbot:latest - Ports – Inherited from the host (80 / 443) because of
network_mode: host. - Environment –
CERTBOT_EMAILis set from thenginx-certbot.envfile. - Volumes –
nginx_secrets:/etc/letsencrypt– stores Let’s Encrypt certificates./data/nginx/user_conf.d:/etc/nginx/user_conf.d– holds per‑domain config snippets.
The script automatically modifies the user configuration file to forward / traffic to the EasyPanel service on http://127.0.0.1:3000.
EasyPanel¶
The EasyPanel installation script pulls and runs an official Docker image (the exact image tag is chosen automatically). The container is named easypanel and internally listens on port 3000. No further Docker‑Compose files are required for EasyPanel; the script handles the creation of a dedicated Docker environment.
Optional Traefik¶
If you prefer Traefik over the Nginx‑Certbot container, the following configuration files are supplied:
traefik_static.yml.j2– static Traefik configuration (entry points, providers).traefik_dynamic_easypanel.yml.j2– dynamic router and service definition for EasyPanel.traefik.yml.j2– main Traefik configuration template (used for generatingtraefik.yml).
Place the rendered files under /etc/traefik and start Traefik in a container with those volumes mounted. Traefik will then forward HTTPS traffic to the EasyPanel service on http://easypanel:3000.
Proxy Servers¶
Two proxy solutions are included in the template set:
- Nginx‑Certbot – A single‑container solution that combines Nginx and Certbot. It serves HTTPS, obtains Let’s Encrypt certificates, and forwards traffic to the EasyPanel container.
- Traefik – A modern reverse‑proxy that can be configured with the provided static and dynamic YAML files. It also handles Let’s Encrypt certificates and can expose the EasyPanel service via HTTPS.
Choose the proxy that best matches your environment. If you use the Nginx‑Certbot container, no additional proxy configuration is needed.
Permission Settings¶
- Directories and files under
/root,/data, and/etcare owned byrootwith read/write/execute permissions limited to the owner. - The
acme.jsonfile for Traefik is set to0600to prevent non‑root users from reading or modifying the certificate storage. - Docker containers run as non‑root users inside the images (except when explicitly overridden by the container runtime).
Starting, Stopping, and Updating¶
Nginx‑Certbot¶
# Start or resume the proxy
cd /root/nginx
docker compose up -d
# Stop the proxy
docker compose down
EasyPanel¶
The installation script creates a Docker systemd service named easypanel. Use the following commands:
# Start EasyPanel
systemctl start easypanel
systemctl enable easypanel
# Stop EasyPanel
systemctl stop easypanel
# Restart EasyPanel
systemctl restart easypanel
# Update EasyPanel
# Re‑run the installation script or pull a newer image:
docker pull easypanel/easypanel:latest
docker compose -f /path/to/easypanel-compose.yml up -d
Traefik (if used)¶
# Start Traefik
docker run -d \
-p 80:80 -p 443:443 \
-v /etc/traefik/traefik.yml:/etc/traefik/traefik.yml \
-v /etc/traefik/dynamic:/etc/traefik/dynamic \
-v /etc/traefik/acme.json:/etc/traefik/acme.json \
traefik:v2.10
# Stop Traefik
docker stop <container_id_or_name>
When updating, replace the Traefik image tag in the run command, pull the new image, and restart the container.
The server is now ready to serve the EasyPanel web interface over HTTPS on the configured domain. No additional services should be listening on ports 80 or 443, and all traffic is securely terminated by the chosen reverse‑proxy.