Postgres jako lustro baz w SQL + runbook (DAN-28) #16

Merged
gitea merged 1 commits from feat/postgres into master 2026-08-09 10:06:30 +00:00
Owner

Manifest, wpięcie w kustomization i runbook krok po krokuREADME-postgres.md.

Co trzeba zrobić ręcznie

Dokładnie jedno: utworzyć sekret astrololo-postgres (komenda gotowa do wklejenia, krok 1 runbooka). Reszta idzie przez ArgoCD.

Decyzje zapisane w manifeście

decyzja dlaczego
local-path, nie NFS Postgres zakłada semantykę blokad i fsync, której NFS nie gwarantuje — klasyczne źródło uszkodzenia bazy przy nagłym restarcie
strategy: Recreate wolumen jest RWO, a dwa procesy Postgresa na jednym katalogu to uszkodzona baza
PGDATA w podkatalogu initdb odmawia pracy w niepustym katalogu, a katalog główny wolumenu potrafi zawierać wpisy FS
wersja przypięta, poza image-updaterem podbicie majora wymaga migracji danych — nie może zdarzyć się samo, w nocy, przy okazji builda
C.UTF-8, nie pl_PL.UTF-8 dopasowanie robimy przez unaccent+pg_trgm, nie przez collation; pl_PL wymagałby obrazu z wygenerowanymi lokalizacjami
DATA_PROVIDER zostaje excel Postgresa da się wdrożyć i obejrzeć bez ryzyka dla działającego wyszukiwania

Init zakłada pg_trgm, unaccent, schemat mirror i tabelę mirror.registry (skrót sha256, licznik wierszy, flaga active) — czyli szkielet pod krok drugi.

Co sprawdziłem, a czego nie

Sprawdzone: kubectl kustomize astrololo składa komplet 21 zasobów bez błędu; YAML parsuje się poprawnie; audyt odwołań do sekretów potwierdza, że jedynym brakującym jest astrololo-postgres; DSN postgresql+psycopg://… jest rozpoznawany przez SQLAlchemy 2.0 z psycopg 3.

Nie sprawdzone: skrypt inicjalizujący nie biegł przeciwko prawdziwemu Postgresowi — na maszynie, na której to powstawało, nie ma Dockera. Składnia przejrzana, ale krok 4 runbooka jest tu prawdziwym testem. Zapisane wprost w runbooku, żeby nikt nie brał tego za zweryfikowane.

Zależność: PR aplikacji feat/postgres-sterownik (dokłada psycopg) — mergować przed albo razem, inaczej warstwa danych nie miałaby czym się połączyć, gdyby ktoś przestawił DATA_PROVIDER.

🤖 Generated with Claude Code

Manifest, wpięcie w `kustomization` i **runbook krok po kroku** — [`README-postgres.md`](astrololo/README-postgres.md). ## Co trzeba zrobić ręcznie Dokładnie **jedno**: utworzyć sekret `astrololo-postgres` (komenda gotowa do wklejenia, krok 1 runbooka). Reszta idzie przez ArgoCD. ## Decyzje zapisane w manifeście | decyzja | dlaczego | |---|---| | `local-path`, **nie NFS** | Postgres zakłada semantykę blokad i `fsync`, której NFS nie gwarantuje — klasyczne źródło uszkodzenia bazy przy nagłym restarcie | | `strategy: Recreate` | wolumen jest RWO, a dwa procesy Postgresa na jednym katalogu to uszkodzona baza | | `PGDATA` w podkatalogu | `initdb` odmawia pracy w niepustym katalogu, a katalog główny wolumenu potrafi zawierać wpisy FS | | wersja przypięta, **poza image-updaterem** | podbicie majora wymaga migracji danych — nie może zdarzyć się samo, w nocy, przy okazji builda | | `C.UTF-8`, nie `pl_PL.UTF-8` | dopasowanie robimy przez `unaccent`+`pg_trgm`, nie przez collation; `pl_PL` wymagałby obrazu z wygenerowanymi lokalizacjami | | `DATA_PROVIDER` zostaje `excel` | Postgresa da się wdrożyć i obejrzeć **bez ryzyka** dla działającego wyszukiwania | Init zakłada `pg_trgm`, `unaccent`, schemat `mirror` i tabelę `mirror.registry` (skrót `sha256`, licznik wierszy, flaga `active`) — czyli szkielet pod krok drugi. ## Co sprawdziłem, a czego nie **Sprawdzone:** `kubectl kustomize astrololo` składa komplet 21 zasobów bez błędu; YAML parsuje się poprawnie; audyt odwołań do sekretów potwierdza, że jedynym brakującym jest `astrololo-postgres`; DSN `postgresql+psycopg://…` jest rozpoznawany przez SQLAlchemy 2.0 z `psycopg` 3. **Nie sprawdzone:** skrypt inicjalizujący nie biegł przeciwko prawdziwemu Postgresowi — na maszynie, na której to powstawało, **nie ma Dockera**. Składnia przejrzana, ale krok 4 runbooka jest tu prawdziwym testem. Zapisane wprost w runbooku, żeby nikt nie brał tego za zweryfikowane. Zależność: PR aplikacji `feat/postgres-sterownik` (dokłada `psycopg`) — mergować **przed** albo razem, inaczej warstwa danych nie miałaby czym się połączyć, gdyby ktoś przestawił `DATA_PROVIDER`. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
gitea force-pushed feat/postgres from 98b311c26d to e6050a14c4 2026-08-09 10:04:14 +00:00 Compare
gitea added 1 commit 2026-08-09 10:06:21 +00:00
Manifest, wpięcie w kustomization i runbook krok po kroku.

DECYZJE ZAPISANE W MANIFEŚCIE, ŻEBY NIE TRZEBA ICH BYŁO ODTWARZAĆ Z GŁOWY:

local-path, NIE NFS. Postgres zakłada semantykę blokad i fsync, której NFS nie
gwarantuje — to klasyczne źródło uszkodzenia bazy przy nagłym restarcie. Ceną
jest przywiązanie do węzła; przy luście odtwarzalnym z Excela to akceptowalne.

strategy: Recreate. Wolumen jest ReadWriteOnce, a dwa procesy Postgresa na jednym
katalogu danych to uszkodzona baza — rolling próbowałby wstać z nowym podem,
zanim stary zejdzie.

PGDATA w PODKATALOGU wolumenu: katalog główny potrafi zawierać wpisy systemu
plików, a initdb odmawia pracy w niepustym katalogu.

Wersja PRZYPIĘTA i poza image-updaterem: podbicie majora wymaga migracji katalogu
danych, więc nie może się zdarzyć samo, w nocy, przy okazji builda aplikacji.

C.UTF-8 zamiast pl_PL.UTF-8: dopasowanie tekstu robimy przez unaccent i pg_trgm,
nie przez collation, a pl_PL wymagałby obrazu z wygenerowanymi lokalizacjami.

DATA_PROVIDER zostaje na `excel`. Postgres można wdrożyć i obejrzeć BEZ ryzyka
dla działającego wyszukiwania; przełączenie to osobna, późniejsza decyzja.

SPRAWDZONE PRZED ODDANIEM: `kubectl kustomize astrololo` składa komplet 21
zasobów bez błędu, YAML parsuje się poprawnie, audyt odwołań potwierdza, że
jedynym brakującym sekretem jest astrololo-postgres (oba klucze), a DSN
postgresql+psycopg:// jest rozpoznawany przez SQLAlchemy z psycopg 3.

NIE SPRAWDZONE: skrypt inicjalizujący nie biegł przeciwko prawdziwemu Postgresowi
— na maszynie, na której to powstawało, nie ma Dockera. Zapisane wprost
w runbooku; krok 4 jest tam prawdziwym testem.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
gitea force-pushed feat/postgres from e6050a14c4 to 99b9a0426f 2026-08-09 10:06:21 +00:00 Compare
gitea merged commit 99b9a0426f into master 2026-08-09 10:06:30 +00:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: gitea/deploy#16