- traefik:v3.7.11 (najnowszy stabilny tag, sprawdzony w Docker Hub) - DNS-01 challenge, provider ovh, endpoint ovh-ca (region panelu) - dashboard tylko na 127.0.0.1:8080, dostęp przez tunel SSH - docker.sock zamontowany read-only - .env z kluczami API OVH poza repo (chmod 600), .env.example w repo - zweryfikowane: redirect 80->443, dashboard 200 lokalnie, czyste logi
7.2 KiB
SERVER.md — rejestr serwera
Źródło prawdy o tym, co stoi na maszynie. Każda zmiana stanu serwera = wpis tutaj, w tej samej sesji. Jeśli czegoś nie ma w tym pliku — z punktu widzenia dokumentacji to nie istnieje.
Ostatnia aktualizacja: (uzupełnić przy pierwszym bootstrapie)
1. Maszyna
| Pozycja | Wartość |
|---|---|
| Dostawca | OVH |
| Model | VPS-2 2026 |
| Host OVH | vps-c936b594.vps.ovh.net |
| vCore / RAM / dysk | 6 / 12 GB / 100 GB SSD NVMe |
| System | Ubuntu 24.04 LTS |
| Lokalizacja | (uzupełnić) |
| IPv4 | 54.38.159.156 |
| IPv6 | (uzupełnić) |
| Snapshot OVH | włączony, 1 slot, ręczny |
| Data ostatniego snapshota | 2026-08-20 — po Kroku 10 (system utwardzony: SSH, ufw, fail2ban, unattended-upgrades, swap, Docker), przed Krokiem 13 (Traefik/Gitea) |
2. Domeny
| Domena | Rola | Rejestrator | DNS |
|---|---|---|---|
dfkk.cloud |
infrastruktura + subdomeny projektów | OVH | OVH |
| (domena 2) | wolna, pod projekt | OVH | OVH |
| (domena 3) | wolna, pod projekt | OVH | OVH |
Certyfikaty: Let's Encrypt, wildcard *.dfkk.cloud, wyzwanie DNS-01 przez API OVH.
Klucze API OVH: przechowywane w /srv/infra/stacks/traefik/.env (poza repo).
Zajęte subdomeny
| Subdomena | Usługa | Publiczna? | Uwagi |
|---|---|---|---|
git.dfkk.cloud |
Gitea | tak | rejestracja wyłączona |
status.dfkk.cloud |
Uptime Kuma | tak | za basic auth |
traefik.dfkk.cloud |
Traefik dashboard | nie | tylko przez tunel SSH |
3. Użytkownicy systemowi
| Użytkownik | Rola | sudo | Uwagi |
|---|---|---|---|
root |
— | — | logowanie po SSH wyłączone przez OVH i przez nas |
ubuntu |
praca codzienna, Docker, Claude Code | tak | konto domyślne obrazu OVH |
4. Klucze SSH
Każde urządzenie ma własny klucz. Zgubiony laptop = usunięcie jednej linii
z authorized_keys, bez ruszania pozostałych.
| Urządzenie | Typ | Komentarz w kluczu | Dodany | Status |
|---|---|---|---|---|
| PC (PILTECH) | ed25519 | KK_PILTECH_PC |
przed bootstrapem | aktywny |
| PC domowy (KK_HOME_PC, Windows) | ed25519 | kacper@KK_HOME_PC |
2026-08-20 | aktywny, zweryfikowany (Accepted publickey w auth.log) |
| macOS | ed25519 | (do ustalenia) | (data) | (do zrobienia) |
| iPhone (Termius) | ed25519 | kacper@iphone |
2026-08-20 | aktywny, zweryfikowany (Accepted publickey w journalctl) |
5. Porty otwarte na świat
| Port | Usługa | Uzasadnienie |
|---|---|---|
| 22 | SSH | dostęp administracyjny, tylko klucze |
| 80 | Traefik | przekierowanie na 443 |
| 443 | Traefik | cały ruch HTTPS |
Nic więcej. Każdy dodatkowy port wymaga wpisu tutaj z uzasadnieniem.
Pamiętaj: opublikowany port kontenera omija ufw — patrz CLAUDE.md, sekcja 3.3.
6. Stacki infrastruktury
| Stack | Ścieżka | Status | Opis |
|---|---|---|---|
| Traefik | /srv/infra/stacks/traefik |
działa (od 2026-08-20) | reverse proxy, TLS DNS-01 przez OVH (ovh-ca), image traefik:v3.7.11, dashboard tylko przez tunel SSH (127.0.0.1:8080) |
| Gitea | /srv/infra/stacks/gitea |
(planowany) | repozytoria kodu, mirror na GitHub |
| Monitoring | /srv/infra/stacks/monitoring |
(planowany) | Uptime Kuma, alerty na maila |
7. Projekty
Tabela uzupełniana przy każdym nowym projekcie (runbook 10-nowa-usluga.md)
i czyszczona przy usuwaniu (runbook 30-usuwanie.md).
| Projekt | Katalog | Repo | Domena | Wolumeny | Baza | Backup | Uruchomiony |
|---|---|---|---|---|---|---|---|
| (brak) |
8. Zadania cykliczne (cron / systemd timers)
| Zadanie | Harmonogram | Gdzie zdefiniowane | Co robi |
|---|---|---|---|
unattended-upgrades |
codziennie | systemd | aktualizacje bezpieczeństwa |
| (uzupełniać) |
9. Konta zewnętrzne powiązane z serwerem
| Usługa | Do czego | Gdzie klucz/token |
|---|---|---|
| OVH API | DNS-01 dla Traefika | /srv/infra/stacks/traefik/.env |
| GitHub | mirror repo infra |
token w Gitei, ustawienia push mirror |
| SMTP (Resend/Brevo) | wysyłka maili z aplikacji | .env danego projektu |
10. Dziennik większych zmian
Krótko, jedna linia, najnowsze na górze. Chodzi o to, żeby po miesiącu dało się odtworzyć, co się działo — nie o pełny changelog.
| Data | Co się zmieniło | Kto |
|---|---|---|
| 2026-08-20 | Krok 13 bootstrapu (część 1/3 — Traefik): stack traefik:v3.7.11 uruchomiony, DNS-01 przez OVH (endpoint ovh-ca), klucze API w .env (poza repo, chmod 600), dashboard na 127.0.0.1:8080 (tylko tunel SSH). Zweryfikowane: redirect 80→443, dashboard odpowiada lokalnie, logi czyste. Certyfikat wildcard wystawi się przy podpięciu pierwszej usługi (Gitea) |
Claude + Kacper |
| 2026-08-20 | Krok 11 bootstrapu: snapshot OVH zrobiony — czysty, utwardzony system przed postawieniem usług | Kacper |
| 2026-08-20 | Krok 10 bootstrapu: /srv/apps, /srv/data utworzone (/srv/infra już istniało), właściciel ubuntu:ubuntu |
Claude |
| 2026-08-20 | Krok 9 bootstrapu: ~/.tmux.conf skonfigurowany (mouse, vi keys, focus-events on), przeładowany w sesji bootstrap bez restartu |
Claude |
| 2026-08-20 | Krok 8 bootstrapu: Docker CE (oficjalne repo), ubuntu w grupie docker (wymaga ponownego logowania), limity logów kontenerów (max-size 10m, max-file 3), live-restore, sieć edge utworzona. hello-world przeszedł |
Claude |
| 2026-08-20 | Krok 7 bootstrapu: swap 2G (/swapfile) aktywny, wpis w fstab, vm.swappiness=10 |
Claude |
| 2026-08-20 | Krok 6 bootstrapu: unattended-upgrades aktywne (Periodic Update-Package-Lists i Unattended-Upgrade włączone), Automatic-Reboot jawnie ustawiony na false w 50unattended-upgrades |
Claude |
| 2026-08-20 | Krok 5 bootstrapu: fail2ban aktywny, jail sshd (bantime 1h, findtime 10m, maxretry 5). Od razu zbanował ruch skanujący port 22 (normalny szum) |
Claude |
| 2026-08-20 | Krok 4 bootstrapu: ufw aktywny, default deny incoming, dozwolone 22/80/443 (IPv4+IPv6). Zweryfikowane: SSH nadal dostępny |
Claude + Kacper |
| 2026-08-20 | Krok 3 bootstrapu: PasswordAuthentication no, PermitRootLogin no, AllowUsers ubuntu w sshd_config.d/99-hardening.conf. Napotkano i naprawiono konflikt: sshd_config.d/50-cloud-init.conf nadpisywał hasła z powrotem na yes (kolejność alfabetyczna plików Include) — poprawiono plik i dodano ssh_pwauth: false w cloud.cfg.d/, żeby nie wróciło po reboocie. Zweryfikowane: logowanie kluczem działa, logowanie hasłem zablokowane. macOS wciąż bez klucza — dostęp z Maca możliwy dopiero po dodaniu klucza przez już uwierzytelnione urządzenie |
Claude + Kacper |
| 2026-08-20 | Krok 1 bootstrapu: timezone Europe/Warsaw, hostname dfkk, pakiety bazowe, uporządkowany /etc/hosts |
Claude |
| 2026-08-20 | Krok 2 bootstrapu: dodane klucze SSH kacper@KK_HOME_PC (Windows) i kacper@iphone (Termius), zweryfikowane logowaniem. macOS jeszcze do zrobienia |
Claude + Kacper |
| 2026-08-20 | sudo dla ubuntu ustawiony na NOPASSWD (/etc/sudoers.d/90-ubuntu-nopasswd); hasło do konta ustawia Kacper ręcznie jako furtka KVM |
Claude |
| 2026-08-20 | Poprawki 00-bootstrap.md (Krok 9 tmux append + focus-events, Krok 10 katalogi, Krok 12 Claude Code jako wykonany, nowy Krok 14 audyt) i numeracja HANDOFF.md sekcja 6 |
Claude |