<?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>Dovecot – Serverküche</title><link>https://serverkueche.de/tags/dovecot/</link><description>Dovecot – 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>Mon, 10 Aug 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://serverkueche.de/tags/dovecot/index.xml" rel="self" type="application/rss+xml"/><item><title>Eigener Mailserver mit Mailcow: Setup von Grund auf</title><link>https://serverkueche.de/tutorials/mailserver-mailcow-aufsetzen/</link><pubDate>Mon, 10 Aug 2026 00:00:00 +0000</pubDate><author>feedback@serverkueche.de (Serverküche)</author><guid>https://serverkueche.de/tutorials/mailserver-mailcow-aufsetzen/</guid><description>Mailcow (dockerized) auf einem eigenen Server aufsetzen: Postfix, Dovecot, Rspamd und SOGo-Webmail unter deiner Domain – kompletter Mailserver-Stack mit HTTPS.</description><content:encoded><![CDATA[<p>Deine E-Mails sind das Rückgrat deiner digitalen Identität – Passwort-Resets, Rechnungen,
Verträge laufen alle darüber. Trotzdem liegen sie bei den meisten bei einem Konzern in den USA.
Mit <strong>Mailcow</strong> holst du dir den kompletten Mailserver auf den eigenen Server: Postfix, Dovecot,
Spam-Filter und Webmail, sauber verpackt in Docker. Dieses Tutorial bringt den Stack zum Laufen –
die knifflige <strong>Zustellbarkeit</strong> (SPF, DKIM, DMARC, Reverse DNS) behandeln wir danach im
<a href="/tutorials/mailserver-zustellbarkeit/" data-track-event="Navigation|Tutorial-Link|/tutorials/mailserver-zustellbarkeit/ ← /tutorials/mailserver-mailcow-aufsetzen/">Zustellbarkeits-Rezept</a>.</p>
<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>Einen eigenen Mailserver zu betreiben ist Arbeit – sei ehrlich zu dir
  </p>
  <div class="prose-kitchen text-sm">Ein Mailserver ist kein „einmal aufsetzen und vergessen&quot;. Du bist ab jetzt für Zustellbarkeit,
Reputation, Backups und Updates verantwortlich. Landen deine Mails im Spam oder fällt der Server
aus, betrifft das deine wichtigste Kommunikation. Wenn du das nicht regelmäßig pflegen willst,
ist ein seriöser Mail-Hoster oft die bessere Wahl – das ist keine Schwäche, sondern eine ehrliche
Abwägung. Wer die Kontrolle wirklich will, ist hier richtig.</div>
</div>
<h2 id="was-bauen-wir">Was bauen wir?</h2>
<p>Am Ende läuft ein <strong>vollständiger Mailserver-Stack</strong> auf deinem Server, erreichbar als Webmail
unter <code>https://mail.DEINE_DOMAIN</code> mit gültigem Let&rsquo;s-Encrypt-Zertifikat. Enthalten sind:</p>
<ul>
<li><strong>Postfix</strong> als SMTP-Server (Senden/Empfangen),</li>
<li><strong>Dovecot</strong> für IMAP/POP3 (Abruf durch Mail-Programme),</li>
<li><strong>Rspamd</strong> als moderner Spam- und Signaturfilter,</li>
<li><strong>SOGo</strong> als Webmail samt Kalender und Kontakten (CalDAV/CardDAV),</li>
<li>eine <strong>Admin-Oberfläche</strong> zum Anlegen von Domains, Postfächern und Aliassen.</li>
</ul>
<p>Das Ganze kommt als <strong>mailcow-dockerized</strong> – ein fertig geschnürtes Compose-Projekt aus <strong>18
Containern</strong>, das das notorisch komplizierte Mailserver-Setup handhabbar macht. Wir setzen auf
<strong>Debian 13</strong> mit <strong>Docker 29.6</strong> und <strong>Compose v5.3</strong> auf; mailcow ist ein <em>Rolling Release</em> und
wird über Monats-Tags gepflegt (du aktualisierst per <code>update.sh</code>, es gibt keine klassische
Versionsnummer). Getestet haben wir gegen den Stand <strong>2026-07b</strong> mit <strong>Postfix 3.10.12</strong>,
<strong>Dovecot 2.3.21.1</strong>, <strong>Rspamd 4.1.4</strong> und <strong>SOGo 5.12.10</strong>.</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>Mailcow braucht einen eigenen Server
  </p>
  <div class="prose-kitchen text-sm">Anders als die meisten Rezepte hier läuft mailcow <strong>nicht</strong> hinter dem gemeinsamen
<a href="/tutorials/reverse-proxy-traefik/">Traefik-Reverse-Proxy</a>. Es bringt seinen <strong>eigenen</strong> Webserver
mit und belegt die Ports <strong>80/443</strong> selbst, dazu die Mail-Ports <strong>25, 465, 587, 143, 993</strong> (und
mehr). Betreibe mailcow deshalb auf einem <strong>dedizierten Server</strong>, auf dem sonst nichts diese Ports
braucht – nicht auf demselben Host wie dein Traefik-Stack.</div>
</div>
<h2 id="voraussetzungen">Voraussetzungen</h2>
<ul>
<li>Ein <strong>eigener Server</strong> mit <strong>Debian 13</strong>, auf dem <a href="/tutorials/docker-installieren/">Docker installiert</a>
ist und der <strong>nur</strong> für mailcow da ist (Ports 80/443 und die Mail-Ports frei).</li>
<li><strong>Mindestens 6 GB RAM</strong> – der Spam-Filter (Rspamd) und der optionale Virenscanner (ClamAV)
brauchen Luft. Mit weniger wird es zäh oder ClamAV muss aus.</li>
<li>Eine <strong>Domain</strong>, deren <a href="/tutorials/domain-mit-server-verbinden/">DNS du selbst steuerst</a>. Ohne
passende Records (v. a. <strong>MX</strong> und <strong>Reverse DNS</strong>) nimmt kein anderer Mailserver deine Post an.</li>
<li><strong>Port 25 ausgehend muss offen sein.</strong> Viele Provider sperren ihn standardmäßig gegen Spam –
bei netcup schaltest du ihn per Support-Ticket frei. Ohne offenen Port 25 kannst du <strong>keine</strong>
Mails an andere Server zustellen.</li>
<li>Ein <strong>PTR-/Reverse-DNS-Eintrag</strong> für die Server-IP, den du im Provider-Panel setzt (bei netcup
im SCP). Er muss auf <code>mail.DEINE_DOMAIN</code> zeigen.</li>
</ul>
<p>Mailcow ist RAM-hungrig, deshalb empfehlen wir mindestens den VPS 2000. Wie viel dein konkreter
Bedarf ist, schätzt dir der <a href="/serverempfehlung/">Server-Rechner</a>.</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 · /tutorials/mailserver-mailcow-aufsetzen/" data-content-piece="VPS 2000 G12">
  <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 2000 G12</p>
      <p class="mt-1 text-sm text-slate-600 dark:text-slate-300">8 vCore · 16 GB RAM · 512 GB NVMe</p>
      <p class="mt-1 text-sm font-semibold text-paprika-700 dark:text-paprika-400">ab 19,24 €/Monat</p>
      <p class="mt-2 text-sm text-slate-600 dark:text-slate-400">Für mailcow inklusive Spam- und Virenfilter sollten es 8 GB RAM sein.</p>
    </div>
    <a href="https://www.netcup.com/de/server/vps/vps-2000-g12-12m?ref=44083" rel="sponsored noopener" target="_blank"
   data-track-event="Affiliate|netcup: Affiliate-Box|VPS 2000 G12 · {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"><p class="not-prose my-3 flex flex-wrap items-center gap-x-2 gap-y-1 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">
  <span>💶 <strong>5 € Gutschein</strong> für netcup-Neukunden:</span><code data-track-voucher="36nc17844976032"
        class="rounded bg-white px-2 py-0.5 font-mono text-sm font-semibold text-herb-800 dark:bg-slate-800 dark:text-herb-400">36nc17844976032</code>
  <span class="text-xs text-slate-500 dark:text-slate-400">(nur Neukunden, keine Domains)</span>
</p></div>
</div>

<h2 id="schritt-für-schritt">Schritt für Schritt</h2>
<h3 id="schritt-1-dns-records-anlegen">Schritt 1: DNS-Records anlegen</h3>
<p>Bevor du irgendetwas installierst, richte die DNS-Einträge ein – sie brauchen Zeit zum
Propagieren, und mailcow holt beim Start das TLS-Zertifikat für den Hostnamen. Lege bei deinem
DNS-Anbieter (siehe <a href="/tutorials/domain-mit-server-verbinden/">Domain mit dem Server verbinden</a>)
diese Einträge an. <code>DEINE_DOMAIN</code> ist deine Mail-Domain (z. B. <code>beispiel.de</code>), <code>DEINE_SERVER_IPV4</code>
die IPv4-Adresse des Servers:</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">mail.DEINE_DOMAIN.   A      DEINE_SERVER_IPV4
</span></span><span class="line"><span class="cl">mail.DEINE_DOMAIN.   AAAA   DEINE_SERVER_IPV6      (falls du IPv6 nutzt)
</span></span><span class="line"><span class="cl">DEINE_DOMAIN.        MX     10 mail.DEINE_DOMAIN.</span></span></code></pre></div>
</div>
<p>Der <strong>MX-Record</strong> sagt anderen Mailservern: „Post für <code>@DEINE_DOMAIN</code> nimmt <code>mail.DEINE_DOMAIN</code>
entgegen.&quot; Der Hostname <code>mail.DEINE_DOMAIN</code> ist der <strong>FQDN des Mailservers</strong> – nicht zu verwechseln
mit der Mail-Domain selbst. Die weiteren Records für Zustellbarkeit (SPF, DKIM, DMARC) und den
<strong>PTR-Eintrag</strong> behandeln wir im Folge-Tutorial zur Zustellbarkeit ausführlich; der PTR-Eintrag
sollte aber schon jetzt gesetzt sein, weil viele Server sonst gar nicht erst annehmen.</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">Setz die <strong>TTL</strong> der Records vor dem Umzug niedrig (z. B. 300 Sekunden). Dann greifen spätere
Korrekturen schnell, während du testest. Nach dem Feinschliff kannst du sie wieder erhöhen.</div>
</div>
<h3 id="schritt-2-voraussetzungen-auf-dem-server-installieren">Schritt 2: Voraussetzungen auf dem Server installieren</h3>
<p>Melde dich per SSH auf dem <a href="/tutorials/ssh-absichern/">abgesicherten Server</a> an. Mailcows
Konfigurations-Generator braucht neben Docker auch <code>git</code> und <code>jq</code> – letzteres wird gern vergessen,
und der Generator bricht sonst mit <code>Cannot find command 'jq'</code> ab. Installiere beides:</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 apt update <span class="o">&amp;&amp;</span> sudo apt install -y git jq</span></span></code></pre></div>
</div>
<p>Prüfe, dass Docker und das Compose-Plugin laufen:</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 --version <span class="o">&amp;&amp;</span> docker compose version</span></span></code></pre></div>
</div>
<p>Du solltest zwei Versionszeilen sehen – bei uns <code>Docker version 29.6.1</code> und <code>Docker Compose version v5.3.1</code>. Mailcow verlangt mindestens <strong>Docker 24</strong>; darunter bricht der Konfigurations-Generator ab.
Fehlt etwas, hol das <a href="/tutorials/docker-installieren/">Docker-Setup</a> nach, bevor du weitermachst.</p>
<h3 id="schritt-3-mailcow-klonen-und-konfigurieren">Schritt 3: Mailcow klonen und konfigurieren</h3>
<p>Mailcow wird als Git-Repository ausgeliefert und <strong>nicht</strong> über einen einzelnen Image-Tag
gepflegt. Klone es nach <code>/opt</code> und wechsle hinein. Wichtig ist die <code>umask 0022</code>, damit die
erzeugten Dateien die richtigen Rechte bekommen:</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 su
</span></span><span class="line"><span class="cl"><span class="nb">umask</span> <span class="m">0022</span>
</span></span><span class="line"><span class="cl"><span class="nb">cd</span> /opt
</span></span><span class="line"><span class="cl">git clone https://github.com/mailcow/mailcow-dockerized
</span></span><span class="line"><span class="cl"><span class="nb">cd</span> mailcow-dockerized</span></span></code></pre></div>
</div>
<p>Jetzt erzeugst du die zentrale Konfigurationsdatei <code>mailcow.conf</code> mit dem interaktiven Generator:</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">./generate_config.sh</span></span></code></pre></div>
</div>
<p>Zuerst prüft er, ob die IP deines Servers auf der <strong>Spamhaus-Bad-ASN-Liste</strong> steht – ein sinnvoller
Frühwarner, denn aus manchen Netzen nimmt kaum ein Mailserver Post an:</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">Detecting if your IP is listed on Spamhaus Bad ASN List...
</span></span><span class="line"><span class="cl">Check completed! Your IP is clean</span></span></code></pre></div>
</div>
<p>Danach stellt er dir nacheinander diese Fragen:</p>
<ul>
<li><strong>Mail server hostname (FQDN):</strong> Trage hier <code>mail.DEINE_DOMAIN</code> ein – den <strong>Hostnamen</strong> des
Servers, nicht deine Mail-Domain. Der Wert muss zum A-Record aus Schritt 1 passen.</li>
<li><strong>Timezone:</strong> Meist schon korrekt vorausgefüllt (z. B. <code>Europe/Berlin</code>) – mit Enter bestätigen.</li>
<li><strong>Choose the Branch with it&rsquo;s number [1/2/3]:</strong> Wähle <strong><code>1</code></strong> für den <code>master</code>-Branch – das ist
der stabile, empfohlene Stand. <code>2</code> ist <code>nightly</code> (Testing), <code>3</code> der abgekündigte <code>legacy</code>-Branch.</li>
</ul>
<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>Die ClamAV-Frage siehst du nur auf kleinen Servern
  </p>
  <div class="prose-kitchen text-sm">Nach dem Virenscanner (<em>Do you want to disable ClamAV now?</em>) fragt der Generator <strong>nur</strong>, wenn der
Server <strong>höchstens 2,5 GiB RAM</strong> hat. Auf einer Maschine mit 6–8 GB stellt er <code>SKIP_CLAMD=n</code> still
ein, ClamAV läuft also von vornherein mit. Abschalten kannst du ihn jederzeit, indem du in der
<code>mailcow.conf</code> <code>SKIP_CLAMD=y</code> setzt und den Stack neu startest.</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>IPv6-Hosts: Docker wird neu gestartet
  </p>
  <div class="prose-kitchen text-sm"><p>Findet der Generator eine funktionierende <strong>IPv6-Verbindung</strong> (Default-Route plus erreichbare
Gegenstelle), muss auch Docker IPv6 sprechen – sonst könnte mailcow zu einem <strong>offenen Relay</strong>
werden. Fehlt <code>/etc/docker/daemon.json</code>, fragt er deshalb:</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">/etc/docker/daemon.json not found. Create it with IPv6 settings? [Y/n]</span></span></code></pre></div>
</div>
<p>Bestätigst du mit Enter, legt er die Datei selbst an (bei Docker ≥ 28 genügt <code>{&quot;ipv6&quot;: true}</code>) und
startet Docker <strong>sofort neu</strong>. Genau deshalb gehört mailcow auf einen <strong>eigenen</strong> Server: Der
Neustart reißt jeden anderen Container auf dem Host mit. Antwortest du mit <code>n</code>, bricht der Generator
ab und du musst die Einstellung von Hand nachtragen. Willst du bewusst ohne IPv6 fahren, setzt du
später in der <code>mailcow.conf</code> <code>ENABLE_IPV6=false</code>.</p>
</div>
</div>
<p>Wirf danach einen Blick in die erzeugte <code>mailcow.conf</code>. Die wichtigsten Werte stehen oben:</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">grep -E <span class="s2">&#34;^(MAILCOW_HOSTNAME|TZ|HTTP_PORT|HTTPS_PORT|SKIP_CLAMD|ENABLE_IPV6)=&#34;</span> mailcow.conf</span></span></code></pre></div>
</div>
<p>Auf unserem Testserver sah das so aus – <code>SKIP_CLAMD=n</code> heißt „ClamAV läuft mit&quot;:</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">MAILCOW_HOSTNAME=mail.DEINE_DOMAIN
</span></span><span class="line"><span class="cl">HTTP_PORT=80
</span></span><span class="line"><span class="cl">HTTPS_PORT=443
</span></span><span class="line"><span class="cl">TZ=Europe/Berlin
</span></span><span class="line"><span class="cl">SKIP_CLAMD=n
</span></span><span class="line"><span class="cl">ENABLE_IPV6=true</span></span></code></pre></div>
</div>
<p>Die Datei enthält auch alle <strong>Port-Belegungen</strong>. In der Standardkonfiguration nimmt mailcow diese
Host-Ports in Beschlag:</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">25    SMTP     (Server-zu-Server-Zustellung)
</span></span><span class="line"><span class="cl">465   SMTPS    (Senden mit impliziter TLS)
</span></span><span class="line"><span class="cl">587   Submission (Senden durch Mailprogramme, STARTTLS)
</span></span><span class="line"><span class="cl">143   IMAP  /  993 IMAPS   (Abruf durch Mailprogramme)
</span></span><span class="line"><span class="cl">110   POP3  /  995 POP3S
</span></span><span class="line"><span class="cl">4190  Sieve    (serverseitige Filterregeln)
</span></span><span class="line"><span class="cl">80    HTTP  /  443 HTTPS   (Webmail + Admin + ACME)</span></span></code></pre></div>
</div>
<p>Diese Ports müssen auf dem Host <strong>frei</strong> sein – darum der eigene Server. Läuft dort schon ein
Reverse Proxy auf 80/443, kollidiert mailcow damit.</p>
<h3 id="schritt-4-firewall-öffnen">Schritt 4: Firewall öffnen</h3>
<p>Deine <a href="/tutorials/firewall-ufw-einrichten/">UFW-Firewall</a> muss die Mail- und Web-Ports
durchlassen. Neben SSH gibst du frei:</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 ufw allow 25/tcp
</span></span><span class="line"><span class="cl">sudo ufw allow 80,443/tcp
</span></span><span class="line"><span class="cl">sudo ufw allow 465,587/tcp
</span></span><span class="line"><span class="cl">sudo ufw allow 143,993/tcp
</span></span><span class="line"><span class="cl">sudo ufw allow 110,995/tcp
</span></span><span class="line"><span class="cl">sudo ufw allow 4190/tcp</span></span></code></pre></div>
</div>
<p>Nutzt du zusätzlich die <a href="/tutorials/netcup-firewall-einrichten/">netcup-Firewall im SCP</a>, gib
dieselben Ports auch dort frei – sonst blockt die Perimeter-Firewall den Verkehr, bevor er den
Server erreicht.</p>
<h3 id="schritt-5-den-stack-starten">Schritt 5: Den Stack starten</h3>
<p>Jetzt lädst du die Images und startest den Stack. Rechne mit <strong>rund 4,5 GB</strong> auf der Platte – der
Stack besteht aus 18 Diensten, die dicksten sind SOGo, Dovecot und Postfix:</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 pull
</span></span><span class="line"><span class="cl">docker compose up -d</span></span></code></pre></div>
</div>
<p>Das erste Hochfahren dauert ein paar Minuten – Datenbank, Suchindex und die einzelnen Dienste
initialisieren sich. Beobachte den Fortschritt mit:</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 ps</span></span></code></pre></div>
</div>
<p>In der Spalte <code>STATUS</code> steht bei jedem Dienst <code>Up …</code>; die Container mit eigenem Healthcheck (etwa
<code>unbound-mailcow</code> und <code>clamd-mailcow</code>) melden zusätzlich <code>(healthy)</code>. Mailcow holt in dieser
Zeit im Hintergrund über seinen eingebauten ACME-Client das <strong>Let&rsquo;s-Encrypt-Zertifikat</strong> für
<code>mail.DEINE_DOMAIN</code>. Dafür müssen der A-Record und Port 80 von außen erreichbar sein – ist das
nicht der Fall, bleibt der <code>acme-mailcow</code>-Container in einer Wiederhol-Schleife und du siehst das
in seinen Logs (<code>docker compose logs acme-mailcow</code>).</p>
<h3 id="schritt-6-erste-anmeldung-an-der-admin-oberfläche">Schritt 6: Erste Anmeldung an der Admin-Oberfläche</h3>
<p>Rufe <code>https://mail.DEINE_DOMAIN</code> im Browser auf. Du landest in der mailcow-UI. Melde dich mit den
<strong>Standard-Zugangsdaten</strong> an:</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">Benutzer:  admin
</span></span><span class="line"><span class="cl">Passwort:  moohoo</span></span></code></pre></div>
</div>
<p>Zeigt die Maske „Anmeldung als Benutzer&quot;, klick unten auf <strong>„Als Admin anmelden&quot;</strong> – das
Login-Formular auf der Startseite meldet dich sonst als Postfach-Nutzer an, nicht als Administrator.</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>Standard-Passwort sofort ändern
  </p>
  <div class="prose-kitchen text-sm"><code>admin</code> / <code>moohoo</code> ist öffentlich bekannt. <strong>Ändere das Admin-Passwort umgehend</strong> unter
<em>System → Konfiguration → Zugang</em>: In der Tabelle <strong>Administratoren</strong> klickst du beim Benutzer
<code>admin</code> auf <strong>Bearbeiten</strong>. Im selben Reiter aktivierst du gleich die
<strong>Zwei-Faktor-Authentisierung</strong> (TOTP oder WebAuthn). Solange das Standard-Passwort gilt, ist dein
Mailserver offen wie ein Scheunentor.</div>
</div>
<p>Nach dem Login landest du im mailcow-Dashboard mit dem Überblick über deine Dienste:</p>
<p><figure class="my-6"><img src="/tutorials/mailserver-mailcow-aufsetzen/mailcow-dashboard_hu_8f0da6babdc6df3c.webp" srcset="/tutorials/mailserver-mailcow-aufsetzen/mailcow-dashboard_hu_c51c5976f35ffd19.webp 480w, /tutorials/mailserver-mailcow-aufsetzen/mailcow-dashboard_hu_8f0da6babdc6df3c.webp 768w, /tutorials/mailserver-mailcow-aufsetzen/mailcow-dashboard_hu_69a66b8d89901c6c.webp 1200w, /tutorials/mailserver-mailcow-aufsetzen/mailcow-dashboard_hu_9f643aab23ba87b1.webp 1920w" sizes="(min-width: 768px) 768px, 100vw"
    width="768" height="432"
    data-full="/tutorials/mailserver-mailcow-aufsetzen/mailcow-dashboard_hu_63170d51f32e9172.webp"
    alt="Das mailcow-Dashboard nach der ersten Anmeldung mit Systemüberblick." title="Das mailcow-Dashboard direkt nach dem Login."
    loading="lazy" decoding="async" class="rounded-lg"><figcaption class="mt-2 text-sm text-center text-slate-500 italic">Das mailcow-Dashboard direkt nach dem Login.</figcaption></figure></p>
<h3 id="schritt-7-mail-domain-und-erstes-postfach-anlegen">Schritt 7: Mail-Domain und erstes Postfach anlegen</h3>
<p>In mailcow trennst du <strong>Domain</strong> (z. B. <code>beispiel.de</code>) und <strong>Postfach</strong> (z. B.
<code>kontakt@beispiel.de</code>).</p>
<p>Über <strong>E-Mail → Konfiguration</strong> in der oberen Navigationsleiste verwaltest du Domains und Postfächer
in getrennten Reitern:</p>
<p><figure class="my-6"><img src="/tutorials/mailserver-mailcow-aufsetzen/mailcow-mail-setup_hu_5e9ebc06065a6393.webp" srcset="/tutorials/mailserver-mailcow-aufsetzen/mailcow-mail-setup_hu_dc3762743ff93980.webp 480w, /tutorials/mailserver-mailcow-aufsetzen/mailcow-mail-setup_hu_5e9ebc06065a6393.webp 768w, /tutorials/mailserver-mailcow-aufsetzen/mailcow-mail-setup_hu_244cd7305681a01e.webp 1200w, /tutorials/mailserver-mailcow-aufsetzen/mailcow-mail-setup_hu_12565b8184e7fa05.webp 1920w" sizes="(min-width: 768px) 768px, 100vw"
    width="768" height="432"
    data-full="/tutorials/mailserver-mailcow-aufsetzen/mailcow-mail-setup_hu_db5cd71c0f0eed07.webp"
    alt="Die Mail-Setup-Oberfläche von mailcow mit den Reitern für Domains und Mailboxen." title="E-Mail → Konfiguration: Domains und Postfächer verwalten."
    loading="lazy" decoding="async" class="rounded-lg"><figcaption class="mt-2 text-sm text-center text-slate-500 italic">E-Mail → Konfiguration: Domains und Postfächer verwalten.</figcaption></figure></p>
<ol>
<li>
<p>Klick auf dem Reiter <strong>Domains</strong> auf <strong>Domain hinzufügen</strong> und trage deine Domain <code>DEINE_DOMAIN</code>
ein. Die Standardwerte (Postfach- und Alias-Kontingente) sind für den Anfang in Ordnung.
Speichere unten mit <strong>„Domain hinzufügen und SOGo neustarten&quot;</strong> – nicht mit „Nur Domain
hinzufügen&quot;. Warum, steht gleich im Kasten darunter.</p>
<p><figure class="my-6"><img src="/tutorials/mailserver-mailcow-aufsetzen/mailcow-domain-anlegen_hu_b9142948d5c5b473.webp" srcset="/tutorials/mailserver-mailcow-aufsetzen/mailcow-domain-anlegen_hu_c0c8f23175efaf0d.webp 480w, /tutorials/mailserver-mailcow-aufsetzen/mailcow-domain-anlegen_hu_b9142948d5c5b473.webp 768w, /tutorials/mailserver-mailcow-aufsetzen/mailcow-domain-anlegen_hu_ec9658fb575187fb.webp 1200w, /tutorials/mailserver-mailcow-aufsetzen/mailcow-domain-anlegen_hu_bd604032a758297c.webp 1920w" sizes="(min-width: 768px) 768px, 100vw"
    width="768" height="432"
    data-full="/tutorials/mailserver-mailcow-aufsetzen/mailcow-domain-anlegen_hu_484d07552631056b.webp"
    alt="Der Dialog zum Hinzufügen einer Mail-Domain in mailcow." title="Eine neue Mail-Domain anlegen."
    loading="lazy" decoding="async" class="rounded-lg"><figcaption class="mt-2 text-sm text-center text-slate-500 italic">Eine neue Mail-Domain anlegen.</figcaption></figure></p>
</li>
<li>
<p>Wechsle auf den Reiter <strong>Mailboxen</strong> und klick auf <strong>Mailbox hinzufügen</strong> – Benutzername, Domain,
voller Name und ein <strong>starkes</strong> Passwort (Passwortmanager!). Dieses Postfach kann sich
anschließend an der Webmail und per IMAP/SMTP anmelden.</p>
<p><figure class="my-6"><img src="/tutorials/mailserver-mailcow-aufsetzen/mailcow-mailbox-anlegen_hu_5ab7153b52aa8cad.webp" srcset="/tutorials/mailserver-mailcow-aufsetzen/mailcow-mailbox-anlegen_hu_812dc501bc27658c.webp 480w, /tutorials/mailserver-mailcow-aufsetzen/mailcow-mailbox-anlegen_hu_5ab7153b52aa8cad.webp 768w, /tutorials/mailserver-mailcow-aufsetzen/mailcow-mailbox-anlegen_hu_ec3e7a5b2ca375a6.webp 1200w, /tutorials/mailserver-mailcow-aufsetzen/mailcow-mailbox-anlegen_hu_ebc5f517d8b20880.webp 1920w" sizes="(min-width: 768px) 768px, 100vw"
    width="768" height="432"
    data-full="/tutorials/mailserver-mailcow-aufsetzen/mailcow-mailbox-anlegen_hu_93fa943c407b3955.webp"
    alt="Der Dialog zum Anlegen eines neuen Postfachs in mailcow." title="Ein neues Postfach anlegen."
    loading="lazy" decoding="async" class="rounded-lg"><figcaption class="mt-2 text-sm text-center text-slate-500 italic">Ein neues Postfach anlegen.</figcaption></figure></p>
</li>
</ol>
<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>Ohne SOGo-Neustart bleibt die Webmail zu
  </p>
  <div class="prose-kitchen text-sm">SOGo liest die Liste der Mail-Domains <strong>nur beim Start</strong> seines Containers ein. Legst du die erste
Domain mit „Nur Domain hinzufügen&quot; an, protokolliert SOGo <code>No authentication sources defined - nobody will be able to login</code>, und jeder Webmail-Login endet mit einer nackten Seite
<strong><code>Unauthorized</code></strong> – obwohl Passwort und Postfach stimmen. Deshalb der zweite Button; nachträglich
geht es über <strong>E-Mail → SOGo neustarten</strong>. Hat sich schon ein fehlgeschlagener Login in den Cache
gebrannt, hilft zusätzlich ein Neustart von memcached (siehe „Wenn es nicht funktioniert&quot;).</div>
</div>
<p>Nach dem Anlegen der Domain zeigt dir mailcow unter dem Domain-Eintrag den <strong>DKIM-Schlüssel</strong> und
die empfohlenen DNS-Records an. Die brauchst du für die Zustellbarkeit – dazu gleich mehr.</p>
<h3 id="schritt-8-webmail-testen">Schritt 8: Webmail testen</h3>
<p>Öffne <code>https://mail.DEINE_DOMAIN/SOGo/</code> (oder klick in der mailcow-UI oben rechts auf <strong>Apps →
Webmail</strong>). Bist du noch nicht angemeldet, landest du zuerst auf der mailcow-Anmeldemaske
„Anmeldung als Benutzer&quot; – dort meldest du dich mit der <strong>vollen Mail-Adresse</strong> und dem
Postfach-Passwort an und wirst direkt in den SOGo-Webmailer mit Posteingang, Kalender und Kontakten
durchgereicht. Eine Test-Mail von dir an dich selbst sollte sofort im Posteingang liegen – das
beweist, dass <strong>lokale Zustellung</strong>, IMAP und Webmail funktionieren.</p>
<p>Der eigentliche Härtetest ist aber das Senden <strong>nach außen</strong> und das Empfangen <strong>von außen</strong> – und
genau da entscheidet sich, ob deine Mails im Postfach oder im Spam-Ordner des Empfängers landen.
Das hängt an SPF, DKIM, DMARC und dem PTR-Eintrag und ist eigenständig genug für ein
<a href="/tutorials/mailserver-zustellbarkeit/" data-track-event="Navigation|Tutorial-Link|/tutorials/mailserver-zustellbarkeit/ ← /tutorials/mailserver-mailcow-aufsetzen/">eigenes Rezept</a>.</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>Hinweis
  </p>
  <div class="prose-kitchen text-sm">Willst du sofort prüfen, wie es um deine Zustellbarkeit steht, schick nach dem Setup eine Mail an
einen Test-Dienst wie <a href="https://www.mail-tester.com">mail-tester.com</a> – er bewertet SPF, DKIM,
DMARC, Reverse DNS und Blocklisten. Unter 10/10 ist noch Luft nach oben; wie du auf die volle
Punktzahl kommst, ist Thema des Zustellbarkeits-Tutorials.</div>
</div>
<h2 id="wenn-es-nicht-funktioniert">Wenn es nicht funktioniert</h2>
<div class="troubleshoot not-prose">
<p><strong><code>generate_config.sh</code> bricht mit <code>Cannot find command 'jq'</code> ab.</strong> Das Paket <code>jq</code> fehlt. <code>sudo apt install -y jq</code> und den Generator erneut starten.</p>
<p><strong>Der Generator meldet „User declined to create daemon.json&quot; und bricht ab.</strong> Auf Hosts mit aktivem
IPv6 hast du die Frage nach der IPv6-fähigen Docker-Konfiguration mit <code>n</code> beantwortet – ohne sie
läuft mailcow dort nicht, sonst droht ein offenes Relay. Lege <code>/etc/docker/daemon.json</code> mit
<code>{&quot;ipv6&quot;: true}</code> an (Docker 28 und neuer), starte Docker mit <code>sudo systemctl restart docker</code> neu und
führe <code>./generate_config.sh</code> erneut aus – oder bestätige die Frage beim zweiten Anlauf einfach mit
Enter, dann erledigt der Generator beides selbst.</p>
<p><strong>Die Webmail antwortet nur mit <code>Unauthorized</code>.</strong> SOGo kennt deine Mail-Domain nicht: Es liest die
Domainliste ausschließlich beim Start und wurde nach dem Anlegen der Domain nicht neu gestartet – in
seinen Logs steht <code>No authentication sources defined - nobody will be able to login</code>. Starte SOGo
über <strong>E-Mail → SOGo neustarten</strong> neu. Bleibt es dabei, hängt noch ein fehlgeschlagener Login im
Cache: <code>docker compose restart memcached-mailcow sogo-mailcow</code>.</p>
<p><strong>Kein Zertifikat, <code>acme-mailcow</code> startet immer wieder neu.</strong> Let&rsquo;s Encrypt erreicht deinen Server
nicht auf Port 80, oder der A-Record von <code>mail.DEINE_DOMAIN</code> stimmt nicht. Prüfe mit <code>docker compose logs acme-mailcow</code>, ob der Hostname und die IP passen, und dass Port 80 durch UFW <strong>und</strong> die
netcup-Firewall offen ist.</p>
<p><strong>Mails nach außen werden nicht zugestellt, Logs zeigen Timeouts auf Port 25.</strong> Dein Provider sperrt
ausgehenden SMTP-Verkehr auf Port 25 (üblich als Spam-Schutz). Port 25 ausgehend beim Provider
freischalten lassen (bei netcup per Support-Ticket). Ohne das kannst du keine Mails an fremde Server
senden – Empfang und lokale Zustellung funktionieren trotzdem.</p>
<p><strong>Ports 80/443 lassen sich nicht binden (<code>address already in use</code>).</strong> Auf dem Host läuft schon ein
Webserver oder Reverse Proxy (z. B. Traefik). Mailcow gehört auf einen eigenen Server. Zur Not
lassen sich <code>HTTP_PORT</code>/<code>HTTPS_PORT</code> in der <code>mailcow.conf</code> verbiegen und mailcow hinter einen Proxy
stellen – das ist aber fortgeschritten und für die Mail-Ports ohnehin keine Lösung.</p>
<p><strong>Container starten träge oder werden vom Kernel beendet (OOM).</strong> Zu wenig RAM. Auf mindestens 6–8
GB gehen oder ClamAV in der <code>mailcow.conf</code> (<code>SKIP_CLAMD=y</code>) deaktivieren – der Virenscanner ist der
größte Speicherfresser.</p>

</div>

<h2 id="wartung--backups">Wartung &amp; Backups</h2>
<p>Ein Mailserver lebt von Pflege – plane sie fest ein.</p>
<p><strong>Updates.</strong> Mailcow bringt ein eigenes Update-Skript mit. Führe es regelmäßig (etwa monatlich)
aus; es aktualisiert die Compose-Datei und alle Images auf den neuesten Stand:</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/mailcow-dockerized
</span></span><span class="line"><span class="cl">sudo ./update.sh</span></span></code></pre></div>
</div>
<p>Das Skript legt vor dem Update automatisch eine Sicherung der Konfiguration an und startet den
Stack neu. Lies die angezeigten Release-Hinweise – bei größeren Sprüngen stehen dort gelegentlich
manuelle Schritte.</p>
<p><strong>Backups.</strong> Deine Mails, die Datenbank und die Krypto-Schlüssel (DKIM!) liegen in Docker-Volumes.
Mailcow bringt dafür ein fertiges Backup-Skript mit:</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/mailcow-dockerized/helper-scripts
</span></span><span class="line"><span class="cl">sudo <span class="nv">BACKUP_LOCATION</span><span class="o">=</span>/opt/mailcow-backups ./backup_and_restore.sh backup all</span></span></code></pre></div>
</div>
<p>Sichere das Zielverzeichnis anschließend <strong>weg vom Server</strong> – am saubersten verschlüsselt mit
<a href="/tutorials/backups-mit-restic/">restic</a>. Besonders wichtig sind die <strong>DKIM-Schlüssel</strong>: Gehen sie
verloren, brechen nach einer Wiederherstellung deine Signaturen, bis du die DNS-Records neu setzt.
Ein Backup, das du nie zurückgespielt hast, ist nur ein Hoffnungswert – teste die Wiederherstellung
einmal auf einem Testsystem.</p>
<p><strong>Reputation im Blick behalten.</strong> Prüfe gelegentlich, ob deine Server-IP auf einer Blockliste
gelandet ist (z. B. über einen der gängigen Blocklist-Checker) und wirf ab und zu einen Blick in
das Rspamd-Dashboard der mailcow-UI. Ein gehacktes oder falsch konfiguriertes Postfach, das Spam
verschickt, ruiniert die Reputation deiner ganzen Domain schnell.</p>
]]></content:encoded></item></channel></rss>