Files
html-to-pdf/documentation/provoz.md
T
2026-09-03 10:03:10 +02:00

3.6 KiB

Provoz

Docker image

Image je dvoufazovy. Prvni faze stavi zavislosti, do vysledneho image se prekladace nedostanou.

Runtime obsahuje:

  • systemove knihovny WeasyPrintu: cairo, pango, gdk-pixbuf, harfbuzz
  • Chromium nainstalovany pres playwright install --with-deps chromium
  • fonty DejaVu, Liberation a Noto vcetne ceske diakritiky
  • qpdf jako zaloha pro praci s PDF
  • curl pro healthcheck

Image je velky, radove jednotky GB. To je u sluzby, ktera v sobe ma cely prohlizec a dve renderovaci knihovny, ocekavane.

Port

Sluzba posloucha na 0.0.0.0:8000, coz odpovida app.yml. Port se nemeni bez odpovidajici upravy metadat aplikace v AppFactory.

Healthcheck

Dockerfile ma HEALTHCHECK, ktery vola /health na 127.0.0.1:8000. Endpoint pri kazdem volani overuje dostupnost enginu vcetne skutecneho nastartovani Chromia.

Sdilena pamet pro Chromium

Chromium se spousti s --disable-dev-shm-usage, takze si vystaci s malym /dev/shm. Pokud by se v logu objevovaly pady rendereru, je potreba containeru zvysit --shm-size.

Overeni po nasazeni

curl -i https://services.csbot.cz/apps/html-to-pdf/health
curl -i https://services.csbot.cz/apps/html-to-pdf/docs

Ve Swagger UI overit, ze Try it out vola adresy s prefixem /apps/html-to-pdf, ne bez nej.

Pozor na znamou vlastnost AppFactory: Caddy propousti GET pozadavky jen z omezeneho seznamu IP adres. Try it out ve Swaggeru proto muze z bezneho prohlizece vracet 403 jako text/plain, i kdyz je sluzba v poradku. Overovat curlem primo ze serveru.

Logy

Kazdy zaznam je jeden radek JSON. Vsechno, co patri k jednomu jobu, nese job_id.

Co stoji za sledovani:

  • Asset could not be loaded v PDF neco chybi
  • WeasyPrint render failed, falling back to Chromium dokument neprosel primarnim enginem
  • Restarting Chromium to release memory bezna udrzba, ne chyba
  • Callback could not be delivered job dobehl, ale klient se to nedozvedel
  • Job failed konverze selhala, kod chyby je v poli error_code

Secrets se do logu nezapisuji.

Znama omezeni

  • Fronta je v pameti procesu. Restart znamena ztratu rozpracovanych jobu, ty se oznaci jako failed s kodem service_restarted.
  • Obsah s cisly stranek umi jen WeasyPrint. Chromium neumi rict, na ktere strance nadpis skoncil.
  • U cleneneho dokumentu nejsou odkazy v obsahu klikatelne, protoze cil lezi v jine casti souboru. Cisla stranek jsou spravna a sluzba na to upozorni ve warnings.
  • Slucovani pres pypdf drzi stranky vysledku v pameti. Je to nejnarocnejsi krok konverze.
  • WeasyPrint nespousti JavaScript. Pro dokumenty dokreslovane skripty je nutne Chromium.
  • WeasyPrint neumi procentualni sirku obrazku uvnitr bunky tabulky. Sluzba to obchazi prepsanim na width: auto, viz api.md. Podobne vlastnosti se mohou objevit i jinde, protoze WeasyPrint neni prohlizec. Kdyz neco v PDF chybi a missing_assets je prazdne, stoji za to zkusit engine: chromium.

Testy

Testy se spousti jen na vyslovne pozadani, nikdy automaticky.

pip install -r requirements-dev.txt
pytest                    # bez pomalych testu spusti vse ostatni
pytest -m slow            # jen mereni nad dokumentem o zhruba 1200 strankach

Testy, ktere potrebuji WeasyPrint, se same preskoci, pokud neni nainstalovany.

Co je pokryte:

  • SSRF vcetne domeny mirici na 127.0.0.1
  • deleni dokumentu, ktery se delit da, i toho, ktery se delit neda
  • spravnost cisel stranek po slouceni
  • obsah ukazuje na skutecne stranky
  • nedostupny asset render nezastavi a objevi se v odpovedi
  • procentualni sirka obrazku v bunce tabulky se prepise na auto
  • zruseni beziciho jobu, plna fronta, chovani pri ukonceni sluzby