$ ssh root@YOUR_PUBLIC_IP
ssh root@YOUR_PUBLIC_IP
ssh root@YOUR_PUBLIC_IP
-weight: 500;">apt -weight: 500;">update && -weight: 500;">apt -weight: 500;">upgrade -y
-weight: 500;">apt -weight: 500;">install -y -weight: 500;">curl -weight: 500;">wget -weight: 500;">git ufw ca-certificates gnupg lsb-release
-weight: 500;">apt -weight: 500;">update && -weight: 500;">apt -weight: 500;">upgrade -y
-weight: 500;">apt -weight: 500;">install -y -weight: 500;">curl -weight: 500;">wget -weight: 500;">git ufw ca-certificates gnupg lsb-release
-weight: 500;">apt -weight: 500;">update && -weight: 500;">apt -weight: 500;">upgrade -y
-weight: 500;">apt -weight: 500;">install -y -weight: 500;">curl -weight: 500;">wget -weight: 500;">git ufw ca-certificates gnupg lsb-release
adduser deploy
usermod -aG -weight: 600;">sudo deploy
rsync --archive --chown=deploy:deploy ~/.ssh /home/deploy
adduser deploy
usermod -aG -weight: 600;">sudo deploy
rsync --archive --chown=deploy:deploy ~/.ssh /home/deploy
adduser deploy
usermod -aG -weight: 600;">sudo deploy
rsync --archive --chown=deploy:deploy ~/.ssh /home/deploy
ssh deploy@YOUR_PUBLIC_IP
ssh deploy@YOUR_PUBLIC_IP
ssh deploy@YOUR_PUBLIC_IP
# Allow SSH first to avoid locking ourselves out
-weight: 600;">sudo ufw allow OpenSSH # Open ports needed for Dokploy and applications
-weight: 600;">sudo ufw allow 80/tcp # HTTP for Traefik
-weight: 600;">sudo ufw allow 443/tcp # HTTPS for Traefik
-weight: 600;">sudo ufw allow 443/udp # HTTPS UDP for Traefik
-weight: 600;">sudo ufw allow 3000/tcp # Dokploy panel (temporary only) # Enable firewall
-weight: 600;">sudo ufw -weight: 500;">enable
-weight: 600;">sudo ufw -weight: 500;">status numbered
# Allow SSH first to avoid locking ourselves out
-weight: 600;">sudo ufw allow OpenSSH # Open ports needed for Dokploy and applications
-weight: 600;">sudo ufw allow 80/tcp # HTTP for Traefik
-weight: 600;">sudo ufw allow 443/tcp # HTTPS for Traefik
-weight: 600;">sudo ufw allow 443/udp # HTTPS UDP for Traefik
-weight: 600;">sudo ufw allow 3000/tcp # Dokploy panel (temporary only) # Enable firewall
-weight: 600;">sudo ufw -weight: 500;">enable
-weight: 600;">sudo ufw -weight: 500;">status numbered
# Allow SSH first to avoid locking ourselves out
-weight: 600;">sudo ufw allow OpenSSH # Open ports needed for Dokploy and applications
-weight: 600;">sudo ufw allow 80/tcp # HTTP for Traefik
-weight: 600;">sudo ufw allow 443/tcp # HTTPS for Traefik
-weight: 600;">sudo ufw allow 443/udp # HTTPS UDP for Traefik
-weight: 600;">sudo ufw allow 3000/tcp # Dokploy panel (temporary only) # Enable firewall
-weight: 600;">sudo ufw -weight: 500;">enable
-weight: 600;">sudo ufw -weight: 500;">status numbered
-weight: 500;">curl -sSL https://dokploy.com/-weight: 500;">install.sh | -weight: 600;">sudo sh
-weight: 500;">curl -sSL https://dokploy.com/-weight: 500;">install.sh | -weight: 600;">sudo sh
-weight: 500;">curl -sSL https://dokploy.com/-weight: 500;">install.sh | -weight: 600;">sudo sh
# View Docker Swarm services
-weight: 500;">docker -weight: 500;">service ls # View running containers
-weight: 500;">docker ps # Verify ports are listening
ss -lntup | grep -E '(:80|:443|:3000)'
# View Docker Swarm services
-weight: 500;">docker -weight: 500;">service ls # View running containers
-weight: 500;">docker ps # Verify ports are listening
ss -lntup | grep -E '(:80|:443|:3000)'
# View Docker Swarm services
-weight: 500;">docker -weight: 500;">service ls # View running containers
-weight: 500;">docker ps # Verify ports are listening
ss -lntup | grep -E '(:80|:443|:3000)'
http://YOUR_PUBLIC_IP:3000
http://YOUR_PUBLIC_IP:3000
http://YOUR_PUBLIC_IP:3000
{ "name": "hello-world-dokploy", "version": "1.0.0", "description": "Hello World application for Dokploy", "main": "app.js", "scripts": { "-weight: 500;">start": "node app.js" }, "dependencies": { "express": "^4.18.2" }
}
{ "name": "hello-world-dokploy", "version": "1.0.0", "description": "Hello World application for Dokploy", "main": "app.js", "scripts": { "-weight: 500;">start": "node app.js" }, "dependencies": { "express": "^4.18.2" }
}
{ "name": "hello-world-dokploy", "version": "1.0.0", "description": "Hello World application for Dokploy", "main": "app.js", "scripts": { "-weight: 500;">start": "node app.js" }, "dependencies": { "express": "^4.18.2" }
}
const express = require('express');
const app = express();
const PORT = 3000; app.get('/', (req, res) => { res.json({ message: 'Hello World from Dokploy!', timestamp: new Date().toISOString(), environment: process.env.NODE_ENV });
}); app.get('/health', (req, res) => { res.-weight: 500;">status(200).send('OK');
}); app.listen(PORT, () => { console.log(`Server running on port ${PORT}`);
});
const express = require('express');
const app = express();
const PORT = 3000; app.get('/', (req, res) => { res.json({ message: 'Hello World from Dokploy!', timestamp: new Date().toISOString(), environment: process.env.NODE_ENV });
}); app.get('/health', (req, res) => { res.-weight: 500;">status(200).send('OK');
}); app.listen(PORT, () => { console.log(`Server running on port ${PORT}`);
});
const express = require('express');
const app = express();
const PORT = 3000; app.get('/', (req, res) => { res.json({ message: 'Hello World from Dokploy!', timestamp: new Date().toISOString(), environment: process.env.NODE_ENV });
}); app.get('/health', (req, res) => { res.-weight: 500;">status(200).send('OK');
}); app.listen(PORT, () => { console.log(`Server running on port ${PORT}`);
});
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN -weight: 500;">npm -weight: 500;">install --omit=dev
COPY . .
EXPOSE 3000
USER node
CMD ["node", "app.js"]
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN -weight: 500;">npm -weight: 500;">install --omit=dev
COPY . .
EXPOSE 3000
USER node
CMD ["node", "app.js"]
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN -weight: 500;">npm -weight: 500;">install --omit=dev
COPY . .
EXPOSE 3000
USER node
CMD ["node", "app.js"]
version: '3.8'
services: app: build: . environment: - NODE_ENV=staging -weight: 500;">restart: unless-stopped
version: '3.8'
services: app: build: . environment: - NODE_ENV=staging -weight: 500;">restart: unless-stopped
version: '3.8'
services: app: build: . environment: - NODE_ENV=staging -weight: 500;">restart: unless-stopped
https://tests-hello-world-puloud-d13d9c-167-172-as2dsaccc234-151.traefik.me/
https://tests-hello-world-puloud-d13d9c-167-172-as2dsaccc234-151.traefik.me/
https://tests-hello-world-puloud-d13d9c-167-172-as2dsaccc234-151.traefik.me/
# View Dokploy logs
-weight: 500;">docker -weight: 500;">service logs dokploy --tail 100 -f # View application logs
-weight: 500;">docker -weight: 500;">service logs hello-world_app --tail 100 -f # View -weight: 500;">service -weight: 500;">status
-weight: 500;">docker -weight: 500;">service ps hello-world_app
# View Dokploy logs
-weight: 500;">docker -weight: 500;">service logs dokploy --tail 100 -f # View application logs
-weight: 500;">docker -weight: 500;">service logs hello-world_app --tail 100 -f # View -weight: 500;">service -weight: 500;">status
-weight: 500;">docker -weight: 500;">service ps hello-world_app
# View Dokploy logs
-weight: 500;">docker -weight: 500;">service logs dokploy --tail 100 -f # View application logs
-weight: 500;">docker -weight: 500;">service logs hello-world_app --tail 100 -f # View -weight: 500;">service -weight: 500;">status
-weight: 500;">docker -weight: 500;">service ps hello-world_app - An Ubuntu 24.04 LTS server (minimum 2 GB RAM for testing)
- SSH access with configured keys
- A domain or subdomain (optional but recommended for HTTPS)
- Basic terminal and Docker knowledge - Choose a cloud or VPS provider that offers Ubuntu 24.04 LTS
- Select a plan with at least 2 GB of RAM for testing
- Configure SSH key access instead of password (more secure)
- Consider enabling backups and monitoring for production
- Note the public IP of your server - 22/TCP from your IP or trusted range (SSH)
- 80/TCP from Anywhere (HTTP)
- 443/TCP from Anywhere (HTTPS)
- 443/UDP from Anywhere (HTTPS UDP)
- 3000/TCP temporarily from your IP only (for initial setup) - Installs Docker if not present
- Initializes Docker Swarm
- Creates the overlay network dokploy-network
- Deploys Postgres, Redis, and Dokploy services
- Launches Traefik as reverse proxy
- Publishes the panel on port 3000 - In your DNS provider's panel (Cloudflare, DigitalOcean, AWS Route53, etc.), add your domain if you haven't already.
- Create DNS records: A record for @ pointing to your server IP A record for www pointing to your server IP
Or a subdomain like dokploy.yourdomain.com
- A record for @ pointing to your server IP
- A record for www pointing to your server IP
- Or a subdomain like dokploy.yourdomain.com - A record for @ pointing to your server IP
- A record for www pointing to your server IP
- Or a subdomain like dokploy.yourdomain.com - In your cloud provider's firewall, limit it to your IP only if you need administrative access - In the Dokploy panel, click Create Project
- Give your project a name (e.g., "Tests")
- In the project panel, click Create Service and select Application
- Name your application: Hello World
- Then access your application and in the bottom section Build Type select Dockerfile and then Save.
- In the top section you have Provider. For this test we'll select the Drop type, however for real cases the best option is through -weight: 500;">git repository.
- Once Drop is selected, drag to the Zip file area the zip with the code we specified in point 7.1.
- Click the Deploy button
- Once deployment is complete, it will show the Deployments tab where you should see a green dot and Done indicating the process was successful. You can click View to verify the process.
- Now, to deploy our Hello World, go to the Domains tab.
- For this test we'll use a free Traefik domain by clicking on the dice icon, specify that the Container Port is 3000 and -weight: 500;">enable HTTPS with Let's Encrypt provider.
- Then click the Create button
- When finished, it will give us a URL where we can enter and see our web. Important: since we're using a test domain it will give security warnings. For production environments use your own domain. - Configure regular server backups (if your provider offers this feature)
- Configure regular database backups
- Use -weight: 500;">docker volume for persistent data - Official Dokploy Documentation
- Dokploy Security Guide
- DigitalOcean Firewall Documentation
- Dokploy GitHub Repository
- Dokploy Discord Community