Files
deploy/astrololo/ingress.yaml
T
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

158 lines
5.2 KiB
YAML

# Wejście do aplikacji po HTTPS (PRE-16).
#
# Poza bezpieczeństwem — Basic Auth po zwykłym http leci siecią czytelny dla
# każdego, kto słucha — TLS naprawia DWIE funkcje zepsute dziś z tego samego
# powodu: geolokalizacja przeglądarki („Tu i teraz") oraz kopiowanie promptu do
# schowka działają wyłącznie w tzw. secure context i po http po prostu odmawiają.
---
apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
name: security-headers
namespace: astrololo
spec:
headers:
stsSeconds: 31536000 # HSTS: rok
stsIncludeSubdomains: false # dotyczy tylko tego hosta
stsPreload: false # preload to wpis na listę w przeglądarkach
# — praktycznie nieodwracalny, nie wchodzimy
forceSTSHeader: true # nagłówek także przy odpowiedziach z backendu
contentTypeNosniff: true
frameDeny: true
referrerPolicy: same-origin
---
apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
name: redirect-https
namespace: astrololo
spec:
redirectScheme:
scheme: https
permanent: true
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: astrololo
namespace: astrololo
annotations:
traefik.ingress.kubernetes.io/router.entrypoints: websecure
traefik.ingress.kubernetes.io/router.middlewares: astrololo-security-headers@kubernetescrd
spec:
tls:
- hosts: [astrololo.czernobog.pl]
secretName: astrololo-tls # wypełnia cert-manager (tls.yaml)
rules:
- host: astrololo.czernobog.pl
http:
paths:
- path: /
pathType: Prefix
backend:
service: { name: presentation, port: { number: 8000 } }
---
# Osobny Ingress wyłącznie na porcie 80 — istnieje po to, żeby odesłać na https.
# Rozdzielone świadomie: gdyby przekierowanie wisiało na tym samym routerze, co
# wejście po https, odsyłałoby samo do siebie w kółko. Backend jest tu formalnością,
# bo żadne żądanie do niego nie dojdzie.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: astrololo-redirect
namespace: astrololo
annotations:
traefik.ingress.kubernetes.io/router.entrypoints: web
traefik.ingress.kubernetes.io/router.middlewares: astrololo-redirect-https@kubernetescrd
spec:
rules:
- host: astrololo.czernobog.pl
http:
paths:
- path: /
pathType: Prefix
backend:
service: { name: presentation, port: { number: 8000 } }
---
# ── astrodemo ──────────────────────────────────────────────────────────────
# Osobny host, nie ścieżka pod astrololo.czernobog.pl. Ścieżka („/demo") dzieliłaby
# z pełną aplikacją pochodzenie w rozumieniu przeglądarki, czyli i ciasteczka:
# wejście do jednej ruszałoby sesję w drugiej. Osobny host trzyma je rozdzielnie.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: astrodemo
namespace: astrololo
annotations:
traefik.ingress.kubernetes.io/router.entrypoints: websecure
traefik.ingress.kubernetes.io/router.middlewares: astrololo-security-headers@kubernetescrd
spec:
tls:
- hosts: [astrodemo.czernobog.pl]
secretName: astrololo-tls # ten sam certyfikat obejmuje oba hosty (tls.yaml)
rules:
- host: astrodemo.czernobog.pl
http:
paths:
- path: /
pathType: Prefix
backend:
service: { name: astrodemo, port: { number: 8005 } }
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: astrodemo-redirect
namespace: astrololo
annotations:
traefik.ingress.kubernetes.io/router.entrypoints: web
traefik.ingress.kubernetes.io/router.middlewares: astrololo-redirect-https@kubernetescrd
spec:
rules:
- host: astrodemo.czernobog.pl
http:
paths:
- path: /
pathType: Prefix
backend:
service: { name: astrodemo, port: { number: 8005 } }
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: astroklient
namespace: astrololo
annotations:
traefik.ingress.kubernetes.io/router.entrypoints: websecure
traefik.ingress.kubernetes.io/router.middlewares: astrololo-security-headers@kubernetescrd
spec:
tls:
- hosts: [astroklient.czernobog.pl]
secretName: astrololo-tls # ten sam certyfikat obejmuje wszystkie hosty (tls.yaml)
rules:
- host: astroklient.czernobog.pl
http:
paths:
- path: /
pathType: Prefix
backend:
service: { name: astroklient, port: { number: 8006 } }
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: astroklient-redirect
namespace: astrololo
annotations:
traefik.ingress.kubernetes.io/router.entrypoints: web
traefik.ingress.kubernetes.io/router.middlewares: astrololo-redirect-https@kubernetescrd
spec:
rules:
- host: astroklient.czernobog.pl
http:
paths:
- path: /
pathType: Prefix
backend:
service: { name: astroklient, port: { number: 8006 } }