Files
deploy/astrololo/astroklient.yaml
gitea 16240466ec astroklient: wdrożenie warstwy pośredniej z własnym stosem danych (5/5)
Domyka drabinę produktów: astrodemo (dwie funkcje) → astroklient → astrololo.
Host astroklient.czernobog.pl, obraz astrololo-astroklient, port 8006.

WŁASNY STOS, NIE WSPÓLNY. Nowa para data-astroklient + logic-astroklient
i nowy udział /mnt/Tank1/astrololo-klient. Pule kont izolują klientów od siebie
w każdym wariancie, ale to izolacja PROGRAMOWA — opiera się na poprawności
mechanizmu pul. Granica na poziomie systemu plików nie zależy od tego, czy
w kodzie niczego nie przeoczono, a przy sprzątaniu demo nie da się przez pomyłkę
skasować cudzych danych, bo leżą gdzie indziej.

Klaster ma zapas (węzły na 24–38% pamięci), więc koszt dwóch podów nie był
argumentem przeciw.

Silnik własny (permisywny) — silnik B (AGPL) nie wchodzi do produktu
oddawanego klientom.

data-astroklient dostaje nodeAffinity na etykietę zdolności procesora, jak
pozostałe warstwy danych: ciągnie pandas, a przez nią NumPy z bazą x86-64-v2.

WPIS W LIŚCIE OBSERWOWANYCH OBRAZÓW od razu, z komentarzem dlaczego. Bez niego
usługa nie deployuje się sama: obraz powstaje w rejestrze, kustomization zostaje
na starym tagu, i wygląda to na zepsute CI. Tak zawisł kiedyś render.

Certyfikat obejmuje trzeci host; DNS już wskazuje (wildcard).

RUNBOOK: udział NFS ze WSZYSTKIMI CZTEREMA węzłami, konta jako hashe scrypt,
własny SESSION_SECRET i własna nazwa ciasteczka (trzy produkty nie mają powodu
uznawać nawzajem swoich sesji), unieważnianie dostępu bez wolumenu stanu, oraz
sprawdzenie po wdrożeniu.

W sprawdzeniu poprawiona rzecz, którą najpierw napisałem błędnie: BEZ SESJI
każdy adres oddaje 303, także nieistniejący, bo bramka logowania działa przed
trasowaniem. Pętla curl bez ciasteczka pokazywałaby 303 dla wszystkiego
i sugerowała, że nieobecne ekrany „są". Sprawdzenie ma sens dopiero z sesją —
i wtedy dają 404, nie 403.

Zweryfikowane: kustomize build (37 obiektów), dry-run serwerowy przyjmuje
wszystkie osiem nowych obiektów, kody odpowiedzi sprawdzone na złożonym drzewie.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-27 16:10:12 +02:00

65 lines
2.2 KiB
YAML

# Astroklient — warstwa pośrednia (PR 4/5).
#
# Pełne funkcje astrologiczne, bez generowania tekstu i bez administracji.
# Obraz NIE ZAWIERA plików usuniętych wg usun.txt, więc nie ma tu czego wyłączać
# ani czym odsłaniać: to jest osobny produkt, a nie pełna aplikacja z zaciągniętą
# kurtyną.
#
# Konta pochodzą wyłącznie z sekretu (ASTROKLIENT_USERS), każde ma własną pulę
# plików na udziale astrololo-klient. Nie ma pliku kont, więc nie ma wolumenu
# stanu: sesje żyją w podpisanym ciasteczku.
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: astroklient
namespace: astrololo
spec:
replicas: 1
selector:
matchLabels: { app: astroklient }
template:
metadata:
labels: { app: astroklient }
spec:
automountServiceAccountToken: false
imagePullSecrets: [{ name: gitea-registry }]
containers:
- name: astroklient
image: gitea.czernobog.pl/gitea/astrololo-astroklient:latest
ports: [{ containerPort: 8006 }]
env:
- name: LOGIC_URL
value: "http://logic-astroklient:8001"
- name: ASTROKLIENT_USERS
valueFrom:
secretKeyRef: { name: astrololo-astroklient, key: ASTROKLIENT_USERS }
- name: SESSION_SECRET
valueFrom:
secretKeyRef: { name: astrololo-astroklient, key: SESSION_SECRET }
- name: INTERNAL_TOKEN
valueFrom:
secretKeyRef: { name: astrololo-auth, key: INTERNAL_TOKEN }
- name: LINK_KEY_PRESENTATION_LOGIC
valueFrom:
secretKeyRef: { name: astrololo-link, key: LINK_KEY_PRESENTATION_LOGIC }
- name: LINK_ENCRYPTION_REQUIRED
value: "true"
- name: TRUST_PROXY
value: "true"
- name: RATE_LIMIT_PER_MIN
value: "60"
resources:
requests: { cpu: "50m", memory: "128Mi" }
limits: { cpu: "500m", memory: "384Mi" }
---
apiVersion: v1
kind: Service
metadata:
name: astroklient
namespace: astrololo
spec:
type: ClusterIP
selector: { app: astroklient }
ports: [{ port: 8006, targetPort: 8006 }]