One place for hosting & domains

      Hosten einer Website mit Caddy unter Ubuntu 18.04


      Der Autor wählte den Free and Open Source Fund, um eine Spende im Rahmen des Programms Write for DOnations zu erhalten.

      Einführung

      Caddy ist ein auf Einfachheit und Sicherheit ausgelegter Webserver, der mit einer Reihe von Funktionen ausgestattet ist, die für das Hosting von Websites nützlich sind. Beispielsweise kann er automatisch TLS-Zertifikate von Let’s Encrypt beziehen und verwalten, um HTTPS zu aktivieren, und er bietet Unterstützung für HTTP/2. HTTPS ist ein System zur Sicherung des Datenverkehrs zwischen Ihren Benutzern und Ihrem Server und entwickelte sich schnell zu einer grundlegenden Erwartung für jede Website, die in Produktion ausgeführt wird – ohne HTTPS warnen Chrome und Firefox, dass Ihre Website „Nicht sicher“ ist, wenn Benutzer versuchen, Anmeldeinformationen einzugeben.

      Früher wurde als Methode zur Installation von Caddy empfohlen, vorgefertigte Binärdateien von der Caddy-Projekt-Website herunterzuladen. Änderungen in der Lizenzierungsweise von Caddy bedeuten jedoch, dass Sie diese vorgefertigten Binärdateien nicht mehr für kommerzielle Zwecke verwenden dürfen, es sei denn, Sie zahlen eine Lizenzgebühr, auch wenn Sie Caddy nur intern innerhalb eines Unternehmens verwenden. Glücklicherweise ist der Quellcode von Caddy immer noch vollständig Open-Source und Sie können Caddy selbst erstellen, um Lizenzprobleme zu vermeiden.

      In diesem Tutorial erstellen Sie Caddy aus dem Quellcode und verwenden ihn zum Hosten einer mit HTTPS gesicherten Website. Dazu müssen Sie ihn kompilieren, mit einer Caddyfile konfigurieren und Plugins installieren. Am Ende lernen Sie, wie Sie Ihre Installation aktualisieren, wenn eine neue Version verfügbar ist.

      Voraussetzungen

      Schritt 1 – Erstellen von Caddy

      In diesem Schritt erstellen Sie den Caddy aus dem Quellcode mit der Möglichkeit, später Plugins hinzuzufügen, ohne den Quellcode von Caddy zu ändern.

      Für die Zwecke dieses Tutorials werden Sie den Quellcode unter ~/caddy speichern. Erstellen Sie das Verzeichnis durch Ausführen des folgenden Befehls:

      Navigieren Sie dorthin:

      Speichern Sie den Quellcode zur Ausführung und Anpassung von Caddy in einer Datei namens caddy.go. Erstellen Sie diese mit dem folgenden Befehl:

      Fügen Sie die folgenden Zeilen hinzu:

      ~/caddy/caddy.go

      package main
      
      import (
          "github.com/caddyserver/caddy/caddy/caddymain"
      )
      
      func main() {
          // caddymain.EnableTelemetry = false
          caddymain.Run()
      }
      

      Dieser Code importiert Caddy direkt von Github (mit Git) und startet ihn von der Eingangsfunktion main. Wenn Sie die Telemetrie aktivieren möchten, entkommentieren Sie die Zeile caddymain.EnableTelemetry und setzen den Wert auf true. Wenn Sie fertig sind, speichern und schließen Sie die Datei.

      Damit caddy.go die importierten Abhängigkeiten verwenden kann, müssen Sie es als Modul initialisieren:

      Output

      go: creating new go.mod: module caddy

      An diesem Punkt sind Sie bereit, die Stock-Version von Caddy aus dem obigen Quellcode zu erstellen, indem Sie Folgendes ausführen:

      Es werden zahlreiche Ausgaben erscheinen, die detailliert aufführen, welche Bibliotheken von Go als Abhängigkeiten heruntergeladen werden, die zum Kompilieren notwendig sind. Die resultierende ausführbare Datei wird unter $GOPATH/bin gespeichert, wie in den Voraussetzungen erklärt.

      Führen Sie Caddy nach Abschluss aus:

      Sie werden eine Ausgabe ähnlich der folgenden sehen:

      Output

      Activating privacy features... done. Serving HTTP on port 2015 http://:2015 WARNING: File descriptor limit 1024 is too low for production servers. At least 8192 is recommended. Fix with `ulimit -n 8192`.

      Dies bedeutet, dass Caddy erfolgreich gestartet wurde und auf dem Port 2015 verfügbar ist. Sie können die Warnmeldung ignorieren, da diese Grenze in späteren Schritten ohne Ihr Zutun angepasst wird. Drücken Sie zum Beenden STRG + C.

      Sie haben Caddy nun erstellt und ausgeführt. Im nächsten Schritt installieren Sie Caddy als Dienst, damit er automatisch beim Booten startet, und passen dann seine Eigentums- und Berechtigungseinstellungen an, um die Sicherheit des Servers zu gewährleisten.

      Schritt 2 – Installieren von Caddy

      Nachdem Sie nun bestätigt haben, dass Sie Caddy erstellen und ausführen können, ist es an der Zeit, einen systemd-Dienst zu konfigurieren, damit Caddy automatisch beim Systemstart gestartet werden kann. Um mehr über systemd zu erfahren, besuchen Sie unser Tutorial Systemd-Grundlagen.

      Verschieben Sie zunächst die Caddy-Binärdatei nach /usr/local/bin, den Standardspeicherort für Binärdateien, die nicht vom Ubuntu-Paketmanager verwaltet werden und für den Systembetrieb nicht entscheidend sind:

      • sudo mv $GOPATH/bin/caddy /usr/local/bin/

      Übertragen Sie anschließend die Eigentümerschaft der Caddy-Binärdatei an den root user:

      • sudo chown root:root /usr/local/bin/caddy

      Dadurch wird verhindert, dass andere Konten die ausführbare Datei modifizieren. Aber selbst wenn der root user Eigentümer von Caddy ist, ist es ratsam, ihn nur mit anderen, Nicht-Root-Konten auszuführen, die auf dem System vorhanden sind. Dadurch wird sichergestellt, dass im Falle einer Kompromittierung von Caddy (oder eines anderen Programms) der Angreifer nicht in der Lage sein wird, die Binärdatei zu verändern oder Befehle als root auszuführen.

      Legen Sie anschließend die Berechtigungen der Binärdatei auf 755 fest – dies gibt root volle Lese-/Schreib-/Ausführungsberechtigungen für die Datei, während andere Benutzer nur in der Lage sind, sie zu lesen und auszuführen:

      • sudo chmod 755 /usr/local/bin/caddy

      Da der Caddy-Prozess nicht als root ausgeführt wird, verhindert Linux, dass er an die Ports 80 und 443 (die Standardports für HTTP bzw. HTTPS) gebunden wird, da es sich hierbei um mit Berechtigungen versehene Operationen handelt. Um in Ihrer Domäne leicht zugänglich zu sein, muss Caddy abhängig vom Protokoll an einen dieser Ports gebunden werden. Andernfalls müssten Sie der Domain-URL in Ihrem Browser eine bestimmte Port-Nummer hinzufügen, um die Inhalte anzuzeigen, die er bereitstellen wird.

      Damit Caddy an niedrige Ports gebunden werden kann, ohne als root ausgeführt zu werden, führen Sie den folgenden Befehl aus:

      • sudo setcap 'cap_net_bind_service=+ep' /usr/local/bin/caddy

      Das Dienstprogramm setcap legt die Dateifähigkeiten fest. In diesem Befehl weist es der Caddy-Binärdatei die Fähigkeit CAP_NET_BIND_SERVICE zu, die es einer ausführbaren Datei ermöglicht, sich an einen niedrigeren Port als 1024 zu binden.

      Sie haben nun die Einrichtung der Caddy-Binärdatei abgeschlossen und können mit dem Schreiben der Caddy-Konfiguration beginnen. Erstellen Sie ein Verzeichnis, in dem Sie die Konfigurationsdateien von Caddy speichern, indem Sie den folgenden Befehl ausführen:

      Legen Sie dann die richtigen Benutzer- und Gruppenberechtigungen dafür fest:

      • sudo chown -R root:www-data /etc/caddy

      Die Einstellung des Benutzers als root und der Gruppe als www-data stellt sicher, dass Caddy Lese- und Schreibzugriff auf den Ordner hat (über die Gruppe www-data) und dass nur das Superuser-Konto die gleichen Rechte zum Lesen und Ändern hat. www-data ist der Standardbenutzer und die Standardgruppe für Webserver unter Ubuntu.

      In einem späteren Schritt werden Sie die automatische TLS-Zertifikatsbereitstellung von Let’s Encrypt aktivieren. Erstellen Sie in Vorbereitung darauf ein Verzeichnis, in dem alle TLS-Zertifikate gespeichert werden, die Caddy erhalten wird, und geben ihm die gleichen Eigentumsregeln wie das Verzeichnis /etc/caddy:

      • sudo mkdir /etc/ssl/caddy
      • sudo chown -R root:www-data /etc/ssl/caddy

      Caddy muss Zertifikate in dieses Verzeichnis schreiben und aus diesem Verzeichnis lesen können, um Anfragen zu verschlüsseln.  Aus diesem Grund sollten Sie die Berechtigungen für das Verzeichnis /etc/ssl/caddy so ändern, dass es nur für root und www-data zugänglich ist:

      • sudo chmod 0770 /etc/ssl/caddy

      Erstellen Sie anschließend ein Verzeichnis, um die Dateien zu speichern, die Caddy hosten wird:

      Setzten Sie dann den Eigentümer und die Gruppe des Verzeichnisses auf www-data:

      • sudo chown www-data:www-data /var/www

      Caddy liest seine Konfiguration aus einer Datei namens Caddyfile, die unter /etc/caddy gespeichert ist. Erstellen Sie die Datei auf der Festplatte, indem Sie Folgendes ausführen:

      • sudo touch /etc/caddy/Caddyfile

      Um den Caddy-Dienst zu installieren, laden Sie die Unit-Datei systemd aus dem Caddy Github-Repository in /etc/systemd/system herunter, indem Sie Folgendes ausführen:

      • sudo sh -c 'curl https://raw.githubusercontent.com/caddyserver/caddy/master/dist/init/linux-systemd/caddy.service > /etc/systemd/system/caddy.service'

      Ändern Sie die Berechtigungen der Dienstdatei, damit sie nur durch ihren Eigentümer root geändert werden kann:

      • sudo chmod 644 /etc/systemd/system/caddy.service

      Dann laden Sie systemd neu, um den Caddy-Dienst zu erkennen:

      • sudo systemctl daemon-reload

      Prüfen Sie, ob systemd den Caddy-Dienst erkannt hat, durch Ausführen von systemctl status:

      • sudo systemctl status caddy

      Sie sehen einen Output, der so ähnlich wie der nachfolgende aussieht:

      Output

      ● caddy.service - Caddy HTTP/2 web server Loaded: loaded (/etc/systemd/system/caddy.service; disabled; vendor preset: e Active: inactive (dead) Docs: https://caddyserver.com/docs

      Wenn Sie die gleiche Ausgabe sehen, wurde der neue Dienst korrekt von systemd erkannt.

      Als Teil der anfänglichen Server-Einrichtungsvoraussetzung haben Sie ufw, die unkomplizierte Firewall, aktiviert und SSH-Verbindungen zugelassen. Damit Caddy HTTP- und HTTPS-Verkehr von Ihrem Server aus bereitstellen kann, müssen Sie diese in ufw zulassen, indem Sie den folgenden Befehl ausführen:

      • sudo ufw allow proto tcp from any to any port 80,443

      Der Output sieht wie folgt aus:

      Output

      Rule added Rule added (v6)

      Überprüfen Sie mit ufw status, ob Ihre Änderungen funktioniert haben:

      Sie sehen die folgende Ausgabe:

      Output

      Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere 80,443/tcp ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) 80,443/tcp (v6) ALLOW Anywhere (v6)

      Ihre Installation von Caddy ist nun abgeschlossen, aber noch nicht konfiguriert, um etwas bereitzustellen. Im nächsten Schritt konfigurieren Sie Caddy, um Dateien aus dem Verzeichnis /var/www bereitzustellen.

      Schritt 3 – Konfigurieren von Caddy

      In diesem Abschnitt schreiben Sie die grundlegende Caddy-Konfiguration für die Bereitstellung von statischen Dateien von Ihrem Server aus.

      Beginnen Sie mit der Erstellung einer grundlegenden HTML-Datei in /var/www namens index.html:

      • sudo nano /var/www/index.html

      Fügen Sie die folgenden Zeilen hinzu:

      /var/www/index.html

      <!DOCTYPE html>
      <html>
      <head>
        <title>Hello from Caddy!</title>
      </head>
      <body>
        <h1 style="font-family: sans-serif">This page is being served via Caddy</h1>
      </body>
      </html>
      

      Wenn sie in einem Webbrowser angezeigt wird, zeigt sie eine Kopfzeile mit dem Text This page is being served via Caddy. Speichern und schließen Sie die Datei.

      Öffnen Sie die zuvor erstellte Konfigurationsdatei Caddyfile für die Bearbeitung:

      • sudo nano /etc/caddy/Caddyfile

      Fügen Sie die folgenden Zeilen hinzu:

      /etc/caddy/Caddyfile

      :80 {
        root /var/www
        gzip
      }
      

      Hierbei handelt es sich um eine grundlegende Caddy-Konfiguration, die besagt, dass der Port 80 Ihres Servers mit Dateien aus /var/www bedient und mit gzip komprimiert werden soll, um die Seitenladezeiten auf der Client-Seite zu reduzieren.

      In den meisten Fällen können Sie die Konfigurationsanweisungen mit Caddy weiter anpassen. Beispielsweise können Sie die gzip-Komprimierung auf HTML- und PHP-Dateien beschränken und die Komprimierungsstufe auf 6 setzen (1 ist die niedrigste und 9 die höchste Komprimierungsstufe), indem Sie die Anweisung mit geschweiften Klammern erweitern und Unteranweisungen darunter auflisten:

      /etc/caddy/Caddyfile

      :80 {
        root /var/www
        gzip {
            ext .html .htm .php
            level 6
        }
      }
      

      Wenn Sie fertig sind, speichern und schließen Sie die Datei.

      Caddy verfügt über eine große Anzahl verschiedener Richtlinien für viele Anwendungsfälle. Beispielsweise könnte die Anweisung fastcgi für das Aktivieren von PHP nützlich sein. Die Anweisung markdown könnte verwendet werden, um Markdown-Dateien vor der Bereitstellung automatisch in HTML zu konvertieren, was für die Erstellung eines einfachen Blogs nützlich sein könnte.

      Um zu testen, ob alles korrekt funktioniert, starten Sie den Caddy-Dienst:

      • sudo systemctl start caddy

      Führen Sie als Nächstes systemctl status aus, um Informationen über den Status des Caddy-Dienstes zu erhalten:

      • sudo systemctl status caddy

      Sie sehen dann Folgendes:

      Output

      ● caddy.service - Caddy HTTP/2 web server Loaded: loaded (/etc/systemd/system/caddy.service; disabled; vendor preset: enabled) Active: active (running) since Thu 2020-03-12 11:17:49 UTC; 11s ago Docs: https://caddyserver.com/docs Main PID: 3893 (caddy) Tasks: 7 (limit: 1152) CGroup: /system.slice/caddy.service └─3893 /usr/local/bin/caddy -log stdout -log-timestamps=false -agree=true -conf=/etc/caddy/Caddyfile -root=/var/tmp Mar 12 11:17:49 caddy-article-update systemd[1]: Started Caddy HTTP/2 web server. Mar 12 11:17:49 caddy-article-update caddy[3893]: [INFO] Caddy version: v1.0.5 Mar 12 11:17:49 caddy-article-update caddy[3893]: Activating privacy features... done. Mar 12 11:17:49 caddy-article-update caddy[3893]: Serving HTTP on port 80 Mar 12 11:17:49 caddy-article-update caddy[3893]: http:// Mar 12 11:17:49 caddy-article-update caddy[3893]: [INFO] Serving http:// Mar 12 11:17:49 caddy-article-update caddy[3893]: [INFO][cache:0xc00007a7d0] Started certificate maintenance routine Mar 12 11:17:49 caddy-article-update caddy[3893]: [WARNING] Sending telemetry (attempt 1): Post "https://telemetry.caddyserver.com/v1/update/6a8159c4-3427-42 Mar 12 11:17:57 caddy-article-update caddy[3893]: [WARNING] Sending telemetry (attempt 2): Post "https://telemetry.caddyserver.com/v1/update/6a8159c4-3427-42 ...

      Sie können nun in einem Webbrowser zu der IP Ihres Servers browsen. Ihre Beispiel-Webseite zeigt an:

      Nachricht von Caddy

      Sie haben Caddy nun konfiguriert, um statische Dateien von Ihrem Server aus bereitzustellen. Im nächsten Schritt erweitern Sie die Funktionalität von Caddy durch die Verwendung von Plugins.

      Schritt 4 — Verwenden von Plugins

      Plugins bieten eine Möglichkeit, das Verhalten von Caddy zu ändern und zu erweitern. Sie bieten allgemein mehr Konfigurationsanweisungen, die Sie je nach Anwendungsfall verwenden können. In diesem Abschnitt fügen Sie Plugins hinzu und verwenden sie durch die Installation des Plugin minify, das überschüssige Leerzeichen entfernt und den Code, der an den Client gesendet wird, aufräumt, wodurch der Platzbedarf und die Ladezeiten weiter reduziert werden.

      Das GitHub-Repository des Plugins minify ist hacdias/caddy-minify.

      Navigieren Sie zum Verzeichnis mit dem Quellcode, den Sie in Schritt Eins erstellt haben:

      Um Caddy ein Plugin hinzuzufügen, müssen Sie es in die Datei caddy.go importieren, die Sie zum Erstellen von Caddy verwendet haben. Öffnen Sie caddy.go zum Bearbeiten:

      Importieren Sie das Plugin minify, indem Sie die hervorgehobene Zeile hinzufügen, wie hier beschrieben:

      ~/caddy/caddy.go

      package main
      
      import (
          "github.com/caddyserver/caddy/caddy/caddymain"
      
          _ "github.com/hacdias/caddy-minify"
      )
      
      func main() {
          // caddymain.EnableTelemetry = false
          caddymain.Run()
      }
      

      Speichern und schließen Sie die Datei.

      Einige Plugins erfordern möglicherweise einige geringfügige Konfigurationsanpassungen, lesen Sie also unbedingt die Dokumentation des Plugins, das Sie installieren. Eine Liste beliebter Plugins finden Sie im linken Fenster der Caddy-Dokumentation unter Plugins.

      Sie müssen Caddy bei jedem Hinzufügen eines neuen Plugins neu erstellen. Das liegt daran, dass Go eine kompilierte Programmiersprache ist, d. h. der Quellcode wird vor der Ausführung in Computercode umgewandelt.  Ihre Änderung an der Importdeklaration hat den Quellcode verändert, wirkt sich aber erst nach der Kompilierung auf die Binärdatei aus.

      Verwenden Sie den Befehl go install, um Caddy zu kompilieren:

      Verschieben Sie nach dem Abschluss die erzeugte Binärdatei nach /usr/local/bin und richten Sie Berechtigungen für die Binärdatei ein, wie Sie es zuvor getan haben. Sie müssen diese Schritte bei jeder Neuerstellung von Caddy durchführen, um dessen Funktionalität und Sicherheit zu gewährleisten:

      • sudo mv $GOPATH/bin/caddy /usr/local/bin/
      • sudo chown root:root /usr/local/bin/caddy
      • sudo chmod 755 /usr/local/bin/caddy
      • sudo setcap 'cap_net_bind_service=+ep' /usr/local/bin/caddy

      Um das Plugin minify zu verwenden, müssen Sie die Anweisung minify zu Ihrer Caddyfile hinzufügen. Öffnen Sie sie zum Bearbeiten:

      • sudo nano /etc/caddy/Caddyfile

      Aktivieren Sie das Plugin, indem Sie die folgende Zeile zum Konfigurationsblock hinzufügen:

      /etc/caddy/Caddyfile

      :80 {
        root /var/www
        gzip
        minify
      }
      

      Starten Sie nun Ihren Server mit systemctl neu:

      • sudo systemctl restart caddy

      Caddy wird nun ausgeführt und wird alle bereitgestellten Daten, einschließlich der zuvor erstellten Datei index.html, „minifizieren“. Sie können die „Minifizierung“ bei der Arbeit beobachten, indem Sie den Inhalt Ihrer Domäne mit curl abrufen:

      Sie werden die folgende Ausgabe sehen: Beachten Sie, dass alle unnötigen Leerzeichen entfernt wurden, was zeigt, dass das Plugin minify funktioniert.

      Output

      <!doctype html><title>Hello from Caddy!</title><h1 style=font-family:sans-serif>This page is being served via Caddy</h1>

      In diesem Schritt haben Sie gelernt, wie Sie Caddy mit Plugins erweitern können. Als Nächstes aktivieren Sie HTTPS, indem Sie das Plugin tls.dns.digitalocean installieren.

      Schritt 5 — Aktivieren von automatischem TLS mit Let’s Encrypt

      In diesem Abschnitt aktivieren Sie die automatische Bereitstellung und Erneuerung von Zertifikaten durch Let’s Encrypt, wobei TXT-DNS-Datensätze zur Verifizierung verwendet werden.

      Um die Verwendung von TXT-DNS-Datensätzen zu verifizieren, installieren Sie mit der DigitalOcean-API namens tls.dns.digitalocean ein Plugin für die Schnittstelle. Das Verfahren zur Installation dieses Plugins ist fast identisch mit der Installation des Plugins minify im vorherigen Schritt. Öffnen Sie zunächst caddy.go:

      Fügen Sie das Repository des Plugins zu imports hinzu:

      ~/caddy/caddy.go

      package main
      
      import (
          "github.com/caddyserver/caddy/caddy/caddymain"
      
          _ "github.com/hacdias/caddy-minify"
      
          _ "github.com/caddyserver/dnsproviders/digitalocean"
      )
      
      func main() {
          // caddymain.EnableTelemetry = false
          caddymain.Run()
      }
      

      Kompilieren Sie es durch Ausführen von:

      Stellen Sie sicher, dass Caddy über systemctl angehalten wird, und beenden Sie dann die Installation des Plugins, indem Sie die neu erstellte Caddy-Binärdatei kopieren und noch einmal die Eigentümerschaft und die Berechtigungen festlegen:

      • sudo systemctl stop caddy
      • sudo mv $GOPATH/bin/caddy /usr/local/bin/
      • sudo chown root:root /usr/local/bin/caddy
      • sudo chmod 755 /usr/local/bin/caddy
      • sudo setcap 'cap_net_bind_service=+ep' /usr/local/bin/caddy

      Konfigurieren Sie anschließend Caddy, um mit der API von DigitalOcean zum Festlegen von DNS-Einträgen zu arbeiten. Caddy muss auf dieses Token als Umgebungsvariable zugreifen, um den DNS von DigitalOcean zu konfigurieren, damit Sie die Unit-Datei systemd bearbeiten können:

      • sudo nano /etc/systemd/system/caddy.service

      Suchen Sie die Zeile, die mit Environment= beginnt, im Abschnitt [Service]. Diese Zeile definiert die Umgebungsvariablen, die an den Caddy-Prozess übergeben werden sollen. Fügen Sie am Ende dieser Zeile ein Leerzeichen ein, fügen Sie dann eine Variable DO_AUTH_TOKEN hinzu, gefolgt von dem Token, das Sie gerade generiert haben:

      /etc/systemd/system/caddy.service

      [Service]
      Restart=on-abnormal
      
      ; User and group the process will run as.
      User=www-data
      Group=www-data
      
      ; Letsencrypt-issued certificates will be written to this directory.
      Environment=CADDYPATH=/etc/ssl/caddy DO_AUTH_TOKEN=your_token_here
      

      Speichern und schließen Sie diese Datei und laden Sie dann den Daemon systemd wie zuvor neu, um sicherzustellen, dass die Konfiguration aktualisiert wird:

      • sudo systemctl daemon-reload

      Führen Sie systemctl status aus, um zu überprüfen, ob Ihre Konfigurationsänderungen in Ordnung sind:

      • sudo systemctl status caddy

      Die Ausgabe sollte wie folgt aussehen:

      Output

      ● caddy.service - Caddy HTTP/2 web server Loaded: loaded (/etc/systemd/system/caddy.service; disabled; vendor preset: enabled) Active: inactive (dead) Docs: https://caddyserver.com/docs ...

      Sie müssen einige geringfügige Änderungen an Ihrer Caddyfile vornehmen, also öffnen Sie diese zur Bearbeitung:

      • sudo nano /etc/caddy/Caddyfile

      Fügen Sie die hervorgehobenen Zeilen in die Caddyfile ein. Achten Sie darauf, dass Sie dabei your_domain durch Ihre Domäne ersetzen (statt nur Port :80) und gzip kommentieren:

      /etc/caddy/Caddyfile

      your_domain {
        root /var/www
        #gzip
        minify
        tls {
            dns digitalocean
        }
      }
      

      Die Verwendung einer Domäne statt nur eines Ports für den Hostnamen führt dazu, dass Caddy Anfragen über HTTP bedient. Die Anweisung tls konfiguriert das Verhalten von Caddy bei Verwendung von TLS, und die Unteranweisung dns gibt an, dass Caddy das DNS-01-System anstelle des HTTP-01 verwenden soll.

      Damit ist Ihre Website für die Bereitstellung bereit. Starten Sie Caddy mit systemctl und aktivieren Sie es dann mit enable, damit es beim Starten ausgeführt wird.

      • sudo systemctl start caddy
      • sudo systemctl enable caddy

      Wenn Sie zu Ihrer Domäne browsen, werden Sie automatisch zu HTTPS umgeleitet, wobei dieselbe Meldung angezeigt wird.

      Ihre Installation von Caddy ist nun abgeschlossen und gesichert und Sie können je nach Anwendungsfall weitere Anpassungen vornehmen.

      Wenn Sie Caddy aktualisieren möchten, wenn eine neue Version verfügbar ist, müssen Sie die Datei go.mod (im gleichen Verzeichnis gespeichert) aktualisieren, die wie folgt aussieht:

      ~/caddy/go.mod

      module caddy
      
      go 1.14
      
      require (
              github.com/caddyserver/caddy v1.0.5
              github.com/caddyserver/dnsproviders v0.4.0
              github.com/hacdias/caddy-minify v1.0.2
      )
      

      Der hervorgehobene Bereich ist die von Ihnen verwendete Version von Caddy. Wenn eine neue Version auf Github veröffentlicht wird (siehe die Seite mit den Versions-Tags), können Sie die bestehende Version in go.mod durch diese ersetzen und Caddy entsprechend der ersten beiden Schritte kompilieren. Sie können dasselbe für alle importierten Plugins tun.

      Zusammenfassung

      Sie haben Caddy nun auf Ihrem Server installiert und konfiguriert, sodass statische Seiten auf Ihrer gewünschten Domäne bereitgestellt werden, die mit kostenlosen Let’s Encrypt TLS-Zertifikaten gesichert sind.

      Ein guter nächster Schritt wäre, einen Weg für die Benachrichtigung zu finden, wenn neue Versionen von Caddy veröffentlicht werden. Sie können beispielsweise den Atom-Feed für Caddy-Veröffentlichungen oder den dedizierten Dienst dependencies.io verwenden.

      Weitere Informationen zur Konfiguration von Caddy finden Sie in der Dokumentation von Caddy.



      Source link

      Cómo alojar un sitio web con Caddy en Ubuntu 18.04


      El autor seleccionó la Free and Open Source Fund para recibir una donación como parte del programa Write for DOnations.

      Introducción

      Caddy es un servidor web diseñado con la simplicidad y la seguridad que provienen de varias funciones útiles para alojar sitios web. Por ejemplo, puede obtener y administrar automáticamente certificados de seguridad de la capa de transporte (TSL) de Let´s Encrypt para habilitar HTTPS e incluye asistencia para HTTP/2. HTTPS es un sistema para proteger el tráfico entre sus usuarios y su servidor, y se está transformando rápidamente en una expectativa básica de cualquier funcionamiento de sitio web en producción; sin este, Chrome y Firefox advertirán que su sitio web “No es seguro” si los usuarios intentan enviar información de inicio de sesión.

      Anteriormente, el método recomendado para instalar Caddy era descargar binarios previamente compilados del sitio web del proyecto Caddy. No obstante, los cambios en la manera en la que funciona la licencia de Caddy implican que ya no tendrá permitido usar estos binarios previamente compilados con fines comerciales, a menos que pague un cargo de licencia, incluso si solo usa Caddy de manera interna dentro de una empresa. Afortunadamente, el código fuente de Caddy todavía es completamente abierto y puede compilar Caddy por su cuenta para evitar inmiscuirse en problemas de licencias.

      A través de este tutorial, compilará Caddy a partir de código fuente y lo utilizará para alojar un sitio web protegido con HTTPS. Esto implica compilarlo, configurarlo mediante Caddyfile e instalar complementos. Con el tiempo, aprenderá a actualizar su instalación cuando se lance una nueva versión.

      Requisitos previos

      Paso 1: Compilar Caddy

      En este paso, compilará Caddy a partir de código fuente con la posibilidad de agregar complementos después, todo ello sin cambiar el código fuente de Caddy.

      Para este tutorial, almacenará el código fuente en ~/caddy. Para crear ese directorio, ejecute el siguiente comando:

      Diríjase a este:

      Guardará el código fuente para ejecutar y personalizar Caddy en un archivo llamado caddy.go. Créelo usando el siguiente comando:

      Añada las siguientes líneas:

      ~/caddy/caddy.go

      package main
      
      import (
          "github.com/caddyserver/caddy/caddy/caddymain"
      )
      
      func main() {
          // caddymain.EnableTelemetry = false
          caddymain.Run()
      }
      

      Este código importa Caddy directamente desde Github (por medio de Git) y lo inicia desde la función de entrada main. Si desea habilitar telemetría, quite el comentario de la línea caddymain.EnableTelemetry y fije el valor en true. Cuando termine, guarde y cierre el archivo.

      Para que caddy.go pueda usar las dependencias importadas, deberá inicializarlo como un módulo:

      Output

      go: creating new go.mod: module caddy

      En este punto, estará listo para compilar la versión básica de Caddy a partir del código de fuente anterior ejecutando lo siguiente:

      Habrá muchos resultados en los que se detallarán las bibliotecas de Go que descargó como dependencias necesarias para compilar. El ejecutable que surja se almacenará en $GOPATH/bin​​​​​​, como se explica en los requisitos previos.

      Al finalizar, intente ejecutar Caddy:

      Visualizará un resultado similar al siguiente:

      Output

      Activating privacy features... done. Serving HTTP on port 2015 http://:2015 WARNING: File descriptor limit 1024 is too low for production servers. At least 8192 is recommended. Fix with `ulimit -n 8192`.

      Esto significa que Caddy se inició de forma correcta y está disponible en el puerto 2015. Réstele importancia al mensaje de advertencia, porque ese límite se ajustará en los siguientes pasos sin intervención por su parte. Para salir, presione CTRL + C.

      Ya compiló y ejecutó Caddy. En el paso siguiente, instalará Caddy como servicio para que se inicie automáticamente con el arranque y luego ajuste la configuración de propiedad y los permisos para garantizar la seguridad del servidor.

      Paso 2: Instalar Caddy

      Ahora que verificó que puede compilar y ejecutar Caddy, es momento de configurar un servicio systemd para que Caddy se pueda abrir automáticamente durante el inicio del sistema. Si desea comprender mejor systemd, consulte nuestro tutorial Aspectos básicos de systemd.

      Para comenzar, traslade el binario de Caddy a /usr/local/bin, la ubicación estándar para binarios que no están administrados por el administrador de paquetes de Ubuntu y no son claves para el funcionamiento del sistema:

      • sudo mv $GOPATH/bin/caddy /usr/local/bin/

      Luego, cambie la propiedad del binario de Caddy al usuario root:

      • sudo chown root:root /usr/local/bin/caddy

      Esto evitará que otras cuentas modifiquen el ejecutable. No obstante, aunque el usuario root sea el propietario de Caddy, se recomienda ejecutarlo solo con otras cuentas que no sean root presentes en el sistema. Esto garantiza que, en caso de que Caddy (u otro programa) quede comprometido, el atacante no pueda modificar el binario ni ejecutar comandos como root.

      A continuación, fije los permisos del binario en 755. Esto otorgará permisos root completos de lectura, escritura y ejecución para el archivo; mientras tanto, otros usuarios solo podrán leerlo y ejecutarlo.

      • sudo chmod 755 /usr/local/bin/caddy

      Debido a que el proceso de Caddy no se ejecutará como root, Linux evitará que se vincule a los puertos 80 y 443 (los puertos estándares para HTTP y HTTPS, respectivamente), ya que estas son operaciones con privilegios. Para que su dominio pueda acceder a Caddy fácilmente, este último debe vincularse con uno de estos puertos, según el protocolo. De lo contrario, deberá agregar un número de puerto específico a la URL de dominio en el navegador para ver el contenido que tendrá.

      Pare permitir que Caddy se vincule a puertos bajos sin ejecutarse como root, ejecute el siguiente comando:

      • sudo setcap 'cap_net_bind_service=+ep' /usr/local/bin/caddy

      La utilidad setcap establece capacidades de archivos. En este comando, asigna la capacidad CAP_NET_BIND_SERVICE al binario Caddy, que permite que un ejecutable se vincule a un puerto menor que el 1024.

      Con esto, habrá finalizado la configuración del binario de Caddy y estará listo para comenzar a escribir la configuración de Caddy. Cree un directorio en el que almacenará los archivos de configuración de Caddy ejecutando el siguiente comando:

      Luego, establezca el usuario y los permisos de grupo correctos para él:

      • sudo chown -R root:www-data /etc/caddy

      Configurar el usuario como root y el grupo como www-data garantiza que Caddy haya leído y escrito el acceso a la carpeta (por medio del grupo www-data) y que solo la cuenta del superusuario tenga los mismos derechos de lectura y modificación. www-data es el usuario y grupo predeterminados para los servidores web en Ubuntu.

      Más adelante, habilitará el aprovisionamiento automático de certificados TLS desde Let´s Encrypt. Para ello, prepare un directorio para almacenar cualquier certificado TLS que Caddy obtendrá y otórguele las mismas reglas de propiedad que las del directorio /etc/caddy:

      • sudo mkdir /etc/ssl/caddy
      • sudo chown -R root:www-data /etc/ssl/caddy

      Debe ser posible para Caddy escribir certificados en este directorio y leer desde este para cifrar solicitudes. Por este motivo, modifique los permisos para el directorio /etc/ssl/caddy, de modo que solo sea accesible mediante root y www-data:

      • sudo chmod 0770 /etc/ssl/caddy

      A continuación, cree un directorio para almacenar los archivos que Caddy alojará:

      Luego, defina el propietario del directorio y agrúpelo en www-data:

      • sudo chown www-data:www-data /var/www

      Caddy lee la configuración desde un archivo denominado Caddyfile, almacenado en /etc/caddy. Cree el archivo en un disco. Para ello, ejecute lo siguiente:

      • sudo touch /etc/caddy/Caddyfile

      Para instalar el servicio Caddy, descargue el archivo de la unidad systemd del repositorio de Github de Caddy a /etc/systemd/system. Para ello, ejecute lo siguiente:

      • sudo sh -c 'curl https://raw.githubusercontent.com/caddyserver/caddy/master/dist/init/linux-systemd/caddy.service > /etc/systemd/system/caddy.service'

      Modifique los permisos del archivo de servicio para que solo pueda modificarlo su propietario, root:

      • sudo chmod 644 /etc/systemd/system/caddy.service

      Luego vuelva a cargar systemd para detectar el servicio de Caddy:

      • sudo systemctl daemon-reload

      Para verificar si systemd detectó el servicio de Caddy, ejecute systemctl status:

      • sudo systemctl status caddy

      Verá un resultado similar a lo siguiente:

      Output

      ● caddy.service - Caddy HTTP/2 web server Loaded: loaded (/etc/systemd/system/caddy.service; disabled; vendor preset: e Active: inactive (dead) Docs: https://caddyserver.com/docs

      Si ve este mismo resultado, significa que systemd detectó correctamente el servicio nuevo.

      Como parte del requisito previo de configuración inicial del servidor, habilitó ufw, Uncomplicated Firewall, y permitió conexiones SSH. Para que Caddy provea el tráfico de HTTP y HTTPS del servidor, deberá permitirlos en ufw; para ello, ejecute el siguiente comando:

      • sudo ufw allow proto tcp from any to any port 80,443

      El resultado será lo siguiente:

      Output

      Rule added Rule added (v6)

      Utilice ufw status para verificar si sus cambios funcionaron:

      Verá el siguiente resultado:

      Output

      Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere 80,443/tcp ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) 80,443/tcp (v6) ALLOW Anywhere (v6)

      De esta manera, finalizó su instalación de Caddy. Sin embargo, no está configurado para presentar nada. En el siguiente paso, configurará Caddy para acceder a archivos desde el directorio /var/www.

      Paso 3: Configurar Caddy

      En esta sección, escribirá la configuración básica de Caddy para acceder a archivos estáticos de su servidor.

      Para empezar, cree un archivo HTML básico en /var/www, llamado index.html:

      • sudo nano /var/www/index.html

      Añada las siguientes líneas:

      /var/www/index.html

      <!DOCTYPE html>
      <html>
      <head>
        <title>Hello from Caddy!</title>
      </head>
      <body>
        <h1 style="font-family: sans-serif">This page is being served via Caddy</h1>
      </body>
      </html>
      

      Cuando se observe en un navegador web, este archivo mostrará un encabezado con el texto This page is being served via Caddy. Guarde y cierre el archivo.

      Abra el archivo de configuración Caddyfile que creó anteriormente para editarlo:

      • sudo nano /etc/caddy/Caddyfile

      Añada las siguientes líneas:

      /etc/caddy/Caddyfile

      :80 {
        root /var/www
        gzip
      }
      

      Esta es una configuración de Caddy básica y establece que el puerto 80 de su servidor debe proporcionarse con los archivos de /var/www y debe comprimirse mediante gzip para reducir los tiempos de carga de la página por parte del cliente.

      En la mayoría de los casos, Caddy le permite personalizar más las directivas de configuración. Por ejemplo, puede limitar la compresión de gzip solo a archivos HTML y PHP y fijar el nivel de compresión en 6 (siendo 1 el más bajo y 9 el más alto) ampliando la directiva con llaves e indicando las subdirectivas abajo:

      /etc/caddy/Caddyfile

      :80 {
        root /var/www
        gzip {
            ext .html .htm .php
            level 6
        }
      }
      

      Cuando termine, guarde y cierre el archivo.

      Caddy tiene muchas directivas diferentes para muchos casos de uso. Por ejemplo, la directiva fastcgi podría ser útil para habilitar PHP. La directiva markdown se podría usar para convertir automáticamente archivos Markdown a HTML antes de presentarlos, lo cual sería útil para crear un simple blog.

      Para probar si todo funciona correctamente, inicie el servicio Caddy:

      • sudo systemctl start caddy

      A continuación, ejecute systemctl status​​​ para buscar información sobre el estado del servicio Caddy:

      • sudo systemctl status caddy

      Observará lo siguiente:

      Output

      ● caddy.service - Caddy HTTP/2 web server Loaded: loaded (/etc/systemd/system/caddy.service; disabled; vendor preset: enabled) Active: active (running) since Thu 2020-03-12 11:17:49 UTC; 11s ago Docs: https://caddyserver.com/docs Main PID: 3893 (caddy) Tasks: 7 (limit: 1152) CGroup: /system.slice/caddy.service └─3893 /usr/local/bin/caddy -log stdout -log-timestamps=false -agree=true -conf=/etc/caddy/Caddyfile -root=/var/tmp Mar 12 11:17:49 caddy-article-update systemd[1]: Started Caddy HTTP/2 web server. Mar 12 11:17:49 caddy-article-update caddy[3893]: [INFO] Caddy version: v1.0.5 Mar 12 11:17:49 caddy-article-update caddy[3893]: Activating privacy features... done. Mar 12 11:17:49 caddy-article-update caddy[3893]: Serving HTTP on port 80 Mar 12 11:17:49 caddy-article-update caddy[3893]: http:// Mar 12 11:17:49 caddy-article-update caddy[3893]: [INFO] Serving http:// Mar 12 11:17:49 caddy-article-update caddy[3893]: [INFO][cache:0xc00007a7d0] Started certificate maintenance routine Mar 12 11:17:49 caddy-article-update caddy[3893]: [WARNING] Sending telemetry (attempt 1): Post "https://telemetry.caddyserver.com/v1/update/6a8159c4-3427-42 Mar 12 11:17:57 caddy-article-update caddy[3893]: [WARNING] Sending telemetry (attempt 2): Post "https://telemetry.caddyserver.com/v1/update/6a8159c4-3427-42 ...

      Ahora podrá dirigirse el IP de su servidor en un navegador web. En la página web de muestra, se observará lo siguiente:

      Mensaje de Caddy

      Con esto, habrá configurado Caddy para acceder a archivos estáticos desde su servidor. En el siguiente paso, ampliará la funcionalidad de Caddy usando complementos.

      Paso 4: Usar complementos

      Los complementos ofrecen una alternativa para cambiar y ampliar el comportamiento de Caddy. Por lo general, ofrecen más directivas de configuración para que las aplique, según su caso de uso. En esta sección, agregará y usará complementos instalando el complemento minify, que elimina los espacios en blanco que están de más y organiza el código que se enviará al cliente, además de reducir la superficie y los tiempos de carga.

      El repositorio de GitHub del complemento minify es hacdias/caddy-minify.

      Diríjase al directorio con el código fuente que creó en el paso uno:

      Para agregar un complemento a Caddy, deberá importarlo en el archivo caddy.go que usó para compilar Caddy. Abra caddy.go​​​ para editarlo:

      Importe el complemento minify; para ello, agregue la línea resaltada, como se observa:

      ~/caddy/caddy.go

      package main
      
      import (
          "github.com/caddyserver/caddy/caddy/caddymain"
      
          _ "github.com/hacdias/caddy-minify"
      )
      
      func main() {
          // caddymain.EnableTelemetry = false
          caddymain.Run()
      }
      

      Guarde y cierre el archivo.

      Es posible que algunos complementos requieran algunas modificaciones simples. Asegúrese de leer la documentación de los que instale. Puede encontrar una lista de complementos populares en el panel izquierdo de la documentación de Caddy, dentro de la sección Plugins.

      Cada vez que agregue una configuración nueva, deberá volver a compilar Caddy. Esto se debe a que Go es un lenguaje de programación compilado; es decir, el código fuente se transforma en código máquina antes de la ejecución. Su cambio en la declaración de importación alteró el código fuente, pero no afectará el binario hasta que esté compilado.

      Use el comando go install para compilar Caddy:

      Al finalizar, mueva el binario generado a /usr/local/bin y configure permisos para el binario como lo hizo anteriormente. Debe realizar estos pasos cada vez que recopile Caddy para garantizar su funcionalidad y seguridad:

      • sudo mv $GOPATH/bin/caddy /usr/local/bin/
      • sudo chown root:root /usr/local/bin/caddy
      • sudo chmod 755 /usr/local/bin/caddy
      • sudo setcap 'cap_net_bind_service=+ep' /usr/local/bin/caddy

      Para comenzar a usar el complemento minify, deberá agregar la directiva minify a Caddyfile. Ábralo​​​ para editarlo:

      • sudo nano /etc/caddy/Caddyfile

      Para habilitar el complemento, agregue la siguiente línea al bloque de configuración:

      /etc/caddy/Caddyfile

      :80 {
        root /var/www
        gzip
        minify
      }
      

      Ahora, reinicie el servidor utilizando systemctl:

      • sudo systemctl restart caddy

      Caddy se encuentra en ejecución y minificará cualquier archivo que contenga, incluso el archivo index.html que creó anteriormente. Puede ver funcionar la minificación si busca el contenido de su dominio mediante curl:

      Verá el siguiente resultado: Observe que todos los espacios en blanco innecesarios se eliminarán, lo cual mostrará que el complemento minify funciona.

      Output

      <!doctype html><title>Hello from Caddy!</title><h1 style=font-family:sans-serif>This page is being served via Caddy</h1>

      En este paso, aprendió ampliar Caddy con complementos. A continuación, habilitará HTTPS instalando el complemento tls.dns.digitalocean.

      Paso 5: Habilitar TLS automático con Let’s Encrypt

      En esta sección, habilitará el aprovisionamiento y la renovación automáticos de certificados de Let’s Encrypt usando registros TXT DNS para la verificación.

      Para realizar la verificación mediante los registros TXT DNS, instalará un complemento para interactuar con la API de DigitalOcean, llamado tls.dns.digitalocean. El procedimiento de instalación es casi idéntico al que usó para instalar el complemento minify en el paso anterior. Por empezar, abra caddy.go:

      Agregue el repositorio del complemento a las importaciones:

      ~/caddy/caddy.go

      package main
      
      import (
          "github.com/caddyserver/caddy/caddy/caddymain"
      
          _ "github.com/hacdias/caddy-minify"
      
          _ "github.com/caddyserver/dnsproviders/digitalocean"
      )
      
      func main() {
          // caddymain.EnableTelemetry = false
          caddymain.Run()
      }
      

      Para compilarlo, ejecute lo siguiente:

      Asegúrese de detener Caddy a través de systemctl, luego termine de instalar el complemento copiando el binario de Caddy recién compilado y nuevamente configure la propiedad y los permisos:

      • sudo systemctl stop caddy
      • sudo mv $GOPATH/bin/caddy /usr/local/bin/
      • sudo chown root:root /usr/local/bin/caddy
      • sudo chmod 755 /usr/local/bin/caddy
      • sudo setcap 'cap_net_bind_service=+ep' /usr/local/bin/caddy

      A continuación, configure Caddy para trabajar con la API de DigitalOcean y configurar registros DNS. Caddy debe acceder a este token como variable de entorno para configurar el DNS de DigitalOcean, de modo que editará su archivo de unidad systemd.

      • sudo nano /etc/systemd/system/caddy.service

      Busque la línea que comienza con Environment= en la sección [Service]. Esta línea define las variables de entorno que se deben pasar al proceso de Caddy. Agregue un espacio al final de esta línea y luego agregue una variable DO_AUTH_TOKEN seguida del token que recién generó:

      /etc/systemd/system/caddy.service

      [Service]
      Restart=on-abnormal
      
      ; User and group the process will run as.
      User=www-data
      Group=www-data
      
      ; Letsencrypt-issued certificates will be written to this directory.
      Environment=CADDYPATH=/etc/ssl/caddy DO_AUTH_TOKEN=your_token_here
      

      Guarde y cierre este archivo, y luego vuelva a cargar el demonio systemd como lo hizo anteriormente para asegurarse de que se haya actualizado la configuración:

      • sudo systemctl daemon-reload

      Ejecute systemctl status para verificar que las modificaciones de la configuración sean correctas:

      • sudo systemctl status caddy

      El resultado debería tener el siguiente aspecto:

      Output

      ● caddy.service - Caddy HTTP/2 web server Loaded: loaded (/etc/systemd/system/caddy.service; disabled; vendor preset: enabled) Active: inactive (dead) Docs: https://caddyserver.com/docs ...

      Deberá realizar algunas modificaciones simples a Caddyfile. Por ello, ábralo para editarlo:

      • sudo nano /etc/caddy/Caddyfile

      Agregue las líneas resaltadas a Caddyfile; asegúrese de sustituir your_domain por su dominio (en lugar de solo el puerto :80) y agregar un comentario en gzip:

      /etc/caddy/Caddyfile

      your_domain {
        root /var/www
        #gzip
        minify
        tls {
            dns digitalocean
        }
      }
      

      Usar un dominio en vez de solo un puerto para el nombre de host hará que Caddy presente solicitudes en HTTPS. La directiva tls configura el comportamiento de Caddy cuando se utiliza TLS y la subdirectiva dns especifica que Caddy debe usar el sistema DNS-01 en vez de HTTP-01.

      Con esto, su sitio web estará listo para implementarse. Inicie Caddy con systemctl y luego habilítelo para que se ejecute en el arranque:

      • sudo systemctl start caddy
      • sudo systemctl enable caddy

      Si busca su dominio, automáticamente accederá a HTTPS y se observará el mismo mensaje.

      De esta manera, finalizó y protegió la instalación de Caddy. Podrá seguir personalizándolo según el uso requerido.

      Si desea actualizar Caddy cuando haya una versión nueva, deberá actualizar el archivo go.mod (almacenado en el mismo directorio) que se verá de la siguiente manera:

      ~/caddy/go.mod

      module caddy
      
      go 1.14
      
      require (
              github.com/caddyserver/caddy v1.0.5
              github.com/caddyserver/dnsproviders v0.4.0
              github.com/hacdias/caddy-minify v1.0.2
      )
      

      La parte resaltada es la versión de Caddy que usa. Cuando se lance una versión nueva en Github (ver la página de etiquetas de lanzamientos), podrá reemplazar la actual de go.mod por esta y compilar Caddy conforme a los dos primeros pasos. Puede hacer lo mismo para todos los complementos importados.

      Conclusión

      Ahora cuenta con Caddy instalado y configurado en su servidor, el cual presenta páginas estáticas en el dominio deseado, con protección a través de certificados TLS de Let´s Encrypt.

      Un buen paso siguiente sería encontrar la manera de que lo notifiquen cuando se lancen versiones nuevas de Caddy. Por ejemplo, podría usar las fuentes de Atom para lanzamientos de Caddy o un servicio especializado como dependencies.io.

      Puede consultar la documentación de Caddy si desea más información o si desea configurar Caddy.



      Source link

      Comment héberger un site Web avec Caddy sur Ubuntu 18.04


      L’auteur a choisi le Free and Open Source Fund pour recevoir une donation dans le cadre du programme Write for DOnations.

      Introduction

      Caddy est un serveur Web basé sur la simplicité et la sécurité, qui est doté d’un certain nombre de fonctionnalités utiles pour l’hébergement de sites Web. Par exemple, il peut obtenir et gérer automatiquement les certificats TLS de Let’s Encrypt pour activer le HTTPS, et il inclut la prise en charge de HTTP/2. HTTPS est un système de sécurisation du trafic entre vos utilisateurs et votre serveur, et il est en passe de devenir en composant indispensable de tout site Web en production. Sans lui, Chrome et Firefox avertiront les utilisateurs que votre site Web est “Non sécurisé” si ceux-ci tentent de soumettre des informations de connexion.

      Auparavant, la méthode recommandée pour installer Caddy consistait à télécharger des binaires pré-construits à partir du site Web du projet Caddy. Toutefois, en raison des modifications apportées au fonctionnement de la licence de Caddy, vous n’êtes plus autorisé à utiliser ces binaires pré-construits à des fins commerciales, même si vous utilisez Caddy en interne au sein d’une entreprise, sauf si vous payez un droit de licence. Heureusement, le code source de Caddy est encore entièrement open source et vous pouvez construire Caddy vous-même pour éviter de rencontrer des problèmes de licence.

      Dans ce tutoriel, vous allez construire Caddy à partir de son code source et l’utiliser pour héberger un site Web sécurisé avec HTTPS. Cela implique de le compiler, de le configurer en utilisant un Caddyfile et d’installer des plugins. Enfin, vous apprendrez à mettre à jour votre installation lorsqu’une nouvelle version est disponible.

      Conditions préalables

      Étape 1 — Construction de Caddy

      Dans cette étape, vous construirez Caddy à partir de son code source avec la possibilité d’ajouter ultérieurement des plugins, le tout sans modifier le code source de Caddy.

      Pour les besoins de ce tutoriel, vous stockerez le code source sous ~/caddy. Créez ce répertoire en exécutant la commande suivante :

      Naviguez jusqu’à lui :

      Vous stockerez le code source pour l’exécution et la personnalisation de Caddy dans un fichier nommé caddy.go. Créez-le en utilisant la commande suivante :

      Ajoutez les lignes suivantes :

      ~/caddy/caddy.go

      package main
      
      import (
          "github.com/caddyserver/caddy/caddy/caddymain"
      )
      
      func main() {
          // caddymain.EnableTelemetry = false
          caddymain.Run()
      }
      

      Ce code importe Caddy directement de Github (en utilisant Git) et le lance à partir de la fonction d’entrée main. Si vous souhaitez activer la télémétrie, décommentez la ligne caddymain.EnableTelemetry et réglez la valeur sur true. Lorsque vous avez terminé, enregistrez et fermez le fichier.

      Pour que caddy.go puisse utiliser les dépendances importées, vous devrez l’initialiser en tant que module :

      Output

      go: creating new go.mod: module caddy

      À ce stade, vous êtes prêt à construire la version de base de Caddy à partir du code source ci-dessus en exécutant :

      Il y aura beaucoup de sorties, détaillant les bibliothèques téléchargées par Go comme dépendances nécessaires à la compilation. L’exécutable résultant est stocké sous $GOPATH/bin, comme expliqué dans les conditions préalables.

      Lorsqu’il a terminé, essayez d’exécuter Caddy :

      Vous verrez une sortie semblable à ce qui suit :

      Output

      Activating privacy features... done. Serving HTTP on port 2015 http://:2015 WARNING: File descriptor limit 1024 is too low for production servers. At least 8192 is recommended. Fix with `ulimit -n 8192`.

      Cela signifie que Caddy a démarré avec succès, et est disponible sur le port 2015. Vous pouvez ignorer le message d’avertissement, car cette limite sera ajustée ultérieurement sans votre intervention. Pour quitter, appuyez sur CTRL + C.

      Vous avez maintenant construit et exécuté Caddy. Dans l’étape suivante, vous installerez Caddy en tant que service afin qu’il se lance automatiquement au démarrage, puis vous ajusterez ses paramètres de propriété et d’autorisation pour assurer la sécurité du serveur.

      Étape 2 – Installation de Caddy

      Maintenant que vous avez vérifié que vous êtes capable de construire et d’exécuter Caddy, il est temps de configurer un service systemd afin que Caddy puisse être lancé automatiquement au démarrage du système. Pour en savoir plus sur systemd, consultez notre tutoriel Les fondamentaux de Systemd.

      Pour commencer, déplacez le binaire Caddy vers /usr/local/bin, l’emplacement standard pour les binaires qui ne sont pas gérés par le gestionnaire de packages d’Ubuntu et qui ne sont pas essentiels au fonctionnement du système :

      • sudo mv $GOPATH/bin/caddy /usr/local/bin/

      Ensuite, transférez la propriété du binaire Caddy à l’utilisateur root :

      • sudo chown root:root /usr/local/bin/caddy

      Cela empêchera d’autres comptes de modifier l’exécutable. Cependant, même si l’utilisateur root possède Caddy, il est conseillé de l’exécuter uniquement en utilisant d’autres comptes non root présents sur le système. Cela permet de s’assurer qu’en cas de compromission de Caddy (ou d’un autre programme), l’attaquant ne pourra pas modifier le binaire, ou exécuter des commandes en tant que root.

      Ensuite, définissez les permissions du fichier binaire à 755 – cela donne à root des permissions complètes de lecture/écriture/exécution pour le fichier, alors que les autres utilisateurs ne pourront que le lire et l’exécuter :

      • sudo chmod 755 /usr/local/bin/caddy

      Comme le processus Caddy ne s’exécutera pas en tant que root, Linux l’empêchera de se lier aux ports 80 et 443 (les ports standard pour HTTP et HTTPS, respectivement), car il s’agit d’opérations privilégiées. Afin d’être facilement accessible sur votre domaine, Caddy doit être relié à l’un de ces ports, selon le protocole. Sinon, il vous faudrait ajouter un numéro de port spécifique à l’URL du domaine dans votre navigateur pour visualiser le contenu qu’il servira.

      Pour permettre à Caddy de se lier à des ports bas sans s’exécuter en tant que root, exécutez la commande suivante :

      • sudo setcap 'cap_net_bind_service=+ep' /usr/local/bin/caddy

      L’utilitaire setcap définit les capacités des fichiers. Dans cette commande, il attribue la capacité CAP_NET_BIND_SERVICE au binaire Caddy, ce qui permet à un exécutable de se lier à un port inférieur à 1024.

      Vous avez maintenant fini de configurer le binaire Caddy, et vous êtes prêt à commencer à écrire la configuration de Caddy. Créez un répertoire dans lequel vous stockerez les fichiers de configuration de Caddy en exécutant la commande suivante :

      Ensuite, définissez les autorisations d’utilisateur et de groupe appropriées pour celui-ci :

      • sudo chown -R root:www-data /etc/caddy

      Le fait de définir l’utilisateur comme root et le groupe comme www-data garantit que Caddy aura un accès en lecture et en écriture au dossier (via le groupe www-data) et que seul le compte du super-utilisateur aura les mêmes droits de lecture et de modification. www-data est l’utilisateur et le groupe par défaut pour les serveurs Web sur Ubuntu.

      Dans une étape ultérieure, vous activerez le provisionnement automatique des certificats TLS à partir de Let’s Encrypt. Pour préparer cette étape, créez un répertoire pour stocker tous les certificats TLS que Caddy obtiendra et donnez-lui les mêmes règles de propriété que le répertoire /etc/caddy :

      • sudo mkdir /etc/ssl/caddy
      • sudo chown -R root:www-data /etc/ssl/caddy

      Caddy doit être capable d’écrire des certificats dans ce répertoire et de lire à partir de celui-ci afin de chiffrer les requêtes. Pour cette raison, modifiez les permissions du répertoire /etc/ssl/caddy afin qu’il ne soit accessible que par root et www-data :

      • sudo chmod 0770 /etc/ssl/caddy

      Ensuite, créez un répertoire pour stocker les fichiers que Caddy hébergera :

      Ensuite, définissez le propriétaire et le groupe du répertoire sur www-data :

      • sudo chown www-data:www-data /var/www

      Caddy lit sa configuration à partir d’un fichier appelé Caddyfile, stocké sous /etc/caddy. Créez le fichier sur le disque en exécutant :

      • sudo touch /etc/caddy/Caddyfile

      Pour installer le service Caddy, téléchargez le fichier d’unité systemd du référentiel Github Caddy dans /etc/systemd/system en exécutant :

      • sudo sh -c 'curl https://raw.githubusercontent.com/caddyserver/caddy/master/dist/init/linux-systemd/caddy.service > /etc/systemd/system/caddy.service'

      Modifiez les permissions du fichier de service afin qu’il ne puisse être modifié que par son propriétaire, root :

      • sudo chmod 644 /etc/systemd/system/caddy.service

      Puis, rechargez le système pour détecter le service Caddy :

      • sudo systemctl daemon-reload

      Vérifiez si systemd a détecté le service Caddy en exécutant systemctl status :

      • sudo systemctl status caddy

      Vous verrez une sortie semblable à :

      Output

      ● caddy.service - Caddy HTTP/2 web server Loaded: loaded (/etc/systemd/system/caddy.service; disabled; vendor preset: e Active: inactive (dead) Docs: https://caddyserver.com/docs

      Si vous voyez cette même sortie, alors le nouveau service a été correctement détecté par systemd.

      Dans le cadre de la configuration initiale du serveur, vous avez activé ufw, le pare-feu non compliqué, et autorisé les connexions SSH. Pour que Caddy puisse servir le trafic HTTP et HTTPS à partir de votre serveur, vous devez les autoriser dans ufw en exécutant la commande suivante :

      • sudo ufw allow proto tcp from any to any port 80,443

      Le résultat sera :

      Output

      Rule added Rule added (v6)

      Utilisez ufw status pour vérifier si vos changements ont fonctionné :

      Vous verrez la sortie suivante :

      Output

      Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere 80,443/tcp ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) 80,443/tcp (v6) ALLOW Anywhere (v6)

      Votre installation de Caddy est maintenant terminée, mais elle n’est pas configurée pour servir quoi que ce soit. Dans l’étape suivante, vous allez configurer Caddy pour qu’il serve les fichiers du répertoire /var/www.

      Étape 3 – Configuration de Caddy

      Dans cette section, vous allez écrire la configuration de base de Caddy pour servir des fichiers statiques à partir de votre serveur.

      Commencez par créer un fichier HTML de base dans /var/www, appelé index.html :

      • sudo nano /var/www/index.html

      Ajoutez les lignes suivantes :

      /var/www/index.html

      <!DOCTYPE html>
      <html>
      <head>
        <title>Hello from Caddy!</title>
      </head>
      <body>
        <h1 style="font-family: sans-serif">This page is being served via Caddy</h1>
      </body>
      </html>
      

      Lorsqu’il est affiché dans un navigateur Web, ce fichier affichera un titre avec le texte This page is being served by Caddy (Cette page est servie par Caddy). Enregistrez et fermez le fichier.

      Ouvrez le fichier de configuration Caddyfile que vous avez créé précédemment pour le modifier :

      • sudo nano /etc/caddy/Caddyfile

      Ajoutez les lignes suivantes :

      /etc/caddy/Caddyfile

      :80 {
        root /var/www
        gzip
      }
      

      Il s’agit d’une configuration de base de Caddy, qui déclare que le port 80 de votre serveur doit être servi avec des fichiers provenant de /var/www et compressés à l’aide de gzip pour réduire le temps de chargement des pages côté client.

      Dans la majorité des cas, Caddy vous permet de personnaliser davantage les directives de configuration. Par exemple, vous pouvez limiter la compression gzip aux seuls fichiers HTML et PHP, et fixer le niveau de compression à 6 (1 étant le plus bas et 9 le plus élevé) en étendant la directive avec des accolades et en énumérant des sous-directives en dessous :

      /etc/caddy/Caddyfile

      :80 {
        root /var/www
        gzip {
            ext .html .htm .php
            level 6
        }
      }
      

      Lorsque vous avez terminé, enregistrez et fermez le fichier.

      Caddy dispose d’un grand nombre de directives différentes pour de nombreux cas d’utilisation. Par exemple, la directive fastcgi peut être utilisée pour activer PHP. La directive markdown peut être utilisée pour convertir automatiquement les fichiers Markdown en HTML avant de les servir, ce qui peut être utile pour créer un simple blog.

      Pour vérifier que tout fonctionne correctement, lancez le service Caddy :

      • sudo systemctl start caddy

      Ensuite, lancez systemctl status pour obtenir des informations sur le statut du service Caddy :

      • sudo systemctl status caddy

      Vous verrez ce qui suit :

      Output

      ● caddy.service - Caddy HTTP/2 web server Loaded: loaded (/etc/systemd/system/caddy.service; disabled; vendor preset: enabled) Active: active (running) since Thu 2020-03-12 11:17:49 UTC; 11s ago Docs: https://caddyserver.com/docs Main PID: 3893 (caddy) Tasks: 7 (limit: 1152) CGroup: /system.slice/caddy.service └─3893 /usr/local/bin/caddy -log stdout -log-timestamps=false -agree=true -conf=/etc/caddy/Caddyfile -root=/var/tmp Mar 12 11:17:49 caddy-article-update systemd[1]: Started Caddy HTTP/2 web server. Mar 12 11:17:49 caddy-article-update caddy[3893]: [INFO] Caddy version: v1.0.5 Mar 12 11:17:49 caddy-article-update caddy[3893]: Activating privacy features... done. Mar 12 11:17:49 caddy-article-update caddy[3893]: Serving HTTP on port 80 Mar 12 11:17:49 caddy-article-update caddy[3893]: http:// Mar 12 11:17:49 caddy-article-update caddy[3893]: [INFO] Serving http:// Mar 12 11:17:49 caddy-article-update caddy[3893]: [INFO][cache:0xc00007a7d0] Started certificate maintenance routine Mar 12 11:17:49 caddy-article-update caddy[3893]: [WARNING] Sending telemetry (attempt 1): Post "https://telemetry.caddyserver.com/v1/update/6a8159c4-3427-42 Mar 12 11:17:57 caddy-article-update caddy[3893]: [WARNING] Sending telemetry (attempt 2): Post "https://telemetry.caddyserver.com/v1/update/6a8159c4-3427-42 ...

      Vous pouvez maintenant naviguer vers l’adresse IP de votre serveur dans un navigateur Web. Votre exemple de page Web affichera :

      Message de Caddy

      Vous avez maintenant configuré Caddy pour servir des fichiers statiques à partir de votre serveur. Dans l’étape suivante, vous allez étendre les fonctionnalités de Caddy grâce à l’utilisation de plugins.

      Étape 4 – Utilisation de plugins

      Les plugins offrent un moyen de modifier et d’étendre le comportement de Caddy. En général, ils proposent davantage de directives de configuration à utiliser, en fonction de votre cas d’utilisation. Dans cette section, vous ajouterez et utiliserez des plugins en installant le plugin minify. Il supprime les espaces excédentaires et nettoie le code qui sera envoyé au client, ce qui réduit encore l’encombrement et les temps de chargement.

      Le référentiel GitHub du plugin minify est hacdias/caddy-minify.

      Naviguez jusqu’au répertoire avec le code source que vous avez créé à la première étape :

      Pour ajouter un plugin à Caddy, vous devez l’importer dans le fichier caddy.go que vous avez utilisé pour construire Caddy. Ouvrez caddy.go​​​ pour le modifier :

      Importez le plugin minify en ajoutant la ligne surlignée, comme ceci :

      ~/caddy/caddy.go

      package main
      
      import (
          "github.com/caddyserver/caddy/caddy/caddymain"
      
          _ "github.com/hacdias/caddy-minify"
      )
      
      func main() {
          // caddymain.EnableTelemetry = false
          caddymain.Run()
      }
      

      Enregistrez et fermez le fichier.

      Certains plugins peuvent nécessiter quelques légers ajustements de configuration, alors assurez-vous de lire la documentation pour ceux que vous installez. Vous trouverez une liste des plugins les plus populaires dans le volet gauche de la documentation de Caddy, sous Plugins.

      À chaque fois que vous ajoutez un nouveau plugin, vous devez reconstruire Caddy. En effet, Go est un langage de programmation compilé, ce qui signifie que le code source est transformé en code machine avant l’exécution. Votre modification de la déclaration d’importation a mis à jour le code source, mais n’affectera pas le binaire tant qu’il n’aura pas été compilé.

      Utilisez la commande go install pour compiler Caddy :

      Lorsque c’est terminé, déplacez le binaire généré vers /usr/local/bin et définissez les autorisations pour le binaire comme vous l’avez fait précédemment. Vous devez suivre ces étapes à chaque fois que vous reconstruisez Caddy afin d’assurer sa fonctionnalité et sa sécurité :

      • sudo mv $GOPATH/bin/caddy /usr/local/bin/
      • sudo chown root:root /usr/local/bin/caddy
      • sudo chmod 755 /usr/local/bin/caddy
      • sudo setcap 'cap_net_bind_service=+ep' /usr/local/bin/caddy

      Pour commencer à utiliser le plugin minify, vous devez ajouter la directive minify à votre Caddyfile. Ouvrez-le pour le modifier :

      • sudo nano /etc/caddy/Caddyfile

      Activez le plugin en ajoutant la ligne suivante au bloc de configuration :

      /etc/caddy/Caddyfile

      :80 {
        root /var/www
        gzip
        minify
      }
      

      Maintenant, redémarrez votre serveur en utilisant systemctl :

      • sudo systemctl restart caddy

      Caddy est maintenant lancé et va minifier tous les fichiers qu’il sert, y compris le fichier index.html que vous avez créé précédemment. Vous pouvez observer la « minification » à l’œuvre en récupérant le contenu de votre domaine à l’aide de curl :

      Vous verrez la sortie suivante. Notez que tous les espaces blancs inutiles ont été supprimés, ce qui montre que le plugin minify fonctionne.

      Output

      <!doctype html><title>Hello from Caddy!</title><h1 style=font-family:sans-serif>This page is being served via Caddy</h1>

      Dans cette étape, vous avez appris à étendre Caddy avec des plugins. Ensuite, vous activerez HTTPS en installant le plugin tls.dns.digitalocean.

      Étape 5 – Activation du TLS automatique avec Let’s Encrypt

      Dans cette section, vous allez activer le provisionnement et le renouvellement automatique du certificat Let’s Encrypt, en utilisant les enregistrements DNS TXT pour la vérification.

      Pour vérifier l’utilisation des enregistrements DNS TXT, vous installerez un plugin pour l’interface avec l’API DigitalOcean, appelé tls.dns.digitalocean. La procédure d’installation est presque identique à celle de l’installation du plugin minify à l’étape précédente. Pour commencer, ouvrez caddy.go :

      Ajoutez le référentiel du plugin à importer :

      ~/caddy/caddy.go

      package main
      
      import (
          "github.com/caddyserver/caddy/caddy/caddymain"
      
          _ "github.com/hacdias/caddy-minify"
      
          _ "github.com/caddyserver/dnsproviders/digitalocean"
      )
      
      func main() {
          // caddymain.EnableTelemetry = false
          caddymain.Run()
      }
      

      Compilez-le en exécutant :

      Assurez-vous que Caddy est arrêté via systemctl, puis terminez l’installation du plugin en copiant le binaire Caddy nouvellement construit et en définissant une fois de plus sa propriété et ses autorisations :

      • sudo systemctl stop caddy
      • sudo mv $GOPATH/bin/caddy /usr/local/bin/
      • sudo chown root:root /usr/local/bin/caddy
      • sudo chmod 755 /usr/local/bin/caddy
      • sudo setcap 'cap_net_bind_service=+ep' /usr/local/bin/caddy

      Ensuite, configurez Caddy pour qu’il fonctionne avec l’API DigitalOcean pour établir des enregistrements DNS. Caddy doit accéder à ce jeton en tant que variable d’environnement pour configurer le DNS de DigitalOcean, vous allez donc éditer son fichier d’unité systemd :

      • sudo nano /etc/systemd/system/caddy.service

      Trouvez la ligne commençant par Environment= dans la section [Service]. Cette ligne définit les variables d’environnement qui doivent être transmises au processus Caddy. Ajoutez un espace à la fin de cette ligne, puis ajoutez une variable DO_AUTH_TOKEN, suivie du jeton que vous venez de générer :

      /etc/systemd/system/caddy.service

      [Service]
      Restart=on-abnormal
      
      ; User and group the process will run as.
      User=www-data
      Group=www-data
      
      ; Letsencrypt-issued certificates will be written to this directory.
      Environment=CADDYPATH=/etc/ssl/caddy DO_AUTH_TOKEN=your_token_here
      

      Enregistrez et fermez ce fichier, puis rechargez le démon systemd comme vous l’avez fait précédemment pour vous assurer que la configuration est mise à jour :

      • sudo systemctl daemon-reload

      Exécutez systemctl status pour vérifier que vos modifications de configurations étaient correctes :

      • sudo systemctl status caddy

      La sortie devrait ressembler à ceci :

      Output

      ● caddy.service - Caddy HTTP/2 web server Loaded: loaded (/etc/systemd/system/caddy.service; disabled; vendor preset: enabled) Active: inactive (dead) Docs: https://caddyserver.com/docs ...

      Vous devrez apporter quelques légères modifications à votre Caddyfile, alors ouvrez-le pour l’éditer :

      • sudo nano /etc/caddy/Caddyfile

      Ajoutez les lignes surlignées au Caddyfile, en veillant à remplacer your_domain par votre domaine (au lieu du seul port :80) et en commentant gzip :

      /etc/caddy/Caddyfile

      your_domain {
        root /var/www
        #gzip
        minify
        tls {
            dns digitalocean
        }
      }
      

      L’utilisation d’un domaine plutôt que d’un simple port pour le nom d’hôte amènera Caddy à servir des requêtes via HTTPS. La directive tls configure le comportement de Caddy lors de l’utilisation de TLS, et la sous-directive dns spécifie que Caddy doit utiliser le système DNS-01, plutôt que HTTP-01.

      Votre site Web est ainsi prêt à être déployé. Démarrez Caddy avec systemctl puis activez-le avec la commande enable, afin qu’il s’exécute au démarrage :

      • sudo systemctl start caddy
      • sudo systemctl enable caddy

      Si vous naviguez sur votre domaine, vous serez automatiquement redirigé vers HTTPS, avec le même message affiché.

      Votre installation de Caddy est maintenant complète et sécurisée, et vous pouvez la personnaliser davantage en fonction de votre cas d’utilisation.

      Si vous souhaitez mettre à jour Caddy lorsqu’une nouvelle version sort, vous devrez mettre à jour le fichier go.mod (stocké dans le même répertoire), qui ressemble à ceci :

      ~/caddy/go.mod

      module caddy
      
      go 1.14
      
      require (
              github.com/caddyserver/caddy v1.0.5
              github.com/caddyserver/dnsproviders v0.4.0
              github.com/hacdias/caddy-minify v1.0.2
      )
      

      La partie surlignée est la version de Caddy que vous utilisez. Lorsqu’une nouvelle version est publiée sur Github (voir la page des balises de sortie), vous pouvez remplacer celle qui existe dans go.mod par celle-ci et compiler Caddy selon les deux premières étapes. Vous pouvez faire de même pour tous les plugins importés.

      Conclusion

      Caddy est maintenant installé et configuré sur votre serveur, et sert des pages statiques sur le domaine souhaité, sécurisé par des certificats TLS Let’s Encrypt gratuits.

      Une bonne étape suivante consisterait à trouver un moyen d’être averti lorsque de nouvelles versions de Caddy sont publiées. Par exemple, vous pourriez utiliser le flux Atom pour les sorties Caddy, ou un service dédié tel que dependencies.io.

      Vous pouvez consulter la documentation de Caddy pour plus d’informations sur la configuration de Caddy.



      Source link