Modul 9 · 9.4
Oppskrifter: Uptime Kuma og Vaultwarden
Modul 9: Docker og docker compose · Lesetid: 13 minutter
Læringsmål: Etter denne leksjonen kan du kjøre Uptime Kuma og Vaultwarden med docker compose bak Caddy, med https, stengt registrering, sikkerhetskopi av volumene og en fast måte å oppdatere på.
Nøkkelbegreper: reverse proxy-container, Caddyfile, automatisk https, Uptime Kuma, Vaultwarden, DOMAIN, SIGNUPS_ALLOWED, ADMIN_TOKEN, Argon2, .env, websockets, sikkerhetskopiere volumer, docker compose pull, egen header
Hva vi bygger
To nyttige tjenester på din egen server, hver på sitt eget underdomene:
- Uptime Kuma på
status.example.com: et overvåkingsprogram med webgrensesnitt som holder øye med nettstedene, portene og sertifikatene dine og sender deg et varsel når noe faller ut (leksjon 8.3). Merk: en overvåking som kjører på samme server som det den overvåker, merker ikke at hele serveren faller ut. Bruk den derfor til de andre nettstedene og tjenestene dine, eller sett den opp på en annen server. - Vaultwarden på
kluis.example.com: en lett, uavhengig serverversjon som fungerer med appene og nettleserutvidelsene til Bitwarden. Et passordhvelv er sensitiv programvare: gjør dette bare hvis du er villig til å vedlikeholde og sikkerhetskopiere det skikkelig. Det er også helt greit å bruke en passordbehandler fra en leverandør.
Foran setter vi Caddy i en container: den tar imot port 80 og 443, ordner selv sertifikatene fra Let's Encrypt (leksjon 7.3 og 7.4) og sender trafikken videre til riktig container. Uptime Kuma og Vaultwarden publiserer selv ingen porter (leksjon 9.3).
internet ──443──> caddy ──> uptime-kuma:3001
└─> vaultwarden:80Før du starter
- Docker Engine med compose-pluginen (leksjon 9.2).
- To DNS-poster som peker til serveren din, A og AAAA (leksjon 7.1):
status.example.comogkluis.example.com. - Port 80 og 443 ledige på serveren. Kjører det allerede en nginx eller Caddy fra systemet på disse portene, kan ikke Caddy-containeren bruke dem. Velg da: enten stopper du systemets webserver, eller så lar du den gjøre proxyjobben og publiserer containerne på
127.0.0.1(leksjon 9.3). I denne oppskriften er det Caddy-containeren som gjør det. - Åpne 80/tcp, 443/tcp og for HTTP/3 også 443/udp i ufw (leksjon 5.2). Strengt tatt går Docker utenom ufw, men slik stemmer brannmuroversikten din med virkeligheten.
Filene
Alt legges i én mappe, /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:Sjekk før du begynner hvilken versjon av Vaultwarden som er den nyeste (releasene på GitHub), og sett den i taggen. Bare Caddy publiserer porter, og de må være offentlige. Volumene caddy-data (sertifikater), uptime-kuma og mappen vw-data inneholder alt du må ta vare på.
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 henter automatisk et sertifikat for begge navnene og sender http videre til https. uptime-kuma og vaultwarden er tjenestenavnene fra compose-filen: Caddy finner dem på det interne nettverket. header-blokken legger til en ekstra headerlinje i hvert svar fra status.example.com. Den bruker du i oppgaven som bevis på at proxy-containeren din kjører. Med defer settes headeren etter at tjenesten bak har gitt sitt svar. Vil du også ha HSTS og de andre sikkerhetsheaderne fra leksjon 7.4, setter du dem i samme blokk.
Sett opp Vaultwarden sikkert
Fire ting utgjør forskjellen mellom et trygt og et farlig hvelv.
Én: bare via https. Webhvelvet til Bitwarden bruker kryptografien i nettleseren, og nettlesere gir bare tilgang til den på https-sider. Uten https fungerer det altså ikke ordentlig, og det er like greit. Vaultwarden-dokumentasjonen anbefaler en reverse proxy for https, slik som Caddy her. Sett DOMAIN til den fullstendige https-adressen.
To: stengt registrering. Med SIGNUPS_ALLOWED: "true" kan alle som finner siden, lage en konto på serveren din. Start derfor, lag kontoen(e) dine med en gang, sett verdien til "false" og kjør docker compose up -d på nytt. Vil du legge til noen senere, bruker du invitasjonsfunksjonen i administrasjonssiden.
Tre: et hashet administrasjonstoken. Administrasjonssiden (/admin) er beskyttet med ADMIN_TOKEN. Ikke sett et lesbart passord der, men en Argon2-hash. Den lager du med Vaultwarden selv:
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$...'Sett den linjen i .env (altså VW_ADMIN_TOKEN='$argon2id$...', med enkle anførselstegn) og gjør filen lesbar bare for root: sudo chmod 600 .env. I en .env-fil trenger du ikke doble $-tegnene. Setter du hashen rett under environment: i compose-filen, må du det (hver $ blir $$), ellers prøver Compose å fylle dem inn som variabler. Du logger inn på /admin med passordet du skrev inn, ikke med hashen. Merk: innstillinger du lagrer i administrasjonssiden, havner i vw-data/config.json og går da foran miljøvariablene.
Fire: sikkerhetskopi og gjenoppretting. Alt ligger i vw-data: databasen, vedlegg og nøkler. Ta med den mappen i restic-sikkerhetskopien din (leksjon 8.2), og følg sikkerhetskopiveiledningen i Vaultwarden-wikien for databasen, slik at du ikke kopierer en halvskrevet fil. Test gjenopprettingen (oppgave O8.2): et hvelv uten fungerende sikkerhetskopi er en risiko for alle passordene dine.
Varsler mellom enheter (websockets) går i nyere versjoner av Vaultwarden over samme port. Caddy sender dem videre uten ekstra innstillinger.
Sett opp Uptime Kuma
Etter docker compose up -d åpner du https://status.example.com. Ved første besøk ber Uptime Kuma deg om å opprette en administratorkonto. Gjør det med en gang: så lenge kontoen ikke finnes, kan alle som finner siden, opprette den. Vil du unngå den risikoen helt, fjerner du først status-blokken fra Caddyfile, oppretter kontoen via en SSH-tunnel (leksjon 2.3) og setter blokken tilbake etterpå.
Deretter legger du til monitorer: en HTTP-monitor for nettstedet ditt, en TCP-monitor for en port, et sertifikatvarsel og en varslingskanal (e-post, et chatprogram eller en pushtjeneste). Slå også på tofaktorautentisering i innstillingene til Uptime Kuma.
Start og kontroller
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-opdrachtBare Caddy har porter. Lykkes ikke sertifikatet, står årsaken i loggene til Caddy: som regel peker DNS ennå ikke til serveren, eller port 80 er ikke tilgjengelig (leksjon 7.3).
Oppdatering
En container oppdateres ikke av unattended-upgrades (leksjon 4.2). Gjør det til en fast rutine, for eksempel hver andre uke:
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 henter de nyeste imagene innenfor taggen du har valgt (så caddy:2 holder seg innenfor versjon 2). For Vaultwarden med et versjonsnummer endrer du først taggen etter at du har lest release notes. Les alltid release notes ved en ny hovedversjon: noen ganger må noe i innstillingene dine endres. Ta en sikkerhetskopi av volumene før en stor oppdatering.
Følg også sikkerhetsvarslene fra utviklerne. En sårbarhet i Vaultwarden eller Caddy blir bare rettet hvis du henter den nye versjonen.
I praksis
Denne oppskriften fungerer på alle VPS-er med Docker, hos WebOké eller hos en annen leverandør. Det er selvhjelp: leverandøren av VPS-en din administrerer ingenting inne i containerne dine. Ta et øyeblikksbilde før du setter det opp første gang, så kan du eksperimentere med god samvittighet.
Sammendrag
- Én compose-fil med Caddy som reverse proxy-container. Bare Caddy publiserer port 80 og 443, tjenestene ingenting.
- Caddy ordner sertifikater og https automatisk og kan sette egne headerlinjer med
header. - Vaultwarden: https er påkrevd,
DOMAINtil https-adressen, stengt registrering etter at du har laget din egen konto,ADMIN_TOKENsom Argon2-hash i en.envmed rettighetene 600. - Uptime Kuma: opprett administratorkontoen med en gang og slå på tofaktorautentisering. Bruk den helst til å overvåke andre servere og nettsteder.
- Sikkerhetskopier volumene og mappen
vw-data, og oppdater meddocker compose pullogup -dtil faste tider.
Quiz
Oppgave
Oppgave Z9.4: Bevis at containeren din kjører. Hent den personlige koden din i oppgaven og legg den inn i Caddyfile i Caddy-containeren din som headeren X-Weboke-Cursus for et av underdomenene dine (for eksempel status.<jouwdomein>). Last inn Caddy på nytt og fyll inn vertsnavnet. Programmet henter https://<hostnaam>/ og kontrollerer at sertifikatet er gyldig og at headeren inneholder nøyaktig koden din. Lim i tillegg inn utdataene fra docker compose ps og svar på hvilken tjeneste som er den eneste som publiserer porter.
Les mer
- Passordbehandler og passkeys: slik sikrer du innloggingen din
- Uptime Kuma (installasjon med Docker): https://github.com/louislam/uptime-kuma
- Vaultwarden-wiki, Using Docker Compose: https://github.com/dani-garcia/vaultwarden/wiki/Using-Docker-Compose
- Vaultwarden-wiki, Enabling admin page: https://github.com/dani-garcia/vaultwarden/wiki/Enabling-admin-page
- Vaultwarden-wiki, Enabling HTTPS: https://github.com/dani-garcia/vaultwarden/wiki/Enabling-HTTPS
- Caddy-dokumentasjon, header: https://caddyserver.com/docs/caddyfile/directives/header
