Files
infra/docs/SERVER.md
T

152 lines
8.6 KiB
Markdown

# 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 od startu (`DISABLE_REGISTRATION=true`), zweryfikowana |
| `status.dfkk.cloud` | Uptime Kuma | tak | za basic auth |
| `traefik.dfkk.cloud` | Traefik dashboard | nie | tylko przez tunel SSH |
**Uwaga:** w strefie DNS znaleziono rekordy `n8n.dfkk.cloud`, `portainer.dfkk.cloud`,
`code.dfkk.cloud`, `biznesai.dfkk.cloud` — pozostałość po wcześniejszych eksperymentach,
nic za nimi nie stoi. Do posprzątania przy okazji (usunięcie rekordów w panelu OVH,
runbook `30-usuwanie.md`), nie pilne.
---
## 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` | **działa** (od 2026-08-20) | `gitea/gitea:1.27.2` + `postgres:18.6`, dane w `/srv/data/gitea/{gitea,postgres}`, mirror na GitHub — **do zrobienia** |
| 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` (`github.com/4nalconda/infra`, prywatne) | classic PAT (`repo`, no expiration) w ustawieniach Push Mirror w Gitei |
| 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 | Repo `infra` wypchnięte do Gitei (`kacperor/infra`) i podpięty Push Mirror na GitHub (`4nalconda/infra`, prywatne, sync przy pushu + co 8h). Skonfigurowany `git credential.helper store` na koncie `ubuntu`, żeby Claude mógł pushować bez pytania o token za każdym razem. Warunek z HANDOFF.md (mirror przed dalszą pracą) spełniony | Claude + Kacper |
| 2026-08-20 | Krok 13 bootstrapu (część 2/3 — Gitea): stack `gitea/gitea:1.27.2` + `postgres:18.6` uruchomiony pod `git.dfkk.cloud`, rejestracja wyłączona od startu, konto admina utworzone przez Kacpra w kreatorze instalacji. Napotkano i naprawiono: postgres 18+ wymaga mountu na `/var/lib/postgresql` (nie `/var/lib/postgresql/data`). Dodano rekord DNS wildcard `*.dfkk.cloud → 54.38.159.156`. Zweryfikowane: HTTPS 200, certyfikat Let's Encrypt ważny, rejestracja faktycznie zablokowana, port SSH kontenera nieopublikowany na hosta | Claude + Kacper |
| 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 |