# Dokploy Setup Guide

> Source: <https://dev.to/codexam/dokploy-setup-guide-n8n>
> Published: 2026-06-25 08:21:46+00:00

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**

```
# SSH (important — don't lock yourself out)
sudo ufw allow 22/tcp

# HTTP
sudo ufw allow 80/tcp

# HTTPS
sudo ufw allow 443/tcp

# Dokploy Web UI
sudo ufw allow 3000/tcp

# Enable the firewall
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 network`dokploy-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 —NOT`localhost`

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):

```
# Caching (DB 0)
CACHE_URL=redis://:RedisPass@2025@my-app-cache:6379/0

# Sessions (DB 1)
SESSION_URL=redis://:RedisPass@2025@my-app-cache:6379/1

# Job Queues (DB 2)
QUEUE_URL=redis://:RedisPass@2025@my-app-cache:6379/2
```

To manage Redis from your local [RedisInsight](https://redis.com/redis-enterprise/redis-insight/):

`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`

```
# View all Dokploy platform services
docker service ls

# View all running containers
docker ps

# Check Dokploy panel logs
docker logs $(docker ps -q -f name=dokploy_dokploy)

# Check Traefik logs (for SSL/routing issues)
docker logs $(docker ps -q -f name=dokploy_dokploy-traefik)

# Restart the Dokploy panel
docker service update --force dokploy_dokploy

# Check system resources
docker stats
df -h
free -h
curl -sSL https://dokploy.com/install.sh | sh -s update
# Check firewall rules
sudo ufw status

# Open port if missing
sudo ufw allow 3000/tcp

# Verify Dokploy is running
docker service ls
docker ps | grep dokploy
# Check Traefik logs for ACME errors
docker logs $(docker ps -q -f name=dokploy_dokploy-traefik) 2>&1 | tail -50

# Ensure ports 80 and 443 are open
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

# Verify DNS resolves correctly
nslookup yourdomain.com
```

Use the **service name** (not `localhost`

) as the hostname:

```
# WRONG
DATABASE_URL=postgresql://user:pass@localhost:5432/mydb

# CORRECT
DATABASE_URL=postgresql://user:pass@my-app-db:5432/mydb
```

Verify all services are on the same network:

```
docker network inspect dokploy-network
# Make sure Docker starts on boot
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 with`Unsupported 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— not`ufw`

or raw`iptables`

. All firewall management is done with`firewall-cmd`

.

✅ 1. **Check Firewall Status**

```
sudo firewall-cmd --state
```

✅ 2. **Open Required Ports**

```
# SSH (ensure you don't lose access)
sudo firewall-cmd --permanent --add-port=22/tcp

# HTTP
sudo firewall-cmd --permanent --add-port=80/tcp

# HTTPS
sudo firewall-cmd --permanent --add-port=443/tcp

# Dokploy Web UI
sudo firewall-cmd --permanent --add-port=3000/tcp

# Apply all changes
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's`ufw`

, AlmaLinux uses firewalld. The`--permanent`

flag makes rules survive reboots automatically — no extra package like`netfilter-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 —NOT`localhost`

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):

```
# Caching (DB 0)
CACHE_URL=redis://:RedisPass@2025@my-app-cache:6379/0

# Sessions (DB 1)
SESSION_URL=redis://:RedisPass@2025@my-app-cache:6379/1

# Job Queues (DB 2)
QUEUE_URL=redis://:RedisPass@2025@my-app-cache:6379/2
```

To manage Redis from your local [RedisInsight](https://redis.com/redis-enterprise/redis-insight/):

`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`

```
# View all Dokploy platform services
docker service ls

# View all running containers
docker ps

# Check Dokploy panel logs
docker logs $(docker ps -q -f name=dokploy_dokploy)

# Check Traefik logs (for SSL/routing issues)
docker logs $(docker ps -q -f name=dokploy_dokploy-traefik)

# Restart the Dokploy panel
docker service update --force dokploy_dokploy

# Check system resources
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

# Then re-run Dokploy installer with your IP
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
# Check open ports
sudo firewall-cmd --list-ports

# Add port if missing
sudo firewall-cmd --permanent --add-port=3000/tcp
sudo firewall-cmd --reload

# Verify Dokploy is actually running
docker service ls
docker ps | grep dokploy
# Check Traefik logs for ACME/Let's Encrypt errors
docker logs $(docker ps -q -f name=dokploy_dokploy-traefik) 2>&1 | tail -50

# Ensure HTTP and HTTPS ports are open
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload

# Verify domain points to your server
nslookup yourdomain.com
```

Use the **service name** (not `localhost`

) as the hostname in your env vars:

```
# WRONG
DATABASE_URL=postgresql://user:pass@localhost:5432/mydb

# CORRECT (use your Dokploy service name)
DATABASE_URL=postgresql://user:pass@my-app-db:5432/mydb
```

Verify services are on the same Docker network:

```
docker network inspect dokploy-network
# Allow proxy network connections
sudo setsebool -P httpd_can_network_connect 1

# Check recent SELinux denials
sudo ausearch -m avc -ts recent
# Ensure Docker starts on boot (required on AlmaLinux)
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` ) |
