feat(render): raport PDF przez LaTeX jako osobna usługa (PRE-24) #32

Merged
gitea merged 1 commits from feat/pre24-pdf-render into master 2026-07-25 11:25:29 +00:00
Owner

Ostatnia z ośmiu wskazówek partnerów. Nowa usługa services/render generuje plik
pośredni .tex i kompiluje go XeLaTeX-em do PDF.

Stacked na #31. Kolejność merge: #29#30#31#32.
Manifesty osobno: deploy#5. Instrukcja: docs/wdrozenie-render-pdf.md.

Szyfrowanie — o które prosiłeś

Łącze prezentacja↔render idzie tak samo jak pozostałe, ale z własnym, trzecim
kluczem
(LINK_KEY_PRESENTATION_RENDER). Osobny, bo tym łączem płynie cały
raport
— dane urodzeniowe i opisy z baz — więc przejęcie go nie może otwierać
łącza do logiki ani do danych. Fail-closed: bez klucza pod nie wstaje. Test kopii
link_crypto obejmuje teraz cztery usługi.

Zweryfikowane na żywo: żądanie bez szyfrowania z poprawnym tokenem400;
obcy klucz → 400, tajny opis nie wraca; właściwy klucz → żądanie dochodzi,
treści baz nie ma na kablu, odpowiedź zaszyfrowana.

Układ PDF wg prośby

imię i nazwisko → wprowadzone dane → rysunek kosmogramu → interpretacja
natalna → predykcje okresowe. Test pilnuje kolejności.

Dwie rzeczy, które wyszły dopiero przy składaniu

Kosmogram nie nadawał się do PDF. Używa zmiennych CSS i klasy .glyph, której
font podaje styles.css — a samodzielny konwerter SVG→PDF nie zna naszego
arkusza
. Wyszłyby czarne kreski bez symboli. Stąd wariant print: konkretne
kolory na białym tle i font glifów wpisany wprost w rysunek. Przy okazji załatwia
to etap 4 planu koła (wariant do druku).

Ucieczka znaków LaTeXa była zepsuta — i złapał to mój własny test. Zamiana
\ na \textbackslash{} szła w tej samej pętli co nawiasy, więc kolejne podmiany
uciekały nawiasy dopiero co wstawione. To nie kosmetyka: niezauważony %
komentuje resztę linii
, więc zdanie od modelu urywałoby się w połowie, a PDF
powstawałby normalnie — tylko krótszy. Test na wrogim tekście sprawdza też, że
\end{document} ani \input{} nie wyrwą się z dokumentu.

Hartowanie

Usługa nie zapisuje nic poza katalogiem tymczasowym, który sprząta po sobie;
w manifeście readOnlyRootFilesystem + emptyDir na /tmp. /health raportuje
obecność xelatex i rsvg-convert — zepsuty obraz widać od razu, a nie przy
pierwszym raporcie. Dockerfile sprawdza oba narzędzia przy budowie.

⚠️ Czego NIE sprawdziłem

Samej kompilacji PDF. W tym środowisku nie ma ani TeX Live, ani działającego
runtime'u kontenerów (docker CLI jest, daemon nie — próbowałem zbudować obraz
i się nie dało). Sprawdzone jest wszystko dookoła: generowanie .tex, ucieczka
znaków, szyfrowanie, kontrakt API, samowystarczalność SVG.

Pierwsze uruchomienie na klastrze trzeba obejrzeć — dlatego PRE-24 zostaje
w wymaganiach jako „W trakcie", nie „Zrobione".

Testy

15 nowych (render) + 14 (łącze i wariant druku). Całość: prezentacja 131,
logika 265 / 1 skip, render 15
.

Ostatnia z ośmiu wskazówek partnerów. Nowa usługa `services/render` generuje plik pośredni `.tex` i kompiluje go XeLaTeX-em do PDF. > **Stacked na [#31](https://gitea.czernobog.pl/gitea/astrololo/pulls/31)**. Kolejność merge: **#29 → #30 → #31 → #32**. > Manifesty osobno: [deploy#5](https://gitea.czernobog.pl/gitea/deploy/pulls/5). Instrukcja: `docs/wdrozenie-render-pdf.md`. ## Szyfrowanie — o które prosiłeś Łącze prezentacja↔render idzie tak samo jak pozostałe, ale z **własnym, trzecim kluczem** (`LINK_KEY_PRESENTATION_RENDER`). Osobny, bo tym łączem płynie **cały raport** — dane urodzeniowe i opisy z baz — więc przejęcie go nie może otwierać łącza do logiki ani do danych. Fail-closed: bez klucza pod nie wstaje. Test kopii `link_crypto` obejmuje teraz **cztery** usługi. **Zweryfikowane na żywo:** żądanie bez szyfrowania z *poprawnym tokenem* → **400**; obcy klucz → **400**, tajny opis nie wraca; właściwy klucz → żądanie dochodzi, treści baz **nie ma na kablu**, odpowiedź zaszyfrowana. ## Układ PDF wg prośby imię i nazwisko → wprowadzone dane → **rysunek kosmogramu** → interpretacja natalna → predykcje okresowe. Test pilnuje kolejności. ## Dwie rzeczy, które wyszły dopiero przy składaniu **Kosmogram nie nadawał się do PDF.** Używa zmiennych CSS i klasy `.glyph`, której font podaje `styles.css` — a samodzielny konwerter SVG→PDF **nie zna naszego arkusza**. Wyszłyby czarne kreski **bez symboli**. Stąd wariant `print`: konkretne kolory na białym tle i font glifów wpisany wprost w rysunek. Przy okazji załatwia to etap 4 planu koła (wariant do druku). **Ucieczka znaków LaTeXa była zepsuta** — i złapał to mój własny test. Zamiana `\` na `\textbackslash{}` szła w tej samej pętli co nawiasy, więc kolejne podmiany uciekały nawiasy dopiero co wstawione. To nie kosmetyka: niezauważony **`%` komentuje resztę linii**, więc zdanie od modelu urywałoby się w połowie, a PDF powstawałby normalnie — tylko krótszy. Test na wrogim tekście sprawdza też, że `\end{document}` ani `\input{}` nie wyrwą się z dokumentu. ## Hartowanie Usługa nie zapisuje nic poza katalogiem tymczasowym, który sprząta po sobie; w manifeście `readOnlyRootFilesystem` + `emptyDir` na `/tmp`. `/health` raportuje obecność `xelatex` i `rsvg-convert` — zepsuty obraz widać od razu, a nie przy pierwszym raporcie. Dockerfile sprawdza oba narzędzia **przy budowie**. ## ⚠️ Czego NIE sprawdziłem **Samej kompilacji PDF.** W tym środowisku nie ma ani TeX Live, ani działającego runtime'u kontenerów (docker CLI jest, daemon nie — próbowałem zbudować obraz i się nie dało). Sprawdzone jest wszystko dookoła: generowanie `.tex`, ucieczka znaków, szyfrowanie, kontrakt API, samowystarczalność SVG. **Pierwsze uruchomienie na klastrze trzeba obejrzeć** — dlatego PRE-24 zostaje w wymaganiach jako **„W trakcie"**, nie „Zrobione". ## Testy 15 nowych (render) + 14 (łącze i wariant druku). Całość: **prezentacja 131, logika 265 / 1 skip, render 15**.
gitea changed target branch from feat/pre23-compile-tab to master 2026-07-24 19:20:55 +00:00
gitea added 1 commit 2026-07-24 19:20:55 +00:00
feat(render): raport PDF przez LaTeX jako osobna usluga (PRE-24)
build / build (push) Successful in 1m27s
Testy / Testy warstwy logicznej (silnik) (push) Successful in 11m25s
Testy / Testy warstwy prezentacji (dostęp do baz) (push) Successful in 10m1s
Testy / Build obrazu silnika B (swisseph) (push) Successful in 33s
Testy / Kontrola składni wszystkich warstw (push) Successful in 27s
f24616d342
Ostatnia z osmiu wskazowek partnerow. Nowa usluga services/render sklada raport:
generuje plik posredni .tex i kompiluje go XeLaTeX-em do PDF.

OSOBNY komponent, nie czesc prezentacji — ta sama zasada co przy izolacji
swissepha (LOG-27). TeX Live wazy setki megabajtow; w obrazie produktu
spowalnialby kazdy build, a tak aktualizuje sie niezaleznie i jego awaria nie
kladzie aplikacji, tylko przycisk „Pobierz PDF".

SZYFROWANIE, o ktore prosiles: lacze prezentacja↔render idzie tak samo jak
pozostale, ale z WLASNYM, TRZECIM kluczem (LINK_KEY_PRESENTATION_RENDER). Osobny,
bo tym laczem plynie CALY raport — dane urodzeniowe i opisy z baz — wiec przejecie
go nie moze otwierac lacza do logiki ani do danych. Fail-closed: bez klucza pod
nie wstaje. Test kopii link_crypto obejmuje teraz cztery uslugi.

Uklad PDF wg prosby: imie i nazwisko -> wprowadzone dane -> RYSUNEK kosmogramu
-> interpretacja natalna -> predykcje okresowe. Test pilnuje kolejnosci.

Dwie rzeczy, ktore wyszly dopiero przy skladaniu tego kawalka:

1. KOSMOGRAM NIE NADAWAL SIE DO PDF. Uzywa zmiennych CSS (var(--line)) i klasy
   .glyph, ktorej font podaje styles.css — a samodzielny konwerter SVG→PDF nie zna
   naszego arkusza. Wyszlyby czarne kreski BEZ SYMBOLI. Stad wariant „print":
   konkretne kolory na bialym tle i font glifow wpisany wprost w rysunek. Przy
   okazji zalatwia to etap 4 planu kola (wariant do druku).

2. UCIECZKA ZNAKOW LATEXA byla zepsuta — i zlapal to moj wlasny test. Zamiana
   „\” na \textbackslash{} szla w tej samej petli co nawiasy, wiec kolejne
   podmiany ucieklyby nawiasy dopiero co wstawione: wychodzilo
   \textbackslash\{\}. Poprawka: ukosnik chowany pod znacznik zastepczy i
   rozwijany na koncu. To nie kosmetyka — niezauwazony „%” komentuje RESZTE LINII,
   wiec zdanie od modelu urywaloby sie w polowie, a PDF powstawalby normalnie,
   tylko krotszy. Test na wrogim tekscie sprawdza tez, ze \end{document} ani
   \input{} nie wyrwa sie z dokumentu.

Usluga nie zapisuje nic poza katalogiem tymczasowym, ktory sprzata po sobie;
w manifescie readOnlyRootFilesystem + emptyDir na /tmp. /health raportuje
obecnosc xelatex i rsvg-convert, zeby zepsuty obraz bylo widac od razu.

Zweryfikowane na zywo (TestClient uslugi render): zadanie bez szyfrowania
z POPRAWNYM tokenem -> 400; obcy klucz -> 400 i tajny opis nie wraca; wlasciwy
klucz -> zadanie dochodzi do aplikacji, tresci baz NIE MA na kablu, odpowiedz
zaszyfrowana. Manifesty przechodza kubectl apply --dry-run=server na zywym
klastrze.

CZEGO NIE SPRAWDZILEM: samej kompilacji PDF. W tym srodowisku nie ma ani TeX
Live, ani dzialajacego runtime'u kontenerow (docker CLI jest, daemon nie) —
probowalem zbudowac obraz i sie nie dalo. Sprawdzone jest wszystko dookola:
generowanie .tex, ucieczka znakow, szyfrowanie, kontrakt API, samowystarczalnosc
SVG. Pierwsze uruchomienie na klastrze trzeba obejrzec — dlatego PRE-24 zostaje
jako „W trakcie", nie „Zrobione".

Instrukcja wdrozenia: docs/wdrozenie-render-pdf.md (klucz, obraz, merge,
weryfikacja, znane ograniczenia).

Testy: 15 nowych (render) + 14 (lacze i wariant druku w prezentacji).
Calosc: prezentacja 131, logika 265/1 skip, render 15.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
gitea merged commit f24616d342 into master 2026-07-25 11:25:28 +00:00
gitea deleted branch feat/pre24-pdf-render 2026-07-25 11:25: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/astrololo#32