Installation
Beschreibung:
Caddy ein letsencrypt Docker Proxy/Agent der Automatisch auch Zertifikate verlängert.
Caddy besteht aus einem Containerund einer Config Datei für die Domänen
Installation
Docker installieren
apt install curl docker.io docker-compose
Beispiel Konfig für einen apache2 der auf http port 8080 lauscht und den Caddy der auf Port 80 und 443 lauscht.
Port 80 wird auf 443 umgeleitet.
Der Port 443 wieder rum an 8080.
In der Composer Datei haben wir den port bei Apache rausgenommen, weil er auf 8080 im internet Docker Netz lauscht
Verzeichnisse erstellen
mkdir caddy_data
mkdir caddy_config
Die Compose Datei
version: '3.8'
services:
apache:
image: httpd:latest
container_name: apache-webserver
#ports:
# - "8080:8080"
volumes:
- ./apache_html:/usr/local/apache2/htdocs/
restart: unless-stopped
caddy:
image: caddy:latest
container_name: caddy-reverse-proxy
ports:
- "80:80"
- "443:443"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
- ./caddy_data:/data
- ./caddy_config:/config
restart: unless-stopped
Nun noch die Caddfile anlegen
Caddyfile für die Nutzung von Lets Encrypt
nano Caddyfile
Inhalt, wenn man es erst testen möchte mit Staging einfach den Kommentar entfernen.
example.com {
reverse_proxy http://<servicename_docker_name>:8080
tls <deine_emailadresse> {
#ca https://acme-staging-v02.api.letsencrypt.org/directory
}
}
Lets Encrypt Global Einstellungen wenn gewünscht:
Man kann aber auch die Lets Encrypt defination global setzen.
Dann braucht man das nicht mehr für jede Domain.
Wenn man es erst testen möchte mit Staging einfach den Kommentar entfernen.
{
#acme_ca https://acme-staging-v02.api.letsencrypt.org/directory
email deine_emailadresse@example.com
}
example.com {
reverse_proxy http://<servicename_docker_name>:8080
}
Über den Paramter tls können dann noch die Versionen angepasst werden.
Lässt man tls weg, wird automatisch das aktuellste verwendet, wie im oberen Beispiel, da haben wir kein tls mit drin.
Hier wird TLS Global definiert, sprich gillt für alle
{
#acme_ca https://acme-staging-v02.api.letsencrypt.org/directory
email admin@example.com
tls {
protocols tls1.2 tls1.3
}
}
example.com {
reverse_proxy http://localhost:8080
}
example2.com {
reverse_proxy http://localhost:8081
}
Man kann aber auch in den einzelnen Domain weiterhin die Versionen angeben, macht Sinn wenn diese sich unterscheiden.
Aus irgendeinem Grund, was nicht zu empfehlen ist, braucht der Server noch TLS 1.1
{
#acme_ca https://acme-staging-v02.api.letsencrypt.org/directory
email admin@example.com
tls {
protocols tls1.2 tls1.3
}
}
example.com {
tls {
protocols tls1.2 tls1.3
}
reverse_proxy http://localhost:8080
}
example2.com {
tls {
protocols tls1.1
}
reverse_proxy http://localhost:8081
}
Vorhandene Zertifikate nutzen:
Hier werden TLS 1.2 und TLS 1.3 erzwungen, und zusätzlich kannst du Client-Zertifikate verwenden, wenn du möchtest.
example.com {
reverse_proxy http://<servicename_docker_name>:8080
tls {
protocols tls1.2 tls1.3
client_auth {
mode require_and_verify
trusted_ca_cert_file /path/to/ca.pem
}
}
}
Caddyfile was selbst signiertes Zertifikat nutzen soll
Wir können einen Domain Namen angeben wenn wir einen eigenen DNS Server Betreiben, ansonsten Hostname oder ip Adressee angeben.
Es wird im Arbeitsspeicher
Es muss unbedingt ein Domänen Namen verwendet werden!!!
Wenn kein eigener DNS Server vorhanden dann in die hosts Datei eintragen. IP Adresse geht nicht!!!!
example.local.lan {
reverse_proxy http://<servicename_docker_name>:8080
tls internal
}
Timer für den restart des Caddy wenn es ein self signed Zertifikat ist
Erstelle Systemd Dienst Datei
nano /etc/systemd/system/docker-container-restart.serviceInhalt:
Um den Namen rauszubekommen nehmen wir diesen Befehl:
docker ps -a --format "{{.ID}} - {{.Names}}"[Unit]
Description=Restart Docker container every 6 days
After=docker.service
Requires=docker.service
[Service]
Type=oneshot
Environment="CONTAINER_NAME=caddy" # Hier den Namen des Containers anpassen
ExecStart=/usr/bin/docker restart $CONTAINER_NAME
[Install]
WantedBy=multi-user.target
Erstelle Systemd Timer Datei
nano /etc/systemd/system/docker-container-restart.timerInhalt:
[Unit]
Description=Run Docker container restart service every 10 hours
[Timer]
OnUnitActiveSec=10h
Persistent=true
[Install]
WantedBy=timers.target
Hier für 5 Minuten damit man das Testen kann.Nach einer änderung muss immer der Daemon neugetartet werden und der Timer auch
OnUnitActiveSec=5min
Systemd Daemon reload und Timer aktivieren
systemctl daemon-reload
systemctl enable --now docker-container-restart.timer
Fertig