What is Dokploy?
Dokploy is a free, self-hosted PaaS β your own Vercel/Heroku that runs on your VPS. It bundles Docker Swarm, Traefik (for SSL + routing), PostgreSQL, and Redis into one web dashboard. You deploy apps, manage databases, and handle domains all from a single UI β no manual Docker config needed.
| Resource | Minimum |
|---|---|
| RAM | 2 GB (4 GB recommended) |
| CPU | 2 vCPU |
| Disk | 30 GB (50 GB recommended) |
| Port | Purpose |
|---|---|
80 |
|
| HTTP traffic (Traefik) | |
443 |
|
| HTTPS traffic (Traefik) | |
3000 |
|
| Dokploy web UI |
β 1. Get Your Credentials
You'll need these three things from your hosting provider:
568.82.48.166
root
Subham@Xam_08
β 2. Connect via Terminal
ssh root@568.82.48.166
β 3. Verify the Connection
You'll see a host authenticity prompt:
The authenticity of host '568.82.48.166' can't be established.
Are you sure you want to continue connecting (yes/no/[fingerprint])?
Type yes
and press Enter.
β 4. Enter Your Password
root@568.82.48.166's password:
Paste your password and press Enter. The terminal won't show characters while typing β that's normal.
β 5. Success!
You'll see the Ubuntu welcome screen and land in the shell:
root@your-hostname:~#
β 1. Clear the Terminal
clear
β 2. Verify Your OS
lsb_release -a
Expected output:
Distributor ID: Ubuntu
Description: Ubuntu 22.04.x LTS
Release: 22.04
β 3. Update the Package List
sudo apt update
β 4. Upgrade Installed Packages
sudo apt upgrade -y
If you see configuration prompts during upgrade, press Tab to highlight OK
and press Enter.
β 5. Install Essential Tools
sudo apt install -y curl wget ca-certificates
β 6. Reboot if Prompted
If the upgrade mentions a kernel update:
sudo reboot
Then SSH back in.
On Ubuntu, Dokploy's installer can auto-install Docker. However, it's best practice to install Docker yourself first so you have full control over the version and configuration.
β 1. Remove Any Old Docker Versions
sudo apt remove -y docker docker-engine docker.io containerd runc
(It's fine if these aren't installed β the command will just say "not installed".)
β 2. Add Docker's Official GPG Key and Repository
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
β 3. Install Docker Engine + Compose
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
β 4. Enable and Start Docker
sudo systemctl enable --now docker
β 5. Verify Docker Installation
docker --version
docker compose version
Expected output:
Docker version 29.x.x, build ...
Docker Compose version v5.x.x
β 6. Test Docker Works
docker run hello-world
You should see Hello from Docker!
in the output.
β 1. Check Firewall Status
sudo ufw status
β 2. Open Required Ports
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 3000/tcp
sudo ufw enable
β 3. Verify Rules
sudo ufw status numbered
Expected output:
Status: active
To Action From
-- ------ ----
[ 1] 22/tcp ALLOW IN Anywhere
[ 2] 80/tcp ALLOW IN Anywhere
[ 3] 443/tcp ALLOW IN Anywhere
[ 4] 3000/tcp ALLOW IN Anywhere
β 1. Run the Dokploy Installer
curl -sSL https://dokploy.com/install.sh | sh
The installer will automatically:
dokploy-network
overlay networkdokploy-postgres
dokploy-redis
dokploy-traefik
β 2. Wait for the Installer to Finish
You'll see:
Congratulations, Dokploy is installed!
Wait 15 seconds for the server to start
Please go to http://568.82.48.166:3000
Wait the full 15 seconds before opening the browser.
β 3. Verify All Platform Services Are Running
docker service ls
Expected output β all services should show 1/1
under REPLICAS
:
NAME MODE REPLICAS IMAGE
dokploy replicated 1/1 dokploy/dokploy:latest
dokploy-postgres replicated 1/1 postgres:16
dokploy-redis replicated 1/1 redis:7
dokploy-traefik replicated 1/1 traefik:v3.x
Also confirm running containers:
docker ps --format '{{.Names}}\t{{.Image}}\t{{.Status}}'
β 4. Confirm the Panel is Responding
curl -I http://127.0.0.1:3000/
Expected:
HTTP/1.1 302 Found
Location: /register
β 1. Open Dokploy in Your Browser
http://568.82.48.166:3000
You'll be redirected to the registration page.
β 2. Create Your Admin Account
Fill in:
Click Create Account.
β 3. You're In the Dashboard!
The main sections you'll use:
Purchase from GoDaddy, Namecheap, Cloudflare, etc.
In your domain provider's DNS management, add:
| Type | Name | Points To | TTL |
|---|---|---|---|
A |
|||
@ |
|||
568.82.48.166 |
|||
| 1 hour | |||
A |
|||
www |
|||
568.82.48.166 |
|||
| 1 hour |
For a panel subdomain (e.g., panel.xyz.com
):
| Type | Name | Points To | TTL |
|---|---|---|---|
A |
|||
panel |
|||
568.82.48.166 |
|||
| 1 hour |
nslookup yourdomain.com
Expected:
Name: yourdomain.com
Address: 568.82.48.166
DNS can take up to
24 hoursto propagate globally. Usually 5β30 minutes.
yourdomain.com
Dokploy's built-in Traefik will automatically issue and renew the SSL certificate.
https://yourdomain.com
You should see the Dokploy login page with a padlock in the browser.
Once your domain + HTTPS is confirmed working, remove port 3000 exposure:
docker service update --publish-rm "published=3000,target=3000,mode=host" dokploy
β οΈ Only run this AFTER verifying your domain works. Otherwise you'll lose access.
Note:Dokploy already has its own internal PostgreSQL running for its own data. The one you create here is aseparate database for your application.
my-app
)| Field | Example |
|---|---|
| Service Name | my-app-db |
| Database Name | myapp |
| Database User | myapp_user |
| Database Password | StrongPass@2025 |
| PostgreSQL Version | 16 |
For app containers in the same project, use the service name as hostname:
DB_HOST=my-app-db
DB_PORT=5432
DB_NAME=myapp
DB_USER=myapp_user
DB_PASSWORD=StrongPass@2025
DATABASE_URL=postgresql://myapp_user:StrongPass@2025@my-app-db:5432/myapp
β οΈ Use
my-app-db
(the service name) as the host βNOTlocalhost
or the server IP. Containers in the same project communicate by service name over the internal Docker network.
To connect from your local machine using pgAdmin or TablePlus:
5433
sudo ufw allow 5433/tcp
Host: 568.82.48.166
Port: 5433
Database: myapp
User: myapp_user
Password: StrongPass@2025
Note:Dokploy has its own internal Redis for deployment queuing. The one you create here is aseparate Redis for your application(caching, sessions, queues).
| Field | Example |
|---|---|
| Service Name | my-app-cache |
| Redis Password | RedisPass@2025 |
| Redis Version | 7 |
REDIS_HOST=my-app-cache
REDIS_PORT=6379
REDIS_PASSWORD=RedisPass@2025
REDIS_URL=redis://:RedisPass@2025@my-app-cache:6379
For multiple use cases using Redis database numbers (0β15):
CACHE_URL=redis://:RedisPass@2025@my-app-cache:6379/0
SESSION_URL=redis://:RedisPass@2025@my-app-cache:6379/1
QUEUE_URL=redis://:RedisPass@2025@my-app-cache:6379/2
To manage Redis from your local RedisInsight:
6379
sudo ufw allow 6379/tcp
568.82.48.166
6379
default
RedisPass@2025
docker-compose.yml
Go to the Environment tab and add your variables:
DATABASE_URL=postgresql://myapp_user:StrongPass@2025@my-app-db:5432/myapp
REDIS_URL=redis://:RedisPass@2025@my-app-cache:6379
PORT=3333
NODE_ENV=production
Click Save.
app.yourdomain.com
)3333
)Make sure
app.yourdomain.com
has an A record pointing to your server IP in your DNS settings.
https://app.yourdomain.com
docker service ls
docker ps
docker logs $(docker ps -q -f name=dokploy_dokploy)
docker logs $(docker ps -q -f name=dokploy_dokploy-traefik)
docker service update --force dokploy_dokploy
docker stats
df -h
free -h
curl -sSL https://dokploy.com/install.sh | sh -s update
sudo ufw status
sudo ufw allow 3000/tcp
docker service ls
docker ps | grep dokploy
docker logs $(docker ps -q -f name=dokploy_dokploy-traefik) 2>&1 | tail -50
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
nslookup yourdomain.com
Use the service name (not localhost
) as the hostname:
DATABASE_URL=postgresql://user:pass@localhost:5432/mydb
DATABASE_URL=postgresql://user:pass@my-app-db:5432/mydb
Verify all services are on the same network:
docker network inspect dokploy-network
sudo systemctl enable docker
sudo systemctl status docker
What is Dokploy?
Dokploy is a free, self-hosted PaaS β your own Vercel/Heroku that runs on your VPS. It bundles Docker Swarm, Traefik (for SSL + routing), PostgreSQL, and Redis into one web dashboard. You deploy apps, manage databases, and handle domains all from a single UI β no manual Docker config needed.β οΈ
AlmaLinux Critical Warning:Dokploy's default installer falls back to Docker's convenience script whichdoes NOT support AlmaLinuxand fails withUnsupported distribution 'almalinux'
. Youmust install Docker manually firstfrom Docker's official CentOS repository before running the Dokploy installer.Step 3 covers this in full.
| Resource | Minimum |
|---|---|
| RAM | 2 GB (4 GB recommended) |
| CPU | 2 vCPU |
| Disk | 30 GB (50 GB recommended) |
| Port | Purpose |
|---|---|
80 |
|
| HTTP traffic (Traefik) | |
443 |
|
| HTTPS traffic (Traefik) | |
3000 |
|
| Dokploy web UI |
β 1. Get Your Credentials
You'll need these three things from your hosting provider:
568.82.48.166
root
Subham@Xam_08
β 2. Connect via Terminal
ssh root@568.82.48.166
β 3. Verify the Connection
You'll see a host authenticity prompt:
The authenticity of host '568.82.48.166' can't be established.
Are you sure you want to continue connecting (yes/no/[fingerprint])?
Type yes
and press Enter.
β 4. Enter Your Password
root@568.82.48.166's password:
Paste your password and press Enter. The terminal won't show characters while typing β that's normal.
β 5. Success!
You'll land in the AlmaLinux shell:
[root@your-hostname ~]#
β 1. Clear the Terminal
clear
β 2. Verify Your OS
Confirm you're running AlmaLinux:
cat /etc/os-release
Expected output:
NAME="AlmaLinux"
VERSION="9.x (Seafoam Ocelot)"
ID="almalinux"
ID_LIKE="rhel centos fedora"
...
β 3. Enable EPEL Repository
EPEL (Extra Packages for Enterprise Linux) is required for many packages on AlmaLinux:
sudo dnf install -y epel-release
β 4. Update the Package List
sudo dnf check-update
(Exit code 100 is normal β it just means updates are available.)
β 5. Upgrade Installed Packages
sudo dnf upgrade -y
β 6. Install Essential Tools
sudo dnf install -y curl wget ca-certificates dnf-plugins-core
β 7. Reboot if Prompted
If the upgrade includes a kernel update:
sudo reboot
Then SSH back in.
β οΈ
This step is required and unique to AlmaLinux.Dokploy's built-in Docker installer does NOT support AlmaLinux. When it tries, it uses Docker's convenience script which returns:
ERROR: Unsupported distribution 'almalinux'
and the entire Dokploy installation fails. The fix is to install Docker yourself first from Docker's official
CentOSrepository β which AlmaLinux is fully binary-compatible with.
Do not skip this step.
β 1. Remove Any Old or Conflicting Docker Packages
sudo dnf remove -y docker docker-client docker-client-latest docker-common \
docker-latest docker-latest-logrotate docker-logrotate docker-engine
(It's fine if these aren't installed β the command will just skip them.)
β 2. Add Docker's Official Repository for CentOS/RHEL
AlmaLinux is binary-compatible with RHEL/CentOS, so use Docker's CentOS repo:
sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
β 3. Install Docker Engine + Compose Plugin
sudo dnf install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
When prompted to accept the GPG key, type y
and press Enter.
β 4. Enable and Start Docker
On AlmaLinux, services don't auto-start β you must enable them explicitly:
sudo systemctl enable --now docker
β 5. Verify Docker Installation
docker --version
docker compose version
Expected output:
Docker version 29.x.x, build ...
Docker Compose version v5.x.x
β 6. Test Docker Works
docker run hello-world
You should see Hello from Docker!
in the output.
β Docker is now installed. The Dokploy installer will detect it and skip its own Docker installation step β allowing it to run successfully on AlmaLinux.
AlmaLinux uses
firewalldβ notufw
or rawiptables
. All firewall management is done withfirewall-cmd
.
β 1. Check Firewall Status
sudo firewall-cmd --state
β 2. Open Required Ports
sudo firewall-cmd --permanent --add-port=22/tcp
sudo firewall-cmd --permanent --add-port=80/tcp
sudo firewall-cmd --permanent --add-port=443/tcp
sudo firewall-cmd --permanent --add-port=3000/tcp
sudo firewall-cmd --reload
β 3. Verify Open Ports
sudo firewall-cmd --list-ports
Expected output:
22/tcp 80/tcp 443/tcp 3000/tcp
β 4. Fix SELinux for Network Proxying (AlmaLinux Specific)
AlmaLinux enables SELinux by default, which can block containers from making network connections. Allow it:
sudo setsebool -P httpd_can_network_connect 1
Why firewall-cmd?Unlike Ubuntu'sufw
, AlmaLinux uses firewalld. The--permanent
flag makes rules survive reboots automatically β no extra package likenetfilter-persistent
is needed.
β 1. Set Your Server's Public IP as the Advertise Address
The Dokploy installer sometimes cannot auto-detect the IP on AlmaLinux. Always set it manually:
export ADVERTISE_ADDR="568.82.48.166"
Replace 568.82.48.166
with your actual VPS IP address.
β 2. Run the Dokploy Installer
curl -sSL https://dokploy.com/install.sh | sh
Because Docker is already installed (Step 3), the installer will skip Docker setup and go straight to deploying Dokploy's services:
dokploy
dokploy-postgres
dokploy-redis
dokploy-traefik
β 3. Wait for Services to Start
You'll see:
Congratulations, Dokploy is installed!
Wait 15 seconds for the server to start
Please go to http://568.82.48.166:3000
Wait the full 15 seconds before opening the browser.
β 4. Verify All Platform Services Are Running
docker service ls
Expected output β all services should show 1/1
under REPLICAS
:
NAME MODE REPLICAS IMAGE
dokploy replicated 1/1 dokploy/dokploy:latest
dokploy-postgres replicated 1/1 postgres:16
dokploy-redis replicated 1/1 redis:7
dokploy-traefik replicated 1/1 traefik:v3.x
Also confirm containers are running:
docker ps --format '{{.Names}}\t{{.Image}}\t{{.Status}}'
β 5. Confirm the Panel is Responding
curl -I http://127.0.0.1:3000/
Expected:
HTTP/1.1 302 Found
Location: /register
β 1. Open Dokploy in Your Browser
http://568.82.48.166:3000
You'll be redirected to the registration page.
β 2. Create Your Admin Account
Fill in:
Click Create Account.
β 3. You're In the Dashboard!
The main sections you'll use:
Purchase from GoDaddy, Namecheap, Cloudflare, etc.
In your domain provider's DNS management, add:
| Type | Name | Points To | TTL |
|---|---|---|---|
A |
|||
@ |
|||
568.82.48.166 |
|||
| 1 hour | |||
A |
|||
www |
|||
568.82.48.166 |
|||
| 1 hour |
For a panel subdomain (e.g., panel.xyz.com
):
| Type | Name | Points To | TTL |
|---|---|---|---|
A |
|||
panel |
|||
568.82.48.166 |
|||
| 1 hour |
nslookup yourdomain.com
Expected:
Name: yourdomain.com
Address: 568.82.48.166
DNS can take up to
24 hoursto propagate globally. Usually 5β30 minutes.
yourdomain.com
Dokploy's built-in Traefik automatically issues and renews the SSL certificate via Let's Encrypt.
https://yourdomain.com
You should see the Dokploy login page with a padlock icon in the browser.
Once your domain + HTTPS is confirmed working, remove port 3000 exposure:
docker service update --publish-rm "published=3000,target=3000,mode=host" dokploy
β οΈ Only run this AFTER verifying your domain works. Otherwise you'll lose access to the panel.
Note:Dokploy already has itsown internal PostgreSQLrunning for its own data. The database you create here is aseparate, isolated PostgreSQL instance for your application.
my-app
)| Field | Example |
|---|---|
| Service Name | my-app-db |
| Database Name | myapp |
| Database User | myapp_user |
| Database Password | StrongPass@2025 |
| PostgreSQL Version | 16 |
For app containers in the same project, use the service name as the hostname:
DB_HOST=my-app-db
DB_PORT=5432
DB_NAME=myapp
DB_USER=myapp_user
DB_PASSWORD=StrongPass@2025
DATABASE_URL=postgresql://myapp_user:StrongPass@2025@my-app-db:5432/myapp
β οΈ Use
my-app-db
(the service name you set) as the host βNOTlocalhost
or the server IP. Containers in the same Dokploy project communicate with each other by service name over the internal Docker network.
To connect from your local machine using pgAdmin or TablePlus:
5433
sudo firewall-cmd --permanent --add-port=5433/tcp
sudo firewall-cmd --reload
Host: 568.82.48.166
Port: 5433
Database: myapp
User: myapp_user
Password: StrongPass@2025
Note:Dokploy has itsown internal Redisfor managing deployment queues. The one you create here is aseparate Redis instance for your applicationβ caching, sessions, job queues, etc.
| Field | Example |
|---|---|
| Service Name | my-app-cache |
| Redis Password | RedisPass@2025 |
| Redis Version | 7 |
REDIS_HOST=my-app-cache
REDIS_PORT=6379
REDIS_PASSWORD=RedisPass@2025
REDIS_URL=redis://:RedisPass@2025@my-app-cache:6379
For multiple use cases using Redis database numbers (0β15):
CACHE_URL=redis://:RedisPass@2025@my-app-cache:6379/0
SESSION_URL=redis://:RedisPass@2025@my-app-cache:6379/1
QUEUE_URL=redis://:RedisPass@2025@my-app-cache:6379/2
To manage Redis from your local RedisInsight:
6379
sudo firewall-cmd --permanent --add-port=6379/tcp
sudo firewall-cmd --reload
568.82.48.166
6379
default
RedisPass@2025
docker-compose.yml
Go to the Environment tab and add your variables:
DATABASE_URL=postgresql://myapp_user:StrongPass@2025@my-app-db:5432/myapp
REDIS_URL=redis://:RedisPass@2025@my-app-cache:6379
PORT=3333
NODE_ENV=production
Click Save.
app.yourdomain.com
)3333
)Make sure
app.yourdomain.com
also has an A record pointing to your server IP.
https://app.yourdomain.com
docker service ls
docker ps
docker logs $(docker ps -q -f name=dokploy_dokploy)
docker logs $(docker ps -q -f name=dokploy_dokploy-traefik)
docker service update --force dokploy_dokploy
docker stats
df -h
free -h
curl -sSL https://dokploy.com/install.sh | sh -s update
This means Docker was not pre-installed. Go back to Step 3 and install Docker manually first:
sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo dnf install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo systemctl enable --now docker
export ADVERTISE_ADDR="568.82.48.166"
curl -sSL https://dokploy.com/install.sh | sh
Always export ADVERTISE_ADDR
before the installer on AlmaLinux:
export ADVERTISE_ADDR="YOUR_PUBLIC_IP"
curl -sSL https://dokploy.com/install.sh | sh
sudo firewall-cmd --list-ports
sudo firewall-cmd --permanent --add-port=3000/tcp
sudo firewall-cmd --reload
docker service ls
docker ps | grep dokploy
docker logs $(docker ps -q -f name=dokploy_dokploy-traefik) 2>&1 | tail -50
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload
nslookup yourdomain.com
Use the service name (not localhost
) as the hostname in your env vars:
DATABASE_URL=postgresql://user:pass@localhost:5432/mydb
DATABASE_URL=postgresql://user:pass@my-app-db:5432/mydb
Verify services are on the same Docker network:
docker network inspect dokploy-network
sudo setsebool -P httpd_can_network_connect 1
sudo ausearch -m avc -ts recent
sudo systemctl enable docker
sudo systemctl status docker
| Task | Command |
|---|---|
| View all Dokploy services | docker service ls |
| View running containers | docker ps |
| Check Dokploy panel logs | docker logs $(docker ps -q -f name=dokploy_dokploy) |
| Update Dokploy | `curl -sSL |
sudo firewall-cmd --permanent --add-port=PORT/tcp && sudo firewall-cmd --reload
sudo firewall-cmd --list-ports
sudo setsebool -P httpd_can_network_connect 1
docker service update --force SERVICE_NAME
| Area | Ubuntu | AlmaLinux |
|---|---|---|
| Docker installation | Auto-handled by Dokploy installer | |
| Must be done manually first (Step 3) | ||
| Docker repo | download.docker.com/linux/ubuntu |
|
download.docker.com/linux/centos |
||
| Package manager | apt |
|
dnf |
||
| Firewall tool | ufw |
|
firewall-cmd (firewalld) |
||
| Firewall persistence | ufw enable |
|
Built-in with --permanent flag |
||
| SELinux | Not active by default | Active β need setsebool -P httpd_can_network_connect 1 |
| Service boot enable | Usually automatic | Must run systemctl enable manually |
| EPEL repo | Not needed | Required (dnf install epel-release ) |