Docker Compose: strona, analityka i monitoring w jednym pliku
Gotowy plik compose: strona statyczna, Umami z Postgresem i Uptime Kuma za jednym nginx. Limity pamięci, aktualizacje obrazów i nocna kopia baz na małym VPS.
Redakcja serwisu Dealownia · ceny i fakty ze stron dostawców, jak sprawdzamy
Strona statyczna, analityka Umami i monitoring Uptime Kuma na jednym VPS-ie, opisane w jednym pliku compose.yaml – z limitami pamięci, aktualizacją jedną komendą i nocną kopią danych. Całość jest darmowa poza samym serwerem. Układ: jeden nginx na hoście przyjmuje HTTPS, a narzędzia siedzą w kontenerach widocznych tylko lokalnie.
Czego potrzebujesz
- VPS z Ubuntu 24.04 LTS, nginx, certbot i Dockerem z wtyczką Compose – instrukcja w poradniku od zera.
- Minimum: 1 vCPU, 2 GB RAM (lub 1 GB z plikiem swap przy małym ruchu), 20 GB dysku. Po starcie, przy małym ruchu, kontenery zajmują orientacyjnie: Umami ok. 180 MiB, Uptime Kuma ok. 120 MiB, Postgres ok. 65 MiB – sprawdź u siebie
docker stats. Jeśli dołożysz GlitchTip (orientacyjnie ok. 170 MiB) i Valkey, celuj w 2 vCPU i 4 GB RAM – wtedy jest zapas na budowanie stron i skoki ruchu. - Trzy rekordy DNS:
example.pl,stats.example.pl,status.example.pl.
Na ten stack wybierz plan z 2 GB RAM (1 GB tylko z plikiem swap i przy małym ruchu).
Krok 1. Układ katalogów
Do site/ wgrywasz zbudowaną stronę (np. katalog dist/ z Astro), w data/ żyją bazy, w backup/ lądują kopie.
Krok 2. Plik compose.yaml
Dlaczego tak:
- Wszystkie porty na
127.0.0.1. Docker omija ufw, więc port opublikowany bez adresu byłby dostępny z internetu bez HTTPS. mem_limiticpuspilnują, żeby jedno narzędzie nie zagłodziło reszty serwera. Wartości wyżej to przykładowe limity dla Umami, Kumy i (z zapasem) Postgresa; przy mniejszym serwerze możesz je obniżyć, ale obserwujdocker statsprzez kilka dni.- Kotwica
x-commondaje każdemu kontenerowi restart po awarii i rotację logów, nawet jeśli nie ustawiłeś jej w/etc/docker/daemon.json. webjest opcjonalny. Strony prościej serwować nginx-em z hosta, bez kontenera – to o jedną warstwę mniej. Kontener ma sens, gdy chcesz, żeby cały stack dało się przenieść jednym katalogiem.
Sprawdź plik i uruchom:
config -q nic nie wypisuje, jeśli plik jest poprawny. Oczekujesz czterech kontenerów Up, z db w stanie healthy.
Krok 3. Jeden nginx na hoście dla wszystkich adresów
Uptime Kuma za proxy korzysta ze zmiennej $connection_upgrade z mapy WebSocket. Mapę WebSocket tworzysz raz na serwer (wyjaśnienie w poradniku o reverse proxy); polecenie niżej nic nie zmieni, jeśli plik już istnieje:
Plik /etc/nginx/sites-available/stack.conf (bez bloku map – ten jest już w conf.d):
Uptime Kuma potrzebuje nagłówków WebSocket, Umami – prawdziwego adresu odwiedzającego. Zaraz po starcie wejdź na oba panele: w Umami zmień domyślne hasło konta admin (umami), w Kumie załóż konto administratora. Szczegóły konfiguracji są w osobnych poradnikach o Umami i Uptime Kuma.
Krok 4. Kopia co noc
Plik /opt/apps/stack/backup.sh:
Postgresa kopiujesz przez pg_dump, a nie kopiując katalog data/postgres – pliki działającej bazy skopiowane w locie bywają niespójne. Kumę zatrzymujemy na kilka sekund z tego samego powodu (SQLite). umask 077 i katalog backup z prawami 700 sprawiają, że zrzuty czyta tylko root. Kopie z siedmiu ostatnich dni wysyłaj dodatkowo zaszyfrowane poza serwer, jak w poradniku o kopiach. Strony w kopii nie są potrzebne, jeśli budujesz je z repozytorium.
Dopisz na końcu skryptu ping do Healthchecks.io albo monitora typu Push w Kumie – wtedy dowiesz się, że kopia się nie wykonała, zamiast odkryć to w dniu awarii.
Krok 5. Aktualizacje
up -d odtwarza tylko kontenery, których obraz się zmienił. Zasady aktualizacji:
- Tagi z główną wersją (
postgres:17-alpine,uptime-kuma:2) zamiastlatesttam, gdzie zmiana głównej wersji wymaga migracji. Wyjątek to Umami: jego dokumentacja instalacji podaje tylko taglatest, więc przedpullzawsze robisz kopię (sudo ./backup.shwyżej). - Postgres 17 na 18 to nie zwykłe
pull: potrzebny zrzut, nowy katalog danych i odtworzenie, a w wersji 18 zmienia się też ścieżka montowania (/var/lib/postgresql). - Przed aktualizacją zawsze świeża kopia.
- Po aktualizacji sprawdź
docker compose psi logi:docker compose logs --since 10m.
Najczęstsze problemy
- Serwer zwalnia, a
dmesgpokazuje „Out of memory”. Kontener przekroczyłmem_limitalbo zabrakło pamięci na hoście. Sprawdźdocker stats --no-stream, dodaj plik swap (sudo fallocate -l 2G /swapfile && sudo chmod 600 /swapfile && sudo mkswap /swapfile && sudo swapon /swapfile, plus wpis w/etc/fstab, żeby przetrwał restart) albo podnieś limit konkretnej usługi. docker compose upzgłasza „port is already allocated”. Inny proces używa portu, np. stary kontener z wcześniejszych prób.sudo ss -tlnp | grep 3000pokaże, kto go trzyma.- Umami nie startuje: „connection refused” do bazy. Postgres jeszcze się inicjuje.
depends_onzcondition: service_healthyrozwiązuje to przy starcie; po ręcznym restarcie samej bazy zrestartuj teżumami. - Hasło w
.envzmienione, a baza go nie przyjmuje.POSTGRES_PASSWORDdziała tylko przy pierwszym tworzeniu bazy. Przy istniejących danych zmieniasz hasło w samej bazie (ALTER USER umami PASSWORD '...'), a dopiero potem w.env. - Panel Kumy wisi na ładowaniu. Brak
Upgrade/Connectionw blokustatus.example.pl.
Co dalej
Dołóż zbieranie błędów JavaScriptu – GlitchTip może korzystać z tego samego Postgresa po utworzeniu osobnej bazy i użytkownika. Zanim zaczniesz kierować ruch na serwer, przejdź listę kontrolną zabezpieczeń. Jeśli szukasz maszyny z większą ilością RAM pod cały stack, porównaj plany w rankingu VPS.