Stos self-hosting na małym VPS: co zmieści się w 2 GB i 4 GB RAM
Realistyczny startowy stos self-hosted na małym VPS: Docker Compose, Caddy, Vaultwarden, Uptime Kuma i Forgejo, budżet RAM na usługę, kopie zapasowe i podstawy bezpieczeństwa.
Krótko: VPS z 2 GB swobodnie uruchomi podstawowy stos self-hosted złożony z Caddy (reverse proxy z HTTPS), Vaultwarden (hasła), Uptime Kuma (monitoring) i Forgejo (git) w Docker Compose, zużywając około 0,6–1 GB RAM. Jeśli dodasz Nextcloud, potrzebujesz 4 GB; jeśli wybierzesz lżejsze narzędzia, takie jak Syncthing czy File Browser, 2 GB nadal wystarczą.
Ten poradnik daje działający plik Compose, budżet RAM dla każdej usługi i dwie rzeczy, które większość konfiguracji self-hosted pomija, dopóki nie jest za późno: kopie zapasowe poza serwerem i ograniczoną powierzchnię sieciową. Polecenia zakładają Debian 12/13 lub Ubuntu 24.04 z Docker Engine i wtyczką Compose zainstalowanymi z oficjalnego repozytorium Dockera.
Budżet RAM na usługę
Wartości to typowa pamięć rezydentna przy bezczynności lub lekkim użyciu dla od jednego do pięciu użytkowników, z SQLite tam, gdzie jest obsługiwany. Szczyty podczas aktualizacji, klonowania dużych repozytoriów git czy generowania podglądów w Nextcloud mogą być wyższe, więc zostaw co najmniej 20% zapasu i dodaj plik swap 1–2 GB.
| Usługa | Rola | Typowe RAM | Uwagi |
|---|---|---|---|
| OS + sshd + journald | System bazowy | 150–250 MB | Debian lub Ubuntu minimal |
| Docker Engine + containerd | Środowisko kontenerów | 80–120 MB | Stały koszt używania kontenerów |
| Caddy | Reverse proxy, automatyczny HTTPS | 20–50 MB | Pojedyncza binarka, bez bazy danych |
| Vaultwarden | Serwer haseł zgodny z Bitwarden | 20–60 MB | Napisany w Rust, SQLite |
| Uptime Kuma | Monitoring dostępności i certyfikatów | 100–200 MB | Node.js; rośnie z liczbą monitorów |
| Forgejo | Hosting git, issues, hooki CI | 150–300 MB | Go, SQLite wystarczy dla małych zespołów |
| Nextcloud + MariaDB + Redis | Pliki, kalendarz, kontakty | 600 MB–1,2 GB | Dominują workery PHP-FPM |
| Syncthing | Synchronizacja plików, bez pakietu webowego | 50–150 MB | Lżejsza alternatywa dla Nextcloud |
| File Browser | Webowy menedżer plików | 20–40 MB | Wysyłanie i udostępnianie plików przez HTTPS |
| Radicale | CalDAV i CardDAV | 30–50 MB | Kalendarz i kontakty bez Nextcloud |
Dobór rozmiaru VPS
Podstawowy stos (Caddy, Vaultwarden, Uptime Kuma, Forgejo) plus system bazowy to około 0,6–1 GB, co mieści się na serwerze 2 vCPU / 2 GB z miejscem na Syncthing i Radicale. Nextcloud z MariaDB i Redis podnosi sumę do około 1,5–2,2 GB, więc 4 GB to realistyczne minimum, jeśli chcesz pełny pakiet plus całą resztę. Liczy się też dysk: repozytoria Forgejo i synchronizowane pliki rosną, a same usługi potrzebują tylko kilku GB.
W NoctisNode plan Pulse (2 vCPU, 2 GB RAM, 40 GB NVMe, $10 za 28 dni) mieści podstawowy stos, a Umbra (4 vCPU, 4 GB, 60 GB NVMe, $15 za 28 dni) — podstawowy stos plus Nextcloud. Oba to KVM z pełnym rootem i dedykowanym IPv4 i można za nie zapłacić w Monero lub innych kryptowalutach. Nic w tym poradniku nie zależy od dostawcy.
Plik Docker Compose
Tylko Caddy publikuje porty webowe; aplikacje są osiągalne wyłącznie przez wewnętrzną sieć Compose. Forgejo publikuje też port 2222 dla git przez SSH, dzięki czemu OpenSSH hosta zostaje na własnym porcie. Ustaw `FORGEJO_TAG` w pliku `.env` na bieżącą główną wersję Forgejo i zastąp przykładowe domeny własnymi rekordami DNS.
# /srv/stack/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
vaultwarden:
image: vaultwarden/server:latest
restart: unless-stopped
environment:
DOMAIN: "https://vault.example.com"
SIGNUPS_ALLOWED: "true" # set to "false" after creating your account
volumes:
- ./vaultwarden:/data
uptime-kuma:
image: louislam/uptime-kuma:2
restart: unless-stopped
volumes:
- ./uptime-kuma:/app/data
forgejo:
image: codeberg.org/forgejo/forgejo:${FORGEJO_TAG}
restart: unless-stopped
environment:
USER_UID: "1000"
USER_GID: "1000"
FORGEJO__service__DISABLE_REGISTRATION: "true"
volumes:
- ./forgejo:/data
ports:
- "2222:22"
# /srv/stack/Caddyfile
# vault.example.com {
# reverse_proxy vaultwarden:80
# }
# status.example.com {
# reverse_proxy uptime-kuma:3001
# }
# git.example.com {
# reverse_proxy forgejo:3000
# }Uruchomienie
- 01.Skieruj rekordy A (i AAAA) dla `vault`, `status` i `git` na IP serwera, aby Caddy mógł uzyskać certyfikaty przy pierwszym starcie.
- 02.Utwórz `/srv/stack`, umieść tam `compose.yaml`, `Caddyfile` i `.env` i uruchom `docker compose up -d`.
- 03.Otwórz adres Forgejo i dokończ instalator; pierwsze konto utworzone przez niego staje się administratorem, bo publiczna rejestracja jest wyłączona.
- 04.Utwórz konto w Vaultwarden, następnie ustaw `SIGNUPS_ALLOWED` na `"false"` i ponownie uruchom `docker compose up -d`. Zostaw panel administracyjny wyłączony, chyba że ustawisz `ADMIN_TOKEN` zahashowany Argon2.
- 05.Utwórz użytkownika administratora Uptime Kuma zaraz po starcie, bo do tego czasu strona konfiguracji jest otwarta dla każdego.
- 06.Dodaj monitory dla każdej usługi i wygasania certyfikatów, najlepiej z drugiej lokalizacji, bo monitor na tym samym serwerze nie zgłosi własnej awarii.
Note · Caddy obsługuje HTTPS automatycznie. Nagłówki, limity żądań i bardziej złożony routing opisuje poradnik o reverse proxy w Caddy.
Kopie zapasowe, które naprawdę da się odtworzyć
Wszystko, co warto zachować, znajduje się w `/srv/stack`: bazy SQLite, repozytoria Forgejo, certyfikaty Caddy i Twoja konfiguracja. Nie licz na snapshoty dostawcy; trzymaj własną zaszyfrowaną kopię poza serwerem za pomocą restic, jak opisano w poradniku o kopiach zapasowych restic.
Pliki SQLite skopiowane w trakcie zapisu przez usługę mogą być niespójne. Najprostsze bezpieczne podejście na małym serwerze to zatrzymanie stosu na minutę, którą zajmuje kopia. Jeśli dodasz Nextcloud z MariaDB, zrzuć bazę przez `mariadb-dump` przed uruchomieniem restic. Przynajmniej raz przetestuj odtwarzanie do katalogu tymczasowego; kopia, której nigdy nie odtworzyłeś, to tylko przypuszczenie.
#!/bin/sh
# /usr/local/sbin/stack-backup (run nightly from cron or a systemd timer)
# needs RESTIC_REPOSITORY and RESTIC_PASSWORD_FILE in the environment
cd /srv/stack || exit 1
docker compose stop
rc=0
restic backup /srv/stack --tag stack || rc=$?
docker compose start
[ "$rc" -eq 0 ] || exit "$rc"
restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 6 --prunePodstawy bezpieczeństwa
- ▹SSH: tylko klucze, bez logowania roota hasłem, opcjonalnie niestandardowy port; zobacz [poradnik o hardeningu SSH](/guides/ssh-hardening).
- ▹Uwaga na firewall: porty publikowane przez Dockera omijają reguły `ufw`, bo Docker zapisuje własne łańcuchy iptables/nftables. Publikuj tylko to, co musi być publiczne (80, 443, 2222), i nigdy nie publikuj portów baz danych ani paneli administracyjnych.
- ▹Aktualizacje: włącz `unattended-upgrades` dla hosta i uruchamiaj `docker compose pull && docker compose up -d` według harmonogramu, którego faktycznie się trzymasz.
- ▹Rejestracja: wyłącz publiczne rejestracje w Vaultwarden i Forgejo; zamiast tego zapraszaj użytkowników.
- ▹Szyfrowanie dysku: umieść `/srv` na [zaszyfrowanym root](/guides/luks-encrypted-root), aby skopiowany obraz dysku niczego nie ujawnił; na zdalnym serwerze użyj [zdalnego odblokowania LUKS przez SSH](/guides/luks-remote-unlock-ssh) i wybierz format LUKS2 opisany w [LUKS2 vs LUKS1](/guides/luks2-vs-luks1).
- ▹Sekrety: `.env` i katalog danych Vaultwarden powinny być czytelne tylko dla roota (`chmod 600`/`700`).
FAQ
QIle RAM potrzebuję do self-hostingu?
APodstawowy stos self-hosted z Caddy, Vaultwarden, Uptime Kuma i Forgejo działa w około 0,6–1 GB łącznie z systemem i Dockerem, więc VPS z 2 GB wystarczy. Dodanie Nextcloud z MariaDB i Redis czyni 4 GB praktycznym minimum.
QCzy mogę uruchomić Nextcloud na VPS z 2 GB?
AUruchomi się, ale obok innych usług zostawia mało zapasu i zwalnia przy generowaniu podglądów lub skokach synchronizacji. Na 2 GB Syncthing plus File Browser i Radicale obsłużą pliki, kalendarz i kontakty za ułamek pamięci.
QCzy self-hosting Vaultwarden jest bezpieczny?
AVaultwarden przechowuje tylko dane sejfu zaszyfrowane end-to-end, więc przejęcie serwera nie ujawnia bezpośrednio haseł w postaci jawnej. Wyłącz rejestracje, zostaw panel administracyjny wyłączony lub chroniony zahashowanym tokenem, regularnie aktualizuj i rób kopię jego katalogu danych.
QJaki reverse proxy jest najlepszy dla stosu self-hosted w Dockerze?
ACaddy jest najprostszy dla małych konfiguracji, bo automatycznie uzyskuje i odnawia certyfikaty HTTPS przy kilku linijkach konfiguracji. Nginx i Traefik też działają, ale wymagają więcej konfiguracji.
QCzy ufw chroni kontenery Dockera?
ADomyślnie nie. Porty publikowane opcją `ports:` Dockera omijają ufw, bo Docker wstawia własne reguły firewalla, więc publikuj tylko porty, które powinny być publiczne.