Modul 9 · 9.4
Recept: Uptime Kuma och Vaultwarden
Modul 9: Docker och docker compose · Lästid: 13 minuter
Lärandemål: Efter den här lektionen kan du köra Uptime Kuma och Vaultwarden med docker compose bakom Caddy, med https, stängd registrering, säkerhetskopior av volymerna och ett fast sätt att uppdatera.
Nyckelbegrepp: reverse proxy-container, Caddyfile, automatisk https, Uptime Kuma, Vaultwarden, DOMAIN, SIGNUPS_ALLOWED, ADMIN_TOKEN, Argon2, .env, websockets, säkerhetskopiera volymer, docker compose pull, egen header
Det här bygger vi
Två praktiska tjänster på din egen server, var och en på en egen underdomän:
- Uptime Kuma på
status.example.com: ett bevakningsprogram med webbgränssnitt som håller koll på dina webbplatser, portar och certifikat och skickar en avisering när något går ner (lektion 8.3). Observera: en bevakning som körs på samma server som det den bevakar märker inte när hela servern går ner. Använd den alltså för dina andra webbplatser och tjänster, eller lägg den på en andra server. - Vaultwarden på
kluis.example.com: en lätt, fristående serverversion som fungerar med Bitwardens appar och webbläsartillägg. Ett lösenordsvalv är känslig programvara: gör det bara om du är beredd att underhålla och säkerhetskopiera det ordentligt. Det går också utmärkt att helt enkelt använda en lösenordshanterare från en leverantör.
Framför dem sätter vi Caddy i en container: den tar emot port 80 och 443, ordnar själv certifikaten från Let's Encrypt (lektion 7.3 och 7.4) och skickar trafiken vidare till rätt container. Uptime Kuma och Vaultwarden publicerar själva inga portar (lektion 9.3).
internet ──443──> caddy ──> uptime-kuma:3001
└─> vaultwarden:80Innan du börjar
- Docker Engine med compose-pluginet (lektion 9.2).
- Två DNS-poster som pekar på din server, A och AAAA (lektion 7.1):
status.example.comochkluis.example.com. - Port 80 och 443 lediga på servern. Kör systemet redan en nginx eller Caddy på de portarna kan Caddy-containern inte använda dem. Välj då: antingen stoppar du systemets webbserver, eller så låter du den sköta proxyarbetet och publicerar containrarna på
127.0.0.1(lektion 9.3). I det här receptet sköter Caddy-containern det. - Öppna 80/tcp, 443/tcp och för HTTP/3 även 443/udp i ufw (lektion 5.2). Strikt taget går Docker förbi ufw, men på så sätt stämmer din brandväggsöversikt med verkligheten.
Filerna
Allt hamnar i en och samma mapp, /srv/diensten/:
/srv/diensten/
├── compose.yaml
├── Caddyfile
└── .envcompose.yaml
services:
caddy:
image: caddy:2
restart: unless-stopped
ports:
- "80:80"
- "443:443"
- "443:443/udp"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile:ro
- caddy-data:/data
- caddy-config:/config
uptime-kuma:
image: louislam/uptime-kuma:2
restart: unless-stopped
volumes:
- uptime-kuma:/app/data
vaultwarden:
image: vaultwarden/server:1.37.5
restart: unless-stopped
environment:
DOMAIN: "https://kluis.example.com"
SIGNUPS_ALLOWED: "true"
ADMIN_TOKEN: ${VW_ADMIN_TOKEN}
volumes:
- ./vw-data:/data
volumes:
caddy-data:
caddy-config:
uptime-kuma:Kolla innan du börjar vilken version av Vaultwarden som är den senaste (releaserna på GitHub) och skriv in den i taggen. Bara Caddy publicerar portar, och de måste vara publika. Volymerna caddy-data (certifikat), uptime-kuma och mappen vw-data innehåller allt du behöver spara.
Caddyfile
{
email beheer@example.com
}
status.example.com {
reverse_proxy uptime-kuma:3001
header {
X-Weboke-Cursus "jouw-code-uit-de-opdracht"
defer
}
}
kluis.example.com {
reverse_proxy vaultwarden:80
}Caddy hämtar automatiskt ett certifikat för båda namnen och skickar http vidare till https. uptime-kuma och vaultwarden är tjänstenamnen från compose-filen: Caddy hittar dem på det interna nätverket. Blocket header lägger till en extra headerrad i varje svar från status.example.com; den använder du i uppgiften som bevis på att din proxy-container körs. Med defer sätts headern efter att den bakomliggande tjänsten har svarat. Vill du också ha HSTS och de andra säkerhetsheaderna från lektion 7.4 lägger du dem i samma block.
Ställ in Vaultwarden säkert
Fyra saker gör skillnaden mellan ett säkert och ett farligt valv.
Ett: bara via https. Bitwardens webbvalv använder webbläsarens kryptografi, och webbläsare gör den bara tillgänglig på https-sidor. Utan https fungerar det alltså inte ordentligt, och det är lika bra. Vaultwardens dokumentation rekommenderar en reverse proxy för https, som Caddy här. Sätt DOMAIN till den fullständiga https-adressen.
Två: stängd registrering. Med SIGNUPS_ALLOWED: "true" kan vem som helst som hittar sidan skapa ett konto på din server. Starta alltså, skapa direkt ditt eget konto (eller dina egna konton), sätt värdet till "false" och kör docker compose up -d igen. Vill du lägga till någon senare använder du inbjudningsfunktionen i administrationsvyn.
Tre: en hashad administratörstoken. Administrationsvyn (/admin) skyddas med ADMIN_TOKEN. Lägg inte ett läsbart lösenord där, utan en Argon2-hash. Den skapar du med Vaultwarden själv:
anna@web1:/srv/diensten$ sudo docker compose exec vaultwarden /vaultwarden hash
Password:
Confirm Password:
ADMIN_TOKEN='$argon2id$v=19$m=65540,t=3,p=4$...'Lägg den raden i .env (alltså VW_ADMIN_TOKEN='$argon2id$...', med enkla citattecken) och gör filen läsbar enbart för root: sudo chmod 600 .env. I en .env-fil behöver du inte dubblera $-tecknen; lägger du hashen direkt under environment: i compose-filen måste du göra det (varje $ blir $$), annars försöker Compose fylla i dem som variabler. Du loggar in på /admin med lösenordet du skrev, inte med hashen. Observera: inställningar som du sparar i administrationsvyn hamnar i vw-data/config.json och går då före miljövariablerna.
Fyra: säkerhetskopiering och återställning. Allt ligger i vw-data: databasen, bilagorna och nycklarna. Ta med den mappen i din restic-säkerhetskopia (lektion 8.2) och följ anvisningarna för säkerhetskopiering av databasen i Vaultwarden-wikin, så att du inte kopierar en halvskriven fil. Testa återställningen (uppgift O8.2): ett valv utan fungerande säkerhetskopia är en risk för alla dina lösenord.
Aviseringar mellan enheter (websockets) går i nyare versioner av Vaultwarden över samma port; Caddy skickar dem vidare utan extra inställningar.
Ställ in Uptime Kuma
Efter docker compose up -d öppnar du https://status.example.com. Vid första besöket ber Uptime Kuma dig att skapa ett administratörskonto. Gör det direkt: så länge kontot inte finns kan vem som helst som hittar sidan skapa det. Vill du inte ta den risken alls, ta då först bort blocket status ur Caddyfile, skapa kontot via en SSH-tunnel (lektion 2.3) och lägg sedan tillbaka blocket.
Därefter lägger du till monitorer: en HTTP-monitor för din webbplats, en TCP-monitor för en port, en certifikatvarning och en aviseringskanal (e-post, ett chattprogram eller en pushtjänst). Slå också på tvåstegsverifiering i inställningarna för Uptime Kuma.
Starta och kontrollera
anna@web1:/srv/diensten$ sudo docker compose up -d
anna@web1:/srv/diensten$ sudo docker compose ps
NAME SERVICE STATUS PORTS
diensten-caddy-1 caddy Up 2 minutes 0.0.0.0:80->80/tcp, [::]:80->80/tcp, 0.0.0.0:443->443/tcp, ...
diensten-uptime-kuma-1 uptime-kuma Up 2 minutes (healthy)
diensten-vaultwarden-1 vaultwarden Up 2 minutes (healthy)
anna@web1:/srv/diensten$ sudo docker compose logs caddy | grep -i "certificate obtained"
anna@web1:~$ curl -sI https://status.example.com | grep -i x-weboke
x-weboke-cursus: jouw-code-uit-de-opdrachtBara Caddy har portar. Misslyckas certifikatet står det i Caddys loggar varför: oftast pekar DNS ännu inte på servern, eller så går port 80 inte att nå (lektion 7.3).
Uppdatera
En container uppdateras inte av unattended-upgrades (lektion 4.2). Gör det till ett fast tillfälle, till exempel varannan vecka:
anna@web1:/srv/diensten$ sudo docker compose pull
anna@web1:/srv/diensten$ sudo docker compose up -d
anna@web1:/srv/diensten$ sudo docker image prunepull hämtar de senaste imagerna inom den tagg du har valt (så caddy:2 stannar inom version 2). För Vaultwarden med ett versionsnummer ändrar du först taggen efter att ha läst release notes. Läs alltid release notes vid en ny huvudversion: ibland måste något i dina inställningar ändras. Säkerhetskopiera volymerna före en stor uppdatering.
Följ också tillverkarnas säkerhetsmeddelanden. En sårbarhet i Vaultwarden eller Caddy åtgärdas bara om du hämtar den nya versionen.
I praktiken
Det här receptet fungerar på alla VPS:er med Docker, hos WebOké eller hos en annan leverantör. Det är självhjälp: leverantören av din VPS hanterar ingenting inuti dina containrar. Ta en snapshot innan du sätter upp det första gången, så kan du experimentera med gott samvete.
Sammanfattning
- En compose-fil med Caddy som reverse proxy-container; bara Caddy publicerar port 80 och 443, tjänsterna ingenting.
- Caddy ordnar certifikat och https automatiskt och kan sätta egna headerrader med
header. - Vaultwarden: https är ett måste,
DOMAINpå https-adressen, stängd registrering efter ditt eget konto,ADMIN_TOKENsom Argon2-hash i en.envmed rättigheter 600. - Uptime Kuma: skapa administratörskontot direkt och slå på tvåstegsverifiering; bevaka främst andra servrar och webbplatser med den.
- Säkerhetskopiera volymerna och mappen
vw-data, och uppdatera meddocker compose pullochup -dvid ett fast tillfälle.
Quiz
Uppgift
Uppgift Z9.4: Bevisa att din container körs. Hämta din personliga kod i uppgiften och lägg den i Caddyfile för din Caddy-container som headern X-Weboke-Cursus för en av dina underdomäner (till exempel status.<jouwdomein>). Ladda om Caddy och fyll i värdnamnet. Programmet hämtar https://<hostnaam>/ och kontrollerar att certifikatet är giltigt och att headern innehåller exakt din kod. Klistra dessutom in utdata från docker compose ps och svara på vilken tjänst som ensam publicerar portar.
Läs mer
- Lösenordshanterare och passkeys: så ordnar du säker inloggning
- Uptime Kuma (installation med Docker): https://github.com/louislam/uptime-kuma
- Vaultwarden-wikin, Using Docker Compose: https://github.com/dani-garcia/vaultwarden/wiki/Using-Docker-Compose
- Vaultwarden-wikin, Enabling admin page: https://github.com/dani-garcia/vaultwarden/wiki/Enabling-admin-page
- Vaultwarden-wikin, Enabling HTTPS: https://github.com/dani-garcia/vaultwarden/wiki/Enabling-HTTPS
- Caddy-dokumentationen, header: https://caddyserver.com/docs/caddyfile/directives/header
