cd /news/developer-tools/dokploy-setup-guide Β· home β€Ί topics β€Ί developer-tools β€Ί article
[ARTICLE Β· art-39018] src=dev.to β†— pub= topic=developer-tools verified=true sentiment=Β· neutral

Dokploy Setup Guide

Dokploy is a free, self-hosted PaaS that bundles Docker Swarm, Traefik, PostgreSQL, and Redis into a single web dashboard, allowing users to deploy apps, manage databases, and handle domains without manual Docker configuration. The setup guide walks through provisioning a VPS with at least 2 GB RAM and 2 vCPU, connecting via SSH, updating the OS, installing Docker, and configuring the firewall to open ports 22, 80, 443, and 3000.

read16 min views1 publishedJun 25, 2026

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 )
── more in #developer-tools 4 stories Β· sorted by recency
── more on @dokploy 3 stories trending now
sponsored brought to you by zahid.host 4,200+ EU-deployed projects
reading about agents? ship yours in a single git push.

Run your AI side-project on zahid.host

EU-based hosting, git-push deploys, automatic HTTPS, no cold starts. Free tier with a custom domain β€” perfect for shipping the agent you just read about.

$git push zahid main
β†’ Live at https://your-agent.zahid.host βœ“
Get free account β†’ Pricing
from €0/mo Β· no card required
LIVE [news/dokploy-setup-guide] indexed:0 read:16min 2026-06-25 Β· β€”