Compare commits

..

14 Commits

Author SHA1 Message Date
gitea a9955a736b feat(astrololo): usluga render — raport PDF (PRE-24)
Nowy komponent skladajacy raport PDF. Osobny obraz, bo dzwiga TeX Live (setki MB)
— ta sama zasada co przy izolacji swissepha (LOG-27): obraz produktu zostaje maly,
TeX aktualizuje sie niezaleznie, a awaria renderu nie kladzie aplikacji, tylko
przycisk „Pobierz PDF".

- render.yaml — Deployment + Service. ClusterIP, BEZ NodePortu i Ingressu: nie ma
  powodu, zeby ktokolwiek siegal do tej uslugi z zewnatrz. Rozmawia wylacznie
  z prezentacja.
- Szyfrowanie: wlasny, TRZECI klucz LINK_KEY_PRESENTATION_RENDER z sekretu
  astrololo-link. Osobny, bo tym laczem plynie CALY raport (dane urodzeniowe
  i opisy z baz) — przejecie go nie moze otwierac lacza do logiki ani danych.
  LINK_ENCRYPTION_REQUIRED=true, wiec bez klucza pod NIE wstaje.
- readOnlyRootFilesystem + emptyDir na /tmp: kompilacja pisze tylko do katalogu
  tymczasowego, raport nie zostawia sladu w kontenerze.
- Limity rozjechane celowo (100m/256Mi -> 1500m/1Gi): XeLaTeX na obszernym
  raporcie bierze duzo, ale na krotko.
- presentation: RENDER_URL + trzeci klucz lacza.

Sekret astrololo-link trzeba UZUPELNIC o trzeci klucz PRZED wdrozeniem,
zachowujac dwa dotychczasowe — komenda w instrukcji.

Sprawdzone: kubectl kustomize + apply --dry-run=server na zywym klastrze
(service/render i deployment.apps/render created).

Pelna instrukcja: docs/wdrozenie-render-pdf.md w repo astrololo.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-24 19:22:11 +02:00
argocd-image-updater 9ced57af74 build: automatic update of astrololo
updates image gitea/astrololo-data tag 'f1956a08' to 'f34016a4'
updates image gitea/astrololo-logic tag '40c9bf79' to 'f34016a4'
updates image gitea/astrololo-presentation tag '40c9bf79' to 'f34016a4'
2026-07-24 16:28:32 +00:00
argocd-image-updater 385b675e27 build: automatic update of astrololo
updates image gitea/astrololo-logic tag '1d7f3e21' to '40c9bf79'
updates image gitea/astrololo-presentation tag '1d7f3e21' to '40c9bf79'
2026-07-24 14:37:55 +00:00
argocd-image-updater 240d79f8b2 build: automatic update of astrololo
updates image gitea/astrololo-logic tag 'ace76183' to '1d7f3e21'
updates image gitea/astrololo-presentation tag 'ace76183' to '1d7f3e21'
2026-07-24 12:34:55 +00:00
argocd-image-updater 37ea8d6997 build: automatic update of astrololo
updates image gitea/astrololo-logic tag 'f1956a08' to 'ace76183'
updates image gitea/astrololo-presentation tag 'f1956a08' to 'ace76183'
2026-07-24 11:04:20 +00:00
argocd-image-updater 86ea5b6147 build: automatic update of astrololo
updates image gitea/astrololo-data tag 'e8f868e9' to 'f1956a08'
updates image gitea/astrololo-logic tag 'e8f868e9' to 'f1956a08'
updates image gitea/astrololo-presentation tag 'e8f868e9' to 'f1956a08'
2026-07-23 21:01:53 +00:00
argocd-image-updater 9d5f318272 build: automatic update of astrololo
updates image gitea/astrololo-data tag '56fdf01d' to 'e8f868e9'
updates image gitea/astrololo-logic tag '56fdf01d' to 'e8f868e9'
updates image gitea/astrololo-presentation tag '56fdf01d' to 'e8f868e9'
2026-07-23 20:39:41 +00:00
gitea a075f9555f feat(astrololo): klucze szyfrowania lacz miedzy warstwami (PRE-16)
Domyka PRE-16 po stronie manifestow. Kod (astrololo#21) potrafi juz szyfrowac
ruch miedzy warstwami AES-256-GCM; tu dokladamy klucze i wymuszenie.

- astrololo-link: nowy sekret z dwoma kluczami (LINK_KEY_PRESENTATION_LOGIC,
  LINK_KEY_LOGIC_DATA), tworzony POZA repo jak pozostale. Osobny klucz na pare
  rozmowcow: przejecie klucza prezentacji nie otwiera warstwy danych. Logika
  bierze oba, prezentacja i dane wylacznie swoj (secretKeyRef).
- LINK_ENCRYPTION_REQUIRED=true we wszystkich trzech: bez klucza pod NIE wstaje,
  a klient nie wysyla niczego. Fail-closed w obie strony jest celowy — usluga,
  ktora wstala i po cichu nie szyfruje, jest gorsza niz CrashLoop, bo awarii
  nie widac.

README: sekcja o sekrecie astrololo-link (tworzenie, wymiana, restart calej
trojki naraz) oraz uczciwa nota, ze szyfrowane sa ciala, nie naglowki — sciezka
i token jada czytelnie, ale sam token bez klucza nic nie daje.

Sprawdzone: kubectl kustomize + apply --dry-run=server przechodza dla obu
profili. Pelna instrukcja wdrozenia: docs/wdrozenie-pre16.md w repo astrololo.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-23 16:40:43 +00:00
gitea 2d30d9a84d feat(astrololo): wejscie po https z wlasnym CA (PRE-16)
Do tej pory aplikacja chodzila po zwyklym http, a logowanie szlo przez HTTP
Basic — czyli haslo leciało siecia w postaci trywialnej do podsluchania.

Poza bezpieczenstwem TLS naprawia DWIE funkcje zepsute dzis z tego samego
powodu: geolokalizacja przegladarki („Tu i teraz") i kopiowanie promptu do
schowka dzialaja wylacznie w secure context, wiec po http po prostu odmawialy.

Wlasne CA, nie Let's Encrypt — klaster stoi w LAN (traefik trzyma LoadBalancera
na 192.168.1.x), wiec walidacja HTTP-01 nie ma jak dojsc z internetu, a DNS-01
wymagalby trzymania w klastrze tokena API do domeny.

Co dochodzi:
- tls.yaml — Issuer selfSigned -> korzen CA (10 lat, importowany raz do
  przegladarki) -> Issuer CA -> certyfikat serwera (90 dni, odnawiany sam).
  Krotki termin certyfikatu serwera jest CELOWY: odnawianie sprawdza sie wtedy
  co kwartal, a nie dopiero za dekade.
- ingress.yaml — wejscie po https + naglowki (HSTS rok, nosniff, frameDeny)
  oraz osobny Ingress na porcie 80 robiacy przekierowanie. Rozdzielone
  swiadomie: gdyby redirect wisial na tym samym routerze co wejscie po https,
  odsylalby sam do siebie w kolko.
- presentation: Service NodePort -> ClusterIP. NodePort byl druga,
  nieszyfrowana droga do aplikacji, czyli obejsciem calego PRE-16.

Zmiana wymagajaca uwagi: TRUST_PROXY=true. Za Ingressem bezposrednim rozmowca
jest zawsze pod Traefika, wiec bez tego limit zadan liczylby WSZYSTKICH do
jednego wiadra i pierwsza osoba, ktora go wyklika, odcielaby pozostalych.

Sprawdzone: Ingress i Middleware przechodza `kubectl apply --dry-run=server`
na zywym klastrze (CRD traefik.io/v1alpha1 sa, entrypointy web/websecure sa).
Obiekty cert-managera zwalidowane offline wobec oficjalnego schematu z CRD
v1.21.0 z additionalProperties=false — literowka w nazwie pola zostalaby
zlapana. `kubectl kustomize` przechodzi dla obu profili (bazowego i swisseph).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-23 16:40:43 +00:00
argocd-image-updater 6c41782b4b build: automatic update of astrololo
updates image gitea/astrololo-logic tag '473d059a' to '56fdf01d'
updates image gitea/astrololo-presentation tag '473d059a' to '56fdf01d'
2026-07-23 15:53:47 +00:00
argocd-image-updater 5096aa98c0 build: automatic update of astrololo
updates image gitea/astrololo-data tag '929b6912' to '56fdf01d'
2026-07-23 15:51:41 +00:00
argocd-image-updater d74e2af355 build: automatic update of astrololo
updates image gitea/astrololo-logic tag '929b6912' to '473d059a'
updates image gitea/astrololo-presentation tag '929b6912' to '473d059a'
2026-07-23 13:36:47 +00:00
argocd-image-updater ffa617e17b build: automatic update of astrololo
updates image gitea/astrololo-data tag '877ec91f' to '929b6912'
updates image gitea/astrololo-logic tag '114b7eeb' to '929b6912'
updates image gitea/astrololo-presentation tag '114b7eeb' to '929b6912'
2026-07-23 13:10:29 +00:00
argocd-image-updater 07a536a315 build: automatic update of astrololo
updates image gitea/astrololo-logic tag '163ace42' to '114b7eeb'
updates image gitea/astrololo-presentation tag '163ace42' to '114b7eeb'
2026-07-23 11:57:48 +00:00
3 changed files with 85 additions and 5 deletions
+8 -5
View File
@@ -5,12 +5,15 @@ resources:
- data.yaml
- logic.yaml
- presentation.yaml
- tls.yaml # certyfikat z własnego CA (wymaga cert-managera)
- ingress.yaml # wejście po https + przekierowanie z http
- render.yaml # składanie raportu PDF (PRE-24), osobny obraz z TeX Live
- tls.yaml # certyfikat z własnego CA (wymaga cert-managera)
- ingress.yaml # wejście po https + przekierowanie z http
images:
- name: gitea.czernobog.pl/gitea/astrololo-data
newTag: 877ec91f
newTag: f34016a4
- name: gitea.czernobog.pl/gitea/astrololo-logic
newTag: 163ace42
newTag: f34016a4
- name: gitea.czernobog.pl/gitea/astrololo-render
newTag: latest
- name: gitea.czernobog.pl/gitea/astrololo-presentation
newTag: 163ace42
newTag: f34016a4
+8
View File
@@ -46,6 +46,14 @@ spec:
# Bez klucza usługa ma NIE wstać, a klient ma nie wysłać niczego.
# Sam serwer broni się fail-closed, ale to za mało: klient bez klucza
# zdążyłby wypuścić zapytanie jawnym tekstem, zanim dostanie odmowę.
# Usługa składająca PDF (PRE-24) — osobny komponent.
- name: RENDER_URL
value: "http://render:8004" # discovery po nazwie Service
# Trzeci klucz łącza: prezentacja ↔ render. Osobny, bo tym łączem
# idzie CAŁY raport (dane urodzeniowe + opisy z baz).
- name: LINK_KEY_PRESENTATION_RENDER
valueFrom:
secretKeyRef: { name: astrololo-link, key: LINK_KEY_PRESENTATION_RENDER }
- name: LINK_ENCRYPTION_REQUIRED
value: "true"
resources:
+69
View File
@@ -0,0 +1,69 @@
# Usługa render — składanie raportu PDF (PRE-24).
#
# OSOBNY komponent, nie część prezentacji, z tego samego powodu co silnik
# swisseph (LOG-27): obraz dźwiga TeX Live, czyli setki megabajtów. W obrazie
# produktu spowalniałby każdy build i deploy; tak aktualizuje się niezależnie,
# a jego awaria nie kładzie aplikacji — psuje się tylko przycisk „Pobierz PDF".
#
# Rozmawia WYŁĄCZNIE z prezentacją, po szyfrowanym łączu z własnym, trzecim
# kluczem. Wystawiona jako ClusterIP — bez NodePort i bez Ingressu, bo nie ma
# powodu, żeby ktokolwiek sięgał do niej z zewnątrz.
apiVersion: apps/v1
kind: Deployment
metadata:
name: render
namespace: astrololo
spec:
replicas: 1
selector: { matchLabels: { app: render } }
template:
metadata: { labels: { app: render } }
spec:
imagePullSecrets: [{ name: gitea-registry }]
containers:
- name: render
image: gitea.czernobog.pl/gitea/astrololo-render:latest
ports: [{ containerPort: 8004 }]
env:
# Token międzywarstwowy (LOG-32) — ta usługa dostaje CAŁY raport:
# dane urodzeniowe i opisy z baz.
- name: INTERNAL_TOKEN
valueFrom:
secretKeyRef: { name: astrololo-auth, key: INTERNAL_TOKEN }
# Szyfrowanie łącza (PRE-16/PRE-24). OSOBNY klucz na parę rozmówców:
# przejęcie klucza renderu nie może otwierać łącza do logiki ani danych.
- name: LINK_KEY_PRESENTATION_RENDER
valueFrom:
secretKeyRef: { name: astrololo-link, key: LINK_KEY_PRESENTATION_RENDER }
- name: LINK_ENCRYPTION_REQUIRED
value: "true"
# XeLaTeX na obszernym raporcie potrafi zjeść sporo pamięci i CPU,
# ale tylko na chwilę — stąd wyraźna różnica między request a limit.
resources:
requests: { cpu: "100m", memory: "256Mi" }
limits: { cpu: "1500m", memory: "1Gi" }
# Kompilacja pisze wyłącznie do katalogu tymczasowego, który sprząta po
# sobie. Dajemy na to emptyDir i zamykamy resztę systemu plików —
# raport nie ma prawa zostawić śladu w kontenerze.
volumeMounts:
- { name: tmp, mountPath: /tmp }
securityContext:
readOnlyRootFilesystem: true
allowPrivilegeEscalation: false
readinessProbe:
httpGet: { path: /health, port: 8004 }
initialDelaySeconds: 5
periodSeconds: 15
volumes:
- name: tmp
emptyDir: { sizeLimit: 512Mi }
---
apiVersion: v1
kind: Service
metadata:
name: render
namespace: astrololo
spec:
type: ClusterIP # tylko dla prezentacji, bez wejścia z zewnątrz
selector: { app: render }
ports: [{ port: 8004, targetPort: 8004 }]