<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Verwaltung – Serverküche</title><link>https://serverkueche.de/tags/verwaltung/</link><description>Verwaltung – Neueste Beiträge von Serverküche</description><generator>Hugo</generator><language>de-DE</language><managingEditor>feedback@serverkueche.de (Serverküche)</managingEditor><webMaster>feedback@serverkueche.de (Serverküche)</webMaster><copyright>2026 Serverküche</copyright><lastBuildDate>Tue, 29 Sep 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://serverkueche.de/tags/verwaltung/index.xml" rel="self" type="application/rss+xml"/><item><title>Dockge: Compose-Stacks im Browser verwalten</title><link>https://serverkueche.de/tutorials/dockge-compose-verwalten/</link><pubDate>Tue, 29 Sep 2026 00:00:00 +0000</pubDate><author>feedback@serverkueche.de (Serverküche)</author><guid>https://serverkueche.de/tutorials/dockge-compose-verwalten/</guid><description>Dockge 1.5 mit Traefik einrichten: Compose-Stacks im Browser bearbeiten, deployen und Logs live mitlesen – ohne Lock-in, es bleiben normale compose.yaml.</description><content:encoded><![CDATA[<p>Wer mehrere Compose-Stacks betreibt, kennt das: SSH auf, in den richtigen Ordner, <code>docker compose pull &amp;&amp; up -d</code>, Logs prüfen, nächster Stack. Dockge holt genau diese Handgriffe in den Browser –
und schreibt dabei ganz normale <code>compose.yaml</code>-Dateien, die du weiterhin per CLI anfassen kannst.</p>
<h2 id="was-bauen-wir">Was bauen wir?</h2>
<p>Am Ende läuft <strong>Dockge 1.5.0</strong> hinter deinem Traefik unter <code>https://DEINE_DOMAIN</code>. Du legst Stacks
im Browser an, bearbeitest ihre <code>compose.yaml</code>, deployst sie mit einem Klick und siehst die
Ausgabe von <code>docker compose up</code> <strong>live</strong> mitlaufen – inklusive Container-Logs und einer
Bash-Konsole pro Container.</p>
<p>Der entscheidende Unterschied zu schwergewichtigen Docker-Oberflächen: Dockge erfindet kein
eigenes Format. Jeder Stack ist ein Ordner unter <code>/opt/stacks/&lt;name&gt;/</code> mit <code>compose.yaml</code> und
<code>.env</code>. <code>docker compose ls</code> zeigt sie als normale Projekte. Du kannst Dockge morgen abschalten und
weiterarbeiten, als hätte es es nie gegeben – <strong>kein Lock-in</strong>.</p>
<p>Zum Ressourcenbedarf: Der Container belegte im Test rund <strong>143 MiB RAM</strong> bei praktisch keiner
CPU-Last. Das Image ist mit <strong>1,17 GB</strong> allerdings kein Leichtgewicht – für einen VPS mit kleiner
Systemplatte ein Posten, den man kennen sollte.</p>
<div class="not-prose my-6 rounded-lg border-l-4 p-4 border-paprika-400 bg-paprika-50 dark:border-paprika-700 dark:bg-paprika-900/20">
  <p class="mb-1 flex items-center gap-2 font-semibold text-slate-900 dark:text-white">
    <span aria-hidden="true">🔥</span>Dockge ist Root auf deinem Server
  </p>
  <div class="prose-kitchen text-sm">Dockge braucht den Docker-Socket (<code>/var/run/docker.sock</code>). Wer Zugriff auf diese Oberfläche hat,
kann beliebige Container starten – auch privilegierte – und damit <strong>den ganzen Host übernehmen</strong>.
Deshalb gilt hier härter als bei jeder anderen App: nur über HTTPS erreichbar, langes einmaliges
Passwort, und wenn möglich zusätzlich auf deine eigene IP beschränken (siehe
<a href="/tutorials/firewall-ufw-einrichten/">Firewall mit UFW</a>). Ein Dockge im offenen Internet mit
schwachem Passwort ist ein übernommener Server.</div>
</div>
<h2 id="voraussetzungen">Voraussetzungen</h2>
<ul>
<li>Ein Server mit Debian 13 und Docker (getestet auf einem netcup VPS mit Docker 29.6.1 und
Compose v5.3.1)</li>
<li><a href="/tutorials/docker-compose-grundlagen/">Docker-Compose-Grundlagen</a> – Dockge nimmt dir nicht das
Verständnis ab, sondern die Tipparbeit</li>
<li>Ein <strong>laufender Traefik</strong> samt <code>proxy</code>-Netz wie im
<a href="/tutorials/reverse-proxy-traefik/">Reverse Proxy mit Traefik</a></li>
<li>Eine Subdomain, die auf den Server zeigt
(<a href="/tutorials/domain-mit-server-verbinden/">Domain verbinden</a>)</li>
</ul>
<div class="not-prose my-6 overflow-hidden rounded-xl border border-paprika-200 bg-paprika-50 dark:border-paprika-800 dark:bg-paprika-900/20"
     data-track-content data-content-name="Affiliate-Box · /tutorials/dockge-compose-verwalten/" data-content-piece="VPS 1000 G12.5">
  <div class="flex items-center justify-between border-b border-paprika-200 bg-paprika-100 px-4 py-1.5 text-xs font-semibold uppercase tracking-wide text-paprika-700 dark:border-paprika-800 dark:bg-paprika-900/40 dark:text-paprika-300">
    <span>🍳 Empfehlung</span>
    <span title="Mit * markierte Links sind Affiliate-Links.">Anzeige</span>
  </div>
  <div class="flex flex-col gap-4 p-4 sm:flex-row sm:items-center sm:justify-between">
    <div>
      <p class="text-lg font-bold text-slate-900 dark:text-white">VPS 1000 G12.5</p>
      <p class="mt-1 text-sm text-slate-600 dark:text-slate-300">4 vCore · 8 GB RAM · 128 GB SSD</p>
      <p class="mt-1 text-sm font-semibold text-paprika-700 dark:text-paprika-400">ab 14,50 €/Monat</p>
      <p class="mt-2 text-sm text-slate-600 dark:text-slate-400">Dockge selbst ist winzig – entscheidend ist, was du damit betreibst.</p>
    </div>
    <a href="https://www.netcup.com/de/server/vps/vps-1000-g12.5-24m-eu?ref=44083#vps-1000-g12.5-12m-eu" rel="sponsored noopener" target="_blank"
   data-track-event="Affiliate|netcup: Affiliate-Box|VPS 1000 G12.5 · {page}"
   class="inline-flex shrink-0 items-center justify-center rounded-lg bg-paprika-600 px-5 py-2.5 font-semibold text-white transition-colors hover:bg-paprika-700">
  Zu netcup →
</a>

  </div><div class="px-4 pb-4"><div class="not-prose my-3 rounded-lg border border-herb-500/40 bg-herb-50 px-3 py-2 text-sm text-slate-700 dark:bg-herb-900/20 dark:text-slate-200"
     data-voucher-pool="vps-1000" data-voucher-codes="[&#34;6877nc17905136544&#34;,&#34;6877nc17905136543&#34;,&#34;6877nc17905136542&#34;,&#34;6877nc17905136541&#34;,&#34;6877nc17905136540&#34;,&#34;6877nc17905133999&#34;,&#34;6877nc17905133998&#34;,&#34;6877nc17905133997&#34;,&#34;6877nc17905133996&#34;,&#34;6877nc17905133995&#34;,&#34;6877nc17905133994&#34;,&#34;6877nc17905133993&#34;,&#34;6877nc17905133992&#34;,&#34;6877nc17905133991&#34;,&#34;6877nc17905133990&#34;]">
  <p class="flex flex-wrap items-center gap-x-2 gap-y-1">
    <span>💶 <span class="font-semibold">1 Monat gratis</span> für netcup-Neukunden:</span>
    <button type="button" data-voucher-code data-track-voucher="6877nc17905136544"
            title="Zum Kopieren klicken" class="cursor-pointer rounded bg-white px-2 py-0.5 font-mono text-sm font-semibold text-herb-800 hover:ring-2 hover:ring-herb-500/40 dark:bg-slate-800 dark:text-herb-400">6877nc17905136544</button>
    <button type="button" data-voucher-next hidden
            class="rounded border border-herb-500/40 px-2 py-0.5 text-xs text-herb-800 hover:bg-white dark:text-herb-400 dark:hover:bg-slate-800">anderer Code</button>
  </p>
  <p class="mt-1 text-xs text-slate-500 dark:text-slate-400">
    Einmal einlösbar, gilt für VPS 1000 G12.5.
    <a href="https://www.netcup.com/de/checkout/warenkorb?ref=44083" rel="sponsored noopener" target="_blank"
       data-track-event="Affiliate|netcup: Gutschein einlösen|VPS 1000 G12.5 · {page}"
       class="font-medium text-herb-800 underline underline-offset-2 hover:text-herb-900 dark:text-herb-400">Im Warenkorb einlösen →</a>
  </p><p class="mt-2 flex flex-wrap items-center gap-x-2 gap-y-1 border-t border-herb-500/30 pt-2">
    <span>💶 <span class="font-semibold">5 € Gutschein</span> für netcup-Neukunden:</span>
    <button type="button" data-voucher-code data-track-voucher="36nc17844976032"
            title="Zum Kopieren klicken" class="cursor-pointer rounded bg-white px-2 py-0.5 font-mono text-sm font-semibold text-herb-800 hover:ring-2 hover:ring-herb-500/40 dark:bg-slate-800 dark:text-herb-400">36nc17844976032</button>
    <span class="text-xs text-slate-500 dark:text-slate-400">immer gültig · nicht für Domains und VPS Lite</span>
  </p>
</div></div>
</div>

<h2 id="schritt-für-schritt">Schritt für Schritt</h2>
<h3 id="1-das-stacks-verzeichnis-festlegen">1. Das Stacks-Verzeichnis festlegen</h3>
<p>Dockge verwaltet <strong>alle Stacks unterhalb eines Ordners</strong>. Standard ist <code>/opt/stacks</code>, und dabei
bleiben wir – das passt zur Konvention aus den anderen Rezepten:</p>
<div class="sk-code">
  <span class="sk-code-head">Terminal</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">mkdir -p /opt/stacks /opt/dockge/data</span></span></code></pre></div>
</div>
<div class="not-prose my-6 rounded-lg border-l-4 p-4 border-amber-400 bg-amber-50 dark:border-amber-700 dark:bg-amber-900/20">
  <p class="mb-1 flex items-center gap-2 font-semibold text-slate-900 dark:text-white">
    <span aria-hidden="true">⚠️</span>Host- und Container-Pfad müssen identisch sein
  </p>
  <div class="prose-kitchen text-sm">Der Pfad muss innerhalb <strong>und</strong> außerhalb des Containers gleich lauten, also
<code>/opt/stacks:/opt/stacks</code>. Dockge ruft <code>docker compose</code> über den Socket des Hosts auf – der Daemon
interpretiert Pfade daher aus <strong>Host</strong>-Sicht. Mountest du <code>/opt/stacks</code> etwa nach <code>/app/stacks</code>,
findet Dockge die Dateien in seiner eigenen Ansicht, der Daemon aber nicht: Deploys scheitern mit
„no such file or directory&quot;.</div>
</div>
<h3 id="2-compose-datei-für-dockge">2. Compose-Datei für Dockge</h3>
<p>Lege <code>/opt/dockge/compose.yaml</code> an und ersetze <code>DEINE_DOMAIN</code>:</p>
<div class="sk-code">
  <span class="sk-code-head">YAML</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">services</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">dockge</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">louislam/dockge:1.5.0</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">restart</span><span class="p">:</span><span class="w"> </span><span class="l">unless-stopped</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">environment</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">DOCKGE_STACKS_DIR</span><span class="p">:</span><span class="w"> </span><span class="l">/opt/stacks</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">volumes</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">/var/run/docker.sock:/var/run/docker.sock</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">./data:/app/data</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">/opt/stacks:/opt/stacks</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">networks</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="l">proxy]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">labels</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s2">&#34;traefik.enable=true&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s2">&#34;traefik.http.routers.dockge.rule=Host(`DEINE_DOMAIN`)&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s2">&#34;traefik.http.routers.dockge.entrypoints=websecure&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s2">&#34;traefik.http.routers.dockge.tls.certresolver=le&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s2">&#34;traefik.http.services.dockge.loadbalancer.server.port=5001&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">networks</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">proxy</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">external</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div>
</div>
<p>Was hier zusammenspielt:</p>
<ul>
<li><strong><code>DOCKGE_STACKS_DIR</code></strong> muss genau dem Mount-Ziel entsprechen (Schritt 1).</li>
<li><strong><code>./data</code></strong> hält Dockges eigene SQLite-Datenbank: Benutzer, Einstellungen, JWT-Secret.</li>
<li><strong><code>loadbalancer.server.port=5001</code></strong> – Dockge lauscht im Container auf 5001. Wir veröffentlichen
<strong>keinen</strong> Port nach außen; nur Traefik erreicht ihn über das <code>proxy</code>-Netz.</li>
<li>Kein <code>user:</code>-Eintrag: Dockge muss über den Socket mit dem Docker-Daemon reden und die
Stack-Dateien schreiben.</li>
</ul>
<p>Starten:</p>
<div class="sk-code">
  <span class="sk-code-head">Terminal</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nb">cd</span> /opt/dockge <span class="o">&amp;&amp;</span> docker compose up -d</span></span></code></pre></div>
</div>
<div class="sk-code">
  <span class="sk-code-head">Terminal</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">docker compose ps</span></span></code></pre></div>
</div>
<p>Der Container bringt einen Healthcheck mit, du solltest also <code>(healthy)</code> sehen:</p>
<div class="sk-code">
  <span class="sk-code-head">Ausgabe</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">NAME              STATUS
</span></span><span class="line"><span class="cl">dockge-dockge-1   Up 12 seconds (healthy)</span></span></code></pre></div>
</div>
<p>Ein Blick in die Logs bestätigt den ersten Start:</p>
<div class="sk-code">
  <span class="sk-code-head">Terminal</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">docker logs --tail <span class="m">5</span> dockge-dockge-1</span></span></code></pre></div>
</div>
<div class="sk-code">
  <span class="sk-code-head">Ausgabe</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">[SERVER] INFO: Connected to the database
</span></span><span class="line"><span class="cl">[SERVER] INFO: JWT secret is not found, generate one.
</span></span><span class="line"><span class="cl">[SERVER] INFO: Stored JWT secret into database
</span></span><span class="line"><span class="cl">[SERVER] INFO: No user, need setup
</span></span><span class="line"><span class="cl">[SERVER] INFO: Listening on 5001</span></span></code></pre></div>
</div>
<p><code>No user, need setup</code> heißt: Der Server wartet auf dein Admin-Konto.</p>
<h3 id="3-admin-konto-anlegen">3. Admin-Konto anlegen</h3>
<p>Ruf <code>https://DEINE_DOMAIN</code> auf. Dockge leitet auf <code>/setup</code> und verlangt Benutzername und
Passwort. Die Oberfläche richtet sich nach der Sprache deines Browsers – bei einem deutschen
Browser also gleich auf Deutsch.</p>
<p><figure class="my-6"><img src="/tutorials/dockge-compose-verwalten/setup_hu_a3f1e60ba08678c8.webp" srcset="/tutorials/dockge-compose-verwalten/setup_hu_69b8a04c6e10075a.webp 480w, /tutorials/dockge-compose-verwalten/setup_hu_a3f1e60ba08678c8.webp 768w, /tutorials/dockge-compose-verwalten/setup_hu_d707999886d5e1a4.webp 1200w, /tutorials/dockge-compose-verwalten/setup_hu_1a649adef561535b.webp 1920w" sizes="(min-width: 768px) 768px, 100vw"
    width="768" height="432"
    data-full="/tutorials/dockge-compose-verwalten/setup_hu_99211e180d47193e.webp"
    alt="Die Dockge-Einrichtungsseite „Erstelle dein Admin-Konto&quot; mit Sprachauswahl und Feldern für Benutzername und Passwort" title="Erster Aufruf: Admin-Konto anlegen"
    loading="lazy" decoding="async" class="rounded-lg"><figcaption class="mt-2 text-sm text-center text-slate-500 italic">Erster Aufruf: Admin-Konto anlegen</figcaption></figure></p>
<p>Danach ist der Weg zu: Eine offene Registrierung gibt es nicht, weitere Konten legst du in den
Einstellungen an. Nimm ein langes, einmaliges Passwort aus dem
<a href="/tutorials/vaultwarden-passwortmanager/">Passwortmanager</a> – siehe Warnung oben.</p>
<h3 id="4-die-startseite-verstehen">4. Die Startseite verstehen</h3>
<p>Nach dem Login siehst du alle Compose-Projekte, die Docker auf dem Host kennt – im Beispiel den
vorhandenen <code>traefik</code>-Stack und den gerade angelegten:</p>
<p><figure class="my-6"><img src="/tutorials/dockge-compose-verwalten/stackliste_hu_f01af3042d0305c3.webp" srcset="/tutorials/dockge-compose-verwalten/stackliste_hu_715a056a343d6c03.webp 480w, /tutorials/dockge-compose-verwalten/stackliste_hu_f01af3042d0305c3.webp 768w, /tutorials/dockge-compose-verwalten/stackliste_hu_f90ab1805287b7a1.webp 1200w, /tutorials/dockge-compose-verwalten/stackliste_hu_f0316f72e354e1f5.webp 1920w" sizes="(min-width: 768px) 768px, 100vw"
    width="768" height="432"
    data-full="/tutorials/dockge-compose-verwalten/stackliste_hu_fe9017e7a06178b2.webp"
    alt="Die Dockge-Startseite mit der Liste aktiver Stacks, Zählern für aktiv, beendet und inaktiv sowie dem Bereich Dockge Agenten" title="Startseite: alle Stacks mit Status auf einen Blick"
    loading="lazy" decoding="async" class="rounded-lg"><figcaption class="mt-2 text-sm text-center text-slate-500 italic">Startseite: alle Stacks mit Status auf einen Blick</figcaption></figure></p>
<p>Links zählt Dockge nach <code>aktiv</code>, <code>beendet</code> und <code>inaktiv</code>. Wichtig: In der Liste erscheinen
<strong>alle</strong> Projekte, verwalten kann Dockge aber nur die unterhalb von <code>/opt/stacks</code>. Wie du
bestehende Stacks übernimmst, steht in Schritt 7.</p>
<h3 id="5-ersten-stack-anlegen-und-deployen">5. Ersten Stack anlegen und deployen</h3>
<p>Klick oben auf <strong>Compose</strong>. Du landest im Editor: links ein Formular für Stack-Name und Container,
rechts die <code>compose.yaml</code> – beide Seiten sind verbunden, du kannst also klicken <strong>oder</strong> YAML
schreiben.</p>
<p><figure class="my-6"><img src="/tutorials/dockge-compose-verwalten/editor_hu_a3a8fa3a1f919699.webp" srcset="/tutorials/dockge-compose-verwalten/editor_hu_3b2ed5d1493aaf3b.webp 480w, /tutorials/dockge-compose-verwalten/editor_hu_a3a8fa3a1f919699.webp 768w, /tutorials/dockge-compose-verwalten/editor_hu_8910a2e390693745.webp 1200w, /tutorials/dockge-compose-verwalten/editor_hu_316f0f7b3dc68054.webp 1920w" sizes="(min-width: 768px) 768px, 100vw"
    width="768" height="432"
    data-full="/tutorials/dockge-compose-verwalten/editor_hu_d641727d398bba43.webp"
    alt="Der Dockge-Compose-Editor mit Feld für den Stack-Namen, Container-Formular und dem YAML-Editor daneben" title="Der Editor: Formular und YAML halten sich gegenseitig aktuell"
    loading="lazy" decoding="async" class="rounded-lg"><figcaption class="mt-2 text-sm text-center text-slate-500 italic">Der Editor: Formular und YAML halten sich gegenseitig aktuell</figcaption></figure></p>
<p>Gib dem Stack einen Namen (nur Kleinbuchstaben – daraus werden Ordner- und Projektname) und passe
das YAML an. Ein Klick auf <strong>Deployen</strong> führt <code>docker compose up -d</code> aus, und die echte Ausgabe
läuft im Terminalfenster mit:</p>
<p><figure class="my-6"><img src="/tutorials/dockge-compose-verwalten/deployed_hu_c8442bb5f4a87775.webp" srcset="/tutorials/dockge-compose-verwalten/deployed_hu_284c4e7922c00ece.webp 480w, /tutorials/dockge-compose-verwalten/deployed_hu_c8442bb5f4a87775.webp 768w, /tutorials/dockge-compose-verwalten/deployed_hu_64c81b68f53b02d0.webp 1200w, /tutorials/dockge-compose-verwalten/deployed_hu_6ee9e7dafecfa50c.webp 1920w" sizes="(min-width: 768px) 768px, 100vw"
    width="768" height="432"
    data-full="/tutorials/dockge-compose-verwalten/deployed_hu_529092ed84850086.webp"
    alt="Ein gerade deployter Stack in Dockge mit laufendem Container, Live-Logs des nginx-Containers und der compose.yaml darunter" title="Nach dem Deploy: Live-Logs direkt im Browser"
    loading="lazy" decoding="async" class="rounded-lg"><figcaption class="mt-2 text-sm text-center text-slate-500 italic">Nach dem Deploy: Live-Logs direkt im Browser</figcaption></figure></p>
<p>Der Container-Eintrag zeigt Status und veröffentlichte Ports, darunter laufen die Logs weiter. Pro
Container gibt es zusätzlich einen <strong>Bash</strong>-Knopf, der eine Konsole im Container öffnet –
praktisch, um schnell eine Konfiguration nachzusehen.</p>
<h3 id="6-was-auf-der-platte-passiert">6. Was auf der Platte passiert</h3>
<p>Das ist der Teil, der Dockge von schwergewichtigen Oberflächen unterscheidet. Nach dem Deploy
liegt auf dem Server genau das, was du erwartest:</p>
<div class="sk-code">
  <span class="sk-code-head">Terminal</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">find /opt/stacks -type f</span></span></code></pre></div>
</div>
<div class="sk-code">
  <span class="sk-code-head">Ausgabe</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">/opt/stacks/whoami-test/.env
</span></span><span class="line"><span class="cl">/opt/stacks/whoami-test/compose.yaml</span></span></code></pre></div>
</div>
<p>Und Docker kennt den Stack als ganz normales Compose-Projekt:</p>
<div class="sk-code">
  <span class="sk-code-head">Terminal</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">docker compose ls</span></span></code></pre></div>
</div>
<div class="sk-code">
  <span class="sk-code-head">Ausgabe</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">NAME                STATUS              CONFIG FILES
</span></span><span class="line"><span class="cl">dockge              running(1)          /opt/dockge/compose.yaml
</span></span><span class="line"><span class="cl">traefik             running(1)          /opt/traefik/compose.yaml
</span></span><span class="line"><span class="cl">whoami-test         running(1)          /opt/stacks/whoami-test/compose.yaml</span></span></code></pre></div>
</div>
<p>Du kannst also jederzeit per SSH in den Ordner wechseln und normal weiterarbeiten:</p>
<div class="sk-code">
  <span class="sk-code-head">Terminal</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nb">cd</span> /opt/stacks/whoami-test <span class="o">&amp;&amp;</span> docker compose ps</span></span></code></pre></div>
</div>
<div class="sk-code">
  <span class="sk-code-head">Ausgabe</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">NAME                   STATUS         PORTS
</span></span><span class="line"><span class="cl">whoami-test-nginx-1    Up 35 seconds  0.0.0.0:8080-&gt;80/tcp, [::]:8080-&gt;80/tcp</span></span></code></pre></div>
</div>
<p>Beides gilt gleichzeitig: Änderungen im Browser sieht die CLI, Änderungen per CLI sieht der
Browser nach dem Neuladen. Dockge ist eine Fernbedienung, kein neues System.</p>
<h3 id="7-bestehende-stacks-übernehmen">7. Bestehende Stacks übernehmen</h3>
<p>Ein Stack außerhalb von <code>/opt/stacks</code> erscheint in der Liste, lässt sich aber nicht anfassen –
Dockge sagt das klar: „Dieser Stack wird nicht von Dockge verwaltet.&quot; Es gibt weder Bearbeiten-
noch Deploy-Knopf.</p>
<p>Zum Übernehmen verschiebst du den Ordner. Angenommen, dein Stack liegt in <code>/opt/meinapp</code>:</p>
<div class="sk-code">
  <span class="sk-code-head">Terminal</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nb">cd</span> /opt/meinapp <span class="o">&amp;&amp;</span> docker compose down
</span></span><span class="line"><span class="cl">mv /opt/meinapp /opt/stacks/meinapp
</span></span><span class="line"><span class="cl"><span class="nb">cd</span> /opt/stacks/meinapp <span class="o">&amp;&amp;</span> docker compose up -d</span></span></code></pre></div>
</div>
<p>Der Projektname leitet sich vom Ordnernamen ab – bleibt der gleich, laufen deine Container unter
denselben Namen weiter und <strong>benannte Volumes bleiben erhalten</strong>. Danach verwaltet Dockge den
Stack vollständig:</p>
<p><figure class="my-6"><img src="/tutorials/dockge-compose-verwalten/uebernommen_hu_e7bb9415d38f2298.webp" srcset="/tutorials/dockge-compose-verwalten/uebernommen_hu_76f77361fb31003c.webp 480w, /tutorials/dockge-compose-verwalten/uebernommen_hu_e7bb9415d38f2298.webp 768w, /tutorials/dockge-compose-verwalten/uebernommen_hu_77c29f8b058e0d04.webp 1200w, /tutorials/dockge-compose-verwalten/uebernommen_hu_cd06c181d0aa54cf.webp 1920w" sizes="(min-width: 768px) 768px, 100vw"
    width="768" height="432"
    data-full="/tutorials/dockge-compose-verwalten/uebernommen_hu_69efa000b996364f.webp"
    alt="Ein übernommener Stack in Dockge mit den Schaltflächen Bearbeiten, Neustarten, Aktualisieren, Anhalten und Löschen sowie Live-Logs des Containers" title="Nach dem Verschieben: Bearbeiten, Neustarten, Aktualisieren, Anhalten, Löschen"
    loading="lazy" decoding="async" class="rounded-lg"><figcaption class="mt-2 text-sm text-center text-slate-500 italic">Nach dem Verschieben: Bearbeiten, Neustarten, Aktualisieren, Anhalten, Löschen</figcaption></figure></p>
<div class="not-prose my-6 rounded-lg border-l-4 p-4 border-herb-400 bg-herb-50 dark:border-herb-700 dark:bg-herb-900/20">
  <p class="mb-1 flex items-center gap-2 font-semibold text-slate-900 dark:text-white">
    <span aria-hidden="true">🧑‍🍳</span>Tipp
  </p>
  <div class="prose-kitchen text-sm">Nimm dir nicht alles auf einmal vor: einen unkritischen Stack verschieben, prüfen, dann den
nächsten. Deinen <strong>Traefik</strong> würde ich zuletzt anfassen – wenn dabei etwas schiefgeht, ist auch
Dockge nicht mehr erreichbar.</div>
</div>
<h3 id="8-docker-run-befehle-umwandeln">8. <code>docker run</code>-Befehle umwandeln</h3>
<p>Viele Projekte dokumentieren nur einen langen <code>docker run</code>-Befehl. Auf der Startseite gibt es
dafür ein Feld: Befehl einfügen, <strong>In Compose-Syntax umwandeln</strong> klicken – und du landest im
Editor mit fertigem YAML. Aus</p>
<div class="sk-code">
  <span class="sk-code-head">Terminal</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">docker run -d --name uptime -p 3001:3001 -v uptime-data:/app/data <span class="se">\
</span></span></span><span class="line"><span class="cl">  --restart unless-stopped louislam/uptime-kuma:2.5.3</span></span></code></pre></div>
</div>
<p>wird:</p>
<div class="sk-code">
  <span class="sk-code-head">YAML</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">services</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">uptime-kuma</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">container_name</span><span class="p">:</span><span class="w"> </span><span class="l">uptime</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">ports</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="m">3001</span><span class="p">:</span><span class="m">3001</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">volumes</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">uptime-data:/app/data</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">restart</span><span class="p">:</span><span class="w"> </span><span class="l">unless-stopped</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">louislam/uptime-kuma:2.5.3</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">volumes</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">uptime-data</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">external</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">uptime-data</span></span></span></code></pre></div>
</div>
<p>Sehr praktisch – mit einer Falle: Das benannte Volume wird als <strong><code>external: true</code></strong> eingetragen,
also als „existiert schon&quot;. Bei einer Neuinstallation gibt es das Volume aber noch nicht, und der
Deploy scheitert. Entweder die beiden Zeilen löschen (dann legt Compose das Volume selbst an)
oder das Volume vorher mit <code>docker volume create uptime-data</code> anlegen. Zum Unterschied siehe
<a href="/tutorials/docker-volumes-vs-bind-mounts/">Volumes vs. Bind Mounts</a>.</p>
<h3 id="9-konsole-und-agenten--bewusst-entscheiden">9. Konsole und Agenten – bewusst entscheiden</h3>
<p>Zwei Funktionen solltest du kennen, bevor du sie einschaltest:</p>
<p><strong>Konsole.</strong> Der Menüpunkt „Konsole&quot; ist im Standard <strong>deaktiviert</strong>, und das ist gut so. Dockge
sagt selbst, warum: Sie erlaubt beliebige Befehle <em>innerhalb</em> des Dockge-Containers – und der hat
den Docker-Socket. Aktiviert bedeutet das eine Root-Shell auf deinen Host im Browser. Lass sie
aus; für den seltenen Fall reicht SSH.</p>
<p><strong>Agenten (beta).</strong> Dockge kann weitere Server einbinden und deren Stacks in derselben Oberfläche
verwalten. Das ist praktisch, wenn du mehrere Maschinen betreibst – die Funktion ist aber als
<strong>beta</strong> gekennzeichnet, und jeder eingebundene Agent vergrößert den Schaden, wenn diese eine
Oberfläche kompromittiert wird. Für den Anfang: ein Server, ein Dockge.</p>
<h3 id="10-updates-per-klick">10. Updates per Klick</h3>
<p>Der Knopf <strong>Aktualisieren</strong> an einem Stack macht genau das, was du sonst tippst: neue Images holen
und den Stack neu hochfahren. Ist das Image schon aktuell, passiert nichts – im Test lief der
Container danach unverändert weiter (gleiche Startzeit), es wird also nicht ohne Grund neu
gestartet. Das ist bequem – und genau deshalb solltest du deine Images weiter <strong>pinnen</strong> statt
<code>latest</code> zu verwenden. Sonst wird aus einem Klick ein Sprung über mehrere Hauptversionen,
ohne dass du es merkst. Warum das zählt, steht in
<a href="/tutorials/docker-stack-aktuell-halten/">Docker-Stack aktuell halten</a>.</p>
<h2 id="wenn-es-nicht-funktioniert">Wenn es nicht funktioniert</h2>
<div class="troubleshoot not-prose">
<p><strong>Traefik antwortet mit 404, obwohl der Container <code>healthy</code> ist.</strong> Meist fehlt
<code>traefik.http.services.dockge.loadbalancer.server.port=5001</code>. Dockge lauscht im Container auf
5001; ohne die Zeile rät Traefik. Prüfe außerdem, dass der Container im <code>proxy</code>-Netz hängt.</p>
<p><strong>Der Deploy bricht mit „no such file or directory&quot; ab.</strong> Host- und Container-Pfad des
Stacks-Verzeichnisses stimmen nicht überein. Es muss <code>/opt/stacks:/opt/stacks</code> gemountet und
<code>DOCKGE_STACKS_DIR=/opt/stacks</code> gesetzt sein – Dockge lässt den Docker-Daemon des Hosts arbeiten,
und der kennt nur Host-Pfade.</p>
<p><strong>Ein Stack ist sichtbar, aber alle Knöpfe fehlen.</strong> Dann liegt er außerhalb von <code>/opt/stacks</code>,
und Dockge zeigt „Dieser Stack wird nicht von Dockge verwaltet.&quot; Verschiebe den Ordner wie in
Schritt 7 – Dockge übernimmt ihn nicht von selbst und legt auch keine Kopie an.</p>
<p><strong>Der Stack-Name wird abgelehnt.</strong> Erlaubt sind nur Kleinbuchstaben, Ziffern und Bindestriche,
weil daraus Ordner- und Compose-Projektname werden. <code>Meine App</code> geht nicht, <code>meine-app</code> schon.</p>
<p><strong>Nach einem Neustart ist die Anmeldung weg.</strong> Dann wurde <code>./data</code> nicht persistent gemountet –
dort liegen Datenbank und JWT-Secret. Prüfe, dass <code>/opt/dockge/data</code> existiert und im Compose
eingebunden ist.</p>
<p><strong>Die Oberfläche ist englisch, obwohl der Browser auf Deutsch steht.</strong> Dockge richtet sich nach
dem Browser und fällt bei unbekannten Kombinationen auf Englisch zurück; in den Einstellungen
lässt sich die Sprache fest wählen.</p>

</div>
<p class="mt-3 text-sm text-slate-500 dark:text-slate-400">
  Dein Problem ist nicht dabei?
  <a href="/fehler/" class="font-medium text-paprika-700 hover:underline dark:text-paprika-400">Alle Fehlermeldungen durchsuchen →</a>
</p>

<h2 id="wartung--backups">Wartung &amp; Backups</h2>
<p><strong>Ehrlich zum Projektstand.</strong> Dockge ist beliebt (rund 24.000 Sterne) und wird weiter entwickelt –
die letzten Commits im Repository stammen aus dem April 2026, unter anderem Container-Steuerung
und eine Ressourcen-Anzeige. <strong>Die letzte stabile Version 1.5.0 ist aber vom 30. März 2025</strong>, also
über ein Jahr alt. Es gibt einen <code>nightly</code>-Tag mit den neueren Funktionen – der ist ausdrücklich
kein Release.</p>
<p>Praktisch heißt das: Bleib auf <code>1.5.0</code> (mit Docker 29.6.1 und Compose v5.3.1 im Test völlig
problemlos), erwarte keine schnellen Fehlerbehebungen und triff keine Betriebsentscheidung, die
darauf baut, dass morgen eine neue Version kommt. Für „Stacks bequem verwalten&quot; reicht das – du
solltest nur wissen, worauf du dich einlässt.</p>
<p><strong>Dockge selbst aktualisieren</strong> geht wie bei jedem Stack, aber von der CLI aus (die Oberfläche kann
sich nicht selbst neu starten):</p>
<div class="sk-code">
  <span class="sk-code-head">Terminal</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nb">cd</span> /opt/dockge <span class="o">&amp;&amp;</span> docker compose pull <span class="o">&amp;&amp;</span> docker compose up -d</span></span></code></pre></div>
</div>
<p><strong>Backup.</strong> Zwei Dinge gehören gesichert, und beide sind klein:</p>
<ul>
<li><code>/opt/dockge/data</code> – Dockges Datenbank mit Konten und Einstellungen</li>
<li><code>/opt/stacks</code> – <strong>hier steckt die eigentliche Arbeit</strong>: alle <code>compose.yaml</code>- und <code>.env</code>-Dateien
deiner Dienste</li>
</ul>
<p>Damit ist <code>/opt/stacks</code> ab jetzt dein zentraler Konfigurationsort – ein Grund mehr, ihn mit
<a href="/tutorials/backups-mit-restic/">Restic</a> täglich zu sichern. Die Daten deiner Anwendungen (Volumes,
Bind Mounts) sichert Dockge dagegen <strong>nicht</strong>; die brauchen weiterhin ihre eigene Strategie.</p>
<p><strong>Zugriff regelmäßig prüfen.</strong> Weil Dockge Root-Rechte auf dem Host bedeutet, gehört zur Wartung
die Frage: Wer kommt eigentlich dran? Die Traefik-Logs zeigen, wer die Anmeldeseite aufruft –
tauchen dort fremde IPs auf, ist eine IP-Beschränkung oder ein Zugang nur über
<a href="/tutorials/wireguard-vpn-einrichten/">WireGuard</a> die bessere Antwort als ein noch längeres
Passwort.</p>
]]></content:encoded></item></channel></rss>