{"id":4959,"date":"2026-09-24T08:00:00","date_gmt":"2026-09-24T08:00:00","guid":{"rendered":"https:\/\/netguide.io\/linux\/?p=4959"},"modified":"2026-08-10T23:46:11","modified_gmt":"2026-08-10T23:46:11","slug":"caddy-reverse-proxy-https-einrichten","status":"publish","type":"post","link":"https:\/\/netguide.io\/linux\/de\/caddy-reverse-proxy-https-einrichten\/","title":{"rendered":"Caddy als Reverse Proxy mit automatischem HTTPS"},"content":{"rendered":"<script type=\"text\/plain\" data-tcf=\"waiting-for-consent\" data-id=\"4797\" data-bid=\"2\" data-placement=\"4798\">PGRpdiBpZD0ibmV0Z3VpZGVhLTc2OTg2Nzc3NCIgY2xhc3M9Im5ldGd1aWRlYS1iZWZvcmUtY29udGVudCBuZXRndWlkZWEtZW50aXR5LXBsYWNlbWVudCI+PGRpdiBjbGFzcz0ibmV0Z3VpZGVhLWFkbGFiZWwiPkFkdmVydGlzZW1lbnRzPC9kaXY+PHNjcmlwdCBhc3luYyBzcmM9Ii8vcGFnZWFkMi5nb29nbGVzeW5kaWNhdGlvbi5jb20vcGFnZWFkL2pzL2Fkc2J5Z29vZ2xlLmpzP2NsaWVudD1jYS1wdWItNjI1ODU1NjI1NzI0NTk5OCIgY3Jvc3NvcmlnaW49ImFub255bW91cyI+PC9zY3JpcHQ+PGlucyBjbGFzcz0iYWRzYnlnb29nbGUiIHN0eWxlPSJkaXNwbGF5OmJsb2NrOyIgZGF0YS1hZC1jbGllbnQ9ImNhLXB1Yi02MjU4NTU2MjU3MjQ1OTk4IiAKZGF0YS1hZC1zbG90PSIzNDk0MTE1MzQyIiAKZGF0YS1hZC1mb3JtYXQ9ImF1dG8iPjwvaW5zPgo8c2NyaXB0PiAKKGFkc2J5Z29vZ2xlID0gd2luZG93LmFkc2J5Z29vZ2xlIHx8IFtdKS5wdXNoKHt9KTsgCjwvc2NyaXB0Pgo8L2Rpdj4=<\/script>\n<p class=\"wp-block-paragraph\">Einen Dienst sicher per HTTPS unter einer eigenen Domain erreichbar machen \u2013 normalerweise ein Gefummel mit Zertifikaten. Nicht mit Caddy. Der moderne Webserver holt und erneuert TLS-Zertifikate vollautomatisch. In dieser Anleitung richtest du <strong>Caddy als Reverse Proxy mit automatischem HTTPS<\/strong> ein.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Caddy als Reverse Proxy<\/strong> nimmt dir die l\u00e4stigste Aufgabe beim Betrieb eigener Webdienste ab: das Verwalten von TLS-Zertifikaten. Der Webserver fordert Let&#8217;s-Encrypt-Zertifikate automatisch an, erneuert sie rechtzeitig und leitet Anfragen sauber an deine Backend-Dienste weiter. In diesem Artikel vergleichen wir Caddy mit Nginx und Traefik, schauen uns n\u00fctzliche Direktiven an und gehen der Zertifikats-Fehlersuche auf den Grund.<\/p>\n\n\n\t\t\t\t<div class=\"wp-block-uagb-table-of-contents uagb-toc__align-left uagb-toc__columns-1  uagb-block-1ffd1ad5      \"\n\t\t\t\t\tdata-scroll= \"1\"\n\t\t\t\t\tdata-offset= \"30\"\n\t\t\t\t\tstyle=\"\"\n\t\t\t\t>\n\t\t\t\t<div class=\"uagb-toc__wrap\">\n\t\t\t\t\t\t<div class=\"uagb-toc__title\">\n\t\t\t\t\t\t\tInhaltsverzeichnis\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"uagb-toc__list-wrap \">\n\t\t\t\t\t\t<ol class=\"uagb-toc__list\"><li class=\"uagb-toc__list\"><a href=\"#was-macht-caddy-besonders\" class=\"uagb-toc-link__trigger\">Was macht Caddy besonders?<\/a><li class=\"uagb-toc__list\"><a href=\"#schritt-1-caddy-installieren\" class=\"uagb-toc-link__trigger\">Schritt 1: Caddy installieren<\/a><li class=\"uagb-toc__list\"><a href=\"#schritt-2-den-caddyfile-anlegen\" class=\"uagb-toc-link__trigger\">Schritt 2: Den Caddyfile anlegen<\/a><li class=\"uagb-toc__list\"><a href=\"#schritt-3-konfiguration-laden\" class=\"uagb-toc-link__trigger\">Schritt 3: Konfiguration laden<\/a><li class=\"uagb-toc__list\"><a href=\"#mehrere-dienste-hinter-einer-caddy-instanz\" class=\"uagb-toc-link__trigger\">Mehrere Dienste hinter einer Caddy-Instanz<\/a><li class=\"uagb-toc__list\"><a href=\"#caddy-im-vergleich-zu-nginx-und-traefik\" class=\"uagb-toc-link__trigger\">Caddy im Vergleich zu Nginx und Traefik<\/a><li class=\"uagb-toc__list\"><a href=\"#n\u00fctzliche-direktiven-im-caddyfile\" class=\"uagb-toc-link__trigger\">N\u00fctzliche Direktiven im Caddyfile<\/a><li class=\"uagb-toc__list\"><a href=\"#fehlersuche-wenn-das-zertifikat-nicht-kommt\" class=\"uagb-toc-link__trigger\">Fehlersuche: Wenn das Zertifikat nicht kommt<\/a><li class=\"uagb-toc__list\"><a href=\"#h\u00e4ufige-fragen\" class=\"uagb-toc-link__trigger\">H\u00e4ufige Fragen<\/a><li class=\"uagb-toc__list\"><a href=\"#brauche-ich-f\u00fcr-caddy-zwingend-port-80\" class=\"uagb-toc-link__trigger\">Brauche ich f\u00fcr Caddy zwingend Port 80?<\/a><li class=\"uagb-toc__list\"><a href=\"#kann-caddy-wildcard-zertifikate-ausstellen\" class=\"uagb-toc-link__trigger\">Kann Caddy Wildcard-Zertifikate ausstellen?<\/a><li class=\"uagb-toc__list\"><a href=\"#wie-lade-ich-caddy-ohne-downtime-neu\" class=\"uagb-toc-link__trigger\">Wie lade ich Caddy ohne Downtime neu?<\/a><li class=\"uagb-toc__list\"><a href=\"#fazit\" class=\"uagb-toc-link__trigger\">Fazit<\/a><\/ol>\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Was macht Caddy besonders?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Caddy besorgt sich f\u00fcr jede konfigurierte Domain automatisch ein kostenloses Let\u2019s-Encrypt-Zertifikat und erneuert es rechtzeitig \u2013 ganz ohne Zusatzarbeit. Als Reverse Proxy leitet er Anfragen von au\u00dfen an deine internen Dienste weiter, \u00e4hnlich wie der <a href=\"https:\/\/netguide.io\/linux\/de\/mit-dem-nginx-proxy-manager-docker-container-ueber-das-internet-verfuegbar-machen\/\">Nginx Proxy Manager<\/a>, aber besonders schlank per Textdatei konfiguriert.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Schritt 1: Caddy installieren<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Installiere Caddy aus dem offiziellen Repository:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#24292e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#e1e4e8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl\ncurl -1sLf \"https:\/\/dl.cloudsmith.io\/public\/caddy\/stable\/gpg.key\" | sudo gpg --dearmor -o \/usr\/share\/keyrings\/caddy-stable-archive-keyring.gpg\ncurl -1sLf \"https:\/\/dl.cloudsmith.io\/public\/caddy\/stable\/debian.deb.txt\" | sudo tee \/etc\/apt\/sources.list.d\/caddy-stable.list\nsudo apt update\nsudo apt install -y caddy<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark\" style=\"background-color: #24292e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #B392F0\">sudo<\/span><span style=\"color: #9ECBFF\"> apt<\/span><span style=\"color: #9ECBFF\"> install<\/span><span style=\"color: #79B8FF\"> -y<\/span><span style=\"color: #9ECBFF\"> debian-keyring<\/span><span style=\"color: #9ECBFF\"> debian-archive-keyring<\/span><span style=\"color: #9ECBFF\"> apt-transport-https<\/span><span style=\"color: #9ECBFF\"> curl<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">curl<\/span><span style=\"color: #79B8FF\"> -1sLf<\/span><span style=\"color: #9ECBFF\"> \"https:\/\/dl.cloudsmith.io\/public\/caddy\/stable\/gpg.key\"<\/span><span style=\"color: #F97583\"> |<\/span><span style=\"color: #B392F0\"> sudo<\/span><span style=\"color: #9ECBFF\"> gpg<\/span><span style=\"color: #79B8FF\"> --dearmor<\/span><span style=\"color: #79B8FF\"> -o<\/span><span style=\"color: #9ECBFF\"> \/usr\/share\/keyrings\/caddy-stable-archive-keyring.gpg<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">curl<\/span><span style=\"color: #79B8FF\"> -1sLf<\/span><span style=\"color: #9ECBFF\"> \"https:\/\/dl.cloudsmith.io\/public\/caddy\/stable\/debian.deb.txt\"<\/span><span style=\"color: #F97583\"> |<\/span><span style=\"color: #B392F0\"> sudo<\/span><span style=\"color: #9ECBFF\"> tee<\/span><span style=\"color: #9ECBFF\"> \/etc\/apt\/sources.list.d\/caddy-stable.list<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">sudo<\/span><span style=\"color: #9ECBFF\"> apt<\/span><span style=\"color: #9ECBFF\"> update<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">sudo<\/span><span style=\"color: #9ECBFF\"> apt<\/span><span style=\"color: #9ECBFF\"> install<\/span><span style=\"color: #79B8FF\"> -y<\/span><span style=\"color: #9ECBFF\"> caddy<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Schritt 2: Den Caddyfile anlegen<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Die gesamte Konfiguration steht in <code>\/etc\/caddy\/Caddyfile<\/code>. F\u00fcr einen Reverse Proxy gen\u00fcgen zwei Zeilen \u2013 Caddy k\u00fcmmert sich um das HTTPS von selbst:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#24292e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#e1e4e8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>meine-domain.de {\n    reverse_proxy localhost:8080\n}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark\" style=\"background-color: #24292e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #E1E4E8\">meine-domain.de {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">    reverse_proxy localhost:8080<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Damit leitet Caddy alle Anfragen an <code>meine-domain.de<\/code> an den lokal auf Port 8080 laufenden Dienst weiter \u2013 automatisch \u00fcber HTTPS.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Schritt 3: Konfiguration laden<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Nach jeder \u00c4nderung l\u00e4dst du die Konfiguration neu \u2013 ohne Ausfallzeit:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#24292e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#e1e4e8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>sudo systemctl reload caddy<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark\" style=\"background-color: #24292e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #B392F0\">sudo<\/span><span style=\"color: #9ECBFF\"> systemctl<\/span><span style=\"color: #9ECBFF\"> reload<\/span><span style=\"color: #9ECBFF\"> caddy<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Wichtig: Die Domain muss per DNS auf deinen Server zeigen und die Ports 80 und 443 m\u00fcssen in der <a href=\"https:\/\/netguide.io\/linux\/de\/ufw-firewall-einrichten-linux\/\">Firewall<\/a> offen sein, damit Let\u2019s Encrypt das Zertifikat ausstellen kann.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Mehrere Dienste hinter einer Caddy-Instanz<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Du kannst beliebig viele Domains untereinander definieren \u2013 jede mit eigenem Ziel:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#24292e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#e1e4e8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>app.meine-domain.de {\n    reverse_proxy localhost:3000\n}\n\ncloud.meine-domain.de {\n    reverse_proxy localhost:8080\n}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark\" style=\"background-color: #24292e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #E1E4E8\">app.meine-domain.de {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">    reverse_proxy localhost:3000<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">cloud.meine-domain.de {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">    reverse_proxy localhost:8080<\/span><\/span>\n<span class=\"line\"><span style=\"color: #E1E4E8\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Das eignet sich perfekt, um mehrere <a href=\"https:\/\/netguide.io\/linux\/de\/docker-netzwerke-erklaert\/\">Docker-Dienste<\/a> unter verschiedenen Subdomains zu ver\u00f6ffentlichen.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Caddy im Vergleich zu Nginx und Traefik<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Caddy ist nicht der einzige Reverse Proxy, aber einer der einfachsten. Der gro\u00dfe Vorteil gegen\u00fcber Nginx ist das automatische HTTPS ohne zus\u00e4tzliche Tools wie Certbot. Traefik wiederum gl\u00e4nzt in dynamischen Docker-Umgebungen, ist aber komplexer zu konfigurieren. F\u00fcr einen \u00fcberschaubaren Selfhosting-Server mit wenigen Diensten ist Caddy meist der schnellste Weg zum Ziel.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Merkmal<\/th><th>Caddy<\/th><th>Nginx<\/th><th>Traefik<\/th><\/tr><\/thead><tbody><tr><td>Auto-HTTPS<\/td><td>Ja, integriert<\/td><td>Nur mit Certbot<\/td><td>Ja<\/td><\/tr><tr><td>Konfiguration<\/td><td>Sehr einfach<\/td><td>Umfangreich<\/td><td>Mittel<\/td><\/tr><tr><td>Docker-Integration<\/td><td>Gut<\/td><td>Manuell<\/td><td>Sehr gut<\/td><\/tr><tr><td>Ressourcen<\/td><td>Gering<\/td><td>Sehr gering<\/td><td>Mittel<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Wenn du bereits auf den <a href=\"https:\/\/netguide.io\/linux\/de\/mit-dem-nginx-proxy-manager-docker-container-ueber-das-internet-verfuegbar-machen\/\">Nginx Proxy Manager<\/a> setzt, gibt es keinen zwingenden Grund zu wechseln \u2013 f\u00fcr neue, textbasiert verwaltete Setups ist Caddy aber oft angenehmer.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">N\u00fctzliche Direktiven im Caddyfile<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Der Caddyfile ist bewusst minimalistisch, bietet aber alles, was ein Reverse Proxy braucht. Neben dem einfachen <code>reverse_proxy<\/code> kannst du Antworten komprimieren, Sicherheits-Header setzen, einzelne Pfade sch\u00fctzen oder Zugriffe protokollieren. Diese Direktiven f\u00fcgst du einfach innerhalb des Domain-Blocks hinzu.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>encode gzip zstd<\/code> \u2013 Antworten automatisch komprimieren<\/li>\n\n<li><code>basicauth<\/code> \u2013 einzelne Bereiche mit Passwort sch\u00fctzen<\/li>\n\n<li><code>header<\/code> \u2013 Sicherheits-Header wie HSTS setzen<\/li>\n\n<li><code>log<\/code> \u2013 Zugriffe in eine Datei schreiben<\/li>\n\n<li><code>handle_path<\/code> \u2013 Anfragen nach Pfad-Pr\u00e4fix aufteilen<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Damit dein Server von au\u00dfen erreichbar ist, m\u00fcssen die Ports 80 und 443 offen sein. Pr\u00fcfe deine <a href=\"https:\/\/netguide.io\/linux\/de\/ufw-firewall-einrichten-linux\/\">UFW-Firewall<\/a> entsprechend.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Besonders praktisch wird Caddy, wenn du mehrere Container hinter einer Instanz betreibst. Jeder Dienst bekommt seinen eigenen Domain-Block, und Caddy k\u00fcmmert sich um das passende Zertifikat pro Subdomain. L\u00e4uft dein Backend in einem Docker-Container, verweist die <code>reverse_proxy<\/code>-Zeile einfach auf den Container-Namen und den internen Port \u2013 vorausgesetzt, Caddy und der Dienst teilen sich ein <a href=\"https:\/\/netguide.io\/linux\/de\/docker-netzwerke-erklaert\/\">Docker-Netzwerk<\/a>. So ersetzt eine einzige, gut lesbare Konfigurationsdatei ein ganzes Geflecht aus Zertifikaten und Weiterleitungsregeln.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Fehlersuche: Wenn das Zertifikat nicht kommt<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Bleibt das HTTPS-Zertifikat aus, liegt es fast immer an einer von drei Ursachen: Die Domain zeigt per DNS nicht auf deinen Server, Port 80 ist blockiert (Let&#8217;s Encrypt braucht ihn f\u00fcr die HTTP-Challenge), oder der Dienst l\u00e4uft hinter einem weiteren NAT ohne Portweiterleitung. Kontrolliere deine Konfiguration zun\u00e4chst mit <code>caddy validate --config \/etc\/caddy\/Caddyfile<\/code> und wirf einen Blick in die Logs \u00fcber <code>journalctl -u caddy -f<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ein h\u00e4ufiger Anf\u00e4ngerfehler ist au\u00dferdem das Rate-Limit von Let&#8217;s Encrypt: Wer beim Ausprobieren zu oft ein echtes Zertifikat anfordert, wird zeitweise ausgesperrt. Nutze f\u00fcr Tests deshalb den Staging-Endpunkt, indem du in der globalen Options-Sektion des Caddyfile <code>acme_ca https:\/\/acme-staging-v02.api.letsencrypt.org\/directory<\/code> setzt. Erst wenn alles fehlerfrei l\u00e4uft, entfernst du die Zeile wieder und Caddy holt das g\u00fcltige Produktiv-Zertifikat.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">H\u00e4ufige Fragen<\/h3>\n\n\n\n<h3 class=\"wp-block-heading\">Brauche ich f\u00fcr Caddy zwingend Port 80?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">F\u00fcr die Standard-Zertifikatsausstellung ja, denn Let&#8217;s Encrypt nutzt die HTTP-Challenge \u00fcber Port 80. Alternativ kannst du die DNS-Challenge einrichten, die ohne offenen Port 80 auskommt und auch Wildcard-Zertifikate erm\u00f6glicht \u2013 daf\u00fcr braucht Caddy aber API-Zugriff auf deinen DNS-Anbieter.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Kann Caddy Wildcard-Zertifikate ausstellen?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Ja, aber nur \u00fcber die DNS-Challenge. Dazu ben\u00f6tigst du das passende DNS-Plugin f\u00fcr deinen Anbieter und hinterlegst einen API-Token im Caddyfile. Danach kann Caddy Zertifikate f\u00fcr <code>*.deine-domain.de<\/code> automatisch anfordern und erneuern.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Wie lade ich Caddy ohne Downtime neu?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Mit <code>caddy reload --config \/etc\/caddy\/Caddyfile<\/code> \u00fcbernimmt Caddy die neue Konfiguration im laufenden Betrieb, ohne bestehende Verbindungen zu unterbrechen. Ein vollst\u00e4ndiger Neustart des Dienstes ist daf\u00fcr nicht n\u00f6tig.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Fazit<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Caddy nimmt dir den l\u00e4stigsten Teil des Hostings ab: Zertifikate. Zwei Zeilen im Caddyfile gen\u00fcgen, und dein Dienst ist per HTTPS erreichbar \u2013 automatisch verl\u00e4ngert. F\u00fcr schlanke Setups ist Caddy damit eine der elegantesten Reverse-Proxy-L\u00f6sungen. Ein VPN wie <a href=\"https:\/\/netguide.io\/linux\/de\/wireguard-vpn-einrichten-linux\/\">WireGuard<\/a> ist die Alternative, wenn ein Dienst gar nicht \u00f6ffentlich sein soll.<\/p>\n<script type=\"text\/plain\" data-tcf=\"waiting-for-consent\" data-id=\"4799\" data-bid=\"2\" data-placement=\"4800\">PGRpdiBpZD0ibmV0Z3VpZGVhLTg3NTY3MDgyMSIgY2xhc3M9Im5ldGd1aWRlYS1hZnRlci1jb250ZW50IG5ldGd1aWRlYS1lbnRpdHktcGxhY2VtZW50Ij48ZGl2IGNsYXNzPSJuZXRndWlkZWEtYWRsYWJlbCI+QWR2ZXJ0aXNlbWVudHM8L2Rpdj48c2NyaXB0IGFzeW5jIHNyYz0iLy9wYWdlYWQyLmdvb2dsZXN5bmRpY2F0aW9uLmNvbS9wYWdlYWQvanMvYWRzYnlnb29nbGUuanM\/Y2xpZW50PWNhLXB1Yi02MjU4NTU2MjU3MjQ1OTk4IiBjcm9zc29yaWdpbj0iYW5vbnltb3VzIj48L3NjcmlwdD48aW5zIGNsYXNzPSJhZHNieWdvb2dsZSIgc3R5bGU9ImRpc3BsYXk6YmxvY2s7IiBkYXRhLWFkLWNsaWVudD0iY2EtcHViLTYyNTg1NTYyNTcyNDU5OTgiIApkYXRhLWFkLXNsb3Q9IjQ1NTk3ODUwMDIiIApkYXRhLWFkLWZvcm1hdD0iYXV0byI+PC9pbnM+CjxzY3JpcHQ+IAooYWRzYnlnb29nbGUgPSB3aW5kb3cuYWRzYnlnb29nbGUgfHwgW10pLnB1c2goe30pOyAKPC9zY3JpcHQ+CjwvZGl2Pg==<\/script>","protected":false},"excerpt":{"rendered":"<p>Caddy als Reverse Proxy einrichten: Dienste unter einer Domain ver\u00f6ffentlichen und automatisch HTTPS per Let\u2019s Encrypt erhalten \u2013 mit minimaler Konfiguration.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_affilinode_tracking":"","_affilinode_autolink_off":false,"_affilinode_rating":"","_uag_custom_page_level_css":"","site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[9],"tags":[],"class_list":["post-4959","post","type-post","status-publish","format-standard","hentry","category-linux"],"uagb_featured_image_src":{"full":false,"thumbnail":false,"medium":false,"medium_large":false,"large":false,"1536x1536":false,"2048x2048":false},"uagb_author_info":{"display_name":"Tobias","author_link":"https:\/\/netguide.io\/linux\/author\/tobias-pries\/"},"uagb_comment_info":0,"uagb_excerpt":"Caddy als Reverse Proxy einrichten: Dienste unter einer Domain ver\u00f6ffentlichen und automatisch HTTPS per Let\u2019s Encrypt erhalten \u2013 mit minimaler Konfiguration.","brizy_media":[],"_links":{"self":[{"href":"https:\/\/netguide.io\/linux\/wp-json\/wp\/v2\/posts\/4959","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/netguide.io\/linux\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/netguide.io\/linux\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/netguide.io\/linux\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/netguide.io\/linux\/wp-json\/wp\/v2\/comments?post=4959"}],"version-history":[{"count":1,"href":"https:\/\/netguide.io\/linux\/wp-json\/wp\/v2\/posts\/4959\/revisions"}],"predecessor-version":[{"id":4991,"href":"https:\/\/netguide.io\/linux\/wp-json\/wp\/v2\/posts\/4959\/revisions\/4991"}],"wp:attachment":[{"href":"https:\/\/netguide.io\/linux\/wp-json\/wp\/v2\/media?parent=4959"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/netguide.io\/linux\/wp-json\/wp\/v2\/categories?post=4959"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/netguide.io\/linux\/wp-json\/wp\/v2\/tags?post=4959"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}