HomeStart / GuidesAnleitungen / Self-hosting Uptime Kuma on a VPS/ Uptime Kuma selbst hosten auf einem VPS

Self-hosting Uptime Kuma on a VPS: what it watches, and the dashboard's own NAT problemUptime Kuma selbst hosten auf einem VPS: was es überwacht, und das eigene NAT-Problem des Dashboards

Uptime Kuma is the thing people reach for right after they get tired of a paid status-check service billing them per monitor. It is a single container, it watches whatever you point it at, and the one part that trips people up is not the monitoring — it is getting to the dashboard from outside.Uptime Kuma ist das, wonach die Leute greifen, sobald sie es leid sind, dass ein bezahlter Status-Check-Dienst sie pro Monitor abrechnet. Es ist ein einzelner Container, er überwacht, worauf du ihn ansetzt, und der Teil, der die Leute stolpern lässt, ist nicht das Monitoring — es ist der Zugriff auf das Dashboard von außen.

What it actually watchesWas es tatsächlich überwacht

Uptime Kuma ships with a long list of monitor types; five cover almost every real use:Uptime Kuma bringt eine lange Liste an Monitor-Typen mit; fünf davon decken fast jeden echten Anwendungsfall ab:

Group monitors, tag them, and set the check interval and retry count per monitor — a flaky endpoint that fails once a day does not need to page you on the first miss.Gruppiere Monitore, versieh sie mit Tags und stelle Prüfintervall und Wiederholungszahl pro Monitor ein — ein wackeliger Endpunkt, der einmal am Tag ausfällt, muss dich nicht schon beim ersten Fehlschlag alarmieren.

Where the checks run from mattersWoher die Prüfungen laufen, ist wichtig

One thing worth saying plainly: a monitor is only ever telling you what things look like from wherever it is running. Point Uptime Kuma at a VPS in Dallas or Charlotte and the ping and HTTP timings it reports are US East/Central numbers. That is a perfectly good signal for "is the service up or down", and a mediocre one for "how fast does this feel to a visitor in Frankfurt" — for that you would want a check running near the visitor, not near you. Use Kuma for availability and treat any latency number it shows as from this one vantage point, not a global truth.Eine Sache, die man klar sagen sollte: Ein Monitor sagt dir immer nur, wie die Dinge von dort aussehen, wo er läuft. Setzt du Uptime Kuma auf einen VPS in Dallas oder Charlotte, sind die gemeldeten Ping- und HTTP-Zeiten Werte aus US East/Central. Das ist ein völlig brauchbares Signal für „ist der Dienst oben oder unten“, und ein mittelmäßiges für „wie schnell fühlt sich das für einen Besucher in Frankfurt an“ — dafür bräuchtest du eine Prüfung, die nah am Besucher läuft, nicht nah an dir. Nutze Kuma für Verfügbarkeit und behandle jede angezeigte Latenzzahl als von genau diesem einen Standpunkt aus, nicht als globale Wahrheit.

SizingDimensionierung

Uptime Kuma is Node.js plus SQLite, and it is genuinely light: monitoring a few dozen endpoints on short intervals idles well under 100 MB of RAM. The database only grows with check history, and by default it keeps that history indefinitely, so the honest ceiling on disk is however many monitors times however many months you let it accumulate — small numbers either way unless you are watching hundreds of things at ten-second intervals. It idles far under 1 GiB total, and the smallest tier with a bit of room for the OS and Docker itself is enough for a personal or small-team setup.Uptime Kuma ist Node.js plus SQLite und wirklich leichtgewichtig: Die Überwachung von ein paar Dutzend Endpunkten in kurzen Intervallen läuft im Leerlauf deutlich unter 100 MB RAM. Die Datenbank wächst nur mit der Prüfhistorie, und standardmäßig behält sie diese Historie unbegrenzt, sodass die ehrliche Obergrenze beim Speicherplatz sich aus der Anzahl der Monitore mal der Anzahl der Monate ergibt, die du sie ansammeln lässt — in beiden Fällen kleine Zahlen, außer du beobachtest Hunderte Dinge im Zehn-Sekunden-Takt. Insgesamt liegt es im Leerlauf weit unter 1 GiB, und die kleinste Stufe mit etwas Spielraum für das Betriebssystem und Docker selbst reicht für ein privates Setup oder ein kleines Team.

The compose fileDie Compose-Datei

services:
  uptime-kuma:
    image: louislam/uptime-kuma:1.23.16   # pin a real tag — check Docker Hub's tag list for the current release before you deploy
    restart: unless-stopped
    volumes:
      - uptime-kuma:/app/data
    ports:
      - "127.0.0.1:3001:3001"

volumes:
  uptime-kuma:

Bind the published port to 127.0.0.1, the same as any other web app on the box: the only thing that should reach port 3001 directly is the reverse proxy running on the same host, not the open internet. Bring it up with docker compose up -d, then open http://127.0.0.1:3001 over an SSH tunnel once to create the admin account before you put a domain in front of it.Binde den veröffentlichten Port an 127.0.0.1, genau wie bei jeder anderen Webanwendung auf der Maschine: Das Einzige, was Port 3001 direkt erreichen soll, ist der Reverse-Proxy auf demselben Host, nicht das offene Internet. Starte es mit docker compose up -d, öffne dann einmal http://127.0.0.1:3001 über einen SSH-Tunnel, um das Admin-Konto anzulegen, bevor du eine Domain davorsetzt.

HTTPS and the reverse proxy — the thing that bites laterHTTPS und der Reverse-Proxy — das Ding, das dich später beißt

Caddy is the least fuss:Caddy macht am wenigsten Aufwand:

status.example.com {
    reverse_proxy 127.0.0.1:3001
}

That line is genuinely the whole config, and it is enough on its own because Caddy detects a WebSocket upgrade and proxies it transparently. That detail matters here specifically: the Uptime Kuma dashboard is not a page that reloads, it is a Socket.IO connection that pushes monitor state live. If you put nginx in front instead, the dashboard will load — logo, monitor list, everything looks fine — and then every status just sits frozen, because nginx does not forward a WebSocket upgrade unless you tell it to:Diese Zeile ist wirklich die gesamte Konfiguration, und sie reicht für sich allein, weil Caddy ein WebSocket-Upgrade erkennt und es transparent durchreicht. Dieses Detail ist hier besonders wichtig: Das Uptime-Kuma-Dashboard ist keine Seite, die neu lädt, sondern eine Socket.IO-Verbindung, die den Monitor-Status live pusht. Setzt du stattdessen nginx davor, lädt das Dashboard — Logo, Monitorliste, alles sieht in Ordnung aus — und danach bleibt jeder Status einfach eingefroren, weil nginx ein WebSocket-Upgrade nicht weiterleitet, wenn man es ihm nicht sagt:

location / {
    proxy_pass http://127.0.0.1:3001;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $host;
}

Miss those three headers and you get a working-looking dashboard that never actually updates, which is a genuinely confusing bug to chase the first time you hit it.Fehlen diese drei Header, bekommst du ein scheinbar funktionierendes Dashboard, das sich nie wirklich aktualisiert — ein Bug, der beim ersten Mal wirklich verwirrend zu jagen ist.

Read this before you buy: the NAT IPv4 catchLies das, bevor du kaufst: die NAT-IPv4-Falle

Here is the part that has nothing to do with monitoring and everything to do with the network the VPS sits on. Split the traffic into two directions:Hier kommt der Teil, der nichts mit Monitoring zu tun hat und alles mit dem Netzwerk, in dem der VPS steckt. Teile den Traffic in zwei Richtungen:

Three honest ways to handle it:Drei ehrliche Wege, damit umzugehen:

Worth reading first if you have not sorted this out yet: NAT IPv4 vs a dedicated IP and NAT IPv4, ports and forwarding.Lesenswert vorab, falls du das noch nicht geklärt hast: NAT IPv4 im Vergleich zu einer dedizierten IP und NAT IPv4, Ports und Weiterleitung.

A clean machine firstZuerst eine saubere Maschine

Deploy the VPS, create a non-root user with your SSH key on it, disable password login, and default the firewall to deny before Docker touches the internet — connect to your VPS over SSH and secure your VPS are our own walkthroughs for that part. Point an A record at the box and let it propagate before you ask Caddy for a certificate.Setze den VPS auf, leg einen Non-Root-Nutzer mit deinem SSH-Key darauf an, deaktiviere den Passwort-Login, und stelle die Firewall auf Standard-Deny, bevor Docker das Internet berührt — Verbindung zu deinem VPS per SSH und deinen VPS absichern sind unsere eigenen Anleitungen für diesen Teil. Richte einen A-Eintrag auf die Maschine ein und lass ihn sich verbreiten, bevor du Caddy um ein Zertifikat bittest.

NotificationsBenachrichtigungen

Notifications live under Settings → Notifications and apply per-monitor, not globally, so a noisy endpoint can page differently from a quiet one. Three that cover most setups:Benachrichtigungen liegen unter Einstellungen → Benachrichtigungen und gelten pro Monitor, nicht global, sodass ein lauter Endpunkt anders alarmieren kann als ein ruhiger. Drei, die die meisten Setups abdecken:

Every provider has a Test button in its settings panel. Use it before you trust the monitor — a notification that silently fails to send is worse than no notification, because it looks configured.Jeder Anbieter hat einen Test-Button in seinem Einstellungsbereich. Nutze ihn, bevor du dem Monitor vertraust — eine Benachrichtigung, die stillschweigend nicht verschickt wird, ist schlimmer als keine, weil sie konfiguriert aussieht.

Status pagesStatusseiten

Uptime Kuma's status pages are a separate, public-facing view: pick monitors, group them under headings, and it publishes at /status/<slug> on the same domain, no login required to view it. Viewers see up/down and an uptime percentage per monitor; you can add incidents by hand when something is actually broken and want to say so in your own words rather than let a wall of red bars speak for you. The admin dashboard stays behind your login the whole time — the status page is a deliberately separate, read-only surface, and you can run more than one of them off the same instance for different audiences.Die Statusseiten von Uptime Kuma sind eine separate, öffentlich sichtbare Ansicht: Wähle Monitore aus, gruppiere sie unter Überschriften, und die Seite wird unter /status/<slug> auf derselben Domain veröffentlicht, ohne Login zum Ansehen. Besucher sehen Up/Down und eine Uptime-Prozentzahl pro Monitor; du kannst von Hand Incidents hinzufügen, wenn tatsächlich etwas kaputt ist und du das in eigenen Worten sagen willst, statt eine Wand roter Balken für sich sprechen zu lassen. Das Admin-Dashboard bleibt die ganze Zeit hinter deinem Login — die Statusseite ist bewusst eine separate, nur lesbare Oberfläche, und du kannst mehr als eine davon von derselben Instanz aus für unterschiedliche Zielgruppen betreiben.

Backups and updatesBackups und Updates

Everything lives in the uptime-kuma volume: an SQLite database plus any uploaded images. Because it is SQLite, copying the file while the container is writing to it risks a corrupt backup, so take it from inside the running container instead:Alles liegt im uptime-kuma-Volume: eine SQLite-Datenbank plus alle hochgeladenen Bilder. Weil es SQLite ist, riskiert das Kopieren der Datei, während der Container hineinschreibt, ein beschädigtes Backup — nimm es deshalb stattdessen aus dem laufenden Container heraus:

docker compose exec uptime-kuma sqlite3 /app/data/kuma.db ".backup /app/data/kuma-backup.db"
docker compose cp uptime-kuma:/app/data/kuma-backup.db ./kuma-backup.db

Use docker compose cp, not plain docker cp, for the second line. Compose v2 names containers <project>-<service>-<index>, and the project name defaults to your working directory's name, not to uptime-kuma — so a raw docker cp uptime-kuma-uptime-kuma-1:... only works if your directory happens to be called that. docker compose cp resolves the service name the same way exec does, regardless of what the project ended up being called.Nutze für die zweite Zeile docker compose cp, nicht schlichtes docker cp. Compose v2 benennt Container <project>-<service>-<index>, und der Projektname ist standardmäßig der Name deines Arbeitsverzeichnisses, nicht uptime-kuma — ein rohes docker cp uptime-kuma-uptime-kuma-1:... funktioniert also nur, wenn dein Verzeichnis zufällig so heißt. docker compose cp löst den Servicenamen genauso auf wie exec, egal wie das Projekt am Ende genannt wurde.

Copy that file off the server — a backup on the same disk as the thing it backs up is not a backup. back up your VPS covers what we actually do and do not provide by default.Kopiere diese Datei vom Server herunter — ein Backup auf derselben Platte wie das, was es sichert, ist kein Backup. Backup deines VPS beschreibt, was wir standardmäßig tatsächlich bereitstellen und was nicht.

Updating is the usual two lines:Updaten sind die üblichen zwei Zeilen:

docker compose pull
docker compose up -d

Uptime Kuma runs its own database migration on startup, and there is no supported way to move a migrated database back to an older version, so take the backup above before you pull, not after something looks wrong.Uptime Kuma führt beim Start seine eigene Datenbankmigration aus, und es gibt keinen unterstützten Weg, eine migrierte Datenbank zurück auf eine ältere Version zu bringen — nimm das Backup oben also vor dem Pull, nicht erst, nachdem etwas komisch aussieht.

On overnight.hostBei overnight.host

Full disclosure: this is what we sell. If you want the dashboard without the sysadmin, we run Uptime Kuma as a managed container with its own hostname and certificate — you get the app and a URL, not a root shell.Zur vollen Transparenz: Das ist, was wir verkaufen. Willst du das Dashboard ohne die Systemadministration, betreiben wir Uptime Kuma als gemanagten Container mit eigenem Hostnamen und Zertifikat — du bekommst die App und eine URL, keine Root-Shell.

One-click apps — EUR 4 to EUR 12 a month, hosted in Germany (EU). Eight apps: n8n, Uptime Kuma, Vaultwarden, Gitea, Nextcloud, Ghost, Managed WordPress, Private AI Chat. Each customer gets an isolated Docker network and volume, plus a hostname under apps.overnight.host on a real wildcard certificate. Memory and CPU are capped per plan by the container runtime.One-Click-Apps — 4 bis 12 EUR im Monat, gehostet in Deutschland (EU). Acht Apps: n8n, Uptime Kuma, Vaultwarden, Gitea, Nextcloud, Ghost, Managed WordPress, Private AI Chat. Jeder Kunde bekommt ein isoliertes Docker-Netzwerk und -Volume sowie einen Hostnamen unter apps.overnight.host mit einem echten Wildcard-Zertifikat. Arbeitsspeicher und CPU sind je Plan durch die Container-Runtime gedeckelt.

You order in the shop, pay by card (Stripe) or SEPA bank transfer, and your login details are e-mailed to you once the service is set up. Support is e-mail, run by one person, with no guaranteed response time. All prices are final totals under the German small-business rule (§19 UStG); no VAT is added or shown.Du bestellst im Shop, zahlst per Karte (Stripe) oder SEPA-Überweisung, und deine Zugangsdaten werden dir per E-Mail zugeschickt, sobald der Dienst eingerichtet ist. Support läuft per E-Mail, von einer einzelnen Person betrieben, ohne garantierte Reaktionszeit. Alle Preise sind Endpreise. Gemäß § 19 UStG wird keine Umsatzsteuer ausgewiesen.

Order one-click-uptime-kuma → · One-click apps overviewOne-Click-Uptime-Kuma bestellen → · Übersicht One-Click-Apps

Written by the person who runs overnight.host: a small, honest hosting company on dedicated bare metal — Linux VPS, game servers, web hosting. Live status at up.overnight.host.Geschrieben von der Person, die overnight.host betreibt: ein kleines, ehrliches Hosting-Unternehmen auf dedizierter Bare-Metal-Hardware — Linux-VPS, Gameserver, Webhosting. Live-Status unter up.overnight.host.

Technical guidance is informational. Plans, specifications and final prices are listed in the shop and can be ordered directly; VPS, game server, web hosting, one-click app and automation plans are provisioned automatically after payment. Custom configurations are still arranged by e-mail.Technische Hinweise dienen der Information. Pläne, Spezifikationen und Endpreise stehen im Shop und können direkt bestellt werden; VPS-, Gameserver-, Webhosting-, One-Click-App- und Automatisierungs-Pläne werden nach der Zahlung automatisch bereitgestellt. Sonderkonfigurationen werden weiterhin per E-Mail vereinbart.

FAQFAQ

Does Uptime Kuma need a database server?Braucht Uptime Kuma einen Datenbankserver?

No. It uses SQLite by default, embedded in the same volume as everything else, so there is nothing extra to run or size — one more reason it fits comfortably on the smallest tier.Nein. Es nutzt standardmäßig SQLite, eingebettet im selben Volume wie alles andere, sodass nichts Zusätzliches zu betreiben oder zu dimensionieren ist — ein weiterer Grund, warum es bequem auf die kleinste Stufe passt.

Can I monitor something that has no public IP at all?Kann ich etwas überwachen, das gar keine öffentliche IP hat?

Yes, with a Push monitor. Kuma gives you a unique URL and expects something to call it on a schedule; as long as whatever you are watching can reach out to your dashboard, it does not need to be reachable itself.Ja, mit einem Push-Monitor. Kuma gibt dir eine eindeutige URL und erwartet, dass etwas sie nach einem Zeitplan aufruft; solange das, was du überwachst, dein Dashboard erreichen kann, muss es selbst nicht erreichbar sein.

Will Uptime Kuma tell me my site is slow for my users?Sagt mir Uptime Kuma, ob meine Seite für meine Nutzer langsam ist?

It will tell you what response times look like from wherever the container runs. If that is a VPS in the US and your users are somewhere else, treat the latency number as a rough proxy for availability, not a promise about what a visitor actually experiences.Es sagt dir, wie die Antwortzeiten von dort aussehen, wo der Container läuft. Ist das ein VPS in den USA und deine Nutzer sitzen woanders, behandle die Latenzzahl als groben Näherungswert für Verfügbarkeit, nicht als Versprechen darüber, was ein Besucher tatsächlich erlebt.

What happens if I lose the data volume?Was passiert, wenn ich das Daten-Volume verliere?

Every monitor, notification setting and history entry is gone, because it is all in that one SQLite file. Reconfiguring a dozen monitors by hand is tedious rather than catastrophic, which is exactly why the backup above takes thirty seconds and is worth doing on day one.Jeder Monitor, jede Benachrichtigungseinstellung und jeder Verlaufseintrag ist weg, weil alles in dieser einen SQLite-Datei liegt. Ein Dutzend Monitore von Hand neu einzurichten ist mühsam, aber nicht katastrophal — genau deshalb dauert das Backup oben dreißig Sekunden und lohnt sich schon am ersten Tag.

Is a managed Uptime Kuma different from running it myself?Unterscheidet sich ein gemanagtes Uptime Kuma vom Selbstbetrieb?

Same application either way. The difference is who owns the certificate and the port: a managed container gets its own hostname on a real certificate with no NAT decision to make, and you do not get a root shell to add Docker monitors or edit the compose file yourself. If you want that control, a VPS is the right place for it.So oder so dieselbe Anwendung. Der Unterschied ist, wer Zertifikat und Port besitzt: Ein gemanagter Container bekommt seinen eigenen Hostnamen mit echtem Zertifikat, ohne dass du eine NAT-Entscheidung treffen musst, und du bekommst keine Root-Shell, um selbst Docker-Monitore hinzuzufügen oder die Compose-Datei zu bearbeiten. Willst du diese Kontrolle, ist ein VPS der richtige Ort dafür.

Ready to order?Bereit zu bestellen?

Prices are final totals; no VAT is shown (§19 UStG). Need something the shop does not list? Email us for a written offer.Alle Preise sind Endpreise ohne ausgewiesene USt. (§19 UStG). Du brauchst etwas, das nicht im Shop steht? Schreib uns für ein schriftliches Angebot.

Order now →Jetzt bestellen → Request a custom configIndividuelle Konfiguration anfragen