Hoppa till innehållet

Cookieinställningar

Välj vilka typer av cookies du tillåter. Du kan alltid ändra ditt val via Cookieinställningar längst ned på varje sida. Integritetspolicy

Nödvändiga

Alltid på

Behövs för att logga in, spara din varukorg och komma ihåg dina val. De är alltid på.

Vilka cookies?
  • weboke_sessie, weboke_klant, weboke_remember: din session och att du förblir inloggad
  • weboke_basket: din varukorg
  • wkBtwIncl: visa priser med eller utan moms
  • wok_cookies: ditt cookieval, 12 månader

Mäter vilken annons som leder till ett besök eller en beställning, så att vi inte betalar för annonser som inte ger något.

Vilka cookies?
  • Google Ads via Google Tag Manager (_gcl_au, _gcl_aw), upp till 90 dagar
  • OpenAI Ads, annonser i ChatGPT
  • wok_aff: via vilken partner du kom till oss (affiliateprogram), 60 dagar

4,6

Land och språk

Varje land har en egen webbplats med landets priser och moms.

Visa

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:80

Innan du börjar

  1. Docker Engine med compose-pluginet (lektion 9.2).
  2. Två DNS-poster som pekar på din server, A och AAAA (lektion 7.1): status.example.com och kluis.example.com.
  3. 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.
  4. Ö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
└── .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:

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

Bara 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 prune

pull 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, DOMAIN på https-adressen, stängd registrering efter ditt eget konto, ADMIN_TOKEN som Argon2-hash i en .env med 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 med docker compose pull och up -d vid ett fast tillfälle.

Quiz

1. Varför publicerar Uptime Kuma och Vaultwarden inga egna portar i det här receptet?



2. Varför fungerar Vaultwardens webbvalv inte ordentligt via vanlig http?



3. Du har skapat ditt eget Vaultwarden-konto. Vad är nästa steg?



4. Du lägger Argon2-hashen för administratörstoken direkt under environment: i compose.yaml och får varningar om okända variabler. Varför?



5. Hur uppdaterar du de här tjänsterna?



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.

Uppgift Z9.4: Bevisa att din container körs

Klicka på "Visa min kod" och lägg in rubrikraden X-Weboke-Cursus med den koden i din Caddyfile, till exempel: header { X-Weboke-Cursus "<code>" }. Utifrån går det inte att se om något körs i en container. Därför klistrar du också in utdata från docker compose ps (den sparar vi inte).




Det du fyller i och det vi hittar sparar vi inte. Din webbläsare kommer ihåg dina svar och om du klarade uppgiften. Är du inloggad sparar vi bara att du klarade uppgiften (nästan) i Mina kurser; där kan du också ta bort det.

Läs mer

Ett ögonblick…

Ställ in dina domäner

Ställ in namnservrar, koppling till ditt webbhotell och vem som blir innehavare för varje domän.

Hämtar dina domäner…