Przejdź do treści

Ustawienia plików cookie

Prosimy wybrać, na które rodzaje plików cookie Państwo zezwalają. Wybór można zmienić w dowolnym momencie w Ustawieniach plików cookie na dole każdej strony. Polityka prywatności

Niezbędne

Zawsze włączone

Potrzebne do logowania, zachowania koszyka i zapamiętania wyborów. Są zawsze włączone.

Jakie pliki cookie?
  • weboke_sessie, weboke_klant, weboke_remember: sesja i pozostanie zalogowanym
  • weboke_basket: koszyk
  • wkBtwIncl: wyświetlanie cen z VAT lub bez VAT
  • wok_cookies: wybór dotyczący plików cookie, 12 miesięcy

Mierzą, która reklama prowadzi do odwiedzin lub zamówienia, abyśmy nie płacili za reklamy, które nic nie dają.

Jakie pliki cookie?
  • Google Ads przez Google Tag Manager (_gcl_au, _gcl_aw), do 90 dni
  • OpenAI Ads, reklamy w ChatGPT
  • wok_aff: przez którego partnera trafili Państwo do nas (program partnerski), 60 dni

4,6

Kraj i język

Każdy kraj ma własną stronę z cenami i stawką VAT tego kraju.

Wyświetl

Przepisy: Uptime Kuma i Vaultwarden

Moduł 9: Docker i docker compose · Czas czytania: 13 min

Cel lekcji: Po tej lekcji będą Państwo potrafili uruchomić Uptime Kuma i Vaultwarden za pomocą docker compose za Caddy, z https, zamkniętą rejestracją, kopią zapasową wolumenów i stałym sposobem aktualizacji.

Kluczowe pojęcia: kontener reverse proxy, Caddyfile, automatyczne https, Uptime Kuma, Vaultwarden, DOMAIN, SIGNUPS_ALLOWED, ADMIN_TOKEN, Argon2, .env, websockety, kopia zapasowa wolumenów, docker compose pull, własny nagłówek

Co budujemy

Dwie przydatne usługi na Państwa własnym serwerze, każda na osobnej subdomenie:

  • Uptime Kuma na status.example.com: program do monitorowania z interfejsem WWW, który pilnuje Państwa stron, portów i certyfikatów oraz wysyła powiadomienie, gdy coś przestanie działać (lekcja 8.3). Uwaga: monitorowanie działające na tym samym serwerze co monitorowane usługi nie zauważy awarii całego serwera. Proszę więc używać go do innych stron i usług albo umieścić go na drugim serwerze.
  • Vaultwarden na kluis.example.com: lekka, niezależna wersja serwerowa, która współpracuje z aplikacjami i rozszerzeniami przeglądarki Bitwarden. Sejf haseł to wrażliwe oprogramowanie: prosimy się na to decydować tylko wtedy, gdy są Państwo gotowi starannie go aktualizować i wykonywać jego kopie zapasowe. Równie dobrym wyborem jest po prostu menedżer haseł od zewnętrznego dostawcy.

Przed nimi umieszczamy Caddy w kontenerze: przyjmuje on ruch na portach 80 i 443, sam zajmuje się certyfikatami Let's Encrypt (lekcja 7.3 i 7.4) i przekazuje ruch do właściwego kontenera. Uptime Kuma i Vaultwarden same nie publikują żadnych portów (lekcja 9.3).

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

Przygotowanie

  1. Docker Engine z wtyczką compose (lekcja 9.2).
  2. Dwa rekordy DNS wskazujące na Państwa serwer, A i AAAA (lekcja 7.1): status.example.com i kluis.example.com.
  3. Wolne porty 80 i 443 na serwerze. Jeśli na tych portach działa już systemowy nginx lub Caddy, kontener Caddy nie będzie mógł z nich korzystać. Należy wtedy wybrać: albo zatrzymać systemowy serwer WWW, albo zlecić mu pracę proxy i opublikować kontenery na 127.0.0.1 (lekcja 9.3). W tym przepisie zadanie to wykonuje kontener Caddy.
  4. W ufw otwarte 80/tcp, 443/tcp, a dla HTTP/3 także 443/udp (lekcja 5.2). Ściśle rzecz biorąc Docker omija ufw, ale dzięki temu przegląd zapory zgadza się z rzeczywistością.

Pliki

Wszystko trafia do jednego katalogu, /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:

Przed rozpoczęciem prosimy sprawdzić, która wersja Vaultwarden jest najnowsza (wydania na GitHubie), i wpisać ją w tagu. Porty publikuje tylko Caddy; one muszą być publiczne. Wolumeny caddy-data (certyfikaty), uptime-kuma oraz katalog vw-data zawierają wszystko, co trzeba zachować.

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 samodzielnie pobiera certyfikat dla obu nazw i przekierowuje http na https. uptime-kuma i vaultwarden to nazwy usług z pliku compose: Caddy znajduje je w sieci wewnętrznej. Blok header dodaje dodatkowy nagłówek do każdej odpowiedzi z status.example.com; wykorzystają go Państwo w zadaniu jako dowód, że Państwa kontener proxy działa. Dzięki defer nagłówek jest ustawiany po tym, jak usługa w tle udzieli odpowiedzi. Jeśli chcą Państwo dodać także HSTS i pozostałe nagłówki bezpieczeństwa z lekcji 7.4, prosimy umieścić je w tym samym bloku.

Bezpieczna konfiguracja Vaultwarden

Cztery rzeczy decydują o tym, czy sejf jest bezpieczny, czy niebezpieczny.

Po pierwsze: tylko przez https. Sejf WWW Bitwarden korzysta z kryptografii przeglądarki, a przeglądarki udostępniają ją wyłącznie na stronach https. Bez https nie działa więc poprawnie, i bardzo dobrze. Dokumentacja Vaultwarden zaleca reverse proxy dla https, taki jak tutaj Caddy. Proszę ustawić DOMAIN na pełny adres https.

Po drugie: zamknięta rejestracja. Przy SIGNUPS_ALLOWED: "true" każdy, kto znajdzie stronę, może założyć konto na Państwa serwerze. Proszę więc uruchomić usługę, od razu założyć własne konto (lub konta), ustawić wartość na "false" i ponownie wykonać docker compose up -d. Jeśli później zechcą Państwo kogoś dodać, prosimy użyć funkcji zaproszeń w panelu administracyjnym.

Po trzecie: zahaszowany token administratora. Panel administracyjny (/admin) jest chroniony przez ADMIN_TOKEN. Proszę nie wpisywać tam czytelnego hasła, lecz hash Argon2. Tworzy się go za pomocą samego Vaultwarden:

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$...'

Proszę umieścić ten wiersz w .env (czyli VW_ADMIN_TOKEN='$argon2id$...', w pojedynczych cudzysłowach) i ustawić plik jako czytelny tylko dla root: sudo chmod 600 .env. W pliku .env nie trzeba podwajać znaków $; jeśli jednak wpiszą Państwo hash bezpośrednio pod environment: w pliku compose, to trzeba (każdy $ zamienia się w $$), w przeciwnym razie Compose spróbuje podstawić je jako zmienne. Do /admin logują się Państwo hasłem, które zostało wpisane, a nie hashem. Uwaga: ustawienia zapisane w panelu administracyjnym trafiają do vw-data/config.json i mają wtedy pierwszeństwo przed zmiennymi środowiskowymi.

Po czwarte: kopia zapasowa i przywracanie. Wszystko znajduje się w vw-data: baza danych, załączniki i klucze. Proszę uwzględnić ten katalog w kopii restic (lekcja 8.2), a w przypadku bazy danych postępować zgodnie ze wskazówkami dotyczącymi kopii zapasowych w wiki Vaultwarden, aby nie skopiować w połowie zapisanego pliku. Proszę przetestować przywracanie (zadanie O8.2): sejf bez działającej kopii zapasowej to ryzyko dla wszystkich Państwa haseł.

Powiadomienia między urządzeniami (websockety) w nowszych wersjach Vaultwarden działają przez ten sam port; Caddy przekazuje je bez dodatkowej konfiguracji.

Konfiguracja Uptime Kuma

Po docker compose up -d proszę otworzyć https://status.example.com. Przy pierwszej wizycie Uptime Kuma poprosi o utworzenie konta administratora. Prosimy zrobić to od razu: dopóki takie konto nie istnieje, każdy, kto znajdzie stronę, może je założyć. Jeśli nie chcą Państwo podejmować tego ryzyka, proszę najpierw usunąć blok status z Caddyfile, utworzyć konto przez tunel SSH (lekcja 2.3), a następnie przywrócić blok.

Następnie dodają Państwo monitory: monitor HTTP dla strony internetowej, monitor TCP dla portu, ostrzeżenie o certyfikacie oraz kanał powiadomień (e-mail, komunikator lub usługa push). Prosimy też włączyć weryfikację dwuetapową w ustawieniach Uptime Kuma.

Uruchomienie i sprawdzenie

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

Porty ma tylko Caddy. Jeśli pobranie certyfikatu się nie powiedzie, przyczynę znajdą Państwo w logach Caddy: zwykle DNS nie wskazuje jeszcze na serwer albo port 80 jest nieosiągalny (lekcja 7.3).

Aktualizacja

Kontener nie jest aktualizowany przez unattended-upgrades (lekcja 4.2). Proszę ustalić stały termin, na przykład co dwa tygodnie:

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 pobiera najnowsze obrazy w ramach wybranego tagu (czyli caddy:2 pozostaje w wersji 2). W przypadku Vaultwarden z numerem wersji najpierw zmieniają Państwo tag, po przeczytaniu informacji o wydaniu (release notes). Przy nowej wersji głównej zawsze prosimy czytać release notes: czasem trzeba coś zmienić w ustawieniach. Przed dużą aktualizacją proszę wykonać kopię zapasową wolumenów.

Prosimy też śledzić komunikaty bezpieczeństwa twórców. Luka w Vaultwarden lub Caddy zostanie usunięta tylko wtedy, gdy pobiorą Państwo nową wersję.

W praktyce

Ten przepis działa na każdym VPS z Dockerem, w WebOké lub u innego dostawcy. To samodzielne rozwiązanie: dostawca Państwa VPS niczym nie zarządza wewnątrz kontenerów. Przed pierwszą konfiguracją proszę wykonać snapshot, aby móc spokojnie eksperymentować.

Podsumowanie

  • Jeden plik compose z Caddy jako kontenerem reverse proxy; tylko Caddy publikuje porty 80 i 443, usługi nie publikują nic.
  • Caddy automatycznie obsługuje certyfikaty i https, a za pomocą header może ustawiać własne nagłówki.
  • Vaultwarden: https obowiązkowo, DOMAIN na adres https, rejestracja zamknięta po założeniu własnego konta, ADMIN_TOKEN jako hash Argon2 w .env z uprawnieniami 600.
  • Uptime Kuma: od razu utworzyć konto administratora i włączyć weryfikację dwuetapową; monitorować nim przede wszystkim inne serwery i strony.
  • Kopia zapasowa wolumenów i katalogu vw-data oraz aktualizacja za pomocą docker compose pull i up -d w stałym terminie.

Quiz

1. Dlaczego w tym przepisie Uptime Kuma i Vaultwarden same nie publikują portów?



2. Dlaczego sejf WWW Vaultwarden nie działa poprawnie przez zwykłe http?



3. Założyli Państwo własne konto Vaultwarden. Jaki jest następny krok?



4. Wpisują Państwo hash Argon2 tokenu administratora bezpośrednio pod environment: w compose.yaml i otrzymują ostrzeżenia o nieznanych zmiennych. Dlaczego?



5. Jak aktualizuje się te usługi?



Zadanie

Zadanie Z9.4: Proszę udowodnić, że Państwa kontener działa. Proszę pobrać w zadaniu swój osobisty kod i wpisać go w Caddyfile kontenera Caddy jako nagłówek X-Weboke-Cursus dla jednej ze swoich subdomen (na przykład status.<jouwdomein>). Następnie proszę przeładować Caddy i podać nazwę hosta. Program pobierze https://<hostnaam>/ i sprawdzi, czy certyfikat jest ważny oraz czy nagłówek zawiera dokładnie Państwa kod. Dodatkowo proszę wkleić wynik docker compose ps i odpowiedzieć, która usługa jako jedyna publikuje porty.

Zadanie Z9.4: Proszę udowodnić, że Państwa kontener działa

Proszę kliknąć "Pokaż mój kod" i dodać nagłówek X-Weboke-Cursus z tym kodem w pliku Caddyfile, na przykład: header { X-Weboke-Cursus "<code>" }. Z zewnątrz nie widać, czy coś działa w kontenerze, dlatego prosimy też wkleić wynik polecenia docker compose ps (nie przechowujemy go).




Wprowadzone dane i wyniki sprawdzania nie są zapisywane. Przeglądarka zapamiętuje udzielone odpowiedzi oraz informację, czy zadanie zostało zaliczone. Po zalogowaniu w Moje kursy zapisywana jest jedynie informacja, że zadanie zostało zaliczone (lub prawie zaliczone); tam można ją również usunąć.

Przeczytaj więcej

Chwileczkę…

Konfiguracja domen

Dla każdej domeny można ustawić serwery nazw, powiązanie z hostingiem oraz to, kto zostanie właścicielem.

Wczytywanie domen…