Gå direkte til indholdet

Cookieindstillinger

Vælg for hver type, hvilke cookies du tillader. Du kan altid ændre dit valg via Cookieindstillinger nederst på hver side. Privatlivspolitik

Nødvendige

Altid slået til

Nødvendige for at logge ind, gemme din kurv og huske dine valg. De er altid slået til.

Hvilke cookies?
  • weboke_sessie, weboke_klant, weboke_remember: din session og at forblive logget ind
  • weboke_basket: din kurv
  • wkBtwIncl: vise priser med eller uden moms
  • wok_cookies: dit cookievalg, 12 måneder

Måler, hvilken annonce der fører til et besøg eller en bestilling, så vi ikke betaler for annoncer, der ikke virker.

Hvilke cookies?
  • Google Ads via Google Tag Manager (_gcl_au, _gcl_aw), op til 90 dage
  • OpenAI Ads, annoncer i ChatGPT
  • wok_aff: hvilken partner der henviste dig til os (affiliateprogram), 60 dage

4,6

Land og sprog

Hvert land har sin egen side med landets priser og moms.

Se

Opskrifter: Uptime Kuma og Vaultwarden

Modul 9: Docker og docker compose · Læsetid: 13 minutter

Læringsmål: Efter denne lektion kan du køre Uptime Kuma og Vaultwarden med docker compose bag Caddy, med https, lukket registrering, backup af dine volumes og en fast måde at opdatere på.

Centrale begreber: reverse proxy-container, Caddyfile, automatisk https, Uptime Kuma, Vaultwarden, DOMAIN, SIGNUPS_ALLOWED, ADMIN_TOKEN, Argon2, .env, websockets, backup af volumes, docker compose pull, egen header

Hvad vi bygger

To praktiske tjenester på din egen server, hver på sit eget subdomæne:

  • Uptime Kuma på status.example.com: et overvågningsprogram med en webgrænseflade, der holder øje med dine websites, porte og certifikater og sender dig en besked, hvis noget falder ud (lektion 8.3). Bemærk: en overvågning, der kører på samme server som det, den overvåger, opdager ikke, hvis hele serveren falder ud. Brug den derfor til dine andre sites og tjenester, eller sæt den op på en anden server.
  • Vaultwarden på kluis.example.com: en let, uafhængig serverversion, der fungerer med Bitwardens apps og browserudvidelser. En adgangskodeboks er følsom software: gør det kun, hvis du er villig til at holde den ordentligt opdateret og tage backup af den. Det er også helt fint bare at bruge en adgangskodeadministrator fra en udbyder.

Foran dem sætter vi Caddy i en container: den tager imod på port 80 og 443, klarer selv certifikaterne fra Let's Encrypt (lektion 7.3 og 7.4) og sender trafikken videre til den rigtige container. Uptime Kuma og Vaultwarden publicerer ingen porte selv (lektion 9.3).

internet ──443──> caddy ──> uptime-kuma:3001
                        └─> vaultwarden:80

Før du går i gang

  1. Docker Engine med compose-pluginnet (lektion 9.2).
  2. To DNS-records, der peger på din server, A og AAAA (lektion 7.1): status.example.com og kluis.example.com.
  3. Port 80 og 443 ledige på serveren. Kører der allerede en nginx eller Caddy fra systemet på de porte, kan Caddy-containeren ikke bruge dem. Så skal du vælge: enten stopper du systemets webserver, eller også lader du den stå for proxyarbejdet og publicerer containerne på 127.0.0.1 (lektion 9.3). I denne opskrift er det Caddy-containeren, der gør det.
  4. I ufw: åbn 80/tcp, 443/tcp og for HTTP/3 også 443/udp (lektion 5.2). Strengt taget går Docker uden om ufw, men på den måde stemmer dit firewalloverblik med virkeligheden.

Filerne

Alt ligger i én mappe, /srv/diensten/:

/srv/diensten/
├── compose.yaml
├── Caddyfile
└── .env

compose.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:

Tjek, før du begynder, hvilken version af Vaultwarden der er den nyeste (udgivelserne på GitHub), og sæt den i tagget. Kun Caddy publicerer porte, og de skal være offentlige. Volumes caddy-data (certifikater), uptime-kuma og mappen vw-data indeholder alt det, du skal gemme.

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 certifikat til begge navne og sender http videre til https. uptime-kuma og vaultwarden er servicenavnene fra compose-filen: Caddy finder dem på det interne netværk. header-blokken sætter en ekstra headerlinje i hvert svar fra status.example.com. Den bruger du i opgaven som bevis på, at din proxy-container kører. Med defer bliver headeren sat, efter at den bagvedliggende tjeneste har givet sit svar. Vil du også have HSTS og de andre sikkerhedsheaders fra lektion 7.4, så sæt dem i samme blok.

Sæt Vaultwarden sikkert op

Fire ting gør forskellen mellem en sikker og en farlig boks.

Et: kun via https. Bitwardens webboks bruger browserens kryptografi, og browsere giver kun adgang til den på https-sider. Uden https virker det altså ikke ordentligt, og det er kun godt. Vaultwarden-dokumentationen anbefaler en reverse proxy til https, som Caddy her. Sæt DOMAIN til den fulde https-adresse.

To: luk registreringen. Med SIGNUPS_ALLOWED: "true" kan alle, der finder siden, oprette en konto på din server. Start derfor, opret straks din egen konto eller dine egne konti, sæt værdien til "false", og kør docker compose up -d igen. Vil du senere tilføje nogen, så brug invitationsfunktionen i administrationssiden.

Tre: et hashet administrationstoken. Administrationssiden (/admin) er beskyttet med ADMIN_TOKEN. Sæt ikke en læsbar adgangskode ind der, men en Argon2-hash. Den laver 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$...'

Sæt den linje i .env (altså VW_ADMIN_TOKEN='$argon2id$...', med enkelte anførselstegn), og gør filen læsbar kun for root: sudo chmod 600 .env. I en .env-fil behøver du ikke fordoble $-tegnene. Sætter du hashen direkte under environment: i compose-filen, skal du derimod (hvert $ bliver til $$), ellers prøver Compose at udfylde dem som variabler. Du logger ind på /admin med den adgangskode, du skrev, ikke med hashen. Bemærk: indstillinger, du gemmer i administrationssiden, havner i vw-data/config.json og går så forud for miljøvariablerne.

Fire: backup og gendannelse. Alt ligger i vw-data: databasen, vedhæftede filer og nøgler. Tag den mappe med i din restic-backup (lektion 8.2), og følg backupanvisningerne for databasen i Vaultwarden-wikien, så du ikke kopierer en halvt skrevet fil. Test gendannelsen (opgave O8.2): en boks uden fungerende backup er en risiko for alle dine adgangskoder.

Notifikationer mellem enheder (websockets) går i nyere versioner af Vaultwarden over samme port. Caddy sender dem videre uden ekstra indstillinger.

Sæt Uptime Kuma op

Efter docker compose up -d åbner du https://status.example.com. Ved første besøg beder Uptime Kuma dig oprette en administratorkonto. Gør det med det samme: så længe den konto ikke findes, kan alle, der finder siden, oprette den. Vil du slet ikke tage den risiko, så fjern først status-blokken fra Caddyfile, opret kontoen via en SSH-tunnel (lektion 2.3), og sæt blokken tilbage bagefter.

Derefter tilføjer du monitorer: en HTTP-monitor til dit website, en TCP-monitor til en port, en certifikatadvarsel og en notifikationskanal (mail, et chatprogram eller en pushtjeneste). Slå også totrinsbekræftelse til i Uptime Kumas indstillinger.

Start og kontrollér

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-opdracht

Kun Caddy har porte. Lykkes certifikatet ikke, står der i Caddys logs hvorfor: som regel peger DNS endnu ikke på serveren, eller port 80 kan ikke nås (lektion 7.3).

Opdatering

En container bliver ikke opdateret af unattended-upgrades (lektion 4.2). Gør det til et fast tidspunkt, for eksempel hver anden uge:

anna@web1:/srv/diensten$ sudo docker compose pull
anna@web1:/srv/diensten$ sudo docker compose up -d
anna@web1:/srv/diensten$ sudo docker image prune

pull henter de nyeste images inden for det tag, du har valgt (så caddy:2 bliver inden for version 2). Til Vaultwarden med et versionsnummer ændrer du først tagget, når du har læst release notes. Læs altid release notes ved en ny hovedversion: nogle gange skal der ændres noget i dine indstillinger. Tag backup af dine volumes før en stor opdatering.

Følg også udviklernes sikkerhedsmeddelelser. En sårbarhed i Vaultwarden eller Caddy bliver kun rettet, hvis du selv henter den nye version.

I praksis

Denne opskrift virker på enhver VPS med Docker, hos WebOké eller hos en anden udbyder. Det er selvhjælp: udbyderen af din VPS administrerer intet inde i dine containere. Tag et snapshot, før du sætter det op første gang, så kan du eksperimentere med ro i maven.

Opsummering

  • Én compose-fil med Caddy som reverse proxy-container. Kun Caddy publicerer port 80 og 443, tjenesterne intet.
  • Caddy klarer certifikater og https automatisk og kan sætte egne headerlinjer med header.
  • Vaultwarden: https er et must, DOMAIN på https-adressen, registrering lukket efter din egen konto, ADMIN_TOKEN som Argon2-hash i en .env med rettigheder 600.
  • Uptime Kuma: opret administratorkontoen med det samme og slå totrinsbekræftelse til. Overvåg især andre servere og sites med den.
  • Tag backup af dine volumes og mappen vw-data, og opdater med docker compose pull og up -d på et fast tidspunkt.

Quiz

1. Hvorfor publicerer Uptime Kuma og Vaultwarden ikke selv porte i denne opskrift?



2. Hvorfor virker Vaultwardens webboks ikke ordentligt via almindelig http?



3. Du har oprettet din egen Vaultwarden-konto. Hvad er næste skridt?



4. Du sætter Argon2-hashen af administrationstokenet direkte under environment: i compose.yaml og får advarsler om ukendte variabler. Hvorfor?



5. Hvordan opdaterer du disse tjenester?



Opgave

Opgave Z9.4: Bevis at din container kører. Hent din personlige kode i opgaven, og sæt den i Caddyfile for din Caddy-container som headeren X-Weboke-Cursus for et af dine subdomæner (som status.<jouwdomein>). Genindlæs Caddy, og udfyld værtsnavnet. Programmet henter https://<hostnaam>/ og kontrollerer, at certifikatet er gyldigt, og at headeren indeholder præcis din kode. Indsæt desuden outputtet fra docker compose ps, og svar på, hvilken tjeneste der som den eneste publicerer porte.

Opgave Z9.4: Bevis at din container kører

Klik på "Vis min kode", og sæt headeren X-Weboke-Cursus med den kode i din Caddyfile, for eksempel: header { X-Weboke-Cursus "<code>" }. Udefra kan man ikke se, om noget kører i en container; derfor indsætter du også outputtet fra docker compose ps (det gemmer vi ikke).




Det, du udfylder, og hvad vi finder, gemmer vi ikke. Din browser husker dine svar, og om du har bestået opgaven. Er du logget ind, gemmer vi kun, at du (næsten) bestod opgaven, i Mine kurser; der kan du også slette det.

Læs mere

Et øjeblik…

Opsæt dine domæner

Angiv for hvert domæne navneserverne, tilknytningen til din hosting, og hvem der bliver ejer.

Indlæser dine domæner…