<?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>Updates – Serverküche</title><link>https://serverkueche.de/tags/updates/</link><description>Updates – 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>Sat, 18 Jul 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://serverkueche.de/tags/updates/index.xml" rel="self" type="application/rss+xml"/><item><title>unattended-upgrades: automatische Sicherheitsupdates für Debian</title><link>https://serverkueche.de/tutorials/automatische-updates-unattended-upgrades/</link><pubDate>Sat, 18 Jul 2026 00:00:00 +0000</pubDate><author>feedback@serverkueche.de (Serverküche)</author><guid>https://serverkueche.de/tutorials/automatische-updates-unattended-upgrades/</guid><description>Debian installiert Sicherheitsupdates automatisch: unattended-upgrades einrichten, den Neustart steuern und prüfen, dass es wirklich läuft.</description><content:encoded><![CDATA[<p>„Denk dran, wöchentlich Updates einzuspielen&quot; – dieser Satz aus den
Wartungsabschnitten der anderen Tutorials ist der erste, den man vergisst. Genau
deshalb übernimmt das ab jetzt der Server selbst: <strong>unattended-upgrades</strong> installiert
Sicherheitsupdates automatisch. Das schließt die gefährlichste Lücke im Selfhosting –
den Server, der monatelang ungepatcht läuft.</p>
<h2 id="was-bauen-wir">Was bauen wir?</h2>
<p>Am Ende zieht dein <strong>Debian 13</strong> täglich automatisch <strong>Sicherheitsupdates</strong> und
installiert sie ohne dein Zutun. Du entscheidest, ob und wann der Server für nötige
Kernel-Updates neu startet, und weißt, wie du überprüfst, dass der Automatismus
wirklich greift. Automatisiert werden Sicherheitsupdates und die konservativen
Stable-Punktreleases; größere Upgrades deiner übrigen Software bleiben bewusst in
deiner Hand.</p>
<h2 id="voraussetzungen">Voraussetzungen</h2>
<ul>
<li>Ein <a href="/tutorials/ssh-absichern/">abgesicherter Server</a> mit
<a href="/tutorials/firewall-ufw-einrichten/">aktiver Firewall</a></li>
</ul>
<h2 id="schritt-für-schritt">Schritt für Schritt</h2>
<h3 id="schritt-1-paket-installieren">Schritt 1: Paket installieren</h3>
<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">sudo apt update
</span></span><span class="line"><span class="cl">sudo apt install -y unattended-upgrades apt-listchanges</span></span></code></pre></div>
</div>
<p><code>apt-listchanges</code> zeigt bei Updates die Changelogs – nützlich, wenn du später doch
manuell nachsiehst, was sich geändert hat.</p>
<h3 id="schritt-2-automatik-aktivieren">Schritt 2: Automatik aktivieren</h3>
<p>Der einfachste Weg, die tägliche Ausführung einzuschalten:</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">sudo dpkg-reconfigure -plow unattended-upgrades</span></span></code></pre></div>
</div>
<p>Wähle im Dialog <strong>Ja</strong>. Das legt die Datei <code>/etc/apt/apt.conf.d/20auto-upgrades</code> mit
diesem Inhalt an:</p>
<div class="sk-code">
  <span class="sk-code-head">INI</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ini" data-lang="ini"><span class="line"><span class="cl"><span class="na">APT::Periodic::Update-Package-Lists &#34;1&#34;;</span>
</span></span><span class="line"><span class="cl"><span class="na">APT::Periodic::Unattended-Upgrade &#34;1&#34;;</span></span></span></code></pre></div>
</div>
<p>Die <code>1</code> bedeutet „täglich&quot;: Paketlisten aktualisieren <strong>und</strong> unbeaufsichtigte
Upgrades ausführen. Ausgelöst wird das über die systemd-Timer <code>apt-daily.timer</code>
(Paketlisten) und <code>apt-daily-upgrade.timer</code> (Upgrade-Lauf) – kein eigener
Cronjob nötig.</p>
<h3 id="schritt-3-festlegen-was-aktualisiert-wird">Schritt 3: Festlegen, was aktualisiert wird</h3>
<p>Wirf einen Blick in <code>/etc/apt/apt.conf.d/50unattended-upgrades</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">sudo nano /etc/apt/apt.conf.d/50unattended-upgrades</span></span></code></pre></div>
</div>
<p>Auf Debian 13 sind im Block <code>Origins-Pattern</code> standardmäßig <strong>drei</strong> Quellen aktiv:</p>
<div class="sk-code">
  <span class="sk-code-head">INI</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ini" data-lang="ini"><span class="line"><span class="cl"><span class="na">Unattended-Upgrade::Origins-Pattern {</span>
</span></span><span class="line"><span class="cl">  <span class="na">&#34;origin</span><span class="o">=</span><span class="s">Debian,codename=${distro_codename},label=Debian&#34;;
</span></span></span><span class="line"><span class="cl"><span class="s">  &#34;origin=Debian,codename=${distro_codename},label=Debian-Security&#34;;
</span></span></span><span class="line"><span class="cl"><span class="s">  &#34;origin=Debian,codename=${distro_codename}-security,label=Debian-Security&#34;;</span>
</span></span><span class="line"><span class="cl"><span class="na">};</span></span></span></code></pre></div>
</div>
<p>Die beiden <code>Debian-Security</code>-Zeilen sorgen für <strong>zeitnahe Sicherheitsupdates</strong> – der
eigentliche Zweck. Die erste Zeile (<code>label=Debian</code>) deckt die <strong>konservativen
Stable-Updates</strong> ab, die nur bei Debian-Punktreleases nachrücken; sie ist also kein
Risiko-Rolling-Update, sondern gut abgehangen. Wer wirklich <strong>ausschließlich</strong>
Security-Updates will, kommentiert die erste Zeile mit <code>//</code> aus.</p>
<p>Zwei Optionen lohnt es, hier explizit zu setzen. <strong>Alte Kernel/Pakete automatisch
aufräumen</strong>, sonst läuft irgendwann <code>/boot</code> voll (<code>Remove-Unused-Kernel-Packages</code>
ist code-seitig zwar schon der Default, steht in der Datei aber nur auskommentiert –
explizit gesetzt ist die Entscheidung dokumentiert):</p>
<div class="sk-code">
  <span class="sk-code-head">INI</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ini" data-lang="ini"><span class="line"><span class="cl"><span class="na">Unattended-Upgrade::Remove-Unused-Kernel-Packages &#34;true&#34;;</span>
</span></span><span class="line"><span class="cl"><span class="na">Unattended-Upgrade::Remove-Unused-Dependencies &#34;true&#34;;</span></span></span></code></pre></div>
</div>
<p>Und der wichtigste Punkt – der <strong>automatische Neustart</strong>:</p>
<div class="sk-code">
  <span class="sk-code-head">INI</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ini" data-lang="ini"><span class="line"><span class="cl"><span class="na">Unattended-Upgrade::Automatic-Reboot &#34;true&#34;;</span>
</span></span><span class="line"><span class="cl"><span class="na">Unattended-Upgrade::Automatic-Reboot-Time &#34;04:00&#34;;</span></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>Automatischer Neustart – bewusst entscheiden
  </p>
  <div class="prose-kitchen text-sm">Manche Sicherheitsupdates (v. a. Kernel) wirken erst nach einem Neustart. Mit
<code>Automatic-Reboot &quot;true&quot;</code> startet der Server dann selbstständig – <strong>setze dabei immer
eine <code>Automatic-Reboot-Time</code></strong>: Ohne sie startet der Server <strong>sofort</strong> nach dem
Upgrade-Lauf neu (der Code-Default ist <code>&quot;now&quot;</code>; die <code>02:00</code> in der Beispieldatei sind
nur ein auskommentierter Vorschlag). Wähle eine Zeit mit geringer Nutzung. Willst du
<strong>keine</strong> automatischen Neustarts, lass die Option auf <code>&quot;false&quot;</code> und starte selbst neu,
wenn <code>/var/run/reboot-required</code> existiert. Beides ist vertretbar – nur eine bewusste
Entscheidung muss es sein.</div>
</div>
<p>Damit der automatische Neustart auf Debian überhaupt auslösen kann, fehlt noch ein
Baustein: unattended-upgrades startet nur dann neu, wenn die Markierungsdatei
<code>/var/run/reboot-required</code> existiert – und die legt Debian 13 bei Kernel-Updates von
Haus aus <strong>nicht</strong> an (den zuständigen Hook liefert ein Ubuntu-Hilfspaket, das es in
Debian nicht gibt; nur einzelne Pakete wie <code>dbus</code> setzen die Datei selbst). Ein
Zweizeiler schließt die Lücke:</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">sudo tee /etc/kernel/postinst.d/zz-reboot-required &gt; /dev/null <span class="s">&lt;&lt;&#39;EOF&#39;
</span></span></span><span class="line"><span class="cl"><span class="s">#!/bin/sh
</span></span></span><span class="line"><span class="cl"><span class="s">touch /var/run/reboot-required
</span></span></span><span class="line"><span class="cl"><span class="s">EOF</span>
</span></span><span class="line"><span class="cl">sudo chmod +x /etc/kernel/postinst.d/zz-reboot-required</span></span></code></pre></div>
</div>
<p>Der Hook läuft nach jeder Kernel-Installation und setzt die Markierungsdatei. Ab jetzt
funktionieren sowohl <code>Automatic-Reboot</code> als auch der manuelle Blick auf
<code>/var/run/reboot-required</code> zuverlässig – ohne den Hook würde der automatische Neustart
bei Kernel-Updates schlicht nie ausgelöst.</p>
<h3 id="schritt-4-einen-probelauf-machen">Schritt 4: Einen Probelauf machen</h3>
<p>Ohne echte Installation testen, was unattended-upgrades tun würde:</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">sudo unattended-upgrade --dry-run --debug</span></span></code></pre></div>
</div>
<p>In der Debug-Ausgabe ist diese Zeile entscheidend (auf einem frischen Debian 13,
gekürzt):</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">Allowed origins are: origin=Debian,codename=trixie,label=Debian, origin=Debian,codename=trixie,label=Debian-Security, origin=Debian,codename=trixie-security,label=Debian-Security
</span></span><span class="line"><span class="cl">[...]
</span></span><span class="line"><span class="cl">No packages found that can be upgraded unattended and no pending auto-removals</span></span></code></pre></div>
</div>
<p>Dort müssen die Debian-Security-Quellen auftauchen. Steht dort etwas, greift die
Konfiguration; findet der Lauf nichts zu tun (wie oben), ist schlicht gerade kein
Sicherheitsupdate offen.</p>
<h2 id="wenn-es-nicht-funktioniert">Wenn es nicht funktioniert</h2>
<p><strong>Symptom:</strong> Der Probelauf meldet <code>No packages found that can be upgraded unattended</code>.</p>
<p><strong>Ursache &amp; Lösung:</strong> Meist völlig normal – aktuell steht kein Sicherheitsupdate an.
Prüfe die Konfiguration trotzdem über die <code>Allowed origins are:</code>-Zeile im
<code>--debug</code>-Lauf. Erscheinen dort keine Security-Origins, stimmt das <code>Origins-Pattern</code>
aus Schritt 3 nicht.</p>
<p><strong>Symptom:</strong> Updates kommen, aber der Server startet trotz Kernel-Update nie neu.</p>
<p><strong>Ursache &amp; Lösung:</strong> Entweder steht <code>Automatic-Reboot</code> auf <code>&quot;false&quot;</code> (Standard) –
dann auf <code>&quot;true&quot;</code> setzen (Schritt 3) – oder die Markierungsdatei wird nie gesetzt,
weil der Kernel-Hook <code>/etc/kernel/postinst.d/zz-reboot-required</code> aus Schritt 3 fehlt.
Ohne ihn legt Debian <code>/var/run/reboot-required</code> bei Kernel-Updates nicht an, und der
automatische Neustart löst nie aus.</p>
<p><strong>Symptom:</strong> <code>/boot</code> läuft voll, Updates schlagen fehl.</p>
<p><strong>Ursache &amp; Lösung:</strong> Alte Kernel häufen sich an. <code>Remove-Unused-Kernel-Packages &quot;true&quot;</code>
setzen (Schritt 3); einmalig aufräumen mit <code>sudo apt autoremove --purge</code>.</p>
<p><strong>Symptom:</strong> Ein Paket wird hartnäckig zurückgehalten (<code>kept back</code>).</p>
<p><strong>Ursache &amp; Lösung:</strong> unattended-upgrades installiert keine Updates, die andere
Pakete entfernen würden. Solche Fälle löst du bewusst von Hand mit
<code>sudo apt upgrade</code> und prüfst, was passiert.</p>
<h2 id="wartung--backups">Wartung &amp; Backups</h2>
<ul>
<li><strong>Trotzdem draufschauen:</strong> Automatik ersetzt nicht die Aufmerksamkeit. Wirf
monatlich einen Blick ins Log <code>/var/log/unattended-upgrades/unattended-upgrades.log</code>
und lauf ab und zu <code>sudo apt update &amp;&amp; sudo apt upgrade</code> für die <strong>nicht</strong>
sicherheitskritischen Updates.</li>
<li><strong>Reboots einplanen:</strong> Wenn du automatische Neustarts nutzt, sorge dafür, dass
deine Dienste einen Reboot sauber überstehen (<code>restart: unless-stopped</code> in
<a href="/tutorials/docker-compose-grundlagen/">Docker Compose</a>, falls du Container
betreibst).</li>
<li><strong>Kein eigenes Backup nötig</strong>, aber halte fest, ob du automatische Reboots
aktiviert hast – das erklärt später, warum der Server nachts kurz weg war.</li>
</ul>
]]></content:encoded></item></channel></rss>