{"id":1885,"date":"2026-09-05T09:36:37","date_gmt":"2026-09-05T04:06:37","guid":{"rendered":"https:\/\/cpanelfree.com\/blog\/how-to-host-uptime-kuma-server-monitoring-docker-vps\/"},"modified":"2026-09-05T12:59:12","modified_gmt":"2026-09-05T07:29:12","slug":"how-to-host-uptime-kuma-server-monitoring-docker-vps","status":"publish","type":"post","link":"https:\/\/cpanelfree.com\/blog\/how-to-host-uptime-kuma-server-monitoring-docker-vps\/","title":{"rendered":"How to Self-Host Uptime Kuma Status Page &amp; Server Monitoring on Ubuntu VPS"},"content":{"rendered":"<h2>Why Relying on Paid Status Page Services Is Unnecessary<\/h2>\n<p>Maintaining high service availability requires continuous monitoring of your website endpoints, API gateways, database ports, and DNS resolvers. While commercial monitoring SaaS platforms (like Pingdom, Better Uptime, or Statuspage.io) charge $25 to $100+ monthly with strict monitor quantity limits, self-hosting your own monitoring portal gives you unlimited monitors, custom check intervals down to 20 seconds, and branded public status pages at zero recurring cost.<\/p>\n<p><strong>Uptime Kuma<\/strong> is the leading open-source self-hosted monitoring tool. Featuring an intuitive visual interface, Uptime Kuma monitors HTTP\/HTTPS endpoints, TCP ports, ping latency, DNS records, Docker container daemons, and Steam game servers. It includes native multi-channel alerting to over 90+ notification services (Discord, Telegram, Slack, Webhooks, SMS, Email) and publishes beautiful, mobile-friendly public status pages for your users.<\/p>\n<p>In this technical tutorial, we will configure Uptime Kuma on Ubuntu 24.04\/22.04 LTS with Docker Compose, secure the web portal behind an Nginx reverse proxy with SSL, configure multi-channel alerts, and publish a branded public status page.<\/p>\n<h2>Step 1: Installing Docker and Creating Project Directory<\/h2>\n<pre><code># Install Docker and prerequisite utilities\nsudo apt update &amp;&amp; sudo apt install -y curl nginx certbot python3-certbot-nginx\n\ncurl -fsSL https:\/\/get.docker.com | sudo sh\nsudo systemctl enable --now docker\n\n# Create dedicated directory for Uptime Kuma\nsudo mkdir -p \/var\/www\/uptime-kuma\nsudo chown -R $USER:$USER \/var\/www\/uptime-kuma\ncd \/var\/www\/uptime-kuma<\/code><\/pre>\n<h2>Step 2: Writing Production Docker Compose File<\/h2>\n<p>Create <code>\/var\/www\/uptime-kuma\/docker-compose.yml<\/code>:<\/p>\n<pre><code>services:\n  uptime-kuma:\n    image: louislam\/uptime-kuma:1\n    container_name: uptime_kuma\n    restart: always\n    ports:\n      - \"127.0.0.1:3001:3001\"\n    volumes:\n      - .\/data:\/app\/data\n    deploy:\n      resources:\n        limits:\n          memory: 256M\n\nvolumes:\n  kuma_data:<\/code><\/pre>\n<p>Launch the container in background daemon mode:<\/p>\n<pre><code>docker compose up -d\ndocker compose ps<\/code><\/pre>\n<h2>Step 3: Nginx Reverse Proxy with Real-Time WebSockets &amp; SSL<\/h2>\n<p>Uptime Kuma relies on WebSockets for live status updates. Create <code>\/etc\/nginx\/sites-available\/status.example.com<\/code>:<\/p>\n<pre><code>server {\n    listen 80;\n    server_name status.example.com;\n\n    location \/ {\n        proxy_pass http:\/\/127.0.0.1:3001;\n        proxy_http_version 1.1;\n        proxy_set_header Upgrade $http_upgrade;\n        proxy_set_header Connection \"upgrade\";\n        proxy_set_header Host $host;\n        proxy_set_header X-Real-IP $remote_addr;\n        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n        proxy_set_header X-Forwarded-Proto $scheme;\n    }\n}<\/code><\/pre>\n<p>Enable the site configuration and acquire a free Let&#8217;s Encrypt SSL certificate:<\/p>\n<pre><code>sudo ln -s \/etc\/nginx\/sites-available\/status.example.com \/etc\/nginx\/sites-enabled\/\nsudo nginx -t &amp;&amp; sudo systemctl reload nginx\nsudo certbot --nginx -d status.example.com<\/code><\/pre>\n<h2>Step 4: Configuring Multi-Channel Notifications (Discord \/ Telegram)<\/h2>\n<p>Navigate to <strong>Settings &gt; Notifications &gt; Setup Notification<\/strong> in your Uptime Kuma dashboard:<\/p>\n<ul>\n<li><strong>Telegram Bot:<\/strong> Enter Bot Token and Chat ID to receive instant alerts within 2 seconds of server downtime.<\/li>\n<li><strong>Discord Webhook:<\/strong> Paste your Discord server channel webhook URL for team operational awareness.<\/li>\n<li><strong>Custom Webhook:<\/strong> Send automated JSON payloads to internal automation pipelines or n8n workflows to trigger self-healing server restart scripts automatically.<\/li>\n<\/ul>\n<h2>Step 5: Publishing a Public Customer Status Page<\/h2>\n<p>Click <strong>Status Pages &gt; New Status Page<\/strong> to create a branded public dashboard at <code>https:\/\/status.example.com\/status\/main<\/code> with custom incident announcement banners, uptime percentage badges, and incident history.<\/p>\n<h2>Uptime Kuma Monitoring Protocol Capabilities<\/h2>\n<table style=\"width: 100%;border-collapse: collapse;margin: 20px 0;border: 1px solid #334155\">\n<thead>\n<tr style=\"background-color: #0f172a;color: #38bdf8\">\n<th style=\"padding: 12px;border: 1px solid #334155\">Monitor Protocol<\/th>\n<th style=\"padding: 12px;border: 1px solid #334155\">What It Verifies<\/th>\n<th style=\"padding: 12px;border: 1px solid #334155\">Ideal Use Case<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr style=\"background-color: #1e293b;color: #f8fafc\">\n<td style=\"padding: 10px;border: 1px solid #334155\"><strong>HTTP(s) Keyword Check<\/strong><\/td>\n<td style=\"padding: 10px;border: 1px solid #334155\">Status 200 + specific text string<\/td>\n<td style=\"padding: 10px;border: 1px solid #334155\">Detects database errors masked by 200 OK headers<\/td>\n<\/tr>\n<tr style=\"background-color: #0f172a;color: #f8fafc\">\n<td style=\"padding: 10px;border: 1px solid #334155\"><strong>TCP Port Probe<\/strong><\/td>\n<td style=\"padding: 10px;border: 1px solid #334155\">Socket connectivity on specific port<\/td>\n<td style=\"padding: 10px;border: 1px solid #334155\">MySQL (3306), Redis (6379), SSH (22)<\/td>\n<\/tr>\n<tr style=\"background-color: #1e293b;color: #f8fafc\">\n<td style=\"padding: 10px;border: 1px solid #334155\"><strong>DNS Record Resolver<\/strong><\/td>\n<td style=\"padding: 10px;border: 1px solid #334155\">Validates resolved IP addresses<\/td>\n<td style=\"padding: 10px;border: 1px solid #334155\">Detects DNS hijacking and nameserver outages<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2>Monitoring Internal Docker Containers via Docker Socket<\/h2>\n<p>Uptime Kuma can monitor internal Docker container health directly over the Unix socket (<code>\/var\/run\/docker.sock<\/code>), verifying if container daemons restart or exit unexpectedly without exposing internal ports:<\/p>\n<pre><code># Mount Docker socket in docker-compose.yml\nvolumes:\n  - .\/data:\/app\/data\n  - \/var\/run\/docker.sock:\/var\/run\/docker.sock:ro<\/code><\/pre>\n<p>In Uptime Kuma, select Monitor Type: <strong>Docker Container<\/strong>, and choose any running container from the auto-populated list!<\/p>\n<h2>Setting Up Custom Domain SSL Expiry Alerts<\/h2>\n<p>Never let an SSL certificate expire unnoticed. Uptime Kuma automatically monitors TLS handshake certificates across all configured HTTPS monitors and triggers warning notifications 14, 7, and 3 days before certificate expiration.<\/p>\n<h2>Uptime Kuma Routine Database Backups<\/h2>\n<p>Uptime Kuma stores monitor history and incident logs in an embedded SQLite database (<code>kuma.db<\/code>). Back up this file with a simple nightly cron job: <code>cp \/var\/www\/uptime-kuma\/data\/kuma.db \/var\/backups\/kuma_$(date +%F).db<\/code>.<\/p>\n<h2>Configuring Push Monitors for Cron Jobs &amp; Background Tasks<\/h2>\n<p>In addition to active polling monitors, Uptime Kuma supports <strong>Push (Heartbeat) Monitors<\/strong> for verifying that critical background cron jobs (such as nightly database backups or video transcoding queues) execute successfully. The cron script sends an HTTP GET heartbeat upon completion; if Uptime Kuma does not receive the ping within the expected time window, an alert triggers immediately:<\/p>\n<pre><code># Example: Nightly MySQL Backup with Uptime Kuma Heartbeat Ping\n#!\/bin\/bash\nset -e\n\/usr\/local\/bin\/backup-database.sh\n\n# Send successful heartbeat ping to Uptime Kuma push URL\ncurl -s -m 10 \"https:\/\/status.example.com\/api\/push\/kUmApUsHtOkEn123?status=up&amp;msg=OK&amp;ping=\"<\/code><\/pre>\n<h2>Customizing Status Page CSS &amp; Corporate Branding<\/h2>\n<p>Uptime Kuma allows injecting custom CSS rules into public status pages. Match your corporate design system with custom brand colors, glassmorphic cards, custom logo headers, and dark mode toggles directly from the Status Page settings panel.<\/p>\n<div style=\"background-color: #0f172a;border-left: 4px solid #38bdf8;padding: 18px 24px;margin: 30px 0;border-radius: 8px\">\n<h3 style=\"color: #38bdf8;margin-top: 0\">Recommended Related Technical Guides<\/h3>\n<ul style=\"margin-bottom: 0;color: #cbd5e1\">\n<li><a href=\"https:\/\/cpanelfree.com\/blog\/how-to-setup-grafana-prometheus-server-monitoring-vps\/\" style=\"color: #38bdf8;text-decoration: underline\">Setting Up Prometheus &amp; Grafana System Monitoring<\/a><\/li>\n<li><a href=\"https:\/\/cpanelfree.com\/blog\/how-to-host-n8n-workflow-automation-docker-vps\/\" style=\"color: #38bdf8;text-decoration: underline\">Triggering Automated Workflows with n8n Webhooks<\/a><\/li>\n<li><a href=\"https:\/\/cpanelfree.com\/blog\/how-to-run-docker-docker-compose-cheap-linux-vps\/\" style=\"color: #38bdf8;text-decoration: underline\">Running Containerized Monitoring on Budget Linux VPS<\/a><\/li>\n<\/ul>\n<\/div>\n<div style=\"background: linear-gradient(135deg, #0284c7 0%, #0369a1 100%);color: #ffffff;padding: 28px;border-radius: 12px;margin: 35px 0;text-align: center\">\n<h3 style=\"color: #ffffff;margin-top: 0;font-size: 22px\">Host 24\/7 Monitoring &amp; Status Pages on CpanelFree<\/h3>\n<p style=\"color: #e0f2fe;font-size: 15px;max-width: 650px;margin: 0 auto 18px auto\">Keep 100% uptime visibility over your infrastructure with pure NVMe cloud VPS servers and 100% free hosting options.<\/p>\n<p>  <a href=\"https:\/\/cpanelfree.com\/\" style=\"background-color: #ffffff;color: #0284c7;font-weight: 700;padding: 12px 28px;border-radius: 8px;text-decoration: none;display: inline-block\">Get Free Cloud Hosting Today &rarr;<\/a>\n<\/div>\n<div style=\"border-left: 4px solid #38bdf8;border-radius: 8px;padding: 20px;margin: 30px 0\">\n<h3 style=\"margin-top: 0;color: #38bdf8;font-size: 18px;display: flex;align-items: center\">\n        <span style=\"margin-right: 8px\">\ud83d\udd17<\/span> Recommended Related Technical Guides:<br \/>\n    <\/h3>\n<ul style=\"margin: 10px 0 0 0;padding-left: 20px;line-height: 1.8\">\n<li><a href=\"https:\/\/cpanelfree.com\/blog\/how-to-host-website-free-forever-guide\/\" style=\"color: #38bdf8;text-decoration: none;font-weight: 600\">How to Host a Website for Free Forever: Complete Beginner Guide (2026)<\/a><\/li>\n<li><a href=\"https:\/\/cpanelfree.com\/blog\/free-wordpress-hosting-softaculous-installer\/\" style=\"color: #38bdf8;text-decoration: none;font-weight: 600\">Top 5 Free WordPress Hosting Services with 1-Click Softaculous Installer<\/a><\/li>\n<li><a href=\"https:\/\/cpanelfree.com\/blog\/how-to-backup-linux-vps-to-cloud-storage-s3-rclone\/\" style=\"color: #38bdf8;text-decoration: none;font-weight: 600\">How to Automatically Backup Your Linux VPS to Cloud Storage (S3 \/ Rclone Guide)<\/a><\/li>\n<li><a href=\"https:\/\/cpanelfree.com\/blog\/is-free-web-hosting-safe-security-checks\/\" style=\"color: #38bdf8;text-decoration: none;font-weight: 600\">Is Free Web Hosting Safe? 5 Critical Security Checks Before Signing Up<\/a><\/li>\n<li><a href=\"https:\/\/cpanelfree.com\/#plans\" style=\"color: #10b981;text-decoration: none;font-weight: 600\">Explore $0 Free cPanel Web Hosting Plans (NVMe SSD, AutoSSL)<\/a><\/li>\n<\/ul>\n<\/div>\n<div style=\"background: linear-gradient(135deg, rgba(6, 182, 212, 0.15) 0%, rgba(59, 130, 246, 0.15) 100%);border-radius: 12px;padding: 25px;margin: 30px 0;text-align: center\">\n<h3 style=\"color: #38bdf8;margin-top: 0;font-size: 20px\">Deploy Fast, Reliable Web Hosting on CpanelFree<\/h3>\n<p style=\"color: #94a3b8;font-size: 14px;line-height: 1.6;max-width: 600px;margin: 0 auto 15px\">\n        Get genuine cPanel control, unmetered NVMe SSD storage, and free AutoSSL at $0 cost forever.\n    <\/p>\n<p>    <a href=\"https:\/\/cpanelfree.com\/#plans\" style=\"display: inline-block;background: linear-gradient(135deg, #0284c7 0%, #0369a1 100%);color: #ffffff;padding: 10px 22px;border-radius: 6px;text-decoration: none;font-weight: bold;font-size: 14px\">Claim Free Hosting Account<\/a>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Why Relying on Paid Status Page Services Is Unnecessary Maintaining high service availability requires continuous monitoring of your website endpoints, API gateways, database ports, and DNS resolvers. While commercial monitoring SaaS platforms (like Pingdom, Better Uptime, or Statuspage.io) charge $25 to $100+ monthly with strict monitor quantity limits, self-hosting your own monitoring portal gives you [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":2509,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[166],"tags":[],"class_list":["post-1885","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-developer-stacks"],"_links":{"self":[{"href":"https:\/\/cpanelfree.com\/blog\/wp-json\/wp\/v2\/posts\/1885","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cpanelfree.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cpanelfree.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cpanelfree.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/cpanelfree.com\/blog\/wp-json\/wp\/v2\/comments?post=1885"}],"version-history":[{"count":3,"href":"https:\/\/cpanelfree.com\/blog\/wp-json\/wp\/v2\/posts\/1885\/revisions"}],"predecessor-version":[{"id":2309,"href":"https:\/\/cpanelfree.com\/blog\/wp-json\/wp\/v2\/posts\/1885\/revisions\/2309"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cpanelfree.com\/blog\/wp-json\/wp\/v2\/media\/2509"}],"wp:attachment":[{"href":"https:\/\/cpanelfree.com\/blog\/wp-json\/wp\/v2\/media?parent=1885"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cpanelfree.com\/blog\/wp-json\/wp\/v2\/categories?post=1885"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cpanelfree.com\/blog\/wp-json\/wp\/v2\/tags?post=1885"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}