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

Open
gitea wants to merge 1 commits from feat/pre24-pdf-render into master
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)
Testy / Testy warstwy logicznej (silnik) (push) Successful in 11m4s
Testy / Testy warstwy prezentacji (dostęp do baz) (push) Successful in 9m57s
Testy / Build obrazu silnika B (swisseph) (push) Successful in 34s
Testy / Kontrola składni wszystkich warstw (push) Successful in 22s
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>
Some checks are pending
Testy / Testy warstwy logicznej (silnik) (push) Successful in 11m4s
Testy / Testy warstwy prezentacji (dostęp do baz) (push) Successful in 9m57s
Testy / Build obrazu silnika B (swisseph) (push) Successful in 34s
Testy / Kontrola składni wszystkich warstw (push) Successful in 22s
This pull request can be merged automatically.
You are not authorized to merge this pull request.
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin feat/pre24-pdf-render:feat/pre24-pdf-render
git checkout feat/pre24-pdf-render
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