<?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>Operations – Serverküche</title><link>https://serverkueche.de/en/tags/operations/</link><description>Operations – Neueste Beiträge von Serverküche</description><generator>Hugo</generator><language>en-US</language><managingEditor>feedback@serverkueche.de (Serverküche)</managingEditor><webMaster>feedback@serverkueche.de (Serverküche)</webMaster><copyright>2026 Serverküche</copyright><lastBuildDate>Sat, 24 Oct 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://serverkueche.de/en/tags/operations/index.xml" rel="self" type="application/rss+xml"/><item><title>100 days of netcup: what nobody tells you beforehand</title><link>https://serverkueche.de/en/tutorials/100-days-netcup/</link><pubDate>Sat, 24 Oct 2026 00:00:00 +0000</pubDate><author>feedback@serverkueche.de (Serverküche)</author><guid>https://serverkueche.de/en/tutorials/100-days-netcup/</guid><description>A netcup VPS, one hundred days in continuous operation: what really happened, which quirks cost time – and what the price round means for existing customers.</description><content:encoded><![CDATA[<p>Every recipe on this site is created on this VPS. It has been running since 16 July, and in that
time we have set up, tested and torn down around twenty applications on it. This article is the
review: what actually happened, and the quirks we stumbled over.</p>
<p>No advertising copy. The most uncomfortable number comes right away in Step 2.</p>
<h2 id="what-are-we-building">What are we building?</h2>
<p>Nothing – we are reporting. By the end you will know what to expect from netcup in continuous
operation, which four quirks would otherwise cost you an evening each, what the September
price round means for you – depending on whether you are an existing customer or ordering new –
and how netcup responded to a critical kernel vulnerability.</p>
<p>The machine is a <strong>VPS 1000 G12</strong> with 4 vCores, 8 GB RAM and a 251 GB disk, on Debian 13.
The only things running on it permanently are a reverse proxy and changing test setups.</p>
<div class="not-prose my-6 rounded-lg border-l-4 p-4 border-sky-300 bg-sky-50 dark:border-sky-800 dark:bg-sky-900/20">
  <p class="mb-1 flex items-center gap-2 font-semibold text-slate-900 dark:text-white">
    <span aria-hidden="true">ℹ️</span>As of when
  </p>
  <div class="prose-kitchen text-sm">The measurements in steps 1 and 2 are from <strong>3 October 2026</strong>, i.e. day 79. By the time this
article is published it will be a hundred days; that changes nothing about the orders of
magnitude, but the values are deliberately dated rather than rounded. What happened on day 94 is
in step 7.</div>
</div>
<h2 id="prerequisites">Prerequisites</h2>
<p>None – this is a report, not a recipe. If you want to read along and check your own system, all
you need is SSH access to your own server. The commands in Step 2 run on any Linux host with
Docker.</p>
<p>If you don&rsquo;t have a server at all yet: the plans are listed in the
<a href="/en/netcup-recommendation/">netcup overview</a>, and the
<a href="/en/server-calculator/">server calculator</a> estimates what your project really needs.</p>
<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 · /en/tutorials/100-days-netcup/" 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>🍳 Recommendation</span>
    <span title="Links marked with * are affiliate links.">Ad</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 vCores · 8 GB RAM · 128 GB SSD</p>
      <p class="mt-1 text-sm font-semibold text-paprika-700 dark:text-paprika-400">from €14.50/month</p>
      <p class="mt-2 text-sm text-slate-600 dark:text-slate-400">The server from this report. 8 GB RAM is enough for a reverse proxy and a handful of services.</p>
    </div>
    <a href="https://www.netcup.com/en/server/vps/vps-1000-g12.5-iv-24m-eu?ref=44083#vps-1000-g12.5-iv-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">
  Go to 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-api="vps-1000" data-voucher-msg-empty="No code is available for this plan right now – use the €5.95 code." data-voucher-msg-limit="No more codes today – use the €5.95 code or try again tomorrow." data-voucher-msg-error="The code couldn&#39;t be fetched right now – use the €5.95 code."
     data-voucher-hint="Empty the cart first – the code adds the server itself.">
  <p class="flex flex-wrap items-center gap-x-2 gap-y-1"><span>💶 <span class="font-semibold">1 month free</span>:</span>
    <button type="button" data-voucher-reveal data-copy-title="Click to copy"
            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">Show code</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">another code</button>
  </p><p class="mt-1 text-xs text-slate-500 dark:text-slate-400" data-voucher-hint-target>
    Single use, valid for VPS 1000 G12.5.
    <a href="https://www.netcup.com/en/checkout/cart?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">Redeem in the cart →</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.95 voucher</span> for new netcup customers:</span>
    <button type="button" data-voucher-code data-track-voucher="36nc17844976032"
            title="Click to copy" 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">always valid · not for domains or VPS Lite</span>
  </p><p class="mt-1 text-xs"><a href="/en/netcup-voucher/" class="font-medium text-herb-800 underline underline-offset-2 hover:text-herb-900 dark:text-herb-400">All netcup vouchers →</a></p>
</div></div>
</div>

<h2 id="step-by-step">Step by step</h2>
<h3 id="step-1-what-happened-in-79-days">Step 1: What happened in 79 days</h3>
<p>The most boring part first, and that is meant as a compliment:</p>
<table>
	<thead>
			<tr>
					<th>Observation</th>
					<th>Value</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>Uptime without a reboot</td>
					<td>79 days</td>
			</tr>
			<tr>
					<td>Failed systemd services</td>
					<td>0</td>
			</tr>
			<tr>
					<td>Unplanned outages</td>
					<td>none noticed</td>
			</tr>
			<tr>
					<td>Logged <code>apt</code> runs</td>
					<td>39</td>
			</tr>
			<tr>
					<td>Automatic security updates with packages</td>
					<td>2</td>
			</tr>
			<tr>
					<td>Let&rsquo;s Encrypt certificates issued</td>
					<td>31</td>
			</tr>
	</tbody>
</table>
<p>The server just kept running. No outages, no crashed services, no support cases. In all that
time the automatic security updates had something to do exactly twice – both times Docker, on
21 July. That is not a shortcoming, it is Debian stable: things rarely happen, and when they do,
they are targeted.</p>
<p>The 39 <code>apt</code> runs say more about us than about the server: they are almost exclusively our own
installations for tutorials, not automatic maintenance. A server simply doesn&rsquo;t keep itself
clean. What happens without any help are exactly those two security updates – everything else
depends on someone keeping an eye on it.</p>
<p>Two caveats, so the number doesn&rsquo;t sound better than it is. First, &ldquo;79 days of uptime&rdquo; says
nothing about availability – we didn&rsquo;t measure from outside, we only established that the
machine wasn&rsquo;t rebooted. Second, it applies to the <strong>host</strong>, not to everything on it:</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 ps --format <span class="s2">&#34;{{.Names}}\t{{.Status}}&#34;</span></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">traefik-traefik-1   Up 2 weeks</span></span></code></pre></div>
</div>
<p>The reverse proxy did <strong>not</strong> run for 79 days, but for two weeks. A Docker update restarted it
at some point. That is harmless and exactly what <code>restart: unless-stopped</code> is supposed to do –
but &ldquo;the server has been up for eleven weeks&rdquo; and &ldquo;your service ran for eleven weeks&rdquo; are two
different statements.</p>
<p>One number in the table deserves a closer look: <strong>31 Let&rsquo;s Encrypt certificates</strong> in 79 days.
Every test setup got its own subdomain, and Traefik fetches a separate certificate for each.
That is unremarkable until you know that Let&rsquo;s Encrypt issues <strong>50 certificates in 7 days</strong> per
registered domain – globally, regardless of which account is asking. After that the quota only
refills slowly, with one certificate every three hours or so.</p>
<p>Spread over 79 days that is completely harmless. But if you try out twenty subdomains in one
afternoon and start over a few times along the way, you suddenly face a proxy that no longer
gets certificates – and look for the mistake on your end. For test series there is therefore
Let&rsquo;s Encrypt&rsquo;s staging environment, which runs through the same mechanics without a quota.</p>
<h3 id="step-2-the-disk-fills-up--and-it-isnt-your-data">Step 2: The disk fills up – and it isn&rsquo;t your data</h3>
<p>Here is the uncomfortable number. A look at the disk:</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">df -h /</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">/dev/vda4       251G   73G  169G  31% /</span></span></code></pre></div>
</div>
<p>73 GB used. On a server running exactly <strong>one</strong> container. The explanation:</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 system df</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">TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
</span></span><span class="line"><span class="cl">Images          107       1         74.58GB   68.43GB (91%)
</span></span><span class="line"><span class="cl">Containers      1         1         8.192kB   0B (0%)
</span></span><span class="line"><span class="cl">Build Cache     33        0         209.5MB   4.096kB</span></span></code></pre></div>
</div>
<p><strong>107 images, 74.58 GB, 91 % of it disposable.</strong> It isn&rsquo;t the data filling up the server, it&rsquo;s
the leftovers. Every <code>docker compose down</code> removes containers and volumes – the downloaded images
stay behind. The biggest chunks in our case:</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">3.69GB  mcr.microsoft.com/playwright:v1.56.0-noble
</span></span><span class="line"><span class="cl">3.50GB  ghcr.io/paperless-ngx/paperless-ngx:3.1.3
</span></span><span class="line"><span class="cl">3.45GB  mcr.microsoft.com/playwright:v1.61.1-noble
</span></span><span class="line"><span class="cl">3.38GB  stirlingtools/stirling-pdf:2.14.3
</span></span><span class="line"><span class="cl">3.12GB  ghcr.io/immich-app/immich-server:v3.1.0
</span></span><span class="line"><span class="cl">3.11GB  ghcr.io/immich-app/immich-server:v3.0.3</span></span></code></pre></div>
</div>
<p>Playwright twice, Immich twice – every update puts a new image next to the old one, and the old
one stays. After a few months you have an image dump you don&rsquo;t notice until the disk gets tight.</p>
<p>This is the point where the plan generation suddenly matters. Our VPS 1000 is a <strong>G12</strong> with
251 GB. The current G12.5 comes with <strong>128 GB</strong>. The same dump would already take up more than
half of the disk there – and that is before any actual data comes in.</p>
<p>Cleaning up is one line:</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 image prune -a</span></span></code></pre></div>
</div>
<p>This removes all images that no container is currently using. Run it when you know what is
running; otherwise the next start pulls the images again. For everyday use the milder
<code>docker image prune</code> is enough – it only throws away unnamed intermediate layers.</p>
<h3 id="step-3-mail-doesnt-go-out-and-it-isnt-your-fault">Step 3: Mail doesn&rsquo;t go out, and it isn&rsquo;t your fault</h3>
<p>The first quirk that costs time. You set up a mail server, everything looks fine, and outgoing
mail runs into a timeout on port 25.</p>
<p>The culprit is netcup&rsquo;s default policy <strong>&ldquo;netcup Mail block&rdquo;</strong>: it blocks ports 25, 465 and 587
outbound. That is exactly what we measured – these three run into a timeout, while 993, 22 and
443 are open.</p>
<p>The important part: this is <strong>not a support case</strong>. You take the policy off the server yourself
in the Server Control Panel under <em>Firewall → Policies</em>, no ticket, no waiting. Many people
instead spend hours looking for the fault in Postfix. How to do it is described in
<a href="/en/tutorials/netcup-firewall-setup/">netcup firewall setup</a>; making sure your mail actually
arrives afterwards is a separate topic covered in
<a href="/en/tutorials/email-deliverability/">email deliverability</a>.</p>
<h3 id="step-4-the-firewall-is-stateless-for-udp">Step 4: The firewall is stateless for UDP</h3>
<p>The quirk that confuses people most, because it feels like a broken server.</p>
<p>With TCP, the netcup firewall remembers that you opened a connection and lets the reply through.
<strong>With UDP it doesn&rsquo;t.</strong> Your server asks a DNS server on port 53, the reply comes back from
port 53 – and gets dropped because no rule expects it.</p>
<p>The result: name resolution and time synchronisation don&rsquo;t work, even though everything
outbound seems to be allowed. For DNS and NTP you need <strong>your own inbound rules</strong> on source
ports 53 and 123. The ready-made, reusable policy for this is also in
<a href="/en/tutorials/netcup-firewall-setup/">netcup firewall setup</a>.</p>
<p>If you don&rsquo;t use the SCP firewall at all, you won&rsquo;t notice any of this – in that case only the
firewall on the server itself protects you.</p>
<h3 id="step-5-almost-everything-is-closed-inbound">Step 5: Almost everything is closed inbound</h3>
<p>The third quirk is the most harmless, but it will just as surely cost you an afternoon if you
don&rsquo;t know about it. Open inbound on our server are <strong>22, 80 and 443</strong>. Nothing else.</p>
<p>Measured: a service on 8443 ran into a timeout from outside, while it responded perfectly on the
server itself. Exactly this pattern – works locally, not from outside – is the telltale sign.</p>
<p>Every additional port is a <strong>separate policy</strong> in the SCP. We had to do that once for Jitsi,
which needs UDP 10000 for the media streams. Plan for this before you pick a service that needs
exotic ports.</p>
<h3 id="step-6-the-price-round--and-what-nobody-tells-existing-customers">Step 6: The price round – and what nobody tells existing customers</h3>
<p>On 22 September netcup raised the prices for <strong>new orders</strong> and
<a href="https://forum.netcup.de/thread/22999-rampocalypse-we-need-to-talk-about-pricing-again/">explained the reasons openly</a>
in its own forum: purchase prices for RAM and flash storage are five times what they were a year
ago, and the market has been bought empty, right down to refurbished hardware.</p>
<p>What stands out is less the increase than the reasoning. netcup lays out the four options it had
to choose from: sell everything off and switch to &ldquo;sold out&rdquo;, massively overbook the servers,
keep the prices and cut the specifications instead – or adjust the products to the market level.
They chose the fourth route. You don&rsquo;t have to like the prices, but the alternative &ldquo;same price,
quietly less performance&rdquo; would have been the more unpleasant one for you as an operator,
because you only notice it when things get tight.</p>
<p>What changes:</p>
<table>
	<thead>
			<tr>
					<th>Product</th>
					<th>Increase</th>
					<th>Also</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>VPS Lite</td>
					<td>up to 20 %</td>
					<td>specifications unchanged</td>
			</tr>
			<tr>
					<td>VPS (x86)</td>
					<td>up to 40 %</td>
					<td>smaller disks</td>
			</tr>
			<tr>
					<td>Root server</td>
					<td>70–110 %</td>
					<td>smaller disks, new RS 500</td>
			</tr>
	</tbody>
</table>
<p>On storage, netcup writes that it continues to provision flash-based with RAID 6, but &ldquo;can&rsquo;t
guarantee NVMe only&rdquo;. That is something different from &ldquo;no more NVMe&rdquo; – you don&rsquo;t know in
advance what you&rsquo;ll get.</p>
<p>And now the part that is easy to overlook, even though it is worth real money:</p>
<ul>
<li><strong>Existing contracts are not increased.</strong> If you have a server, you keep paying your price.</li>
<li><strong>Upgrades run at the old price.</strong> netcup has specifically kept capacity free on the existing
hardware for this. So an RS 1000 G12 can be moved up to an RS 2000 G12 on the old terms – that
also applies on renewal.</li>
<li><strong>The contract exchange (Tauschbörse) keeps the old prices.</strong> If you take over a contract
there, you keep the G12 terms, as long as offers are available.</li>
</ul>
<p>In practice this means: if you want to grow anyway, upgrading your existing contract is
considerably cheaper than a new order. And if you are just getting started, it pays to look at
the contract exchange before you order.</p>
<h3 id="step-7-day-94--netcup-restarts-every-server">Step 7: Day 94 – netcup restarts every server</h3>
<p>Just before this article went out, a restart came after all – and not from us. On 15 October
<strong>PwnEscape</strong> was published (CVE-2026-99999, CVSS 9.3): a bug in the Linux kernel&rsquo;s IPv4
networking stack. Using crafted packets, a guest can read memory of the <strong>host</strong>; in the
discoverer&rsquo;s lab it went as far as code execution on the host. It was found by
<a href="https://pwn.ai/blog/pwnescape">pwn.ai</a> during a security challenge run by Vercel. The fix has
been in the kernel since 14 October – but it only takes effect once the <strong>KVM host</strong> boots the
patched kernel. And when the host goes down, every VM on it goes with it.</p>
<p>For a provider whose hosts run different customers side by side, that is the worst case: one VM
could read its neighbours&rsquo; memory. On 16 October netcup announced on
<a href="https://www.netcup-status.de/">netcup-status.de</a> that all VPS and root servers would be
restarted in blocks from the 17th, with 20 to 30 minutes of downtime per server. The notice at
first only mentioned software updates. In an update on 19 October netcup names the reason
explicitly: PwnEscape, which became known only a few hours before the restarts began. Normally,
netcup writes there, such maintenance is announced several days ahead – this time that wasn&rsquo;t
possible.</p>
<p>Our turn came on 18 October. The journal shows how the restart arrived:</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">journalctl -b -1 -u systemd-logind --no-hostname <span class="p">|</span> grep hypervisor</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">Oct 18 10:19:30 systemd-logind[774]: System is powering down (hypervisor initiated shutdown).</span></span></code></pre></div>
</div>
<p><code>hypervisor initiated shutdown</code> means netcup shut the server down <strong>cleanly</strong> via the QEMU guest
agent, like pressing the power button. Services were stopped properly and file systems synced.
At 10:34 it was running again – <strong>14½ minutes</strong> of downtime, less than announced. Thanks to
<code>restart: unless-stopped</code>, Traefik came back up on its own; there was nothing to do.</p>
<p>The timing is what stands out. There was no public exploit at that point; the discoverer expects
one within a few weeks. netcup didn&rsquo;t wait for one but started the restarts two days after publication.
A quarter of an hour of downtime on a Sunday morning is a fair price for that – the alternative
would be a host on which a stranger&rsquo;s VM can look into your memory.</p>
<p>What to take away:</p>
<ul>
<li><strong>Services have to start without you.</strong> Make sure everything runs with
<code>restart: unless-stopped</code> or as an enabled systemd unit. A container you once started by hand
is simply gone after a restart like this.</li>
<li><strong>Announced doesn&rsquo;t mean scheduled.</strong> The status notice gave a window of days, not a time per
server. According to netcup, the notification email now arrives about an hour before the
individual server restarts – sent to the address in your customer account, so make sure it&rsquo;s
one you actually read. If you want to know when your service was really down, you need
monitoring from the outside,
for example <a href="/en/tutorials/uptime-kuma-monitoring/">Uptime Kuma</a>.</li>
<li><strong>netcup patches the host, you patch the guest.</strong> PwnEscape lives in the KVM host&rsquo;s kernel,
not in your VM – there&rsquo;s nothing to do there, and a kernel update in the guest wouldn&rsquo;t have
helped. For your own kernel, what&rsquo;s under &ldquo;Maintenance &amp; backups&rdquo; still applies.</li>
</ul>
<p><code>last</code> shows whether it has already hit you:</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">last -x reboot shutdown <span class="p">|</span> head -3</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">reboot   system boot  6.12.111+deb13-a Sun Oct 18 10:34 - still running
</span></span><span class="line"><span class="cl">reboot   system boot  6.12.111+deb13-a Thu Oct  8 11:29 - 10:19 (9+22:49)
</span></span><span class="line"><span class="cl">shutdown system down  6.12.111+deb13-a Sun Oct 18 10:19 - 10:34  (00:14)</span></span></code></pre></div>
</div>
<p>A <code>shutdown</code> from 17 October onwards that you didn&rsquo;t trigger yourself was this restart. Note the
kernel column: the same version before and after, 6.12.111. What rebooted was the host
underneath, not our system. The
entry from 8 October is our own, by the way: the reboot after a kernel update that ended the
uptime from step 1 after 84 days.</p>
<p>Three days later, on 21 October, the next emergency arrived – this time in PHP
(CVE-2026-109618 and -109619). netcup took web hosting and managed servers offline for a while
and rolled out patched PHP builds itself. On a VPS that doesn&rsquo;t happen: there, PHP lives inside
your container images, and nobody updates those but you. How to find out which of your services
are affected is covered in
<a href="/en/tutorials/keep-docker-stack-updated/">Keeping your whole Docker stack safely up to date</a>.</p>
<h2 id="when-things-go-wrong">When things go wrong</h2>
<div class="troubleshoot not-prose">
<p><strong>Outgoing mail runs into a timeout on port 25, 465 or 587.</strong> That isn&rsquo;t your configuration but
netcup&rsquo;s default policy &ldquo;netcup Mail block&rdquo;. Take it off the server in the SCP under
<em>Firewall → Policies</em> – no ticket needed, see
<a href="/en/tutorials/netcup-firewall-setup/">netcup firewall setup</a>.</p>
<p><strong>DNS or time synchronisation doesn&rsquo;t work, even though everything outbound is allowed.</strong> The
netcup firewall is stateless for UDP and doesn&rsquo;t automatically let reply packets through. Create
inbound rules for source port 53 (DNS) and 123 (NTP).</p>
<p><strong>A service responds on the server, but not from outside.</strong> Then the SCP firewall is blocking it,
not the one on the server. Only 22, 80 and 443 are open inbound; every additional port needs its
own policy. Test with <code>curl</code> from another machine, not from localhost.</p>
<p><strong>The disk is full, but you can&rsquo;t find any large files.</strong> Check Docker: <code>docker system df</code> shows
you how much is in images and how much of it is disposable. In our case it was 68 GB out of
73 GB used. <code>docker image prune -a</code> cleans up.</p>
<p><strong>A container is killed by the kernel (OOM), even though the server has headroom.</strong> Then a
memory limit of the container is kicking in, not that of the host. In that case the log shows
<code>constraint=CONSTRAINT_MEMCG</code>. This happened to us exactly once – raise the service&rsquo;s limit
before you think about a bigger server.</p>

</div>
<p class="mt-3 text-sm text-slate-500 dark:text-slate-400">
  Your problem is not listed?
  <a href="/en/errors/" class="font-medium text-paprika-700 hover:underline dark:text-paprika-400">Search all error messages →</a>
</p>

<h2 id="maintenance--backups">Maintenance &amp; backups</h2>
<p>After a hundred days, the list of things you really have to do regularly is short – but it isn&rsquo;t
empty.</p>
<p><strong>Clean up monthly.</strong> <code>docker image prune -a</code> belongs in your calendar, otherwise Step 2 will
repeat itself on your server. Two minutes, and on small disks the difference between &ldquo;running&rdquo;
and &ldquo;Disk full&rdquo; on a Sunday evening.</p>
<p><strong>Reboot when a new kernel is available.</strong> netcup updates the host&rsquo;s kernel – as with PwnEscape,
restarting your server if necessary. The kernel inside your VM is your job. Automatic security
updates install it but don&rsquo;t activate it. Check with <code>ls /var/run/reboot-required</code> and schedule the reboot yourself instead
of putting it off for years. Eleven weeks of uptime are no badge of quality if an unpatched
kernel is running underneath.</p>
<p><strong>Snapshots are not a backup.</strong> They sit with the same provider on the same infrastructure and
help you against a botched upgrade attempt, not against a lost account. How to create them in
the SCP is covered in <a href="/en/tutorials/netcup-snapshots-scp/">netcup Server Control Panel</a> – the
real backup belongs encrypted and away from the server, for example with
<a href="/en/tutorials/restic-backups/">restic</a>.</p>
<p><strong>Look at your invoice once a quarter.</strong> After the price round, existing contracts and new orders
cost different amounts. If you want to grow, check the upgrade of your existing contract first –
not the shopping cart.</p>
]]></content:encoded></item></channel></rss>