Deployn

Komodo mit Traefik: Docker-Server per Weboberfläche verwalten

Komodo hinter Traefik mit HTTPS installieren, Stacks per Oberfläche und Git deployen, Backups und Auto-Updates einrichten und einen zweiten Server anbinden. Mit Screenshots, für Einsteiger.

Veröffentlicht am
Komodo mit Traefik: Docker-Server per Weboberfläche verwalten hero image
Inhalt
Getestet mit
Komodo 2.3.4Traefik 3.7MongoDB 8Docker 29.9Debian 13
Zuletzt geprüft am

Komodo ist eine Weboberfläche, mit der du Docker-Container auf einem oder mehreren Servern verwaltest. Du startest Compose-Stacks per Klick, siehst Logs und Statistiken, holst Stacks aus einem Git-Repository, lässt Updates automatisch einspielen und bekommst Benachrichtigungen, wenn etwas ausfällt. In dieser Anleitung installiere ich Komodo hinter Traefik auf einem Debian-Server, deploye meine ersten Stacks und gehe einige Funktionen durch.

Was ist Komodo?

Komodo ist eine Oberfläche für Docker, wie es auch Portainer ist, dem ich früher eine Anleitung gewidmet habe. Bei den bekannten Alternativen hat sich die Lage verschoben:

  • Portainer hat im September 2026 Version 3.0 angekündigt. Die neue Entwicklung ist Kubernetes-first und Closed Source. Die Community Edition bleibt auf dem Stand 2.45 LTS.
  • Dockhand hat im September 2026 seine BSL-1.1-Lizenz überarbeitet. Wer es produktiv in einem Unternehmen einsetzt, braucht eine kostenpflichtige Lizenz. Für den Privatgebrauch bleibt es erstmal kostenlos.
  • Übrig bleiben freie Projekte: Arcane steht unter BSD-3-Clause, Komodo unter GPL-3.0.

Komodo denkt in Stacks, Git-Repositories und Abläufen:

  • Ein Stack ist eine Compose-Datei, die du in der Oberfläche schreibst, vom Server liest oder aus Git holst.
  • Prozeduren verketten Aktionen, zum Beispiel „Stack A aktualisieren, dann Stack B”, und laufen auf einem Zeitplan.
  • Variablen und Geheimnisse legst du einmal an und nutzt sie in vielen Stacks.
  • Die Konfiguration lässt sich als TOML exportieren und in einem Git-Repository versionieren.

Dafür ist Komodo etwas größer: Neben der Oberfläche läuft eine MongoDB. Außerdem dauert die Einarbeitung länger.

Glossar

Begriff Beschreibung
Core Der zentrale Dienst mit Weboberfläche und API. Er läuft einmal.
Periphery Ein kleiner Agent auf jedem Server, den Komodo verwaltet. Er führt Docker-Befehle aus.
Server Ein Rechner mit Docker und einem Periphery-Agenten, der mit dem Core verbunden ist.
Stack Eine Docker-Compose-Datei samt Einstellungen, die Komodo auf einem Server startet.
Procedure Eine Abfolge von Aktionen, die du von Hand oder per Zeitplan startest.
Variable Ein benannter Wert, den du in Stacks einsetzt. Als Geheimnis markiert, wird er in der Oberfläche versteckt.
Alerter Ein Ziel für Benachrichtigungen, etwa Discord, Slack oder ntfy.
Traefik Der Reverse Proxy, der HTTPS-Zertifikate holt und Anfragen an die richtigen Container weiterreicht.

Voraussetzungen

  1. Ein Server mit Docker Ich habe einen kleinen VPS mit 2 vCPU und 4 GB RAM genutzt. Nach der Installation von Traefik, Komodo und zwei Beispiel-Stacks belegte das System etwa 1 GB RAM. Mit weniger als 2 GB wird es eng, weil allein MongoDB etwa 275 MB verbraucht.
  2. Eine Domain oder Subdomain, deren A-Record auf die IP deines Servers zeigt. Ich nutze hier {{domain}}.
  3. Offene Ports: 80 und 443.
  4. Traefik oder einen anderen Reverse Proxy. Wenn du ihn noch nicht hast, richte ich ihn im nächsten Schritt in Kurzform ein. Die ausführliche Variante mit Middlewares und Authentifizierung steht in der Traefik-Anleitung.

Prüfe vorher, ob der DNS-Eintrag stimmt:

Terminalbash
dig +short {{domain}}

Die Ausgabe muss die IP deines Servers sein. Brauchst du Hilfe beim Einstieg in SSH, hilft dir mein Beitrag zu den VPS-Grundlagen.

Schritt 1: Docker installieren

Alles als root auszuführen ist eine schlechte Angewohnheit: Ein Tippfehler oder ein kompromittierter Dienst hat dann vollen Zugriff auf die Maschine. Ich nutze root nur für den ersten Login, um einen normalen Benutzer anzulegen. Wenn dein Anbieter dir schon einen Benutzer mit sudo eingerichtet hat, überspringe den ersten Block.

Terminalbash
apt update && apt upgrade -y
apt install -y sudo
adduser deploy
usermod -aG sudo deploy

Melde dich ab und als deploy wieder an (ssh deploy@{{domain}}). Nutzt du SSH-Schlüssel, kopiere deinen vorher mit ssh-copy-id deploy@{{domain}} zum neuen Benutzer. Ab hier braucht kein Befehl dieser Anleitung mehr einen root-Login. Jetzt installiere ich Docker aus der offiziellen Paketquelle von Docker, wie es die Docker-Dokumentation für Debian beschreibt. So bekommt Docker seine Updates später über apt upgrade:

Terminalbash
sudo apt install -y ca-certificates curl dnsutils git
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
sudo tee /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/debian
Suites: $(. /etc/os-release && echo "$VERSION_CODENAME")
Components: stable
Signed-By: /etc/apt/keyrings/docker.asc
EOF
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo usermod -aG docker $USER

Der letzte Befehl erlaubt deinem Benutzer, Docker ohne sudo zu nutzen. Melde dich dafür einmal ab und wieder an. Beachte, dass die Mitgliedschaft in der Gruppe docker praktisch Root-Rechte bedeutet. Füge also nur Benutzer hinzu, denen du vertraust.

Zur Kontrolle:

Terminalbash
docker --version
docker compose version
Docker version 29.9.3, build 5457199
Docker Compose version v5.7.0

Schritt 2: Traefik einrichten

Alle Docker-Projekte landen bei mir unter ~/docker. Traefik bekommt ein eigenes Verzeichnis, und alle Dienste, die er ausliefern soll, hängen im gemeinsamen Docker-Netzwerk web.

Terminalbash
mkdir -p ~/docker/traefik/acme
cd ~/docker
touch traefik/acme/acme.json
chmod 600 traefik/acme/acme.json

Die Datei acme.json speichert die Zertifikate. Sie muss 600 als Rechte haben, sonst verweigert Traefik den Start. Jetzt die statische Konfiguration ~/docker/traefik/traefik.yml:

yaml
global:
    checkNewVersion: true
    sendAnonymousUsage: false
    aliasHeadersStrategy: delete

api:
    dashboard: true

ping: {}

log:
    level: INFO

entryPoints:
    http:
        address: ":80"
        http:
            redirections:
                entryPoint:
                    to: https
                    scheme: https
    https:
        address: ":443"
        http:
            tls:
                certResolver: letsencrypt

providers:
    docker:
        exposedByDefault: false
        network: web

certificatesResolvers:
    letsencrypt:
        acme:
            email: deine@mail.de
            storage: /acme.json
            httpChallenge:
                entryPoint: http

Ersetze deine@mail.de durch deine Adresse. Die Optionen im Einzelnen:

  • exposedByDefault: false sorgt dafür, dass Traefik nur Container ausliefert, die ausdrücklich traefik.enable=true tragen.
  • Der Einstiegspunkt http leitet alles auf https um.
  • Die Zertifikate holt Traefik per HTTP-Challenge, dafür muss Port 80 offen sein.

Die Compose-Datei ~/docker/docker-compose.yml:

yaml
networks:
    web:
        name: web

services:
    traefik:
        image: traefik:v3.7
        container_name: traefik
        restart: unless-stopped
        security_opt:
            - no-new-privileges:true
        ports:
            - "80:80"
            - "443:443"
        volumes:
            - /var/run/docker.sock:/var/run/docker.sock:ro
            - ./traefik/traefik.yml:/etc/traefik/traefik.yml:ro
            - ./traefik/acme/acme.json:/acme.json
        networks:
            - web
        healthcheck:
            test: ["CMD", "traefik", "healthcheck", "--ping"]
            interval: 30s
            timeout: 5s
            retries: 3
Terminalbash
cd ~/docker
docker compose up -d
docker compose ps

Bis der Status healthy zeigt, vergehen ein paar Sekunden.

Schritt 3: Komodo mit Docker Compose starten

Komodo besteht aus drei Containern:

  • mongo speichert die gesamte Konfiguration.
  • core ist die Weboberfläche und die API.
  • periphery führt Docker-Befehle auf dem Server aus, auf dem Komodo selbst läuft.

Das Verzeichnis dafür:

Terminalbash
mkdir -p ~/docker/komodo
cd ~/docker/komodo

Die Datei .env

Die .env enthält Passwörter und Einstellungen. Ich nenne sie bewusst .env, weil Docker Compose diese Datei automatisch liest und du später keine Warnungen wie „variable is not set” bekommst. Die Geheimnisse erzeuge ich direkt auf dem Server:

Terminalbash
cat > .env <<EOF
COMPOSE_KOMODO_IMAGE_TAG=2
COMPOSE_KOMODO_BACKUPS_PATH=/etc/komodo/backups

KOMODO_DATABASE_USERNAME=komodo
KOMODO_DATABASE_PASSWORD=$(openssl rand -hex 16)

TZ=Europe/Berlin
KOMODO_HOST=https://{{domain}}
KOMODO_TITLE=Komodo
KOMODO_PERIPHERY_PUBLIC_KEY=file:/config/keys/periphery.pub
KOMODO_LOCAL_AUTH=true
KOMODO_FIRST_SERVER_NAME=Local
KOMODO_WEBHOOK_SECRET=$(openssl rand -hex 16)
KOMODO_JWT_SECRET=$(openssl rand -hex 32)

PERIPHERY_CORE_ADDRESS=ws://core:9120
PERIPHERY_CONNECT_AS=Local
PERIPHERY_CORE_PUBLIC_KEYS=file:/config/keys/core.pub
PERIPHERY_ROOT_DIRECTORY=/etc/komodo
PERIPHERY_INCLUDE_DISK_MOUNTS=/etc/hostname
EOF
chmod 600 .env

Die wichtigsten Einträge:

Variable Bedeutung
KOMODO_HOST Die öffentliche URL von Komodo. Sie wird für Webhooks und Links gebraucht.
KOMODO_LOCAL_AUTH Erlaubt Login mit Benutzername und Passwort. Ohne diese Option brauchst du einen OAuth-Anbieter.
KOMODO_JWT_SECRET Schlüssel für die Login-Sitzungen. Zufällig und geheim halten.
KOMODO_WEBHOOK_SECRET Geheimnis, mit dem Git-Anbieter Webhooks an Komodo signieren.
PERIPHERY_CORE_ADDRESS Wohin sich der Agent verbindet. Der Agent ruft den Core an, nicht umgekehrt.
PERIPHERY_ROOT_DIRECTORY Der Ordner, in dem Komodo Stacks, Repos und Backups ablegt.
KOMODO_PERIPHERY_PUBLIC_KEY Öffentlicher Schlüssel des Agenten. Core und Periphery erkennen sich über Schlüsselpaare, nicht über Passwörter.

Die Datei compose.yaml

yaml
networks:
    web:
        external: true

services:
    mongo:
        image: mongo:8
        restart: unless-stopped
        labels:
            komodo.skip:
        command: --quiet --wiredTigerCacheSizeGB 0.25
        volumes:
            - mongo-data:/data/db
            - mongo-config:/data/configdb
        environment:
            MONGO_INITDB_ROOT_USERNAME: ${KOMODO_DATABASE_USERNAME}
            MONGO_INITDB_ROOT_PASSWORD: ${KOMODO_DATABASE_PASSWORD}

    core:
        image: ghcr.io/moghtech/komodo-core:${COMPOSE_KOMODO_IMAGE_TAG:-2}
        init: true
        restart: unless-stopped
        depends_on:
            - mongo
        env_file: ./.env
        environment:
            KOMODO_DATABASE_ADDRESS: mongo:27017
        volumes:
            - keys:/config/keys
            - ${COMPOSE_KOMODO_BACKUPS_PATH}:/backups
        networks:
            - default
            - web
        labels:
            komodo.skip:
            traefik.enable: "true"
            traefik.http.routers.komodo.rule: Host(`{{domain}}`)
            traefik.http.routers.komodo.entrypoints: https
            traefik.http.services.komodo.loadbalancer.server.port: "9120"

    periphery:
        image: ghcr.io/moghtech/komodo-periphery:${COMPOSE_KOMODO_IMAGE_TAG:-2}
        init: true
        restart: unless-stopped
        depends_on:
            - core
        env_file: ./.env
        volumes:
            - keys:/config/keys
            - /var/run/docker.sock:/var/run/docker.sock
            - /proc:/proc
            - ${PERIPHERY_ROOT_DIRECTORY:-/etc/komodo}:${PERIPHERY_ROOT_DIRECTORY:-/etc/komodo}
        labels:
            komodo.skip:

volumes:
    mongo-data:
    mongo-config:
    keys:

Ein paar Stellen zum Verstehen:

  • Der Core hängt an zwei Netzwerken. default verbindet ihn mit MongoDB und dem Agenten, web mit Traefik.
  • Die Labels am Core sind das komplette Traefik-Setup: Domain, HTTPS und der interne Port 9120. Eine Datei für Traefik musst du dafür nicht anfassen.
  • Das Label komodo.skip sagt Komodo, dass es diese Container nicht selbst neu starten oder aktualisieren darf. Sonst würde sich Komodo beim Update gegenseitig den Boden wegziehen.
  • Core und Agent teilen sich das Volume keys. Dort legt Komodo beim ersten Start die Schlüsselpaare ab, mit denen sich beide gegenseitig erkennen.
  • --wiredTigerCacheSizeGB 0.25 begrenzt den Cache von MongoDB, sonst nimmt sich die Datenbank viel RAM.
  • Der Ordner /etc/komodo wird mit demselben Pfad in den Agenten gehängt. Das ist wichtig, weil Docker-Befehle des Agenten auf dem Host ausgeführt werden und dieselben Pfade brauchen.

Starten und prüfen:

Terminalbash
docker compose up -d
docker compose ps
NAME                 IMAGE                                 STATUS          PORTS
komodo-core-1        ghcr.io/moghtech/komodo-core:2        Up 35 minutes   9120/tcp
komodo-mongo-1       mongo:8                               Up 35 minutes   27017/tcp
komodo-periphery-1   ghcr.io/moghtech/komodo-periphery:2   Up 35 minutes   8120/tcp

Ein Blick ins Log des Cores zeigt, dass alles geklappt hat:

Terminalbash
docker compose logs core | tail -5
CoreStartup: Komodo Core version: v2.3.4
Writing private key to /config/keys/core.key
Server starting on http://[::]:9120

Nach etwa einer Minute hat Traefik das Zertifikat geholt. Prüfen kannst du es mit:

Terminalbash
curl -vI https://{{domain}} 2>&1 | grep -E "issuer|HTTP/"
*  issuer: C=US; O=Let's Encrypt; CN=YR1
< HTTP/2 200

Schritt 4: Erster Login

Öffne https://{{domain}} im Browser. Beim ersten Aufruf gibt es noch keinen Benutzer.

Der Anmeldebildschirm von Komodo

Klicke auf „Sign Up” und lege Benutzername und Passwort an. Der erste Benutzer, der sich registriert, wird automatisch Administrator. Danach solltest du keine weiteren Registrierungen zulassen: Setze KOMODO_DISABLE_USER_REGISTRATION=true in die .env und starte den Core mit docker compose up -d neu. Weitere Benutzer legst du danach im Admin-Bereich selbst an.

Möchtest du den Admin lieber per Konfiguration anlegen, kennt Komodo dafür die Variablen KOMODO_INIT_ADMIN_USERNAME und KOMODO_INIT_ADMIN_PASSWORD.

Die Oberfläche im Überblick

Komodo ist nach dem Login schon nicht mehr leer. Der Server Local wurde durch KOMODO_FIRST_SERVER_NAME angelegt, und der Agent hat sich verbunden.

Das Dashboard von Komodo

Links in der Seitenleiste findest du:

  • Dashboard: Zusammenfassung aller Ressourcen.
  • Containers: Alle Container aller Server in einer Liste.
  • Terminals: Shells in Containern und auf Servern.
  • Stats: Auslastung der Server.
  • Servers, Swarms, Stacks, Deployments, Builds, Repos, Procedures, Actions, Syncs: Die Ressourcen, die Komodo verwaltet. Ich gehe die wichtigsten gleich durch.
  • Alerts und Updates: Benachrichtigungen und ein Protokoll aller Änderungen.

Die Serverliste

Unter „Servers” siehst du den Server Local mit dem Status OK.

Die Serverliste mit dem Server Local

Ein Klick darauf öffnet die Detailseite mit Konfiguration, Statistiken, Docker-Objekten und Terminals.

Die Detailseite eines Servers

Der Reiter „Stats” zeigt CPU, RAM und Festplatte über die Zeit.

Die Statistik des Servers

Im Reiter „Docker” findest du alle Container, Netzwerke, Volumes und Images des Servers.

Container, Netzwerke, Volumes und Images eines Servers

Oben auf der Seite gibt es außerdem Knöpfe wie „Prune System”, um ungenutzte Images und Container zu löschen. Sei damit vorsichtig, wenn du gestoppte Container noch brauchst.

Den ersten Stack per Oberfläche starten

Ein Stack ist eine Compose-Datei. Zum Ausprobieren nutze ich traefik/whoami, einen winzigen Webserver, der Informationen über die Anfrage zurückgibt.

Gehe auf „Stacks” und klicke auf „New Stack”.

Der Dialog „New Stack”

Gib einen Namen ein, wähle den Server Local und bestätige. Der Stack ist angelegt, aber noch leer.

Ein neu angelegter, leerer Stack

Unter „Choose Mode” wählst du, woher die Compose-Datei kommt:

Auswahl des Modus eines Stacks

Modus Bedeutung
UI Defined Du schreibst die Compose-Datei direkt in der Oberfläche. Komodo speichert sie in der Datenbank.
Files On Server Die Datei liegt schon auf dem Server und Komodo liest sie.
Git Repo Komodo holt die Datei aus einem Git-Repository.

Wir nehmen „UI Defined” und fügen im Editor diese Compose-Datei ein. Ersetze whoami.deinedomain.de durch eine Domain, die auf deinen Server zeigt:

yaml
services:
    whoami:
        image: traefik/whoami
        restart: unless-stopped
        networks:
            - web
        labels:
            - "traefik.enable=true"
            - "traefik.http.routers.whoami.rule=Host(`whoami.deinedomain.de`)"
            - "traefik.http.routers.whoami.entrypoints=https"
            - "traefik.http.services.whoami.loadbalancer.server.port=80"

networks:
    web:
        external: true

Die Compose-Datei im Editor von Komodo

Mit „Save” speicherst du. Komodo zeigt vorher einen Vergleich der Änderung an und fragt nach Bestätigung.

Der Bestätigungsdialog mit dem Vergleich der Änderungen

Dann klickst du auf „Deploy”. Alle ausführenden Knöpfe in Komodo fragen mit einem zweiten Klick nach. Der Stack wechselt auf RUNNING.

Der laufende Stack

Unter „Log” siehst du, was Komodo beim Deploy gemacht hat. Das ist der Ablauf von docker compose up:

Das Deploy-Log eines Stacks

„Services” zeigt die Container des Stacks, und der Reiter „Log” die Ausgabe der Container selbst.

Die Services eines Stacks

Das Log eines Containers im Stack

Ein Test von außen zeigt, dass Traefik die Anfrage an den neuen Container weiterreicht:

Terminalbash
curl https://whoami.deinedomain.de
Hostname: be603bb374a5
IP: 127.0.0.1
IP: ::1
IP: 172.18.0.4
RemoteAddr: 172.18.0.2:36224
GET / HTTP/1.1
Host: whoami.deinedomain.de
X-Forwarded-Proto: https

Die Domain brauchst du dafür nicht in Traefik einzutragen. Der Container trägt seine Regeln als Labels selbst, und Traefik liest sie über den Docker-Socket.

Stacks aus einem Git-Repository

Für Stacks, die du versionieren willst, ist der Git-Modus besser. Die Compose-Datei liegt dann in einem Repository, und Komodo holt sie dort. Ich nutze zum Testen das Repository von Uptime Kuma, das eine fertige compose.yaml enthält.

Lege einen neuen Stack an, wähle als Modus „Git Repo” und trage ein:

  • Account: leer, bei öffentlichen Repositories brauchst du keinen.
  • Repo: louislam/uptime-kuma
  • Branch: master (Komodo setzt als Vorgabe main)

Die Git-Einstellungen eines Stacks

Beim Speichern zeigt Komodo wieder den Vergleich.

Vergleich beim Speichern der Git-Einstellungen

Nach dem Deploy klont Komodo das Repository nach /etc/komodo/stacks/<Stack-Name> auf dem Server und startet die Compose-Datei daraus.

Der Stack aus dem Git-Repository läuft

Für private Repositories hinterlegst du unter Einstellungen → Providers ein Konto mit Zugriffstoken. Das wählst du dann im Feld „Account” aus.

Providers in den Einstellungen

Webhooks: Deploy bei jedem Push

Im Stack findest du den Abschnitt „Webhooks”. Komodo zeigt dort eine URL der Form https://{{domain}}/listener/github/stack/<ID>/deploy. Trägst du diese URL als Webhook in GitHub oder einem kompatiblen Git-Dienst ein (zum Beispiel Forgejo oder Gitea), deployt Komodo den Stack bei jedem Push.

Webhook-Einstellungen eines Stacks

Das Geheimnis aus KOMODO_WEBHOOK_SECRET trägst du beim Git-Dienst als „Secret” ein.

Dateien, die schon auf dem Server liegen

Der Modus „Files On Server” liest eine Compose-Datei aus dem Verzeichnis /etc/komodo/stacks/<Stack-Name>/. Das lohnt sich, wenn du Dateien mit Ansible oder per Hand dorthin legst. Im Feld „Run Directory” gibst du einen Pfad relativ zu diesem Ordner an. Die Datei heißt standardmäßig compose.yaml.

Ein Stack im Modus „Files On Server”

Container verwalten

Unter „Containers” siehst du alle Container aller Server in einer Liste.

Die Containerliste

Ein Klick auf einen Container öffnet seine Seite mit drei Reitern:

  • Log: die Ausgabe des Containers.
  • Inspect: das Ergebnis von docker inspect.
  • Terminals: eine Shell im Container.

Die Seite eines Containers

Das Log eines Containers

Das Terminal öffnest du mit sh oder bash, je nachdem, was das Image mitbringt. Das ist praktisch, wenn du unterwegs schnell etwas nachsehen willst, ohne SSH.

Eine Shell im Container

Variablen und Geheimnisse

Unter Einstellungen → Variables legst du Werte an, die du in mehreren Stacks nutzt, zum Beispiel deine Domain oder ein Passwort.

Variablen in den Einstellungen

Eine neue Variable hat Name, Wert und Beschreibung. Mit der Option „Secret” versteckt Komodo den Wert in der Oberfläche.

Eine Variable anlegen

Laut Dokumentation setzt du eine Variable mit doppelten eckigen Klammern ein, etwa [[DOMAIN]]. In meinem Test habe ich das nicht bis zum Ende prüfen können, deshalb prüfe nach dem ersten Deploy mit docker inspect, ob der Wert wirklich ersetzt wurde.

Zusätzlich hat jeder Stack einen eigenen Bereich „Environment”. Was du dort im Format NAME=wert einträgst, schreibt Komodo vor dem Deploy in eine .env neben die Compose-Datei, und Compose liest sie wie gewohnt.

Prozeduren und Backups

Prozeduren führen Aktionen in einer festen Reihenfolge aus und können per Zeitplan laufen. Komodo bringt bereits drei mit:

Die Liste der Prozeduren

Prozedur Zeitpunkt Wirkung
Backup Core Database 01:00 Sichert die Komodo-Datenbank nach /etc/komodo/backups.
Global Auto Update 03:00 Aktualisiert alle Stacks und Deployments, die Auto-Update eingeschaltet haben.
Rotate Server Keys 06:00 Erneuert die Schlüssel der Server.

Das Backup solltest du einmal von Hand testen. Öffne „Backup Core Database”.

Die Prozedur „Backup Core Database”

Klicke auf „Run”. Für Prozeduren verlangt Komodo, dass du zur Bestätigung den Namen der Prozedur eintippst.

Bestätigung durch Eingabe des Namens

Die Prozedur ist durchgelaufen

Auf dem Server findest du ein Verzeichnis mit Datum, in dem für jeden Typ eine komprimierte Datei liegt:

Terminalbash
sudo ls /etc/komodo/backups/
sudo ls /etc/komodo/backups/2026-11-06_20-01-36
2026-11-06_20-01-36
Stats.gz     Action.gz    Alerter.gz   Alert.gz     ApiKey.gz
Builder.gz   Build.gz     Deployment.gz  Procedure.gz  Repo.gz
Server.gz    Stack.gz     Variable.gz  User.gz       UserGroup.gz
...

Die Backups enthalten die Konfiguration von Komodo, also Stacks, Server und Prozeduren. Die Daten deiner Container (Volumes) sind darin nicht enthalten. Kopiere den Ordner regelmäßig auf einen anderen Rechner, zum Beispiel mit rsync.

Automatische Updates

Jeder Stack hat einen Abschnitt „Auto Update”. Dort gibt es drei Schalter:

  • Poll for Updates: Komodo prüft regelmäßig, ob es neue Images gibt.
  • Auto Update: Komodo deployt, wenn es ein neues Image gibt.
  • Full Stack Auto Update: aktualisiert den gesamten Stack, nicht nur die Services mit neuem Image.

Auto-Update-Einstellungen eines Stacks

Die Prozedur „Global Auto Update” läuft nachts und zieht neue Images, wenn du Auto Update eingeschaltet hast. Bei Containern mit festem Tag wie :2 bekommst du neue Patch-Versionen, bei :latest auch Sprünge auf die nächste Hauptversion. Ich schalte die Funktion nur bei Diensten ein, bei denen ein Update selten etwas kaputt macht.

Benachrichtigungen mit Alertern

Unter Einstellungen → Alerters legst du Ziele für Benachrichtigungen an.

Die Alerter in den Einstellungen

Komodo unterstützt die Endpunkte Custom, Discord, Slack, Ntfy und Pushover.

Einen neuen Alerter anlegen

Du wählst den Typ und trägst die URL ein. In der Konfiguration kannst du außerdem festlegen, bei welchen Ereignissen eine Nachricht kommt, etwa wenn ein Server nicht erreichbar ist, ein Stack ausfällt oder die Festplatte voll wird.

Die Endpunkt-Einstellungen eines Alerters

Weitere Funktionen im Kurzüberblick

Diese Bereiche gehen über Stacks hinaus.

Builds und Builder

Komodo kann Docker-Images aus einem Git-Repository bauen und in eine Registry pushen. Der Builder, der die Arbeit macht, ist standardmäßig dein Server („Local”). Unter Einstellungen → Builders kannst du weitere hinzufügen.

Die Liste der Builds

Builder in den Einstellungen

Actions

Actions sind kleine TypeScript-Skripte, die gegen die Komodo-API laufen. Du kannst damit Abläufe bauen, die eine Prozedur allein nicht kann.

Die Seite für Actions

Syncs und der TOML-Export

Mit einem Resource Sync hältst du die Konfiguration von Komodo in einem Git-Repository. Du beschreibst Stacks, Server und Prozeduren als TOML-Datei, und Komodo gleicht sie ab. Auf vielen Seiten gibt es oben rechts den Knopf „Toml”, der die aktuelle Konfiguration als TOML anzeigt. So kommst du ohne Handarbeit zu einer Startdatei.

Der TOML-Export eines Stacks

Die Seite für Resource Syncs

Benutzer und Gruppen

Unter Einstellungen → Users legst du weitere Benutzer an und fasst sie in Gruppen zusammen. Die Rechte vergibst du pro Ressource, sodass jemand zum Beispiel nur einen bestimmten Stack sehen darf.

Benutzer und Gruppen

Einen zweiten Server anbinden

Einer der Gründe für Komodo ist, mehrere Server aus einer Oberfläche zu steuern. Dafür installierst du auf dem neuen Server nur den Periphery-Agenten. Docker muss dort vorher laufen (siehe Schritt 1).

Zuerst legst du im Core einen Onboarding-Schlüssel an: Einstellungen → Onboarding → „New Onboarding Key”.

Leere Liste der Onboarding-Schlüssel

Du gibst dem Schlüssel einen Namen und lässt die Gültigkeit bei einem Tag.

Der Dialog zum Erstellen eines Onboarding-Schlüssels

Komodo zeigt den Schlüssel danach genau einmal an. Kopiere ihn sofort. Er beginnt mit O_. Auf dem neuen Server startest du dann das Installationsskript:

Terminalbash
curl -sSL https://raw.githubusercontent.com/moghtech/komodo/main/scripts/setup-periphery.py | sudo python3 - \
  --core-address="https://{{domain}}" \
  --connect-as="worker" \
  --onboarding-key="O_DEIN_SCHLÜSSEL"

Das Skript lädt den Agenten herunter, schreibt eine Konfiguration nach /etc/komodo und richtet einen systemd-Dienst namens periphery ein. Ein Pipe-Aufruf wie oben führt Code aus dem Internet aus. Wer das nicht möchte, lädt das Skript zuerst herunter, liest es und startet es dann mit sudo python3 setup-periphery.py und denselben Optionen.

Im Log des Dienstes siehst du, dass die Verbindung geklappt hat:

Terminalbash
sudo journalctl -u periphery --no-pager | tail -3
OnboardingFlow: Server onboarding flow for 'worker' successful
Logged in to Komodo Core {{domain}} websocket as Server worker

Im Core taucht der Server in der Liste auf:

Die Serverliste mit zwei Servern

Bemerkenswert ist die Richtung der Verbindung: Der Agent ruft den Core an. Auf dem neuen Server musst du deshalb keinen Port öffnen. Der Core braucht nur eine erreichbare Adresse, in unserem Fall die HTTPS-Domain hinter Traefik.

Jetzt kannst du Stacks auf dem zweiten Server anlegen. Ich habe den Uptime-Kuma-Stack aus dem Git-Repository nochmal erstellt, diesmal mit dem Server worker.

Stacks auf zwei Servern

Auf dem Worker lief der Container danach mit dem Status healthy:

kuma-worker-uptime-kuma-1  louislam/uptime-kuma:2  Up 12 seconds (healthy)

Dieser Stack hat kein Traefik-Label, weil auf dem Worker kein Traefik läuft. Für einen Dienst mit HTTPS brauchst du dort ebenfalls einen Reverse Proxy.

Komodo aktualisieren

Weil ich das Image mit dem Tag 2 verwende, bleibt Komodo bei der Hauptversion 2 und bekommt Updates innerhalb davon:

Terminalbash
cd ~/docker/komodo
docker compose pull
docker compose up -d

Die Daten liegen in Volumes und gehen dabei nicht verloren. Vor einem Sprung auf die nächste Hauptversion (von 2 auf 3) lies die Release Notes und mach ein Backup. Den Agenten auf weiteren Servern hältst du mit periphery-Updates aktuell. Das Installationsskript zieht die neueste Version, wenn du es erneut startest.

Wie viel RAM braucht Komodo?

Mit Traefik, Komodo und zwei Stacks lieferte docker stats diese Werte:

Container Speicher
mongo 275 MiB
core 163 MiB
periphery 162 MiB
traefik 142 MiB
uptime-kuma 115 MiB
whoami 9 MiB

Das System insgesamt belegte etwa 1 GB von 3,8 GB. Für Komodo und Traefik zusammen plane ich mit etwa 750 MB ein.

Probleme und Lösungen

Problem Ursache und Lösung
variable is not set-Warnungen bei docker compose Die Datei heißt nicht .env. Benenne sie um oder nutze --env-file.
Traefik startet nicht, Fehler wegen acme.json Die Datei braucht die Rechte 600: chmod 600 traefik/acme/acme.json.
Zertifikat wird nicht ausgestellt Port 80 ist zu oder der DNS-Eintrag stimmt nicht. Prüfe mit dig und docker logs traefik.
Oberfläche liefert 404 page not found Core hängt nicht am Netzwerk web oder die Regel Host(...) passt nicht zur Domain.
Server in Komodo zeigt NOT OK Der Agent läuft nicht oder erreicht den Core nicht. Prüfe docker compose logs periphery oder sudo journalctl -u periphery.
Onboarding-Schlüssel nicht mehr sichtbar Komodo zeigt ihn nur einmal. Lösche den Schlüssel und lege einen neuen an.
Neuer Stack hat „Config Missing” Es fehlt noch ein Modus mit Inhalt. Wähle „Choose Mode” und speichere.
Eingabe in Feldern löst Tastenkürzel aus Komodo hat Kürzel, die ohne Fokus in einem Feld greifen. Klicke zuerst in das Feld.
Stack erreicht Traefik nicht Der Service muss im Netzwerk web hängen und traefik.enable=true tragen.

Fazit

Komodo ersetzt bei mir kein SSH, nimmt mir aber viel Handarbeit ab: Compose-Dateien liegen versioniert in Git, ein Push deployt sie, ein nächtlicher Lauf sichert die Konfiguration, und mehrere Server teilen sich eine Oberfläche.

Nutzt du Komodo oder eine andere Oberfläche für Docker? Schreib es gerne in die Kommentare.

FAQ

Häufige Fragen

Was ist Komodo?

Komodo ist eine Open-Source-Weboberfläche zum Verwalten von Docker-Containern, Compose-Stacks und Servern. Sie besteht aus dem Core mit Oberfläche und API, einer MongoDB und einem Agenten (Periphery) auf jedem verwalteten Server.

Wie viel RAM braucht Komodo?

In meinem Test belegten Core etwa 163 MiB, Periphery 162 MiB und MongoDB 275 MiB. Zusammen sind das gut 600 MB. Mit Traefik und ein paar Diensten sollte der Server mindestens 2 GB haben.

Brauche ich Traefik für Komodo?

Nein. Du kannst Komodo auch hinter Caddy, Nginx oder einem anderen Reverse Proxy betreiben. Wichtig ist, dass er Anfragen an Port 9120 des Cores weiterreicht und WebSockets unterstützt, weil sich die Agenten darüber verbinden.

Kann ich mehrere Server mit Komodo verwalten?

Ja. Auf jedem weiteren Server installierst du den Periphery-Agenten und verbindest ihn mit einem Onboarding-Schlüssel mit dem Core. Der Agent baut die Verbindung selbst auf, auf dem neuen Server musst du dafür keinen Port freigeben.

Wie sichere ich Komodo?

Die vorinstallierte Prozedur Backup Core Database sichert die Konfiguration täglich um 01:00 Uhr nach /etc/komodo/backups. Kopiere diesen Ordner auf einen anderen Rechner. Die Daten deiner Container sichert sie nicht, dafür brauchst du ein eigenes Backup der Volumes.

Wie aktualisiere ich Komodo?

Wechsle in das Verzeichnis mit der compose.yaml und führe docker compose pull und docker compose up -d aus. Mit dem Tag 2 bleibst du innerhalb der Hauptversion 2. Vor einem Sprung auf die nächste Hauptversion solltest du die Release Notes lesen und ein Backup machen.

Kann ich Stacks aus privaten Git-Repositories deployen?

Ja. Unter Einstellungen → Providers hinterlegst du ein Konto mit Zugriffstoken und wählst es im Stack im Feld Account aus.