Monitor Your Server Like a Pro: Beszel & Uptime Kuma Setup on Dokploy
Complete guide to setting up Beszel for resource monitoring (CPU, memory, disk, Docker) and Uptime Kuma for uptime checks on Dokploy with SMTP alerts.
Table of Contents
- Understanding Key Monitoring Metrics
- Why Beszel and Uptime Kuma?
- Prerequisites
- Part 1: Deploying Beszel (The Resource Monitoring Hub)
- Part 2: Installing the Beszel Agent
- Part 3: Setting Up Uptime Kuma
- Part 4: Configuring SMTP Alerts with Brevo
- Part 5: Testing Your Monitoring Stack
- Advanced Configuration
- Best Practices
- Conclusion
- Frequently Asked Questions
Join BitBuddies
Level up your DevOps skills with hands-on courses on CloudPanel and Dockploy. Join our community of developers and get expert workshops to accelerate your online journey.
Start your journey to DevOps mastery today! 🚀
Monitoring your self-hosted infrastructure is non-negotiable. Whether you’re running a simple VPS or a cluster of servers, knowing when a service goes down or when a disk is full is critical. You need visibility into what’s happening inside your servers (resources) AND confirmation that services are accessible from the outside (uptime).
Server monitoring is the systematic process of observing, tracking, and analyzing server performance metrics in real-time. It’s crucial for maintaining system reliability and preventing potential issues before they impact services. Modern server monitoring encompasses:
- Resource utilization: CPU, memory, disk, network
- Application performance: Response times, error rates
- Service availability: Uptime checks, health endpoints
- Container health: Docker container stats and performance
In this guide, we’ll walk through setting up a complete monitoring stack using Dokploy. We’ll deploy Beszel for internal resource monitoring (CPU, memory, disk, Docker stats) and Uptime Kuma for external uptime checks (HTTP/DNS), ensuring you’re covered from all angles.
More Monitoring Options
For a broader look at monitoring options like Netdata or Prometheus + Grafana, check out our comprehensive guide on Server Monitoring Tools.
Understanding Key Monitoring Metrics
Before setting up monitoring tools, it’s essential to understand what metrics matter most:
Essential Server Metrics
| Metric Category | What to Monitor | Why It Matters |
|---|---|---|
| CPU | Load average (1, 5, 15 min), per-core usage, system/user time | Identifies processing bottlenecks |
| Memory | Available RAM, swap usage, buffer/cache utilization | Prevents out-of-memory crashes |
| Disk | Space usage, inode utilization, I/O wait times | Avoids disk-full failures |
| Network | Bandwidth, packet loss, latency, connection states | Detects network issues early |
Monitoring Priorities by Environment
Different environments require different monitoring focus:
| Metric Type | Traditional Server | Container Environment | Cloud Infrastructure |
|---|---|---|---|
| CPU | Overall usage | Per container usage | Instance utilization |
| Memory | Physical/Swap | Container limits | Instance limits |
| Storage | Partition usage | Volume usage | Block storage |
| Network | Interface stats | Container networks | VPC metrics |
Why Beszel and Uptime Kuma?
Before diving in, let’s understand what each tool brings to the table:
| Tool | Purpose | What It Monitors |
|---|---|---|
| Beszel | Internal resource monitoring | CPU, memory, disk, network, Docker containers |
| Uptime Kuma | External availability checks | HTTP/HTTPS endpoints, DNS, TCP ports, SSL certificates |
Beszel - The Lightweight Monitoring Hub
Beszel is a modern, lightweight monitoring solution that doesn’t eat up your server’s resources. Unlike heavyweight solutions like Prometheus + Grafana, Beszel uses a single binary agent and provides:
- Real-time server metrics monitoring
- Historical data with graphs
- Docker container statistics
- Custom notification channels (email, webhooks)
- Public key authentication for secure agent communication
- Multi-server support from a single hub
- Very low resource footprint
Here’s what the Beszel interface looks like in action:
Beszel provides detailed historical graphs for all your metrics:
Beszel Feature Overview:
| Feature | Description | Benefit |
|---|---|---|
| Lightweight | Minimal resource usage (~10-20MB RAM per agent) | Ideal for small servers |
| Docker Integration | Native container monitoring | Easy container tracking |
| Public Key Auth | Secure agent communication via SSH keys | Enhanced security |
| Multi-server Support | Monitor multiple servers from one hub | Centralized monitoring |
| Historical Data | Stores metrics with graphs over time | Trend analysis |
Uptime Kuma - The Gold Standard for Uptime Monitoring
Uptime Kuma is the go-to self-hosted uptime monitoring solution. It checks if your websites and services are actually accessible from the outside world and sends notifications if they aren’t.
- HTTP/HTTPS endpoint monitoring
- DNS, TCP, Ping, and Docker container checks
- SSL certificate expiration monitoring
- Beautiful status pages you can share
- 90+ notification integrations
- Maintenance windows
- Multi-language support
Why Use Both Together?
The key insight is that internal health ≠ external availability:
- Your server could show 10% CPU usage, but your website might be down due to a misconfigured nginx
- A container might be “running” but returning 502 errors
- Your disk might be 95% full, but Uptime Kuma won’t know until the app crashes
Beszel tells you what’s happening inside. Uptime Kuma tells you what users experience.
How This Stack Compares to Other Solutions
| Feature | Beszel + Uptime Kuma | Prometheus/Grafana | Netdata |
|---|---|---|---|
| Scalability | Small-Medium | Enterprise-grade | Medium |
| Setup Complexity | Low | High | Low |
| Customization | Basic-Moderate | Extensive | Moderate |
| Resource Usage | Very Low (~200MB total) | Moderate-High | Low |
| Learning Curve | Gentle | Steep | Moderate |
| Uptime Monitoring | Built-in (Kuma) | Requires additional setup | Limited |
| Status Pages | Yes (Kuma) | Manual setup needed | No |
The Importance of Proactive Notifications
A well-configured alerting system should:
-
Provide Early Warning
- Detect potential issues before they become critical
- Monitor trend changes that might indicate future problems
- Alert on unusual patterns or anomalies
-
Enable Quick Response
- Deliver notifications through multiple channels (email, SMS, Slack)
- Include relevant diagnostic information
- Provide clear action items
-
Prevent Alert Fatigue
- Use intelligent thresholds
- Implement alert correlation
- Configure proper alert priorities
Prerequisites
Before starting, ensure you have:
- A VPS or Server: Minimum 2GB RAM recommended (1GB works for small deployments)
- Dokploy Installed: Follow our Dokploy Installation Guide if you haven’t already
- A Domain Name: For accessing your monitoring dashboards (e.g.,
monitor.yourdomain.com,status.yourdomain.com) - Email Service (Optional): For alert notifications (we’ll use Brevo/Sendinblue which offers 300 free emails/day)
Part 1: Deploying Beszel (The Resource Monitoring Hub)
Beszel consists of two components:
- The Hub: The main dashboard where you view all metrics
- The Agent: Installed on every server you want to monitor
Step 1: Create the Beszel Service in Dokploy
- Go to your Dokploy dashboard and navigate to your project
- Click Create Service → Template
- Search for Beszel and select it
- Choose the server you want to deploy the Hub on
- Select the latest version tag (e.g.,
0.9.1orlatest)
Deployment Tip
For redundancy, consider deploying the Hub on a separate node from your main production apps. If your production server goes down, you’ll still receive alerts.
Step 2: Configure the Domain
- In Dokploy, go to the Domains tab for your new Beszel service
- Add your domain (e.g.,
monitor.yourdomain.com) - Set the port to 8090 (Beszel’s default UI port)
- Enable HTTPS (Let’s Encrypt)
- Click Create
If using Cloudflare:
- Create an A Record pointing
monitorto your server IP - Set SSL/TLS mode to Full (not Flexible)
Step 3: Set Essential Environment Variables
To ensure email alerts contain the correct links (instead of localhost), you must set the application URL.
- Go to the Environment tab in Dokploy
- Add the following variable:
APP_URL=https://monitor.yourdomain.com
- Click Save and Redeploy
Step 4: Initial Beszel Setup
- Visit your new URL (
https://monitor.yourdomain.com) - Create your admin account with a strong password
- You’ll land on the main dashboard (empty for now)
Best Practices for Beszel Deployment:
- Use secure networking between server and agents
- Implement proper backup for Beszel data
- Regular updates of both server and agent containers
- Monitor agent connectivity from the Hub
Part 2: Installing the Beszel Agent
Now that the Hub is running, we need to install the Agent on every server we want to monitor.
Step 1: Get the Agent Configuration from the Hub
- In the Beszel Hub, click Add System
- Name your system (e.g.,
main-dokploy-nodeorproduction-1) - Copy the Docker Compose snippet provided - it contains your unique public KEY for authentication
The snippet will look something like this:
services:
beszel-agent:
image: henrygd/beszel-agent
container_name: beszel-agent
restart: unless-stopped
network_mode: host
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
environment:
PORT: 45876
KEY: 'ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIHiPxG...'
Step 2: Deploy the Agent via Dokploy
- Go back to Dokploy on the server you want to monitor
- Create a new Compose service (not a template)
- Name it
beszel-agent - Paste the Docker Compose configuration you copied from the Hub
- Click Deploy
Important
Ensure the port mapping matches what the Hub expects. The default is 45876. If you change it, update it in both the agent and the Hub.
Step 3: Verify the Connection
Once deployed:
- The icon in your Beszel Hub should turn green
- You’ll start seeing real-time CPU, Memory, Disk, and Docker container stats
- Historical graphs will begin populating
What Metrics You’ll See:
| Metric | Description | Alert Threshold Suggestion |
|---|---|---|
| CPU Load | 1, 5, 15 minute load averages | > 90% for 5 minutes |
| Memory | Used, available, cached, swap | > 85% used |
| Disk | Usage per mount point, I/O stats | > 85% capacity |
| Network | Bandwidth in/out, packet stats | Unusual spikes |
| Docker | Per-container CPU, memory, network | Container-specific |
Monitoring Additional Servers
Repeat the agent installation process for each server you want to monitor:
- In the Hub, click Add System for each new server
- Give it a unique name
- Copy the Docker Compose snippet (each will have a unique KEY)
- Deploy the agent on that server
Part 3: Setting Up Uptime Kuma
While Beszel watches internal resources, Uptime Kuma watches external availability.
Step 1: Deploy via Dokploy Template
- In Dokploy, create a new service from Template
- Search for Uptime Kuma and select it
- Check the image tag - change to the latest stable version if needed (e.g.,
1or specific version like1.23.15) - Click Deploy
Step 2: Configure the Domain
- Go to the Domains tab
- Set up a domain (e.g.,
status.yourdomain.com) - The internal port should be 3001
- Enable HTTPS
- Click Create
Volume Persistence
Dokploy handles the volume creation automatically to persist your monitoring data across container restarts.
Step 3: Initial Uptime Kuma Setup
- Visit your new URL (
https://status.yourdomain.com) - Create your admin account
- You’ll see an empty dashboard ready for monitors
Step 4: Add Your First Monitor
- Click Add New Monitor
- Choose monitor type: HTTP(s) for websites
- Enter the URL you want to monitor
- Set the heartbeat interval (e.g., 60 seconds)
- Click Save
Recommended monitors to set up:
| Monitor Type | Use Case | Example |
|---|---|---|
| HTTP(s) | Website availability | https://yourdomain.com |
| HTTP(s) - Keyword | Content verification | Check for “Welcome” text |
| TCP Port | Database connectivity | PostgreSQL on port 5432 |
| DNS | DNS resolution | Check A record for domain |
| Docker Container | Container health | Monitor specific container |
Part 4: Configuring SMTP Alerts with Brevo
Monitoring is useless if you don’t get notified when things break. Here’s how to set up email alerts using Brevo (formerly Sendinblue), which offers 300 free emails per day.
Step 1: Get SMTP Details from Brevo
- Create a free Brevo account if you don’t have one
- Go to Settings → SMTP & API
- Generate a new SMTP Key
- Note down your credentials:
| Setting | Value |
|---|---|
| Server | smtp-relay.brevo.com |
| Port | 587 |
| Login | Your Brevo email |
| Password | The SMTP Key you generated |
Sender Authentication
Ensure your sender address (e.g., [email protected]) is authenticated in Brevo. Go to Settings → Senders & IP → Senders and add/verify your domain.
Step 2: Configure Beszel Alerts
- In Beszel, go to Settings → SMTP (or General settings depending on version)
- Enter the SMTP details:
- Host:
smtp-relay.brevo.com - Port:
587 - Username: Your Brevo email
- Password: Your SMTP Key
- Sender Address:
[email protected]
- Host:
- Save the settings
Set up alert thresholds:
- Go to Systems → click your server → Alerts
- Enable alerts for specific thresholds:
| Metric | Recommended Threshold |
|---|---|
| CPU Usage | > 90% for 5 minutes |
| Memory Usage | > 85% |
| Disk Usage | > 85% |
| System Status | Down |
Step 3: Configure Uptime Kuma Alerts
- In Uptime Kuma, go to Settings → Notifications
- Click Setup Notification
- Choose Email (SMTP)
- Fill in the same Brevo details:
- Hostname:
smtp-relay.brevo.com - Port:
587 - Security: STARTTLS
- Username: Your Brevo email
- Password: Your SMTP Key
- From Email:
[email protected] - To Email: Your notification email
- Hostname:
- Click Test to verify it works
- Save the notification
Attach notifications to monitors:
When creating or editing a monitor, scroll down to Notifications and select your email notification to receive alerts for that specific monitor.
Part 5: Testing Your Monitoring Stack
Always verify everything works before assuming you’re covered.
Test Beszel Alerts
- SSH into your monitored server
- Stop the Beszel Agent container:
docker stop beszel-agent - Wait 1-2 minutes
- You should receive an email saying “System is Down”
- Restart the agent:
docker start beszel-agent - You should receive a “System is Up” email
Test Uptime Kuma Alerts
- Stop one of your monitored web applications:
docker stop your-web-app - Uptime Kuma should detect the error (502/Timeout) within your heartbeat interval
- You should receive a notification email
- Restart your app and verify you get an “Up” notification
Advanced Configuration
Creating Status Pages with Uptime Kuma
Uptime Kuma can generate public status pages to share with your users:
- Go to Status Pages in the menu
- Click New Status Page
- Give it a name and slug (e.g.,
status) - Add monitors to display
- Customize the look and feel
- Share the public URL with users
Monitoring Docker Containers Directly
Uptime Kuma can monitor Docker containers without going through HTTP:
- Create a new monitor with type Docker Container
- Enter the container name or ID
- The monitor checks if the container is running (not just the port)
Docker Socket Access
For Docker container monitoring in Uptime Kuma, you need to mount the Docker socket. The Dokploy template should handle this, but verify the volume mount exists:
volumes:
- /var/run/docker.sock:/var/run/docker.sock Monitoring Multiple Servers
For a multi-server setup:
- Deploy one Beszel Hub (central dashboard)
- Deploy Beszel Agents on each server (using unique keys)
- Deploy one Uptime Kuma instance (can monitor all external endpoints)
- Configure alerts to go to the same email/Slack/Discord channel
Best Practices
- Set meaningful alert thresholds: Avoid alert fatigue by not alerting on every 80% CPU spike
- Use multiple notification channels: Email + Slack/Discord for critical alerts
- Monitor your monitoring: Set up an external service (like UptimeRobot free tier) to monitor your Uptime Kuma instance
- Regular testing: Test your alerts monthly to ensure they still work
- Document your setup: Keep notes on what each monitor checks and why
- Backup configurations: Export your Uptime Kuma configuration periodically
Recommended Alert Thresholds
Based on real-world experience, here are suggested thresholds for common metrics:
| Metric | Warning Level | Critical Level | Notes |
|---|---|---|---|
| CPU Usage | 70% for 5 min | 90% for 5 min | Sustained high CPU indicates bottleneck |
| Memory Usage | 75% | 85% | Leave headroom for spikes |
| Disk Usage | 80% | 90% | Plan expansion before hitting critical |
| Disk I/O Wait | 20% | 40% | High I/O wait slows everything |
| Network Errors | Any increase | Sustained errors | Usually indicates hardware issues |
| Container Restarts | 2 in 10 min | 5 in 10 min | Crash loops need investigation |
When to Scale Up Your Monitoring
Consider moving to more robust solutions when:
- Small deployments (1-5 servers): Beszel + Uptime Kuma is perfect
- Medium deployments (5-20 servers): Consider adding Netdata for deeper insights
- Large deployments (20+ servers): Evaluate Prometheus/Grafana for enterprise features
Conclusion
By combining Beszel for internal resource metrics and Uptime Kuma for external uptime checks, you now have a robust, self-hosted monitoring stack running entirely on Dokploy. This setup is:
- Lightweight: Minimal resource usage compared to Prometheus/Grafana
- Cost-effective: Completely free to self-host
- Comprehensive: Covers both internal health and external availability
- Alert-ready: You’ll be the first to know when something breaks
Your monitoring stack now provides visibility into:
- Server resources (CPU, memory, disk, network)
- Docker container health and statistics
- Website and API availability
- SSL certificate expiration
- And much more
Choosing the Right Tool for Your Needs
| Your Situation | Recommended Approach |
|---|---|
| Beginner with 1-2 servers | Start with this Beszel + Uptime Kuma stack |
| Need log monitoring too | Add Dozzle for Docker logs |
| Want cloud-managed option | Consider Netdata Cloud (free for 5 nodes) |
| Enterprise with complex needs | Prometheus + Grafana stack |
Summary of Best Practices:
- Start with basic monitoring and expand as needed
- Implement proper alerting with meaningful thresholds
- Regular backup of monitoring data
- Keep monitoring tools updated
- Document monitoring setup and procedures
For more advanced monitoring scenarios or to explore other tools like Netdata or Prometheus, check out our comprehensive Server Monitoring Guide.
Beszel on GitHub Uptime Kuma on GitHubFrequently Asked Questions
Beszel monitors internal server resources - CPU usage, memory consumption, disk space, network bandwidth, and Docker container stats. It tells you what’s happening inside your server.
Uptime Kuma monitors external availability - whether your websites are accessible, APIs are responding, and services are reachable from outside. It tells you what users experience.
You need both because a server can have healthy internal metrics but still serve errors to users (misconfig, full queue, etc.), and vice versa.
Both tools are designed to be lightweight:
- Beszel Hub: ~50-100MB RAM
- Beszel Agent: ~10-20MB RAM per monitored server
- Uptime Kuma: ~100-200MB RAM depending on number of monitors
Combined, you’re looking at under 500MB RAM for a complete monitoring stack, which is significantly less than Prometheus + Grafana.
Absolutely! Both tools support multiple notification channels:
Beszel supports:
- Email (SMTP)
- Webhooks (for Slack, Discord, etc.)
- Custom integrations
Uptime Kuma has 90+ integrations including:
- Slack, Discord, Microsoft Teams
- Telegram, Pushover, Gotify
- PagerDuty, Opsgenie
- SMS services
- Custom webhooks
Yes! The Beszel Agent is just a Docker container (or binary) that can run anywhere. You can:
- Install it via Docker on any Linux server
- Run the binary directly without Docker
- Deploy it on Kubernetes
As long as the agent can reach the Hub over the network (port 45876 by default), it will work.
Yes, Uptime Kuma has built-in status page functionality:
- Go to Status Pages in the menu
- Create a new status page with your monitors
- Customize the appearance
- Share the public URL with your users
You can have multiple status pages for different audiences (internal team vs. public users).
For Dokploy deployments, the data is stored in Docker volumes:
- Beszel: Data in
/beszel_datainside the container - Uptime Kuma: Data in the Kuma data volume
To backup:
- Use Dokploy’s backup features if available
- Or manually backup the Docker volumes:
docker run --rm -v uptime-kuma_data:/data -v $(pwd):/backup alpine tar cvf /backup/kuma-backup.tar /dataFor Beszel, export system configurations from the UI when possible.
Based on production experience, here are suggested thresholds:
- CPU: Alert at 90% sustained for 5+ minutes
- Memory: Alert at 85% usage
- Disk: Warning at 80%, critical at 90%
- System Status: Immediate alert when down
These can be adjusted based on your workload patterns. Some applications have natural CPU spikes that shouldn’t trigger alerts.
Yes! Beszel supports monitoring additional disks by mounting folders in the /extra-filesystems directory. In your agent’s Docker Compose, add:
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- /mnt/disk/.beszel:/extra-filesystems/sda1:roThis allows you to monitor external drives, NAS mounts, or additional partitions beyond the root filesystem.
Each tool has its strengths:
- Beszel: Lightest weight (~20MB RAM), perfect for small deployments, simple setup
- Netdata: More metrics out of the box, ML anomaly detection, cloud option for 5 free nodes
- Prometheus/Grafana: Most customizable, enterprise-grade, but steeper learning curve and higher resource usage
For most self-hosted scenarios with 1-10 servers, Beszel + Uptime Kuma provides the best balance of features and resource efficiency.
Related Posts
Multiple PostgreSQL Databases in ONE Service: THE Docker Compose WAY!
Master multiple PostgreSQL databases effortlessly! Discover how Docker Compose simplifies your setup. Don't miss out – transform your workflow NOW!
Best 100+ Docker Containers for Home Server
Check out this list with 100+ docker containers that you can use on your home server.
Top 50+ Docker Commands You MUST Know
Master Docker with our comprehensive guide to 50+ essential commands. From basic operations to advanced container management, this resource covers everything DevOps professionals and Docker enthusiasts need to know.