Why deploy Easypanel on your VPS
Easypanel positions itself as a modern, visual alternative to CapRover or Dokku. It relies on Docker and Nixpacks to automatically build your applications from a Git repository, without you having to write a Dockerfile. Its interface, more recent and more ergonomic than most open-source panels, lets you manage applications, databases, certificates and domains in a few clicks. Easypanel natively integrates Traefik as a reverse proxy: each deployed application automatically gets its Let's Encrypt certificate and its routing. It's an excellent compromise between the simplicity of a commercial PaaS and the control of a server you own, particularly well suited to agencies that regularly deploy client projects.
The concrete benefits of Easypanel
- Automatic builds via Nixpacks: deploy Node, Python, PHP or Go without writing a Dockerfile.
- Modern, intuitive interface to manage apps, domains and databases.
- Traefik built in: reverse proxy and Let's Encrypt SSL configured automatically.
- One-click databases: PostgreSQL, MySQL, MongoDB, Redis ready to use.
- Deployment from GitHub with automatic rebuild on every push.
- Templates for popular applications (WordPress, n8n, Ghost…) deployable instantly.
- Project isolation: each client or application in its own Docker network.
Exact prerequisites for Easypanel
Easypanel bundles Traefik and a Nixpacks builder, which requires a bit more memory than Portainer.
RAM: 2 GB minimum, the requirement stated by the vendor. As soon as you host several applications with their databases, aim for 4 GB: Nixpacks builds temporarily consume a lot of RAM and a small server risks killing the compilation process mid-way.
CPU: 1 vCPU is sufficient to start, 2 vCPU recommended as soon as you run frequent builds or resource-intensive databases.
Disk: plan for at least 30 GB of SSD. Plan for more if you host large databases or heavy Docker images (Node, Java).
OS: Clean Ubuntu 22.04 LTS or Ubuntu 24.04 LTS with root access. The official script targets Ubuntu: when Docker is missing, it installs it from Docker's Ubuntu repository. Docker is installed automatically by the Easypanel script — no need to pre-install it.
Network / DNS: configure an A record for the panel domain (panel.mydomain.com) pointing to your VPS IP. A wildcard record *.mydomain.com is strongly recommended to avoid manually adding each application subdomain. Ports 80 and 443 must be free (the script stops if a service already uses them) and open in your firewall. The panel listens on port 3000 for first access; once its domain is configured, disable IP access rather than relying on ufw, which does not filter ports published by Docker.
Install Easypanel and deploy an application
Launch the automated installation
On a clean Ubuntu, run the official script as root:
curl -sSL https://get.easypanel.io | shThe script installs Docker (if absent), initialises Docker Swarm and starts Easypanel, which deploys Traefik, in a few minutes. The panel is then reachable on port 3000 of the server:
http://VPS_IP:3000. Verify that Docker is running withdocker psbefore moving to the next step.Create the administrator account
Open
http://VPS_IP:3000in your browser. Create your admin account with an email address and a strong password (at least 16 characters). Then open the server settings (Settings) and fill in the custom panel domain (panel.mydomain.com): Easypanel will immediately request a Let's Encrypt certificate via Traefik. Once the certificate is obtained, the panel is accessible via HTTPS: then disable IP access in that same setting. Do not rely on ufw to close port 3000: Docker publishes its ports ahead of ufw rules.Create a project and an application
In the interface, click New Project: a project groups your services (app + database + cache) in an isolated Docker network. Inside the project, click New Service → App. Provide the GitHub repository (a GitHub token configured on the server is required for a private repository), the production branch and the build path if necessary. Easypanel uses the Dockerfile if present; otherwise Nixpacks detects the stack — Node, Python, PHP, Ruby, Go. Railpack, its successor, is recommended by the vendor for a new application and is selected in the Build tab.
Add a database and environment variables
In the same project, click New Service and choose Postgres, MySQL, MariaDB, Mongo or Redis. Easypanel generates an internal hostname derived from the project and service names, a user (
postgresby default for PostgreSQL) and a random password. Copy the internal connection URL from the Credentials tab, then inject it into your application via the Environment tab of your App service. Services within the same project communicate via their service name on the internal Docker network — no need to expose the database to the Internet.Configure the domain and deploy
In the application's Domains tab, add
my-app.mydomain.com: Easypanel configures Traefik and obtains the SSL certificate automatically. Click Deploy: Nixpacks builds the image and brings the application online. View real-time build logs from the Deployments tab to track progress and catch any errors.
Post-installation: Traefik and advanced TLS
Easypanel exposes Traefik via two entry points: the Traefik dashboard (disabled by default for security reasons) and the internal routing API that the panel manages automatically. You normally do not need to touch the Traefik configuration directly.
Automatic TLS. For each domain added in the Domains tab of a service, Easypanel configures an ACME Let's Encrypt resolver. The certificate is renewed automatically before expiry. If your domain is behind Cloudflare, make sure the SSL/TLS mode is set to Full (strict) — a "Flexible" mode would cause an infinite redirect loop since Traefik already redirects HTTP to HTTPS.
Advanced configurations. From the tabs of each service, you can:
- add Traefik middlewares to a domain (Domains tab) or HTTP Basic authentication (Security tab);
- mount persistent volumes (Storage tab, useful for data in applications that do not use a dedicated database);
- set the number of replicas and zero-downtime deployments (Advanced tab).
Internal port. Each domain routes to a target port, which must be the port the application listens on inside the container (normally on 0.0.0.0). If your application listens on a non-standard port, set it as the domain's target port (Domains tab) so that Traefik knows where to route requests.
Updates and Easypanel backups
Updating Easypanel. The panel checks for updates itself: when a new release is available, a button appears in the navigation bar. From the command line, the manual update documented by the vendor (stable channel) is:
docker image pull easypanel/easypanel && docker service update easypanel --forceDo not re-run the installation script to update: it is meant for a fresh server, stops when ports 80 and 443 are in use and runs docker swarm leave --force.
Backing up the panel state. Easypanel stores its configuration, the Traefik configuration (certificates included) and service data in the server's /etc/easypanel directory, mounted into its containers. To back up everything:
# Measure Easypanel's state directory
du -sh /etc/easypanel
# Archive it (the archive contains secrets: protect it)
tar czf /root/easypanel-backup-$(date +%Y%m%d).tar.gz -C / etc/easypanel \
&& chmod 600 /root/easypanel-backup-*.tar.gzThen copy the archive off the server. Files of a database being written may be inconsistent in it: for databases, rely on their logical backups.
Application database backups. Easypanel offers scheduled logical backups for PostgreSQL, MySQL, MariaDB and MongoDB (not Redis). First declare a destination in Settings → Server → Storage Providers: an S3 or S3-compatible bucket (Cloudflare R2, Backblaze B2, Wasabi…), SFTP, Dropbox or Google Drive. Then configure the backup from the Backups tab of each database service: cron schedule, number of backups kept and destination path. Run a first backup manually and test its restore.
Restoring. To restore the state directory archive on the server:
tar xzf /root/easypanel-backup-20261001.tar.gz -C /Troubleshooting: the most common errors
Port 80 or 443 already in use. If the installation script stops on "something is already running on port 80" (or 443), check which service is listening on those ports: ss -tlnp | grep -E ':(80|443)'. A pre-installed nginx or Apache on the VPS blocks the installation. Stop and disable the competing service (systemctl disable --now nginx) then re-run the installation script.
Docker not installed or version too old. The script only installs Docker when it is missing: on a system that already has an old Docker version, it keeps it as is and you may get compatibility errors. Check the version: docker --version, and compare it with the latest stable Docker Engine release. If necessary, uninstall the old version and re-run the script.
DNS not propagated — SSL certificate not found. If Let's Encrypt cannot verify the domain (DNS record not yet propagated, or long TTL), Traefik will show a certificate error. Check propagation from your terminal: dig +short panel.mydomain.com must return your VPS IP. DNS propagation can take a few minutes to several hours depending on the registrar and TTL.
Certificate error after IP change. If you migrate your VPS to a new IP without updating DNS, the ACME challenge fails. Update your A record, wait for propagation, then run the server IP refresh from the server settings, which updates the recorded IP, the generated domain and the certificates.
Nixpacks build fails out of memory. On a small VPS (2 GB of RAM), Node.js builds or multi-stage images may fail silently. Add swap to absorb peaks: fallocate -l 2G /swapfile && chmod 600 /swapfile && mkswap /swapfile && swapon /swapfile. Make swap persistent by adding /swapfile none swap sw 0 0 to /etc/fstab.
Easypanel, Coolify or Dokploy: which to choose?
Scroll the table
| Criterion | Easypanel | Coolify | Dokploy |
|---|---|---|---|
| License | Proprietary (free plan limited to 3 projects) | Open source (Apache 2.0) | Open source (Apache 2.0, except a proprietary directory) |
| Minimum recommended RAM | 2 GB | 2 GB | 2 GB |
| Internal database | Not documented | PostgreSQL (+ Redis) | PostgreSQL (required) |
| Buildpacks | Railpack, Nixpacks, Buildpacks, Dockerfile, Docker image | Nixpacks, Railpack (beta), Dockerfile, Docker Compose, static | Nixpacks, Railpack, Dockerfile, Heroku, Paketo, static |
| App templates | 800+ (WordPress, n8n, Ghost, Plausible…) | 300+ (Appwrite, Supabase, n8n…) | 500+ (WordPress, n8n, Directus…) |
| Multi-server | Yes (Docker Swarm worker nodes) | Yes (remote servers over SSH) | Yes (remote servers, Swarm nodes) |
| Free / self-hosted plan | Free up to 3 projects, paid per-server licences | 100% self-hosted free | 100% self-hosted free |
Enable automatic deployment by connecting a GitHub webhook: every push to your production branch triggers a Nixpacks rebuild with no intervention. For client projects, create a separate Project per client in order to isolate networks and databases. On a memory-limited VPS, watch the RAM during Nixpacks builds and add swap: Node compilations or heavy images can saturate a small server and cause the deployment to fail. For panel security, disable IP access (port 3000) after configuring its domain and consider adding a Traefik authentication middleware in front of sensitive internal services.