# eiac.dev — pełna treść (Everything Is A Code) > Pismo i katalog o zarządzaniu z kodu. Poniżej pełna treść artykułów (markdown) oraz opisy narzędzi z katalogu. Źródło: https://eiac.dev. Indeks: https://eiac.dev/llms.txt ======== ARTYKUŁY ======== # Aplikacje z kodu: SST vs Encore URL: https://eiac.dev/blog/sst-vs-encore Filar: App-as-Code Data: 2026-05-15 Tagi: sst, encore, aws, typescript, app-as-code Skrót: Dwa podejścia do App-as-Code: elastyczny framework IaC (SST) kontra konwencja z infrastrukturą wywiedzioną z kodu (Encore). Model, przykłady, wady i zalety. Lubię takie porównania, bo dwa narzędzia obiecują dokładnie to samo, a pod maską są zupełnie inne. Obie platformy mówią: opisujesz aplikację w kodzie, a one ogarniają infrastrukturę pod spodem. Różni je jednak coś fundamentalnego — _skąd_ bierze się wiedza o tym, jaka infrastruktura jest potrzebna. [SST](/katalog/sst) każe Ci ją **zadeklarować** (elastycznie, jak w klasycznym IaC), [Encore](/katalog/encore) **wywodzi** ją z Twojego kodu aplikacji (przez analizę statyczną). To pozornie drobne rozróżnienie pociąga za sobą całą resztę: język, lock-in, sposób pracy lokalnej i to, ile decyzji musisz podjąć.
Oś sporu

SST = konfiguracja: ty komponujesz zasoby z bloczków IaC. Encore = konwencja: framework czyta kod i sam dokłada infrastrukturę.

## Czym jest SST SST to framework do budowy i wdrażania pełnych aplikacji (frontend + backend + infrastruktura) — głównie na AWS. W wersji 3 jego silnikiem jest Pulumi z providerami Terraform, więc pod maską masz pełną moc klasycznego IaC: setki providerów i zasobów. Na wierzchu dostajesz wysokopoziomowe **komponenty** (`sst.aws.Function`, `sst.aws.Bucket`, `sst.aws.Astro` itd.), które ukrywają boilerplate, oraz mechanizm `link`, który automatycznie przekazuje uprawnienia i zmienne między zasobami. Aplikację opisujesz w `sst.config.ts` — zwykłym TypeScript, z pętlami, warunkami i pakietami: ```ts // sst.config.ts export default $config({ app: () => ({ name: "eiac", home: "aws" }), async run() { const bucket = new sst.aws.Bucket("Assets"); const api = new sst.aws.Function("Api", { handler: "src/api.handler", url: true, link: [bucket], // nadaje funkcji dostęp do bucketa (IAM + env) }); new sst.aws.Astro("Web", { link: [api] }); return { api: api.url }; }, }); ``` Sygnaturą SST jest tryb `sst dev` — uruchamia lokalną pętlę developerską, w której kod funkcji działa na Twojej maszynie, ale jest wpięty w _prawdziwe_ zasoby w chmurze (tzw. Live Lambda). Dostajesz natychmiastowy feedback bez ciągłego deployu. ```bash npx sst dev # lokalny dev wpięty w realne zasoby w chmurze npx sst deploy --stage production ``` Kluczowe cechy modelu SST: - **Pełen IaC pod spodem** — przez Pulumi/Terraform sięgniesz po dowolny zasób (kolejki, bazy, DNS, Cloudflare), nie tylko gotowe komponenty. - **Frontend i backend razem** — komponenty dla Next/Astro/React Router wdrażasz obok API w jednym repo. - **`link` zamiast ręcznego IAM** — relacje między zasobami zamiast ręcznego klejenia uprawnień i zmiennych. - **Stan i etapy (stages)** — odseparowane środowiska (`--stage`), stan trzymany jak w Pulumi. ## Czym jest Encore Encore odwraca kierunek. Zamiast deklarować infrastrukturę, **deklarujesz elementy aplikacji** — serwisy, endpointy, bazy, kolejki, crony — jako konstrukcje w kodzie (TypeScript lub Go). Encore analizuje ten kod statycznie, buduje graf aplikacji i sam provisionuje potrzebne zasoby: lokalnie, a po wdrożeniu w chmurze. Infrastruktury nie opisujesz osobno — ona „wynika" z tego, czego użyłeś. ```ts // api.ts — serwis, endpoint i baza wywiedzione z kodu import { api } from "encore.dev/api"; import { SQLDatabase } from "encore.dev/storage/sqldb"; const db = new SQLDatabase("catalog", { migrations: "./migrations" }); export const getTool = api( { method: "GET", path: "/tools/:id", expose: true }, async ({ id }: { id: string }) => { const row = await db.queryRow`SELECT name FROM tools WHERE id = ${id}`; return { tool: row?.name }; }, ); ``` Z deklaracji `new SQLDatabase(...)` Encore wie, że potrzebna jest baza — i tworzy ją sam (lokalnie w kontenerze, w chmurze jako zarządzaną instancję). Wywołania między serwisami są typowane: importujesz funkcję innego serwisu i wołasz ją jak zwykłą, a Encore zamienia to w wywołanie sieciowe z zachowaniem typów. Drugą sygnaturą Encore jest lokalny dashboard: `encore run` startuje aplikację z **rozproszonym tracingiem, eksploratorem API i automatyczną dokumentacją** — bez konfiguracji. ```bash encore run # lokalnie: dashboard, tracing, API explorer encore deploy # wdrożenie (Encore Cloud) ... encore build docker eiac:latest # ... albo własny obraz do self-hostingu ``` Wdrożenie ma dwie drogi: **Encore Cloud** automatycznie provisionuje aplikację na Twoim koncie AWS/GCP (i daje CI/CD, środowiska, podgląd), albo budujesz samodzielny obraz Dockera (`encore build`) i uruchamiasz go gdziekolwiek, np. na [Kubernetes](/katalog/kubernetes). Kluczowe cechy modelu Encore: - **Infrastruktura z kodu** — brak osobnego IaC; zasoby wynikają z użytych prymitywów. - **Konwencja zamiast konfiguracji** — mniej „kleju", więcej narzuconej struktury. - **Wbudowana obserwowalność** — tracing, metryki, dokumentacja API od ręki. - **Bezpieczne wywołania między serwisami** — typowane, sprawdzane w czasie kompilacji. ## Filozofia: konfiguracja kontra konwencja To jest sedno różnicy. W SST infrastruktura jest **jawna i programowalna** — masz nad nią pełną kontrolę, ale też pełną odpowiedzialność: to Ty decydujesz, jaki zasób powołać i jak go połączyć. W Encore infrastruktura jest **domniemana** — framework wie, czego potrzebujesz, bo przeczytał Twój kod; płacisz za to dopasowaniem się do jego modelu. Z tego wypływają wszystkie praktyczne konsekwencje: elastyczność kontra prostota, brak lock-inu na runtime kontra wbudowane „baterie", krzywa wejścia po stronie infrastruktury kontra krzywa wejścia po stronie konwencji frameworka. ## Te same zadania, dwa style Spójrz na to samo zadanie — API z dostępem do magazynu danych — w obu narzędziach. W **SST** najpierw deklarujesz zasób (`Bucket`), potem jawnie łączysz go z funkcją (`link`), a uprawnienia IAM i zmienne środowiskowe wygeneruje framework: ```ts const bucket = new sst.aws.Bucket("Assets"); new sst.aws.Function("Api", { handler: "src/api.handler", link: [bucket] }); ``` W **Encore** po prostu używasz prymitywu w kodzie — sama jego obecność „zamawia" infrastrukturę: ```ts const bucket = new Bucket("assets", { public: false }); // użycie bucket.upload(...) w endpointcie wystarcza, by Encore go zapewnił ``` Różnica nie jest składniowa, lecz koncepcyjna: w SST infrastruktura to osobny, jawny obiekt; w Encore to efekt uboczny użycia API. ## Różnice w kluczowych wymiarach | Wymiar | SST | Encore | | -------------------- | -------------------------------------- | ----------------------------------------------- | | Model infrastruktury | deklarowana jawnie (komponenty) | wywiedziona z kodu (analiza statyczna) | | Pod maską | Pulumi + providerzy Terraform | własny runtime + generowane IaC | | Języki | TypeScript/JavaScript | TypeScript i Go | | Chmura | AWS-first (też Cloudflare i inne) | AWS/GCP (Encore Cloud) lub własny obraz | | Frontend | tak (Next/Astro/React…) | nie (backend-first) | | Lokalny DX | `sst dev` (Live Lambda, realne zasoby) | `encore run` (dashboard, tracing, API explorer) | | Obserwowalność | dokładasz sam | wbudowana | | Elastyczność infry | bardzo wysoka (cały IaC) | ograniczona do modelu frameworka | | Lock-in | na AWS/komponenty, nie na runtime | na model i runtime Encore | | Wyjście awaryjne | naturalne (dropniesz do surowego IaC) | węższe (poza modelem trudniej) | ## Wady i zalety ### SST **Zalety** - Pełna moc IaC — sięgniesz po dowolny zasób przez Pulumi/Terraform, nie tylko gotowce. - Frontend + backend + infrastruktura w jednym repo i jednym wdrożeniu. - `link` realnie redukuje boilerplate IAM i konfiguracji. - Brak narzuconego runtime — Twój kod to zwykłe funkcje; mniejszy lock-in na sposób pisania. - Świetny lokalny feedback (Live Lambda). **Wady** - AWS-centryczny — najlepiej działa na AWS; poza nim wsparcie jest węższe. - Więcej decyzji i wiedzy o infrastrukturze po Twojej stronie. - Trzeba zarządzać stanem i etapami (jak w Pulumi). - Obserwowalność i konwencje musisz sobie poskładać sam. ### Encore **Zalety** - Minimum boilerplate — infrastruktura wynika z kodu, bez osobnego IaC. - Wbudowana obserwowalność (tracing, metryki, dokumentacja API) od pierwszej minuty. - Typowane, bezpieczne wywołania między serwisami. - Spójna struktura w zespole dzięki konwencji. - Elastyczne wdrożenie: Encore Cloud albo własny obraz Dockera. **Wady** - Lock-in na model i runtime Encore — wychodzisz poza schemat z trudem. - Ograniczona elastyczność dla nietypowej infrastruktury. - Tylko Go i TypeScript. - Mniejszy ekosystem i społeczność niż wokół Pulumi/Terraform. - „Magia" analizy statycznej bywa trudniejsza do debugowania, gdy coś nie zadziała. ## Kiedy co wybrać - **Wybierz SST**, gdy potrzebujesz pełnej kontroli nad infrastrukturą AWS, chcesz wdrażać frontend razem z backendem albo sięgać po zasoby spoza „happy path" (kolejki, nietypowe usługi, multi-provider). Cena: więcej decyzji i wiedzy o IaC. - **Wybierz Encore**, gdy budujesz backend/mikroserwisy i zależy Ci na maksymalnej prostocie, wbudowanej obserwowalności i szybkim starcie — a akceptujesz związanie z modelem frameworka. Cena: mniej elastyczności i lock-in na runtime. Dobry papierek lakmusowy: jeśli najwięcej czasu spędzasz na _infrastrukturze_ i chcesz nią rządzić — SST. Jeśli najwięcej czasu spędzasz na _logice biznesowej_ i chcesz, żeby infrastruktura „po prostu była" — Encore. ## Podsumowanie SST i Encore rozwiązują ten sam problem z dwóch przeciwnych stron. SST to elastyczny framework IaC z wysokopoziomowymi komponentami: dużo mocy, dużo kontroli, AWS w centrum. Encore to opinionowany framework backendowy, który infrastrukturę wywodzi z kodu i dorzuca obserwowalność: mało boilerplate'u, szybki start, w zamian za życie wewnątrz jego modelu. Wybór sprowadza się do jednego pytania: czy chcesz **rządzić** infrastrukturą, czy chcesz o niej **zapomnieć**. Obie odpowiedzi są poprawne — pod warunkiem, że świadomie zaakceptujesz ich konsekwencje. U mnie? Zależy od projektu: do szybkiego backendu sięgam po Encore, do czegoś, co muszę wyrzeźbić po swojemu — po SST. Weź oba na warsztat na jednym weekendowym projekcie, różnicę poczujesz w pięć minut. :) --- # IaC w 2026 — przegląd pola URL: https://eiac.dev/blog/iac-2026-przeglad Filar: Infrastructure-as-Code Data: 2026-05-07 Tagi: terraform, opentofu, pulumi, crossplane, iac, platform-engineering, adp Skrót: Po trzęsieniu licencyjnym IaC rozszczepia się na trzech osiach: podejście, governance i autonomia. Cztery obozy narzędzi, warstwa typowanej konfiguracji, automatyzacja TACOS i wejście agentów. Pamiętam swoje pierwsze `terraform apply` i ten dreszczyk, czy aby na pewno nie zaoram właśnie produkcji. Od tego czasu w Infrastructure-as-Code zmieniło się tyle, że rok 2026 zastał to pole zupełnie inne, niż je zostawił. W ciągu dwóch lat przeszło trzęsienie licencyjne, wchłonęło podejścia kwestionujące sam model „pisania infrastruktury osobno", dorobiło się warstwy typowanej konfiguracji i — co najważniejsze dla tej serii — zaczęło wpuszczać do pętli agentów AI. To już nie wyścig „które narzędzie jest najlepsze". To **pole rozszczepiające się wzdłuż kilku osi naraz**: podejścia, governance i autonomii. Ten przegląd porządkuje tę mapę i czyta ją przez pryzmat [platformy](/blog/platform-engineering-normalizacja-pracy): nie „co modne", lecz co daje się oprzeć na otwartym fundamencie, samoobsłudze i kontroli. Bo wybór silnika IaC w 2026 to nie tylko decyzja o składni — to decyzja o suwerenności, o tym, kto pisze infrastrukturę (człowiek czy agent) i kto za nią ręczy.
Teza

W 2026 nie wybierasz „narzędzia IaC", lecz pozycję na trzech osiach naraz: podejście (deklaratywny HCL, pełny język, control plane, czy infrastructure-from-code), governance (BSL pod jednym vendorem vs Linux Foundation), oraz autonomia (kod pisany ręcznie, generowany przez agenta, czy reconcile'owany automatycznie). Otwartość i policy-as-code to nie dodatki — to warunek, by pozostałe osie nie zamieniły się w pułapkę.

## Trzęsienie licencyjne: kto teraz rządzi Najgłośniejsza zmiana nie dotyczyła składni, lecz licencji. W sierpniu 2023 HashiCorp zmienił licencję Terraform z otwartej MPL 2.0 na [Business Source License](https://mariadb.com/bsl11/) (BSL) — źródło widoczne, ale z ograniczeniami komercyjnymi. Reakcją był fork: we wrześniu 2023 grupa firm (Spacelift, env0, Gruntwork i inne) odbiła Terraform na ostatnim commicie MPL (v1.5.5), nazwała go [OpenTofu](/katalog/opentofu) i przekazała pod [Linux Foundation](https://www.linuxfoundation.org/). Stawkę podniosło przejęcie: IBM ogłosił zakup HashiCorp (grudzień 2024, 6,4 mld USD), a transakcja zamknęła się 27 lutego 2025 — Terraform należy dziś do IBM i integruje się z Red Hat Ansible. Dla organizacji, które myślą o [suwerenności i strategii wyjścia](/blog/suwerenny-idp-exit-by-design), to kluczowy sygnał: fundament infrastruktury wpadł pod jednego, eksterytorialnego właściciela. Co istotne, fork dojrzał, a nie zwiądł. W 2026 [OpenTofu](/katalog/opentofu) ma 95%+ parytetu funkcji z [Terraform](/katalog/terraform) (wspólne providery), a do tego rzeczy, których Terraform nie dostał: **natywne szyfrowanie stanu** end-to-end (Terraform wymaga do tego Vault albo zaszyfrowanego S3), provider-defined functions i szybsze wydania. W produkcji używają go m.in. Boeing, Capital One i AMD. Wniosek praktyczny: **dla projektu greenfield bez długu w Terraform, OpenTofu jest dziś bezpiecznym domyślnym wyborem** — otwarta licencja (MPL 2.0), governance Linux Foundation, brak ryzyka licencyjnego. To wprost zasada EIAC: wybieraj silnik otwarty i fundacyjny, nie zakładnika jednego vendora. ## Cztery obozy podejścia Pod warstwą licencji pole dzieli się na cztery sposoby myślenia o tym, *czym w ogóle jest* opis infrastruktury. | Obóz | Reprezentanci | Idea | Cena wyboru | |---|---|---|---| | **Deklaratywny HCL** | [OpenTofu](/katalog/opentofu), [Terraform](/katalog/terraform) | Domeno-specyficzny język, `plan`/`apply`, stan | HCL bywa ciasny przy logice; stan do pilnowania | | **Pełny język** | [Pulumi](/katalog/pulumi), AWS CDK, [SST](/katalog/sst) | Infrastruktura w TS/Go/Python — pętle, typy, testy | Większa moc = większa szansa na nadmiar sprytu | | **Control plane** | [Crossplane](/katalog/crossplane) | Infrastruktura jako API Kubernetes, ciągły reconcile | Wymaga K8s i zmiany modelu myślenia | | **Infrastructure-from-Code** | [Encore](/katalog/encore), [SST](/katalog/sst), [Winglang](/katalog/winglang), [Nitric](/katalog/nitric) | Infrastruktura wywnioskowana z kodu aplikacji | Abstrakcja przecieka; ryzyko lock-in | **Deklaratywny HCL** to wciąż centrum grawitacji — i po forku pozostaje najbezpieczniejszym wyborem, o ile sięgasz po OpenTofu. **Pełny język** ([Pulumi](/katalog/pulumi)) kusi zespoły, które chcą pisać infrastrukturę tak jak aplikacje: z pętlami, typami i testami jednostkowymi. Pulumi dołożył do tego [ESC](https://www.pulumi.com/docs/esc/) (Environments, Secrets, Configuration) — warstwę config-as-code z dynamicznymi, krótkożyciowymi poświadczeniami przez OIDC, działającą też niezależnie od samego Pulumi IaC. **Control plane** to najgłębsza zmiana modelu. [Crossplane](/katalog/crossplane) — projekt CNCF, który osiągnął poziom „graduated" w listopadzie 2025 — zamienia infrastrukturę w API Kubernetes i nieustannie uzgadnia stan rzeczywisty z zadeklarowanym. Wersja 2.0 (sierpień 2025) uprościła model (zasoby namespaced domyślnie, composition functions zamiast patch-and-transform). Kluczowy cytat z ich pozycjonowania jest dla nas znaczący: control plane pozwala „zarówno ludziom, jak i inteligentnym agentom bezpiecznie zamawiać i zarządzać środowiskami przez API" — wrócimy do tego przy platformie agentowej. ## Czwarty obóz: Infrastructure-from-Code Najbardziej kwestionujące status quo jest podejście **infrastructure-from-code (IfC)**, wokół którego toczy się szczery spór „czy IaC umarło?". Teza IfC: skoro kod aplikacji i kod infrastruktury i tak muszą być zsynchronizowane, to po co pisać je osobno? Niech opis zasobów będzie **wywnioskowany z kodu aplikacji**. Obóz nie jest jednorodny — i warto rozróżnić jego odmiany, bo różnią się ceną: - [Encore](https://encore.dev/) idzie najdalej: infrastruktura deklarowana wprost w kodzie aplikacji, wyprowadzana automatycznie, bez plików stanu i cyklu plan/apply. - [SST](/katalog/sst) to superzbiór AWS CDK skupiony na świetnym DX dla serverless na AWS. - [Winglang](/katalog/winglang) stawia tezę, że istniejące języki nie wystarczają do opisu chmury (rozróżnia kod „preflight" wykonywany przy wdrożeniu i „inflight" w runtime); dziś oferuje też SDK dla TypeScript. - [Nitric](/katalog/nitric) celowo *uzupełnia* IaC: generuje specyfikację wymagań z kodu aplikacji i przekazuje ją pluginom, które produkują konfigurację Terraform/innego silnika — utrzymując IaC w synchronizacji z aplikacją. Uczciwa ocena: IfC nie jest „następcą", który zabije IaC, tylko inną odpowiedzią na realny problem synchronizacji. Płaci za wygodę dwiema walutami: **przeciekającą abstrakcją** (gdy coś się psuje pod spodem, i tak musisz zejść do warstwy, którą ukryto) i **ryzykiem lock-in** (framework dyktuje model). Dlatego porównanie dwóch flagowców — [SST kontra Encore](/blog/sst-vs-encore) — opisaliśmy osobno. Reguła kciuka: IfC świeci przy greenfield i serverless, gdzie tempo zmian aplikacji jest wysokie; przy złożonej, długowiecznej infrastrukturze wciąż wygrywa jawny IaC. ## Warstwa pod spodem: typowana konfiguracja Równolegle dojrzała warstwa, o której łatwo zapomnieć: **języki konfiguracji** zastępujące surowy YAML/JSON tam, gdzie ten przestaje się skalować. Zamiast kopiować bloki i modlić się o spójność, opisujesz konfigurację z typami, walidacją i funkcjami. Trzech głównych graczy różni się filozofią: - [KCL](https://www.kcl-lang.io/) — projekt CNCF (Sandbox), język ograniczeń, statycznie kompilowany, szybki przy dużej skali; szczególnie mocny do budowania composition w [Crossplane](/katalog/crossplane). - [CUE](https://cuelang.org/) — silny system typów i ograniczeń sprawdzanych w runtime; bez oficjalnego wsparcia IDE. - [Pkl](https://pkl-lang.org/) — od Apple, ergonomiczny (klasy, funkcje), z dojrzałym wsparciem edytorów i bogatą walidacją typów. To nie konkurenci IaC, lecz warstwa, która karmi go czystymi, walidowanymi danymi — szczególnie cenna, gdy te dane ma generować lub czytać agent. W EIAC ten sam impuls, co przy [tokenach designu](/blog/design-as-code-tokeny-od-zera): zamknij wartości w typowanym, walidowalnym kształcie, zamiast w luźnym tekście. ## Warstwa nad spodem: automatyzacja (TACOS) Sam silnik IaC nie rozwiązuje pracy zespołowej: blokowania stanu, wykrywania driftu, RBAC, prywatnych rejestrów, egzekwowania polityk. Tę lukę wypełnia kategoria **TACOS** (Terraform/OpenTofu Automation and Collaboration Software): - [Atlantis](https://www.runatlantis.io/) — otwarty pionier wzorca „plan/apply z komentarza w PR"; trzeba samemu złożyć płaszczyznę zarządzania. - [Spacelift](/katalog/spacelift), [env0](/katalog/env0) (z naciskiem na FinOps), [Scalr](/katalog/scalr) (drop-in Terraform Cloud) — komercyjne platformy z drift detection, granularnym RBAC i GitOps; [Terramate](/katalog/terramate) to ich lekka, open-source alternatywa (stacki + change detection). - [OpenTaco](/katalog/digger) (dawniej Digger) — orkiestruje przebiegi Terraform/OpenTofu **wewnątrz Twojego CI** (np. Gitea/GitHub Actions), zamiast uruchamiać własny compute, z self-hostowanym backendem stanu. Dla platformy suwerennej wybór TACOS to znów decyzja o kontroli: model „w Twoim CI, z Twoim stanem" (Digger) trzyma całość po Twojej stronie, zgodnie z [exit-by-design](/blog/suwerenny-idp-exit-by-design). Drift detection — wykrywanie, że stan rzeczywisty rozjechał się z kodem — to dziś funkcja oczekiwana, nie luksus; a w 2026 przestaje być „tylko wykrywaniem". ## AI wchodzi w pętlę: IaC w platformie agentowej Tu pole zmienia się najszybciej. Trzy zjawiska schodzą się w jedno: 1. **Generacja** — AI pisze kod aplikacji szybciej, niż zespoły piszą do niego infrastrukturę. Wąskim gardłem staje się IaC, więc to ono jest następne do zautomatyzowania. 2. **Remediacja driftu** — agentowa naprawa driftu przestała być eksperymentem; jest operacyjna. Narzędzia przechodzą od „tylko wykrywam" do „samo koryguję": cofają nieautoryzowane zmiany z konsoli i utrzymują stan pożądany. 3. **Control plane jako interfejs dla agentów** — [Crossplane](/katalog/crossplane) i pokrewne dają agentom bezpieczny, deklaratywny punkt zamawiania zasobów przez API. Wzorzec, który się wyłania, jest dokładnie tym z [czterech poziomów agentowego wytwarzania](/blog/cztery-poziomy-agentowego-wytwarzania): **guardrails konfigurowane per workflow** — pełna autonomia dla operacji dobrze zrozumianych (right-sizing zasobów nieprodukcyjnych, naprawa znanego driftu), a **człowiek w pętli** przy zmianach wrażliwych. Tego nie da się zrobić bezpiecznie bez bramki: [policy-as-code](/blog/policy-as-code-dla-zespolow) jest tym punktem decyzyjnym, przez który musi przejść każdy `apply` — niezależnie, czy zainicjował go człowiek, czy model. To jest [deterministyczny szkielet ADP](/blog/deterministyczny-szkielet-adp) zastosowany do infrastruktury: nie ufamy agentowi „że nie zepsuje", tylko zamykamy go w polityce i przeglądzie planu.
Warstwa agentowa — bramka policy-as-code generacja · remediacja driftu · człowiek w pętli przy ryzyku Automatyzacja: TACOS · GitOps Atlantis · Spacelift · env0 · Scalr · OpenTaco · Terramate Silnik IaC — cztery obozy HCL · pełny język · control plane · infrastructure-from-code Konfiguracja typowana: KCL · CUE · Pkl BSL LF
Mapa pola IaC 2026: cztery warstwy (konfiguracja → silnik → automatyzacja → agent), a z prawej oś governance — od zamkniętej licencji BSL po otwarty Linux Foundation.
```hcl # OpenTofu: ten sam plan przechodzi przez bramkę polityki w CI, # zanim ktokolwiek (człowiek czy agent) zrobi apply resource "aws_s3_bucket" "data" { bucket = "eiac-sovereign-eu" } resource "aws_s3_bucket_server_side_encryption_configuration" "data" { bucket = aws_s3_bucket.data.id # wymagane przez politykę: rule { # conftest/checkov odrzuci plan apply_server_side_encryption_by_default { sse_algorithm = "aws:kms" } } } ``` ## Jak wybrać Nie ma jednego zwycięzcy — jest dopasowanie do kontekstu. Cztery typowe sytuacje: - **Greenfield, brak długu w Terraform** → [OpenTofu](/katalog/opentofu). Otwarta licencja, szyfrowanie stanu, governance LF. Domyślny wybór „bez żalu". - **Zespół chce pisać infrastrukturę jak aplikację (typy, testy)** → [Pulumi](/katalog/pulumi) + ESC; pełny język w cenie większej odpowiedzialności za dyscyplinę. - **Budujesz platformę z samoobsługą i chcesz, by zamawiali z niej też agenci** → [Crossplane](/katalog/crossplane) jako control plane, ewentualnie [KCL](https://www.kcl-lang.io/) do composition. - **Greenfield serverless, tempo aplikacji > tempo infrastruktury** → IfC ([Encore](https://encore.dev/)/[SST](/katalog/sst)), ze świadomością ceny abstrakcji i lock-in. A ponad tymi wyborami — dwie stałe, niezależne od obozu: **trzymaj się otwartego, fundacyjnego silnika** (osłona przed ryzykiem licencyjnym i eksterytorialnym) oraz **postaw bramkę policy-as-code** (jedyny sposób, by wpuścić agentów do pętli bez utraty kontroli). Migracja Terraform → OpenTofu jest dziś nisko-ryzykowna dzięki parytetowi; wejście w agentowy IaC bez polityki — wręcz przeciwnie. ## Podsumowanie IaC w 2026 to nie pojedynczy wyścig narzędzi, lecz pole rozpięte na trzech osiach: podejście (HCL, język, control plane, IfC), governance (BSL pod IBM vs Linux Foundation za OpenTofu) i autonomia (od ręcznego kodu po agentową remediację driftu). Pod silnikami dojrzała warstwa typowanej konfiguracji (KCL/CUE/Pkl), nad nimi — automatyzacja TACOS, a ponad wszystkim wchodzą agenci. Dla platformy, która ma być otwarta, suwerenna i gotowa na AI, odpowiedź EIAC jest spójna z resztą serii: wybierz otwarty, fundacyjny silnik, opisz wszystko jako kod i zamknij każdy `apply` w bramce policy-as-code — wtedy każda z tych osi pozostaje wyborem, a nie pułapką. A jeśli masz stary stack w Terraform i zachodzisz w głowę, czy migrować — migruj na OpenTofu. Parytet jest, ryzyko małe, a spokój duży. :) --- # Security Plane: sekrety, tożsamość i policy-as-code URL: https://eiac.dev/blog/security-plane-sekrety-tozsamosc-policy Filar: Security-as-Code Data: 2026-04-30 Tagi: security, secrets, identity, policy-as-code, agents Skrót: Trzy filary Security Plane — tożsamość, sekrety i policy-as-code — działają razem, self-hostowane i opisane jako kod, spełniając jednocześnie wymóg suwerenności i audytowalnej autonomii. Security Plane przewija się przez całą serię — w [Suwerennym IDP](/blog/suwerenny-idp-exit-by-design) jako jedna z pięciu płaszczyzn, w [Deterministycznym szkielecie](/blog/deterministyczny-szkielet-adp) jako warunek bezpiecznej autonomii agentów. Tu poświęcam jej całą uwagę, bo to warstwa, na której najłatwiej się przewrócić. Teza spaja oba konteksty: w platformie suwerennej i agentowej **root of trust musi być lokalny i deklaratywny** — tożsamość, sekrety i polityki pod kontrolą organizacji, opisane jako kod, a nie rozsiane po konsolach dostawców.
Teza

Bezpieczeństwa nie da się „dokleić" na końcu. To płaszczyzna przecinająca wszystkie inne: jeśli tożsamość, sekrety i polityki są u obcego dostawcy lub poza kodem, ani suwerenność, ani audytowalna autonomia agentów nie są możliwe.

## Tożsamość: niezależny broker zamiast natywnego IAM Poleganie na natywnym IAM dostawcy chmury (np. AWS IAM) przywiązuje perymetr tożsamości do tego konkretnego vendora — i łamie suwerenność. Wzorzec to **niezależny broker tożsamości**, self-hostowany, integrujący istniejące źródła logowania. Dla brokera federującego ([OIDC](https://openid.net/developers/how-connect-works/) przed wieloma źródłami: [LDAP](https://datatracker.ietf.org/doc/html/rfc4511), [SAML](https://docs.oasis-open.org/security/saml/v2.0/saml-core-2.0-os.pdf), dostawcy zewnętrzni) dobrze sprawdza się [Dex](/katalog/dex); dla pełnego, headless serwera [OAuth2](https://oauth.net/2/)/OIDC — [Ory Hydra](/katalog/ory-hydra). Konfigurację trzymasz deklaratywnie: ```yaml # Dex: jeden punkt OIDC przed wieloma źródłami (fragment) issuer: https://auth.eiac.dev/dex connectors: - type: ldap id: corp name: Active Directory config: { host: ldap.eiac.dev:636 } staticClients: - id: argo-cd name: Argo CD redirectURIs: ["https://cd.eiac.dev/auth/callback"] ``` Efekt: jedno SSO dla całej platformy, niezależne od dostawcy infrastruktury. ## Sekrety: self-hosted źródło prawdy Natywne KMS chmury to kolejny wektor lock-inu. Architektura suwerenna mandatuje **self-hostowany menedżer sekretów** jako jedyne źródło prawdy dla kluczy, haseł i certyfikatów — np. [Vault](/katalog/vault) / [OpenBao](/katalog/openbao), a dla zespołów ceniących prostotę [Infisical](/katalog/infisical). Aplikacje pobierają sekrety dynamicznie, więc nigdy nie lądują w repo ani w proprietarnym vaultcie dostawcy. Druga, komplementarna droga to **szyfrowanie sekretów w Git** (GitOps-friendly): [SOPS](/katalog/sops) z kluczem [age](/katalog/age). Klucze pozostają jawne, wartości zaszyfrowane: ```yaml # secrets.enc.yaml — wersjonowane w repo, wartości zaszyfrowane db_password: ENC[AES256_GCM,data:9b1d…,tag:7f…] api_token: ENC[AES256_GCM,data:0c44…,tag:a1…] ``` W modelu GitOps sekrety wstrzykuje się do klastra dopiero przy synchronizacji — np. przez [Argo CD Vault Plugin](/katalog/argocd-vault-plugin), który zamienia placeholdery na wartości z backendu. Wybór „SOPS vs serwer sekretów" to kompromis: SOPS jest prosty i w pełni w repo; serwer daje dynamiczne, krótkożyciowe poświadczenia i centralną rotację. ## Policy-as-code: bramka, nie audyt Trzeci filar to polityki egzekwowane automatycznie, opisane jako kod. W CI działają jako bramki ([OPA](/katalog/open-policy-agent)/Conftest, Checkov), a w klastrze jako admission control ([OPA Gatekeeper](/katalog/gatekeeper)). Przykład reguły wiążącej bezpieczeństwo z suwerennością: ```rego package eiac.security deny contains msg if { input.kind == "Deployment" some c in input.spec.template.spec.containers not c.securityContext.readOnlyRootFilesystem msg := sprintf("kontener %q musi mieć readOnlyRootFilesystem", [c.name]) } ``` Ta sama polityka chroni zmianę człowieka i agenta — bo działa na artefakcie, nie na autorze. To właśnie czyni ją skalowalną przy wolumenie zmian generowanych maszynowo. ## Nowy wymiar: tożsamość nie-ludzka dla agentów Platforma agentowa dokłada wymóg, którego klasyczny IDP nie miał: **agent musi mieć własną, ograniczoną tożsamość** — nie działać z poświadczeniami człowieka, który go uruchomił. Bez tego autonomia jest nieaudytowalna („kto to zrobił?") i ma zbyt szeroki promień rażenia. Wzorce: - **Tożsamość nie-ludzka** z wąskim zakresem (co agent może dotknąć), brokerowana przez [Dex](/katalog/dex)/[Ory Hydra](/katalog/ory-hydra). - **Krótkożyciowe poświadczenia** z [Vault](/katalog/vault)/[OpenBao](/katalog/openbao), wydawane na czas zadania — nie statyczne sekrety. - **Izolacja workspace** dla równoległych przebiegów agentów, by nie kolidowały i nie eskalowały uprawnień. - **Ślad i provenance** — każda akcja agenta zalogowana, artefakty podpisane. ```hcl # Vault: krótkożyciowe poświadczenia dla agenta zamiast statycznego sekretu path "database/creds/agent-readonly" { capabilities = ["read"] # TTL np. 15 min, automatyczna rotacja } ``` To domyka wątek z [Deterministycznego szkieletu](/blog/deterministyczny-szkielet-adp): bez tożsamości nie-ludzkiej i krótkożyciowych poświadczeń nie da się bezpiecznie podnieść poziomu autonomii. ## Jak to się składa w całość Trzy filary Security Plane działają razem: **tożsamość** mówi *kto/co* (ludzie i agenci), **sekrety** dają *bezpieczny dostęp* (dynamiczny, lokalny), **policy-as-code** egzekwuje *co wolno* (deklaratywnie, w bramce). Wszystkie trzy są self-hostowane i opisane jako kod — dzięki czemu spełniają jednocześnie wymóg suwerenności (lokalny root of trust) i wymóg audytowalnej autonomii (ślad, granice, prowienancja), o których pisaliśmy w kontekście [DORA](https://eur-lex.europa.eu/eli/reg/2022/2554/oj) i [AI Act](https://digital-strategy.ec.europa.eu/en/policies/regulatory-framework-ai). ## Podsumowanie Security Plane to nie zestaw dodatków, lecz płaszczyzna przecinająca platformę. Niezależny broker tożsamości, self-hostowane sekrety i policy-as-code lokalizują root of trust w organizacji, a tożsamość nie-ludzka rozszerza ten model na agentów. To fundament, na którym stoją zarówno suwerenność (kontrola nad każdą warstwą), jak i bezpieczna autonomia (audytowalne granice działania). Bez tej płaszczyzny reszta serii pozostaje teorią. Jak w homelab: dopóki nie ogarniesz lokalnego PKI, tożsamości i sekretów, każda „automatyzacja" powyżej stoi na piasku. --- # Open source ≠ suwerenność: licencje i co-option chmury URL: https://eiac.dev/blog/open-source-a-suwerennosc Filar: Infrastructure-as-Code Data: 2026-04-24 Tagi: sovereignty, open-source, licensing, iac Skrót: Otwarta licencja nie wystarcza do suwerenności. Open-core, zmiany licencji (BSL/SSPL), repackaging przez chmury i przejęcia — oraz test, który naprawdę definiuje sovereign-ready tooling. W [Suwerennym IDP](/blog/suwerenny-idp-exit-by-design) założyłem, że fundamentem przenośności jest otwarte tooling. Sam przez lata powtarzałem sobie wygodny mit: „open source jest z definicji suwerenny i wolny od lock-inu". Nauczyłem się — nieraz boleśnie — że to nieprawda, a trend idzie w niekorzystną stronę. Otwarta licencja to warunek konieczny, ale daleko niewystarczający.
Teza

Testem suwerenności nie jest to, czy narzędzie ma licencję open source. Testem jest, czy organizacja może je self-hostować, operować i zmigrować bez zależności od jednego podmiotu komercyjnego.

## Cztery sposoby, w jakie „otwarte" przestaje być wolne Open source bywa fundamentem suwerenności, ale kilka strukturalnych nacisków tę przewagę eroduje. | Trend | Przykłady | Ryzyko dla suwerenności | |---|---|---| | **Open core** | Backstage, Elasticsearch, MongoDB, Terraform | Rdzeń otwarty, funkcje enterprise zamknięte — migrujesz do open source, a potem wpadasz w komercyjny lock-in na kluczowych zdolnościach | | **Zmiany licencji** | Elastic (SSPL), MongoDB (AGPL→SSPL), HashiCorp (BSL) | Przejście z licencji permisywnej łamie zaufanie i retroaktywnie ogranicza użycie | | **Co-option przez chmury** | repackaging projektów jako usługi zarządzane | Hyperscaler dokłada warstwy proprietary, odtwarzając lock-in, którego projekt miał unikać | | **Przejęcia** | Red Hat (IBM), GitHub (Microsoft), HashiCorp (IBM) | Priorytety społeczności zmieniają się po akwizycji | Każdy z tych mechanizmów może zamienić „otwarte" narzędzie w pułapkę — nie z dnia na dzień, lecz stopniowo, gdy już jesteś od niego zależny. ## Praktyczne wnioski Z tej diagnozy płyną trzy zasady projektowania suwerennego toolingu: - **Suwerenność wymaga czystego, społecznościowego open source.** Modele open-core to świetne punkty wejścia, ale ich warstwy enterprise SaaS są produktami komercyjnymi. Prawdziwa autonomia opiera się na nieskrępowanym, swobodnie modyfikowalnym rdzeniu. - **Zmiany licencji erodują zaufanie.** Audytuj licencje przed adopcją i monitoruj zmiany. To argument za stawianiem na projekty pod skrzydłami fundacji (Linux Foundation, CNCF), które gwarantują, że rdzeń pozostanie otwarty i zarządzany przez społeczność. - **Chmury co-optują open source.** Usługi zarządzane oparte na otwartych projektach często dokładają warstwy proprietary, odtwarzające lock-in, którego oryginał miał unikać. ## Case: OpenTofu jako odpowiedź na BSL Najczystszy przykład to fork [Terraform](/katalog/terraform) po zmianie jego licencji na BSL. Społeczność odpowiedziała [OpenTofu](/katalog/opentofu) — zgodnym składniowo (HCL, format stanu, ekosystem providerów) zamiennikiem pod **Linux Foundation**, co gwarantuje, że silnik definiujący infrastrukturę organizacji pozostaje otwarty i wolny od przechwycenia przez jeden podmiot. W praktyce dla większości projektów migracja jest niemal wymianą binarki: ```bash # ten sam kod .tf, moduły i providerzy — inna komenda tofu init tofu plan tofu apply ``` To pokazuje, czym jest „sovereign-ready": nie samą licencją, lecz realną możliwością odejścia bez przepisywania całej infrastruktury. ## Kryteria wyboru sovereign-ready tooling Praktyczna lista kontrolna przy ocenie narzędzia do platformy: - **Self-hosting** — czy da się uruchomić w pełni we własnej jurysdykcji, także air-gapped? - **Migrowalność** — czy istnieje droga wyjścia bez zależności od jednego dostawcy (otwarte formaty, standardy)? - **Governance** — czy projekt jest pod fundacją / wieloma kontrybutorami, czy kontroluje go jeden komercyjny właściciel? - **Licencja** — permisywna/community, nie BSL/SSPL; z historią stabilności. - **Brak ukrytego open-core** — czy funkcje krytyczne dla Ciebie są w otwartym rdzeniu, czy za płatną bramką? Przez ten pryzmat warto patrzeć na cały katalog narzędzi platformy — od VCS ([Gitea](/katalog/gitea)), przez GitOps ([Argo CD](/katalog/argo-cd)), po rejestry ([Harbor](/katalog/harbor)). ## Niuans: governance to też proces, nie tylko licencja Suwerenność toolingu łączy się z szerszym tematem zarządzania zmianą — jak projekt (i Twoja organizacja) panuje nad wersjami, kompatybilnością i procesem wydań. To, co pisaliśmy o deterministycznym, opartym na regułach procesie w [artykule o wersjonowaniu](/blog/wersjonowanie-semver-conventional-commits), dotyczy także zaufania do zależności: przewidywalny, otwarty proces wydawniczy jest częścią „sovereign-ready". ## Podsumowanie „Open source" na etykiecie nie wystarcza. Liczy się, czy możesz narzędzie self-hostować, nim operować i od niego odejść — bez łaski jednego komercyjnego właściciela. Open-core, zmiany licencji, co-option przez chmury i przejęcia to realne wektory utraty autonomii. Dlatego sovereign-ready tooling rozpoznajesz nie po licencji, lecz po przenośności i governance — a fundacje takie jak Linux Foundation czy CNCF są tu Twoim najlepszym sojusznikiem. Następnym razem, gdy zobaczysz łatkę „open source", zadaj trzy pytania: self-host, operowanie, wyjście. Reszta to marketing. --- # Suwerenne AI w platformie: open-weight, lokalne GPU i ochrona IP URL: https://eiac.dev/blog/suwerenne-ai-open-weight Filar: Security-as-Code Data: 2026-04-17 Tagi: sovereignty, ai, llm, ip, security Skrót: Bez modelu open-weight na własnej infrastrukturze data residency jest iluzją — najcenniejsze aktywa wyciekają przez asystenta. Suwerenne AI jako zarządzanie ryzykiem IP i ciągłości, z trzeźwym uznaniem kosztów. W [Suwerennym IDP](/blog/suwerenny-idp-exit-by-design) ustaliłem, że suwerenność to przenośność workflowów, a każdy komponent platformy podlega tej samej ocenie co infrastruktura. Jest jednak jeden, który łamie tę ocenę w nowy sposób — **asystent AI**. I to on spędza mi sen z powiek najbardziej. Tradycyjny Copilot nieustannie wysyła fragmenty kodu i kontekst na serwery dostawcy, do przetwarzania i potencjalnego treningu. To nie jest „przetwarzanie danych" w starym sensie — to ciągły, trudny do zauważenia wyciek własności intelektualnej poza granicę suwerenności.
Teza

Jeśli Twój asystent AI przetwarza kod na cudzych serwerach, „data residency" reszty platformy nic nie znaczy. Algorytmy, logika biznesowa i definicje infrastruktury wyciekają tą samą drogą, którą miały chronić wszystkie inne kontrole.

## Dlaczego to nowy rodzaj ryzyka Klasyczne kontrole suwerenności pilnują, gdzie *spoczywają* dane. Asystent AI obchodzi je, bo dane *w ruchu* — prompt, otaczający kod, definicje infry, komunikaty błędów — opuszczają organizację przy każdym zapytaniu. Co gorsza, mogą zostać wchłonięte przez obce, scentralizowane pipeline'y treningowe, nad którymi nie masz żadnej kontroli ani widoczności. Do tego dochodzi ryzyko ciągłości. Zdolność hostowana w jednej jurysdykcji może zostać odcięta z dnia na dzień decyzją administracyjną — bez uprzedzenia i bez prawa odwołania. Dla zespołu, który wpiął obcy model w krytyczną ścieżkę wytwarzania, to nie teoretyczne ryzyko, lecz nagłe zatrzymanie pracy. ## Optyka: suwerenność to optionality Suwerenne AI nie znaczy „zakaz używania zewnętrznych modeli". Znaczy **optionality** — zdolność do uruchomienia całego cyklu wytwarzania na własnych warunkach, gdy zajdzie potrzeba. W praktyce sprowadza się to do trzech decyzji architektonicznych: - **Modele open-weight** — o otwartych wagach, które możesz pobrać, uruchomić i audytować, zamiast czarnej skrzynki za API. - **Hosting lokalny lub suwerenny** — na własnym GPU albo u dostawcy w Twojej jurysdykcji, tak by zapytania nie opuszczały granicy. - **Routing zapytań AI przez platformę** — wszystkie zapytania asystentów idą przez kontrolowany punkt, nie bezpośrednio do obcego SaaS. Dzięki temu kod, telemetria i definicje infry pozostają pod kontrolą organizacji i nie są ingerowane przez zewnętrzne modele. ## Jak to wygląda na platformie Wzorzec to brama (gateway) wystawiająca zgodne z OpenAI API, za którą stoi lokalnie hostowany model — np. uruchomiony na [Kubernetes](/katalog/kubernetes) (lub lekkim [k3s](/katalog/k3s) na brzegu z GPU). Asystenci w IDE i agenci w pipeline kierują ruch do tej bramy, nie na zewnątrz. ```yaml # wdrożenie lokalnej bramy modelu z dostępem do GPU (szkic) apiVersion: apps/v1 kind: Deployment metadata: { name: llm-gateway, namespace: ai } spec: replicas: 2 template: spec: containers: - name: gateway image: registry.eiac.dev/ai/openai-compatible-gateway:1.0.0 resources: limits: { nvidia.com/gpu: "1" } env: - name: MODEL value: "open-weight-coder" ``` Sekrety dostępowe do bramy i providerów trzymasz w [Vault](/katalog/vault)/[OpenBao](/katalog/openbao) (nie w repo), a do oceny jakości i bezpieczeństwa modeli oraz promptów używasz deklaratywnych ewaluacji i red-teamingu — np. [promptfoo](/katalog/promptfoo) jako krok w CI. Provenance artefaktów generowanych z udziałem AI warto podpisywać (np. [gitsign](/katalog/gitsign)), by dało się udowodnić ich pochodzenie. ```yaml # ewaluacja i red-teaming modelu jako bramka jakości (promptfoo) prompts: ["{{zadanie}}"] providers: ["http://llm-gateway.ai.svc/v1"] redteam: plugins: [prompt-injection, pii-leak] ``` ## Kompromisy: czego to kosztuje Suwerenne AI nie jest darmowe. Open-weight modele bywają o krok za najlepszymi zamkniętymi frontier-models, lokalny hosting wymaga GPU i utrzymania, a brama to dodatkowy komponent do obsłużenia. To realny koszt — który zestawiasz z ryzykiem wycieku IP i utraty ciągłości. Dla wielu zespołów rozsądny jest model mieszany: wrażliwe ścieżki przez model lokalny, mniej wrażliwe — przez zewnętrzny, ale zawsze za kontrolowaną bramą, którą da się przełączyć. ## Styk z regulacją Suwerenne AI spotyka się z **[AI Act](https://digital-strategy.ec.europa.eu/en/policies/regulatory-framework-ai)** w dwóch punktach: transparentności (lineage modelu — co i na czym działa) oraz nadzoru i śladu (logowanie zapytań/wyników w granicy organizacji). Lokalna brama daje naturalny punkt, w którym ten ślad powstaje i pozostaje pod kontrolą. Mapowanie wymogów AI Act na cykl wytwarzania rozwijamy w [AI Act a agentowy SDLC](/blog/ai-act-a-agentowy-sdlc). ## Podsumowanie AI jest dziś częścią platformy — więc podlega tej samej ocenie suwerenności co reszta. Bez opcji modelu open-weight na własnej infrastrukturze data residency jest iluzją: najcenniejsze aktywa wyciekają przez asystenta. Suwerenne AI to nie ideologia, lecz zarządzanie ryzykiem IP i ciągłości — z trzeźwym uznaniem jego kosztów. To zarazem warstwa, w której rodzi się ślad wymagany przez AI Act, do którego przechodzę dalej. I tak, wiem — lokalny model kosztuje: sprzęt, ludzi, utrzymanie. Ale policz kiedyś, ile warta jest Twoja własność intelektualna, zanim uznasz, że to za drogo. --- # AI Act a agentowy SDLC: regulacja kontra autonomia URL: https://eiac.dev/blog/ai-act-a-agentowy-sdlc Filar: Security-as-Code Data: 2026-04-10 Tagi: ai-act, agents, compliance, governance, eu Skrót: Wymogi AI Act — nadzór człowieka, ślad, transparentność, zarządzanie ryzykiem — mapują się niemal jeden do jednego na deterministyczny szkielet platformy agentowej. Regulacja jako specyfikacja, nie hamulec. W [czterech poziomach](/blog/cztery-poziomy-agentowego-wytwarzania) pokazałem, że im wyżej w autonomii, tym ważniejszy staje się nadzór i ślad. To nie jest tylko dobra inżynieria — to dokładnie to, czego żąda **[AI Act](https://digital-strategy.ec.europa.eu/en/policies/regulatory-framework-ai)**. Wiem, „regulacja" brzmi jak hamulec. Ale pokażę Ci, że jej wymogi mapują się niemal jeden do jednego na deterministyczny szkielet platformy agentowej (ADP) — czyli na to, co i tak musisz zbudować.
Teza

AI Act nie jest przeszkodą dla agentów — jest specyfikacją tego, co i tak musi mieć dobra platforma agentowa: nadzór człowieka, logowanie, transparentność i zarządzanie ryzykiem. Im wyższy poziom autonomii, tym mocniejsze wymagane guardrails.

Uwaga

To analiza techniczna, nie porada prawna. Zakres obowiązków AI Act zależy od roli (dostawca, podmiot stosujący), klasy ryzyka i przeznaczenia systemu.

## AI Act w pigułce: regulacja oparta na ryzyku AI Act klasyfikuje systemy AI według ryzyka, a obowiązki rosną wraz z nim: - **Niedopuszczalne** — praktyki zakazane (obowiązują od lutego 2025). - **Wysokie ryzyko** — np. rekrutacja, scoring kredytowy, egzekwowanie prawa; pełen zestaw obowiązków (zarządzanie ryzykiem, nadzór człowieka, logi, dokumentacja, jakość danych). - **Ograniczone** — obowiązki transparentności (użytkownik wie, że ma do czynienia z AI / treścią generowaną). - **Minimalne** — większość zastosowań; bez dodatkowych wymogów. Kalendarz (stan na 2026): obowiązki dla **GPAI** (modeli ogólnego przeznaczenia) są stosowane od 2 sierpnia 2025, a pełne uprawnienia egzekucyjne AI Office aktywują się 2 sierpnia 2026. Terminy dla systemów wysokiego ryzyka zostały przesunięte (w ramach „Digital Omnibus", porozumienie z 7 maja 2026, w trakcie formalnego przyjęcia): Annex III (samodzielne) do **2 grudnia 2027**, Annex I (wbudowane w produkty) do **2 sierpnia 2028**. GPAI obecne na rynku przed 2 sierpnia 2025 mają czas na zgodność do 2 sierpnia 2027. ## Dwa różne pytania Mówiąc o „AI i regulacji", łatwo pomieszać dwie sprawy: 1. **Używasz AI do wytwarzania** (agenci w pipeline). Tu zwykle nie budujesz systemu wysokiego ryzyka — kluczowe są ład, nadzór i audytowalność *procesu*. 2. **Dostarczasz funkcje oparte na AI** w produkcie. Tu może wejść reżim wysokiego ryzyka lub obowiązki transparentności wobec użytkowników. Ten artykuł skupia się na (1) — agentowym SDLC — bo to tam AI Act spotyka się z architekturą platformy. Ale ta sama platforma pomaga też spełnić (2). ## Mapowanie wymogów na ścieżki value streamu Najciekawsze jest to, jak czysto wymogi AI Act odwzorowują się na elementy ADP opisane wcześniej: | Wymóg AI Act | Element platformy agentowej | |---|---| | Nadzór człowieka (human oversight) | poziomy in/on/orchestrator — człowiek w/na pętli, auto-promocja tylko dla low-risk | | Logowanie i rejestry (record-keeping) | obserwowalność + ślad audytowy, tożsamość nie-ludzka (kto/co zrobił) | | Transparentność | provenance artefaktów — podpisy ([gitsign](/katalog/gitsign)), jawne pochodzenie zmian | | Zarządzanie ryzykiem | klasyfikacja ryzyka + policy-as-code jako bramka ([OPA](/katalog/open-policy-agent), [Gatekeeper](/katalog/gatekeeper)) | | Jakość/ład danych | sekrety i dostęp (Security Plane), warstwy semantyczne nad danymi | | Testy i monitorowanie | walidacja-pętla + ewaluacja/red-teaming ([promptfoo](/katalog/promptfoo)), runtime ([Falco](/katalog/falco)) | Innymi słowy: deterministyczny szkielet, który i tak jest potrzebny, by agenci działali bezpiecznie, jest jednocześnie warstwą zgodności z AI Act. ## Nadzór jako funkcja poziomu autonomii Kluczowa intuicja: **im mniej człowieka w pętli, tym mocniejsze muszą być automatyczne dowody i granice.** AI Act wymaga „odpowiedniego nadzoru człowieka" — a poziomy z [czterech poziomów](/blog/cztery-poziomy-agentowego-wytwarzania) dają temu konkretny kształt: - na poziomie 1-2 nadzór jest wprost (człowiek akceptuje / weryfikuje zachowanie), - na poziomie 3 przenosi się na **reguły promocji** — człowiek projektuje politykę, a nie ogląda każdą zmianę, - przy autonomii (poziom 4) nadzór to **granice i progi ryzyka** plus pełny ślad, który pozwala odtworzyć każdą decyzję. Klasyfikacja ryzyka zmiany staje się więc nie tylko mechanizmem przepustowości, ale i mechanizmem zgodności: ```rego # tylko zmiany low-risk mogą iść bez człowieka; reszta wymaga nadzoru package eiac.aiact auto_promote if { input.change.risk == "low" input.validation.status == "green" input.actor.type == "agent" input.provenance.signed == true # podpisany artefakt (transparentność) } ``` Reguła łączy trzy wymogi naraz: zarządzanie ryzykiem (klasa), nadzór (co wolno bez człowieka) i transparentność (podpis). Wszystko jako kod, więc audytowalne. ## GPAI, open-weight i transparentność Jeśli używasz modeli, AI Act dokłada wątek transparentności i dokumentacji (zwłaszcza dla GPAI). Tu zazębia się to z [Suwerennym AI](/blog/suwerenne-ai-open-weight): lokalna brama modelu daje naturalny punkt, w którym powstaje ślad zapytań i odpowiedzi, a wybór modelu open-weight ułatwia wykazanie lineage (co, na czym, z jakimi danymi). Suwerenność i zgodność z AI Act często prowadzą do tej samej decyzji architektonicznej. ## Praktyka: zgodność jako właściwość platformy Tak jak przy [DORA](/blog/dora-w-praktyce-platformy), najmocniejszy wniosek jest ten sam: nie buduj „zgodności z AI Act" jako osobnego procesu obok platformy. Wbuduj ją w platformę — jako polityki, ślad, prowienancję i progi ryzyka, które i tak są potrzebne do bezpiecznej autonomii. Wtedy zgodność jest produktem ubocznym dobrze zaprojektowanego ADP, a nie dodatkowym obciążeniem. ## Podsumowanie AI Act i agentowy SDLC nie są w konflikcie — opisują tę samą rzecz z dwóch stron. Regulacja mówi „musi być nadzór, ślad, transparentność i zarządzanie ryzykiem"; dobra platforma agentowa mówi „bez tego autonomia jest niebezpieczna". Deterministyczny szkielet ADP jest więc jednocześnie systemem bezpieczeństwa i warstwą zgodności. Im wcześniej go zbudujesz, tym mniej będzie bolał każdy kolejny termin z kalendarza AI Act. Potraktuj tę regulację nie jak biurokrację do odhaczenia, lecz jak listę kontrolną dobrej platformy agentowej — i tak ją odhaczysz przy okazji. --- # DORA w praktyce platformy: testowalne strategie wyjścia URL: https://eiac.dev/blog/dora-w-praktyce-platformy Filar: Security-as-Code Data: 2026-04-03 Tagi: dora, sovereignty, compliance, gitops, eu Skrót: DORA zamienia strategię wyjścia z dokumentu w udowadnialną zdolność operacyjną. Jak warstwy platformy — IaC, GitOps, policy-as-code — przekładają się wprost na zgodność. W [Suwerennym IDP](/blog/suwerenny-idp-exit-by-design) pokazałem, że „exit-by-design" czyni strategię wyjścia funkcją techniczną. Dla sektora finansowego w UE to już nie jest dobra praktyka — to wymóg prawny. **[DORA](https://eur-lex.europa.eu/eli/reg/2022/2554/oj)** (Digital Operational Resilience Act) zamienia odporność operacyjną z deklaracji w coś, co trzeba *udowodnić i przetestować*. Zobaczmy, jak warstwy platformy — IaC, GitOps, policy-as-code — przekładają się wprost na zgodność.
Teza

DORA nie pyta „czy macie dokument strategii wyjścia?". Pyta „czy potraficie ją wykonać bez przerwania działania?". To czyni z odporności właściwość architektury, nie segregatora.

Uwaga

To analiza techniczna, nie porada prawna. Zakres i interpretacja DORA zależą od podmiotu i nadzorcy — tu patrzymy wyłącznie na konsekwencje dla architektury platformy.

## Co DORA wymaga (w skrócie technicznym) DORA obowiązuje podmioty finansowe i ich dostawców ICT. Z perspektywy platformy liczą się przede wszystkim: - **Mapowanie zależności ICT** — musisz wiedzieć (i umieć wykazać), od jakich dostawców i komponentów zależysz. - **Ryzyko koncentracji (CTPP)** — zakaz nadmiernej zależności od jednego krytycznego dostawcy ICT (critical third-party provider). - **Testowalne strategie wyjścia** — utrzymywane i *przetestowane* ścieżki migracji bez zakłócenia działania. - **Odporność operacyjna i testowanie** — zdolność do przetrwania i odtworzenia po incydencie. Kluczowe: nie wystarczy strategię *opisać*. Trzeba mieć **operacyjną zdolność** jej wykonania. A tę da się zbudować tylko przez fundamentalne odsprzężenie wytwarzania i dostarczania od konkretnego dostawcy infrastruktury. ## Mapowanie wymogów na warstwy platformy | Wymóg DORA | Mechanizm platformy | |---|---| | Mapowanie zależności ICT | wszystko-jako-kod w repo → zależności są jawne i audytowalne | | Unikanie koncentracji CTPP | multi-cloud przez abstrakcję IaC + framework-agnostyczna orkiestracja | | Testowalna strategia wyjścia | GitOps jako odtwarzalny stan → DR = wskazanie kontrolerowi nowego klastra | | Dowody zgodności | policy-as-code jako bramki + ślad audytowy z Gita | | Odporność/odtwarzanie | środowiska deklaratywne, reprodukowalne z repo | ## Abstrakcja IaC: warunek unikania koncentracji Ryzyka koncentracji nie da się ograniczyć, jeśli wdrożenie jest „zapieczone" w API jednego dostawcy. Dlatego infrastrukturę definiujesz w sposób cloud-agnostyczny — przez [OpenTofu](/katalog/opentofu) (lub [Terraform](/katalog/terraform)) z modułami, które da się skierować na różnych dostawców: ```hcl # moduł sieci wołany dla różnych dostawców z tego samego kodu module "vpc" { source = "git::https://git.eiac.dev/eiac/modules.git//network?ref=v1.4.0" provider = var.target # sovereign-eu | global-aws cidr = "10.0.0.0/16" } ``` Ten sam moduł, dwa cele wdrożenia — to techniczny fundament tezy „nie jesteśmy nadmiernie zależni od jednego dostawcy". Multi-cloud przestaje być hasłem, a staje się weryfikowalną własnością kodu. ## GitOps: strategia wyjścia, którą da się wykonać Skoro cały stan systemu żyje jako kod, „wyjście" przestaje być projektem migracyjnym, a staje się operacją. Kontroler GitOps ([Argo CD](/katalog/argo-cd) / [Flux](/katalog/flux)) odtwarza środowisko z repozytorium na dowolnym zgodnym klastrze:
katastrofa / nakaz wyjścia provisioning klastra u innego dostawcy Argo CD → reconcile z repo środowisko odtworzone tofu apply
Exit = DR jako operacja: provisioning u innego, suwerennego dostawcy, skierowanie kontrolera GitOps na nowy klaster i odtworzenie środowiska z repo.
To jest sedno „testowalnej strategii wyjścia": skoro DR i exit to ta sama operacja (re-point kontrolera + reconcile), możesz ją **przećwiczyć** — a przećwiczona migracja to dokładnie to, czego DORA wymaga. Na [Kubernetes](/katalog/kubernetes) (lub lekkim [k3s](/katalog/k3s) na zapasowej lokacji) odtworzenie jest powtarzalne i mierzalne. ## Dowody zgodności jako kod DORA wymaga wykazywania zgodności. Zamiast ręcznych audytów, czynisz reguły maszynowo egzekwowalne i samodokumentujące — policy-as-code w pipeline (np. [OPA](/katalog/open-policy-agent)). Każde uruchomienie zostawia ślad: co sprawdzono, z jakim wynikiem. ```rego # przykładowa reguła zgodna z wymogiem rezydencji danych package eiac.dora deny contains msg if { input.resource.type == "database" not startswith(input.resource.region, "eu-") msg := "dane regulowane muszą pozostać w regionie UE" } ``` Reguła egzekwowana w CI (i ślad z Gita) jest jednocześnie kontrolą i dowodem — bez osobnego procesu audytowego. ## Granica: czego platforma nie załatwi Uczciwie: platforma spełnia *techniczną* część DORA. Reszta — rejestr informacji o dostawcach, raportowanie incydentów do nadzorcy, testy odporności (w tym TLPT dla większych podmiotów), zarządzanie ryzykiem na poziomie organizacji — to procesy i obowiązki wykraczające poza kod. Architektura jest warunkiem koniecznym zgodności, nie wystarczającym. ## Podsumowanie DORA przesuwa ciężar z „opisz strategię wyjścia" na „udowodnij, że ją wykonasz". Everything-as-code daje mapę zależności, abstrakcja IaC ogranicza koncentrację, GitOps czyni z exitu rutynową operację, a policy-as-code dostarcza dowodów. To nie przypadek, że to ta sama architektura, którą opisałem jako suwerenną — odporność i suwerenność wyrastają z tego samego korzenia. Uczciwie: sam kod nie załatwi zgodności w całości; rejestr dostawców, raportowanie incydentów i procesy to wciąż robota ludzi. Ale bez tej architektury reszta nie ma się na czym oprzeć. W kolejnej części patrzę na drugą wielką regulację: [AI Act a agentowy SDLC](/blog/ai-act-a-agentowy-sdlc). --- # Suwerenny IDP: exit-by-design jako architektura URL: https://eiac.dev/blog/suwerenny-idp-exit-by-design Filar: Infrastructure-as-Code Data: 2026-03-30 Tagi: platform-engineering, sovereignty, gitops, iac, eu Skrót: Suwerenność to nie miejsce przechowywania danych, lecz przenośność workflowów. Jak everything-as-code i GitOps zamieniają strategię wyjścia z dokumentu w funkcję techniczną. W [wprowadzeniu](/blog/platform-engineering-normalizacja-pracy) platforma była sposobem na uspójnienie pracy. Tu dochodzi drugi wymiar, równie strukturalny: **suwerenność** — zdolność organizacji do działania niezależnie od nacisków prawnych, handlowych czy geopolitycznych. Teza, którą rozwijam, jest prosta i niewygodna: o suwerenności nie decyduje to, *gdzie* leżą dane, lecz *czy potrafisz przenieść swoje workflowy* gdzie indziej, gdy przyjdzie potrzeba. Brzmi abstrakcyjnie? Do czasu, aż dostawca zmieni cennik albo licencję i nagle „gdzie leżą dane" przestaje być Twoim największym problemem.
Teza

Data residency to nie to samo co suwerenność. Suwerenność jest własnością przenośności procesu, a jej technicznym nośnikiem jest „everything-as-code" — przesunięcie źródła zaufania z vendora do Twoich repozytoriów Git.

## Legal sandwich: dlaczego residency nie wystarcza Współczesne przedsiębiorstwo działa w „prawnej kanapce": sprzeczne jurysdykcje potrafią się wykluczać. Klasyczny przykład to napięcie między amerykańskim [CLOUD Act](https://en.wikipedia.org/wiki/CLOUD_Act) (który może zmusić firmę z USA do wydania danych niezależnie od tego, gdzie fizycznie leżą) a unijnym [RODO](https://eur-lex.europa.eu/eli/reg/2016/679/oj) (które takiego transferu zakazuje). Dostawca z USA przechowujący dane w Paryżu czy Frankfurcie i tak jest „w środku" — a wraz z nim jego klient. Z tego płynie wniosek, który zmienia projektowanie platform: jeśli VCS, orkiestrator wdrożeń, dostawca tożsamości i asystent AI podlegają obcej jurysdykcji, to infrastruktura spełniająca data residency daje **tylko częściową suwerenność**. Każdy komponent platformy trzeba poddać tej samej ocenie, co warstwę infrastruktury. ## Pięć planes: architektura zamiast warstw Suwerenny IDP projektuje się jako **planes** (płaszczyzny) — wymienne, komponowalne zdolności łączone przez standardowe API — a nie sztywne warstwy o monolitycznej zależności. Ta komponowalność jest fundamentem strategii wyjścia. - **Developer Control Plane** — portal, IDE/CDE i suwerenne AI; punkt wejścia ukrywający złożoność. - **Integration & Delivery Plane** — silnik mechaniczny: VCS ([Gitea](/katalog/gitea)/Forgejo), CI runners, orkiestrator i GitOps ([Argo CD](/katalog/argo-cd)/[Flux](/katalog/flux)). - **Resource Plane** — compute/sieć/storage u dostawców suwerennych i globalnych (świadomie pofragmentowane, by ograniczyć ryzyko jednego dostawcy). - **Security Plane** — lokalna tożsamość, sekrety i polityki (rozwijamy w [Security Plane](/blog/security-plane-sekrety-tozsamosc-policy)). - **Observability Plane** — metryki, logi, tracing oraz FinOps/GreenOps. Każda płaszczyzna jest wymienna — to czyni „exit" wykonalnym, a nie życzeniowym. ## Everything-as-code + GitOps = exit-by-design Sercem podejścia jest bezkompromisowe egzekwowanie „everything-as-code". Definiując całą infrastrukturę — od load balancerów u dostawcy suwerennego po bucket S3 u globalnego — w deklaratywnym kodzie, traktujesz ją jako jednorazową i odtwarzalną. Wybór narzędzia ma tu znaczenie: ze względu na ryzyko zmian licencyjnych warto trzymać się silnika otwartego i fundacyjnego, jak [OpenTofu](/katalog/opentofu) (drop-in zamiennik [Terraform](/katalog/terraform) pod Linux Foundation) — wątek licencji rozwijamy w [Open source ≠ suwerenność](/blog/open-source-a-suwerennosc). GitOps jest operacyjną ramą, która to spina: self-hostowany VCS jest jedynym źródłem prawdy dla kodu aplikacji **i** konfiguracji infrastruktury, a kontroler (np. Argo CD) nieustannie uzgadnia stan rzeczywisty z zadeklarowanym. ```yaml # Argo CD: aplikacja, której źródłem prawdy jest repo na Gitei apiVersion: argoproj.io/v1alpha1 kind: Application metadata: { name: web, namespace: argocd } spec: project: default source: repoURL: https://git.eiac.dev/eiac/deploy.git path: clusters/sovereign-eu/web targetRevision: main destination: server: https://kubernetes.default.svc namespace: web syncPolicy: automated: { prune: true, selfHeal: true } ``` Konsekwencja jest mocna: skoro cały stan biznesu jest opisany jako kod w repo, to **disaster recovery (i exit) sprowadza się do wskazania kontrolerowi nowego klastra** u innego, suwerennego dostawcy i pozwolenia mu odtworzyć środowisko od zera. Strategia wyjścia przestaje być dokumentem w segregatorze, a staje się rutynowo wykonywaną operacją. ## Air-gapped: ostateczny test suwerenności Dla obronności i części finansów połączenie z jakimkolwiek publicznym internetem (nawet suwerennym) bywa wykluczone. Zdolność do działania w pełni odizolowanym środowisku air-gapped to najtwardszy sprawdzian: jeśli platforma opiera się na self-hostowanych control planes, własnym rejestrze obrazów i otwartej orkiestracji, całość da się postawić w odciętym data center. To samo, co daje suwerenność, daje też odporność na odcięcie. ## Macierz walidacji: jak sprawdzić, czy jesteś suwerenny Praktyczny test sprowadza się do trzech domen i kilku pytań, na które trzeba odpowiedzieć „tak": | Domena | Pytanie kontrolne | |---|---| | Infrastruktura i dane | Czy IaC jest otwarte i wolne od restrykcyjnych licencji (OpenTofu vs proprietary)? Czy dane leżą wyłącznie w wybranej jurysdykcji, a dostawca jest odporny na eksterytorialne żądania? | | Tooling i control plane | Czy VCS jest self-hostowany? Czy orkiestrator jest framework-agnostyczny (wdraża i do suwerennych, i globalnych bez vendor-specyficznych wtyczek)? Czy sekrety/IAM są self-hostowane, nie w natywnym KMS chmury? | | AI i własność intelektualna | Czy asystenci AI/LLM są hostowani lokalnie/suwerennie? Czy masz gwarancję, że kod i telemetria nie zasilają obcych modeli? (rozwijamy w [Suwerenne AI](/blog/suwerenne-ai-open-weight)) | ## Kontekst UE: nie tylko RODO Ruch w stronę suwerenności napędzają konkretne ramy: **[NIS2](https://digital-strategy.ec.europa.eu/en/policies/nis2-directive)** (cyberbezpieczeństwo w 18 sektorach krytycznych), **[EU Data Act](https://digital-strategy.ec.europa.eu/en/policies/data-act)**, inicjatywy jak [SecNumCloud](https://cyber.gouv.fr/enjeux-technologiques/cloud/) (Francja), [Gaia-X](https://gaia-x.eu/) czy [EU Cloud Rulebook](https://digital-strategy.ec.europa.eu/en/policies/cloud-computing). Najtwardsze wymogi techniczne stawia jednak **[DORA](https://eur-lex.europa.eu/eli/reg/2022/2554/oj)** wobec sektora finansowego — mapowanie zależności ICT, unikanie nadmiernej koncentracji u jednego dostawcy i utrzymywanie *przetestowanych* strategii wyjścia. Temu poświęcamy osobną część: [DORA w praktyce platformy](/blog/dora-w-praktyce-platformy). ## Podsumowanie Suwerenny IDP to nie „chmura w UE", lecz architektura, w której każda płaszczyzna jest wymienna, a cały stan żyje jako kod w repozytorium pod Twoją kontrolą. Wtedy „exit" przestaje być ryzykiem do opisania w dokumencie, a staje się właściwością systemu — wykonywaną tak samo, jak każde inne wdrożenie. To również fundament, na którym da się spełnić wymogi DORA i bezpiecznie osadzić AI — co rozwijam w kolejnych częściach serii. Zrób sobie ten jeden test: gdyby jutro trzeba było przenieść wszystko do innego dostawcy, ile z tego pojedzie jednym `apply`? Odpowiedź mówi o Twojej suwerenności więcej niż jakikolwiek certyfikat. --- # Deterministyczny szkielet platformy agentowej URL: https://eiac.dev/blog/deterministyczny-szkielet-adp Filar: SDLC / Policy-as-Code Data: 2026-03-23 Tagi: platform-engineering, policy-as-code, ci, security, agents Skrót: Nieprzewidywalną moc modeli zamienia w audytowalny wynik deterministyczny szkielet: walidacja-pętla, policy-as-code jako bramka, środowiska efemeryczne i tożsamość nie-ludzka. W [poprzedniej części](/blog/cztery-poziomy-agentowego-wytwarzania) napisałem, że walidacja zmienia się z bramki w pętlę, a policy-as-code staje się nieodzowne. No dobra, deko mięcha — rozłóżmy to na części: co konkretnie w deterministycznej warstwie platformy musi się zmienić, by agenci mogli generować zmiany seriami, bezpiecznie i bez zatkania systemu.
Teza

Bezpieczeństwo agentów nie wynika z tego, że model jest mądry. Wynika z tego, że każdy artefakt — niezależnie od autora — musi przejść przez te same, maszynowo egzekwowane bramki, zanim ruszy dalej.

## Walidacja przestaje być bramką, staje się pętlą W świecie ludzkim walidacja to przystanek: deweloper składa PR, CI uruchamia testy, recenzent ogląda zmianę. Gdy agenci produkują PR-y równolegle, ten model się załamuje — pojedynczy checkpoint natychmiast staje się wąskim gardłem. Rozwiązaniem jest pętla: gdy walidacja zawodzi, sygnał błędu wraca do agenta, który poprawia implementację i próbuje ponownie. Cykl powtarza się, aż artefakt spełni wymagania.
agent PR CI: testy · skany · polityki kandydat gotowy fail → opis błędu wraca do agenta pass popraw model agenta: kontekst · reguły · testy
Pętla walidacji — niepowodzenie wraca do agenta (ponów), a powtarzalne błędy poprawiają jego model działania, by ta sama klasa błędu nie wracała.
Aspiracja jest zaskakująca: **faza weryfikacji powinna stać się nudna**. Zanim zmiana dotrze do walidacji, powinna niemal zawsze przechodzić. Jeśli nie przechodzi, to sygnał, że trzeba poprawić *model działania agenta* (kontekst, reguły, oczekiwania testowe), a nie tylko tę jedną zmianę. Walidacja przestaje być pasywną siatką bezpieczeństwa, a staje się mechanizmem, który wypycha rozwiązywanie defektów w górę procesu. ## Trzy konsekwencje pętli walidacji **1. Presja na pojemność CI.** Agenci iterują znacznie agresywniej niż ludzie — powtarzają, aż przejdzie, i uruchamiają szersze zestawy weryfikacji. To oznacza więcej przebiegów pipeline'u, więcej środowisk efemerycznych i potencjalnie dramatycznie wyższe zużycie compute. Źle zaprojektowane CI potrafi rosnąć kosztowo szybciej niż przyrost produktywności. Stąd waga cache'owania, przenośnych kroków (np. [Dagger](/katalog/dagger)) i szybkich, jednorazowych klastrów ([kind](/katalog/kind)) zamiast ciężkich, długowiecznych środowisk. **2. Weryfikacja musi wyjść poza testy jednostkowe.** Same unit testy nie zastąpią osądu recenzenta. Organizacje poszerzają deterministyczną weryfikację o scenariusze e2e, testy wydajności, analizę zależności i licencji oraz kontrolę integralności środowiska. Na froncie często dominuje weryfikacja zachowania (deploy preview, a nawet agenci „usability" robiący zrzuty/nagrania); backend wymaga twardszych dowodów (scenariusze, regresje czasu startu, polityki bezpieczeństwa). **3. Bezpieczeństwo i polityki muszą być automatyczne.** Przy wolumenie zmian generowanych maszynowo ręczny przegląd bezpieczeństwa nie skaluje się. Skany podatności, wykrywanie sekretów, kontrola zgodności — wszystko to musi być częścią pętli walidacji, nie audytem po wdrożeniu. ## Policy-as-code jako deterministyczna bramka Najważniejsza zasada: polityki na artefaktach IaC (plany [Terraform](/katalog/terraform)/[OpenTofu](/katalog/opentofu), manifesty [Kubernetes](/katalog/kubernetes), charty [Helm](/katalog/helm)) muszą działać jako **bramki w CI**, a nie audyty po fakcie. Narzędzia jak [OPA](/katalog/open-policy-agent), [Kyverno](/katalog/kyverno) czy [Checkov](/katalog/checkov) przestają być dodatkiem, a stają się obowiązkowym krokiem. Przykład — test konfiguracji przez [Conftest](/katalog/conftest) (silnik OPA/Rego) jako krok pipeline: ```rego # policy/deployment.rego package main deny contains msg if { input.kind == "Deployment" not input.spec.template.spec.securityContext.runAsNonRoot msg := "kontener musi działać jako non-root (runAsNonRoot: true)" } ``` ```yaml # krok w CI (Gitea Actions / dowolne) — twarda bramka - run: conftest test k8s/ --policy policy/ - run: checkov -d infra --soft-fail-on LOW - run: trivy config infra --exit-code 1 --severity HIGH,CRITICAL ``` Dlaczego to akurat teraz „non-negotiable"? Bo skodyfikowane, maszynowo egzekwowalne reguły są warunkiem bezpiecznego przejścia z Poziomu 2 na 3: **jakość warstwy polityk wprost wyznacza, ile autonomii możesz bezpiecznie przyznać agentom.** W klastrze te same reguły można egzekwować w czasie wdrożenia przez [OPA Gatekeeper](/katalog/gatekeeper) lub [Kyverno](/katalog/kyverno) (admission control; Kyverno trzyma polityki w YAML, bez osobnego języka), a statycznie w CI przez [Conftest](/katalog/conftest) — ta sama intencja, różne warstwy. Dodatkowy niuans kolejności: AI-asystowany przegląd kodu działa najlepiej **wcześnie** w pętli — automatyczny recenzent generuje uwagi, zanim spojrzy na to człowiek, a agent od razu je wchłania. Do walidacji trafia więc artefakt, w którym usterki mechaniczne są już rozwiązane. ## Środowiska efemeryczne: izolacja i dowód Skoro wiele zmian biegnie równolegle, nie mogą sobie nawzajem deptać po środowiskach. Stąd **środowiska efemeryczne** — tworzone na żądanie, jednorazowe, izolowane. Na froncie służą jako deploy preview (recenzent ogląda działającą funkcję, nie kod); na backendzie jako miejsce, gdzie biegną scenariusze e2e. ```yaml # efemeryczny klaster do walidacji w CI, kasowany po teście - run: kind create cluster --name pr-${PR_NUMBER} - run: kubectl apply -k overlays/ci - run: npm run test:e2e - run: kind delete cluster --name pr-${PR_NUMBER} ``` Klucz: środowisko jest dowodem. Walidacja ma wyprodukować dowód na tyle mocny, by zastąpić ręczne czytanie diffów — a efemeryczny, czysty klaster ([kind](/katalog/kind), a dla cięższych przypadków [k3s](/katalog/k3s)) daje powtarzalny punkt odniesienia. ## Tożsamość nie-ludzka i granice działania Gdy agent „wysyłany jest do pracy", musi działać z własną, ograniczoną tożsamością — nie z poświadczeniami człowieka. To warunek audytu („kto/co to zrobił") i ograniczenia promienia rażenia. Wzorce: - **Tożsamość nie-ludzka** dla agenta z wąskim zakresem uprawnień (co wolno dotknąć), brokerowana przez niezależny IdP (np. [Dex](/katalog/dex)). - **Krótkożyciowe poświadczenia** zamiast statycznych sekretów — pobierane dynamicznie z [Vault](/katalog/vault)/[OpenBao](/katalog/openbao), nigdy zaszyte w repo. - **Izolacja workspace** dla równoległych przebiegów, by nie kolidowały. - **Provenance** artefaktów — podpisywanie wydań/commitów (np. bezkluczowo przez [gitsign](/katalog/gitsign)), by dało się udowodnić, skąd pochodzi zmiana. Rozwijamy te wzorce w artykule [Security Plane](/blog/security-plane-sekrety-tozsamosc-policy); tu istotne jest jedno: bez tożsamości nie-ludzkiej autonomia agentów jest nieaudytowalna, a więc nie do utrzymania w organizacji pod nadzorem. ## Mapowanie na pętlę OODA Wszystko to wraca do pętli z [wprowadzenia](/blog/platform-engineering-normalizacja-pracy). Deterministyczny szkielet nie spowalnia pętli — on pozwala ją *bezpiecznie* przyspieszyć: polityki i walidacja to „orientacja" (wspólny model, co wolno), środowiska efemeryczne to tani, powtarzalny „test działania", a obserwowalność i audyt domykają sprzężenie. Im mocniejszy szkielet, tym ciaśniejszą pętlę można powierzyć maszynie. ## Podsumowanie Deterministyczny szkielet to nie biurokracja spowalniająca agentów — to system bezpieczeństwa, który w ogóle umożliwia ich pracę na skalę. Walidacja-pętla, policy-as-code jako bramka, środowiska efemeryczne i tożsamość nie-ludzka zamieniają nieprzewidywalną moc modeli w przewidywalny, audytowalny wynik. To również dokładnie ta warstwa, której domagają się regulacje — [DORA](https://eur-lex.europa.eu/eli/reg/2022/2554/oj) i [AI Act](https://digital-strategy.ec.europa.eu/en/policies/regulatory-framework-ai) — co rozwijam w częściach o [DORA w praktyce](/blog/dora-w-praktyce-platformy) i AI Act. Bez tej warstwy cała reszta to życzenie, nie system — i żaden model tego za Ciebie nie załata. --- # Cztery poziomy agentowego wytwarzania oprogramowania URL: https://eiac.dev/blog/cztery-poziomy-agentowego-wytwarzania Filar: SDLC / Policy-as-Code Data: 2026-03-17 Tagi: platform-engineering, agents, adp, value-stream, ai Skrót: Dojrzałość agentowa to nie ilość AI, lecz zmiana, kto inicjuje pracę. Poziomy 0–4, model paths-to-outcomes i to, jak walidacja zamienia się w pętlę. W poprzedniej części ([Od IDP do ADP](/blog/od-idp-do-adp)) ustaliłem, że przewagą nie jest model, lecz deterministyczny szkielet platformy. Ale „agentowość" to nie przełącznik wł./wył. — i tu robi się ciekawie. To **kontinuum dojrzałości**, w którym zmienia się jedno: kto inicjuje pracę i jak głęboko platforma domyka pętlę bez człowieka. Rozłóżmy je na pięć poziomów (0–4), używając modelu „paths-to-outcomes".
Klucz

Poziomy różnią się nie liczbą użytego AI, lecz stopniem zaangażowania człowieka: is → in → on → orchestrator → poza pętlą. Im niżej możesz bezpiecznie zejść, tym wyższa przepustowość — ale „bezpiecznie" zależy od jakości platformy.

## Model: ścieżki w strumieniu wartości Niezależnie od narzędzi, strumień wartości „dostarcz funkcję" składa się z powtarzalnych ścieżek: | Ścieżka | Typowe wejście | Wyjście | |---|---|---| | Zdobądź kontekst | ticket, issue, zgłoszenie | kontekst do pracy | | Zmień (implement) | tworzenie kodu | kandydacka zmiana / commit | | Zweryfikuj (validate) | zmiana / PR | zweryfikowany artefakt lub błąd | | Promuj (promote) | zweryfikowany artefakt | zatwierdzony do wdrożenia | | Wdróż (deploy) | artefakt wydania | działający system | | Obserwuj (observe) | sygnały runtime | telemetria, widoczność | | Napraw (remediate) | alert | przywrócony stan | Ta struktura jest stabilna — i to czyni ją użyteczną: pozwala rozmawiać o platformie niezależnie od konkretnego CI czy chmury. Poziomy agentowe to opis tego, jak te ścieżki się zmieniają. ## Poziom 0: człowiek jest pętlą Punkt wyjścia: działający IDP, zero agentów. Człowiek pisze kod, a deterministyczna platforma wspiera wykonanie, wdrożenie i testy. Zysk rośnie liniowo, ograniczeniem jest przepustowość ludzi. To nie jest „poziom agentowy" — to fundament, który (jak pisaliśmy w [Od IDP do ADP](/blog/od-idp-do-adp)) jest tą samą pracą, co budowa ADP. ## Poziom 1: człowiek w pętli Agent wchodzi do edytora jako asystent. Zmieniają się dwie ścieżki: **zdobądź kontekst** (agentowe wyszukiwanie, wyjaśnianie komponentów) i **zmień** (generowanie kodu z promptu). Reszta systemu jest nietknięta — kod nadal idzie przez PR, CI dalej waliduje, człowiek akceptuje lub odrzuca każdą propozycję. To lokalne usprawnienie, nie zmiana strukturalna. Zysk jest realny, ale ograniczony — bo wąskim gardłem pozostaje przepustowość ludzkiego przeglądu. Wartość tego poziomu: osłania przed halucynacją (człowiek filtruje) i jest łatwy do wdrożenia. ## Poziom 2: człowiek na pętli Najbardziej fundamentalny przeskok. Agent przestaje być prywatnym narzędziem w edytorze, a staje się **uczestnikiem strumienia wartości**. Człowiek nadal „wysyła agenta" do pracy (to on jest wyzwalaczem i ponosi odpowiedzialność), ale wiele zadań biegnie równolegle w tle. Pojawia się **nowa ścieżka: „dispatch work to agents"** — warstwa, która zamienia ludzkie zlecenia w wykonywalne zadania agentowe z odpowiednim kontekstem, tożsamością i granicami. Typowe wejścia to nie „wymagania" w sensie SDLC, lecz zlecenia: „zbadaj ten alert z Sentry", „zrób pierwszą wersję z tego ticketu", „oskryptuj komponent z tego zrzutu ekranu". Jeden człowiek może uruchomić kilka agentów naraz, a potem zdecydować, co awansować. Drugą, najbardziej niedocenianą zmianą jest to, że **walidacja staje się pętlą**:
agent PR CI: testy · skany · polityki kandydat gotowy fail → poprawka, ponów pass
Walidacja jako pętla — przy niepowodzeniu sygnał wraca do agenta, który poprawia i ponawia.
Walidacja przestaje być bramką, przez którą przechodzi człowiek, a staje się przemysłowym sprzężeniem zwrotnym: agent powtarza próby, aż artefakt spełni wymagania platformy. To rodzi trzy konsekwencje, którym poświęcamy osobny artykuł ([Deterministyczny szkielet platformy agentowej](/blog/deterministyczny-szkielet-adp)): presję na pojemność CI, konieczność poszerzenia weryfikacji poza testy jednostkowe, oraz **policy-as-code jako nieodzowną, automatyczną bramkę** (np. [OPA](/katalog/open-policy-agent)/[Conftest](/katalog/conftest), [Checkov](/katalog/checkov), [Trivy](/katalog/trivy)). Promocja też się zmienia: człowiek nie czyta każdego diffa, lecz **weryfikuje zachowanie** (deploy preview, dowody z testów) i priorytetyzuje, co scalić. Na froncie często wystarczy podgląd w środowisku efemerycznym; backend wymaga twardszych, deterministycznych dowodów (scenariusze e2e, testy wydajności, polityki bezpieczeństwa). ## Poziom 3: człowiek jako orkiestrator Platforma zaczyna działać jako **ciągła warstwa wykonawcza w tle**. Praca nie wchodzi już tylko przez zlecenia człowieka — to platforma generuje ją z zaobserwowanych wzorców: nawracających anomalii, aktualizacji zależności, regresji wydajności, zaległości wykrytych analizą. Ścieżka „dispatch" rozrasta się w warstwę koordynacji całego ekosystemu agentów: harmonogramowanie, koordynacja wielu agentów na powiązanych obszarach, **wykrywanie konfliktów** gdy zmiany się nakładają. Ścieżka „obserwuj" staje się głównym źródłem sygnałów napędzających pracę. Przegląd człowieka staje się **wyjątkowy** — wkracza, gdy walidacja daje wynik niejednoznaczny lub zmiana jest wysokiego ryzyka. Pojawia się **promocja oparta na regule** — klasyfikacja ryzyka decyduje, co może iść automatycznie: ```yaml # polityka promocji oparta na ryzyku (pseudo-konfiguracja) promotion: auto: when: - change_class: ["dependency-patch", "config-tweak", "docs"] - validation: all-green - blast_radius: low human_review: when: - change_class: ["schema-migration", "iam", "public-api"] - blast_radius: ["medium", "high"] ``` Człowiek przestaje zatwierdzać pojedyncze zmiany — zaczyna **projektować reguły**, według których zmiany awansują. Ograniczenie przesuwa się z przepustowości przeglądu na dojrzałość architektury i ekonomię tokenów. Co istotne: bardzo niewiele organizacji jest dziś w pełni na poziomie 3 — częściej dla części frontendowej. ## Poziom 4: pełna autonomia (zarys) Logiczny kraniec trajektorii. Agenci **nie czekają już na zlecenia** — inicjują pracę w reakcji na sygnały środowiska (telemetria, zachowanie klientów, anomalie kosztów, alerty bezpieczeństwa), w granicach zdefiniowanych przez platformę. Ścieżka „napraw" staje się **samonaprawcza**: klasyfikacja incydentu dopasowuje znany wzorzec/playbook, a auto-remediacja wykonuje naprawę lub rollback bez człowieka; ludzie zajmują się tylko nowymi lub wysokoryzykownymi przypadkami, a każda naprawa poszerza bibliotekę wzorców. To, co Poziom 4 odblokowuje, jest jakościowo nowe: ciągły refactoring na dużą skalę, proaktywna remediacja CVE i dryfu zgodności, adaptacja do popytu, a przede wszystkim **samodoskonaląca się walidacja** — system analizuje własne wzorce porażek i aktualizuje kontekst/testy/reguły, by ta sama klasa błędu nie docierała ponownie do walidacji. Trzeba uczciwie powiedzieć: udokumentowanych wdrożeń Poziomu 4 jest dziś bardzo mało. Większość zespołów jest między 1 a 2, niektóre dotykają 3. Poziom 4 to mniej „praktyka branżowa", a bardziej kierunek — i zestaw ograniczeń architektonicznych, które trzeba spełnić, by autonomia była bezpieczna. ## Jak zmieniają się ścieżki, poziom po poziomie | Ścieżka | L1 | L2 | L3 | L4 | |---|---|---|---|---| | Zdobądź kontekst | wspomagana | dla agentów | ciągła | autonomiczna | | Zmień | wspomagana | wykonywana przez agenta | bez inicjacji człowieka | z sygnałów środowiska | | Zweryfikuj | bramka | **pętla** | wysoki wolumen | krytyczna warstwa kontroli | | Promuj | ręczna | weryfikacja zachowania | reguła (low-risk) | automatyczna | | Obserwuj | jak L0 | źródło zleceń | główne źródło sygnału | warstwa sensoryczna | | Napraw | ręczna | kierowana przez człowieka | częściowo auto | samonaprawcza | | Dispatch | — | **nowa** | koordynacja ekosystemu | inicjacja ze środowiska | ## Co to znaczy w praktyce Awans o poziom to nie „włącz więcej AI", lecz **inwestycja w konkretną zdolność platformy**: z L1 na L2 — kontekst dla agentów, tożsamość nie-ludzka, walidacja jako pętla, polityki jako kod; z L2 na L3 — harmonogramowanie, wykrywanie konfliktów, klasyfikacja ryzyka i auto-promocja; z L3 na L4 — samonaprawa i samodoskonalenie walidacji. Każdy z tych elementów to deterministyczny mechanizm — i właśnie one, nie modele, decydują, jak daleko możesz bezpiecznie zejść z człowiekiem z pętli. ## Podsumowanie Cztery poziomy to mapa, nie drabina do przebiegnięcia na siłę. Pokazują, że dojrzałość agentowa rośnie wraz z dojrzałością deterministycznego szkieletu: im lepsze polityki, walidacja i obserwowalność, tym więcej pętli platforma może domknąć bezpiecznie. W następnej części schodzę do tego szkieletu — pokazuję, jak walidacja-pętla i policy-as-code czynią agentów bezpiecznymi w praktyce. Ustaw sobie szczerze, na którym poziomie jesteś dziś — bo to on wyznacza, ile autonomii możesz bezpiecznie oddać. --- # Od IDP do ADP: platforma w erze agentów URL: https://eiac.dev/blog/od-idp-do-adp Filar: SDLC / Policy-as-Code Data: 2026-03-11 Tagi: platform-engineering, adp, idp, agents, ai Skrót: Gdy część pracy w pętli przejmuje agent, platforma musi się zmienić — z IDP w ADP. Dlaczego przewaga nie leży w lepszym modelu, lecz w systemie produkcyjnym, który go ujarzmia. We [wprowadzeniu do serii](/blog/platform-engineering-normalizacja-pracy) postawiłem tezę, że platform engineering to skracanie organizacyjnej [pętli OODA](https://pl.wikipedia.org/wiki/OODA) — uspójnianie i przyspieszanie drogi od obserwacji do działania. Zobaczmy teraz, co się z tą pętlą dzieje, gdy do gry wchodzą agenci AI: większość pracy przestaje wykonywać człowiek przy klawiaturze, a zaczyna ją wykonywać platforma. To wymusza zmianę samej platformy — z **IDP** (Internal Developer Platform) w **ADP** (Agentic Development Platform).
Teza

To nie wyścig o najlepszy model. Modele to towar o zbieżnych możliwościach. Różnicą jest system produkcyjny, który ujarzmia inteligencję i utrzymuje ją w ryzach — czyli deterministyczny szkielet platformy.

## Dlaczego model to nie wąskie gardło Wydajność modeli na zadaniach inżynierskich (mierzona np. na [SWE-bench](https://www.swebench.com/)) przeszła w ostatnich latach od bliskiej zeru do poziomów porównywalnych z człowiekiem, i wciąż rośnie. Dostęp do mocnego modelu jest dziś kwestią klucza API, nie przewagi. Skoro tak, to przewaga nie może leżeć w „lepszym modelu" — bo ten ma każdy. Z analiz nieudanych wdrożeń AI wyłania się powtarzalny wzorzec: w większości przypadków zawiodły **nie modele, lecz platforma** — brak guardrails, brak deterministycznych bramek, brak miejsca, w którym agent mógłby działać szybko i bezpiecznie. Organizacja, która „dokłada AI" na wierzch starego procesu, dostaje wszystkie wady probabilistyki (halucynacje, niespójność) przy znikomych korzyściach — i wnioskuje, że „to nie dla niej". To samospełniająca się pułapka. Prawdziwy wyścig toczy się więc o coś innego: jak bardzo zrównoleglić i zautomatyzować pracę, nie tracąc kontroli. A to zależy od jakości platformy. ## Probabilistyczne spotyka deterministyczne Architektura zdolna do bezpiecznej pracy z agentami musi połączyć dwa światy o przeciwnej naturze. **Systemy probabilistyczne** — rozumują, generalizują i poprawiają się z kontekstem, ale są nieprzewidywalne: - modele fundamentalne i agenci kodujący, - frameworki koordynacji wielu agentów, - warstwy oceny i ewaluacji zachowań (model-evaluating, behavioral evaluation). **Systemy deterministyczne** — przewidywalne, powtarzalne, audytowalne: - orkiestracja platformy (bezpieczne tworzenie i zmiana zasobów), - jawne granice zdolności i stabilne API, - reprodukowalne pipeline'y CI/CD i **środowiska efemeryczne** do izolacji i weryfikacji, - egzekwowanie polityk, tożsamość i RBAC, - zarządzanie stanem, warstwy semantyczne nad danymi, weryfikacja zależności i licencji, - obserwowalność i ślad audytowy. IDP standaryzuje ścieżki dla ludzi. **ADP czyni te ścieżki wykonywalnymi przez agentów na dużą skalę — a docelowo pozwala agentom uruchamiać je samodzielnie.** To nie jest nowy zestaw narzędzi, lecz nowy kontrakt: deterministyczna część platformy staje się systemem bezpieczeństwa dla części probabilistycznej. ## Złote ścieżki dla ludzi to złote ścieżki dla agentów Najważniejsza praktyczna obserwacja: ścieżki, które dziś budujesz dla developerów, to dokładnie te same ścieżki, które jutro będą wykonywać agenci. Model „paths-to-outcomes" z wprowadzenia (zdobądź kontekst → zmień → zweryfikuj → wypuść → obserwuj → napraw) nie znika — zmienia się tylko to, **kto** i **jak często** go przemierza. Dlatego budowa solidnego IDP nie jest „warunkiem wstępnym" myślenia o agentach — to ta sama praca, widziana przez inną soczewkę. Jeśli ścieżka jest deklaratywna, idempotentna i weryfikowalna automatycznie, agent może po niej iść. Jeśli wymaga ręcznego klikania i wiedzy plemiennej, nie pójdzie po niej ani agent, ani nowy człowiek. Przykład: ta sama bramka polityki (tu w Rego dla [Open Policy Agent](/katalog/open-policy-agent)) chroni zarówno zmianę od człowieka, jak i od agenta — bo działa na artefakcie, nie na intencji autora: ```rego package eiac.deploy # żaden obraz z tagiem :latest nie wejdzie na produkcję deny contains msg if { input.kind == "Deployment" some c in input.spec.template.spec.containers endswith(c.image, ":latest") msg := sprintf("obraz %q ma tag :latest", [c.image]) } ``` Bramka nie pyta „czy to napisał człowiek?". Pyta „czy artefakt spełnia regułę?". To właśnie czyni ją bezpieczną przy wolumenie zmian generowanych maszynowo. ## Co naprawdę się zmienia: pętla, nie narzędzia Struktura platformy pozostaje, ale obciąża się inaczej. Trzy przesunięcia są kluczowe: - **Walidacja z bramki staje się pętlą.** Gdy agent generuje zmiany seriami, weryfikacja nie może być pojedynczym przystankiem — staje się przemysłowym sprzężeniem zwrotnym, w którym agent powtarza próby aż przejdzie. Rozwijamy to w artykule [Deterministyczny szkielet platformy agentowej](/blog/deterministyczny-szkielet-adp). - **Ograniczenie przesuwa się z „szybkości pisania" na „jakość weryfikacji".** Wąskim gardłem nie jest już, jak szybko ktoś pisze kod, lecz jak szybko i wiarygodnie platforma potrafi go sprawdzić. - **Rola człowieka wędruje w górę** — od pisania, przez przegląd, po definiowanie reguł i granic. Te poziomy zaangażowania to temat artykułu [Cztery poziomy agentowego wytwarzania](/blog/cztery-poziomy-agentowego-wytwarzania). ## Dlaczego to dotyczy też zgodności Im więcej pętli domyka maszyna, tym ważniejsze stają się dwie rzeczy, które w świecie czysto ludzkim były „miłe, ale opcjonalne": **nadzór** i **ślad audytowy**. To nie przypadek, że dokładnie tego wymagają regulacje — [DORA](https://eur-lex.europa.eu/eli/reg/2022/2554/oj) (odporność operacyjna, udowadnialne procesy) i [AI Act](https://digital-strategy.ec.europa.eu/en/policies/regulatory-framework-ai) (nadzór człowieka, logowanie, transparentność). Deterministyczny szkielet ADP — polityki jako kod, audyt, RBAC, środowiska efemeryczne — jest tym samym, co spełnia te wymogi. Wrócimy do tego w częściach poświęconych [DORA](/blog/dora-w-praktyce-platformy) i AI Act. ## Podsumowanie Przejście z IDP do ADP nie polega na „dodaniu AI". Polega na wzmocnieniu deterministycznej części platformy tak, by mogła bezpiecznie napędzać część probabilistyczną. Modele są towarem; przewagą jest system produkcyjny, który zamienia ich nieprzewidywalną moc w przewidywalny wynik. W kolejnej części rozkładam ten przeskok na cztery konkretne poziomy dojrzałości — od człowieka piszącego kod po platformę, która sama domyka pętlę. Zapraszam do maszynowni, tam robi się konkretnie. --- # Platform engineering: normalizacja pracy w organizacji URL: https://eiac.dev/blog/platform-engineering-normalizacja-pracy Filar: SDLC / Policy-as-Code Data: 2026-03-05 Tagi: platform-engineering, idp, golden-paths, dx, ooda, wprowadzenie Skrót: Platform engineering to normalizacja pracy — kodowanie osądu raz i stosowanie go wszędzie. Wprowadzenie do serii: korzyści, koszty i moment, w którym platforma ma (lub nie ma) sensu. Przepracowałem dość lat jako admin, potem developer, a teraz devops, żeby oglądać ten sam film w kółko: w każdej organizacji powtarza się ten sam zestaw czynności — zdobądź kontekst, zmień kod, zweryfikuj, wypuść, obserwuj, napraw. Im więcej zespołów i usług, tym częściej te same kroki robi się na dziesiątki nieco różnych sposobów: każdy zespół po swojemu konfiguruje CI, inaczej wdraża, inaczej trzyma sekrety. Ta różnorodność, początkowo niewinna, z czasem staje się podatkiem — od onboardingu, przez bezpieczeństwo, po czas od pomysłu do produkcji. **Platform engineering to dyscyplina, która ten podatek likwiduje przez normalizację** — ujednolicenie i uproduktowienie sposobu, w jaki organizacja buduje, dostarcza i utrzymuje software. To wprowadzenie do serii, w której rozłożymy na czynniki pierwsze, dokąd ta dyscyplina zmierza: ku platformom agentowym i suwerennym, w cieniu regulacji UE.
W skrócie

Platform engineering zamienia powtarzalne czynności inżynierskie w „złote ścieżki" (golden paths) — domyślne, samoobsługowe, bezpieczne drogi od kodu do produkcji. Korzyść to spójność i prędkość; koszt to budowa oraz utrzymanie samej platformy.

## Czym jest platform engineering Platform engineering to projektowanie i utrzymywanie wewnętrznej platformy (często nazywanej **IDP** — Internal Developer Platform) traktowanej jak produkt, którego klientami są inżynierowie organizacji. Zamiast pojedynczego zespołu walczącego z infrastrukturą przy każdym projekcie, wydzielony zespół platformowy dostarcza gotowe, wspierane „drogi", z których reszta korzysta samoobsługowo. Dwie idee są tu kluczowe: - **Platforma jako produkt** — ma użytkowników, roadmapę, wsparcie i metryki adopcji. Nie jest zbiorem skryptów „bo ktoś kiedyś napisał", lecz świadomie utrzymywanym narzędziem. - **Redukcja obciążenia poznawczego** — deweloper nie musi znać dziesięciu chmurowych API, polityk bezpieczeństwa i niuansów wdrożeń, żeby wypuścić zmianę. Platforma chowa tę złożoność za prostym interfejsem. W języku [Team Topologies](https://teamtopologies.com/): zespoły „stream-aligned" (dostarczające wartość) korzystają z usług zespołu platformowego, by zmniejszyć liczbę rzeczy, które muszą trzymać w głowie naraz. ## Normalizacja pracy: złote ścieżki Sercem platform engineeringu jest **golden path** — utwardzona, domyślna droga zrobienia czegoś dobrze. „Chcesz nową usługę? Oto szablon: repo, pipeline, wdrożenie, monitoring i polityki bezpieczeństwa już skonfigurowane." Zamiast zaczynać od pustej kartki, zaczynasz od sprawdzonego standardu — a odstępstwa są możliwe, ale świadome. Normalizacja działa na kilku poziomach jednocześnie: - **Self-service zamiast ticketów** — portal lub CLI, w którym deweloper sam zamawia środowisko, bazę czy nową usługę, zamiast czekać na zgłoszenie do innego zespołu. - **Everything-as-code** — infrastruktura, konfiguracja, polityki i pipeline'y jako wersjonowany kod w repozytorium, a nie ręczne klikanie w konsolach. - **Spójne bramki jakości** — te same testy, skany bezpieczeństwa i reguły zgodności na każdej ścieżce, egzekwowane automatycznie. Efekt: dwie różne usługi w organizacji powstają, wdrażają się i są monitorowane w ten sam, przewidywalny sposób. To właśnie jest „normalizacja pracy". ## Pętla OODA: dlaczego normalizacja daje przewagę Żeby zrozumieć, *dlaczego* normalizacja przekłada się na realną przewagę, a nie tylko porządek, warto sięgnąć po model spoza IT — [pętlę OODA](https://pl.wikipedia.org/wiki/OODA). Opracował ją na przełomie lat 70. i 80. XX wieku John Boyd, pułkownik USAF, początkowo by wyjaśnić, czemu amerykańscy piloci wygrywali pojedynki powietrzne w Korei mimo teoretycznie nie lepszych maszyn. Odpowiedź: **szybciej domykali cykl decyzyjny niż przeciwnik**. OODA to cztery przeplatające się — zwykle równoległe — fazy adaptacyjnego podejmowania decyzji: - **Observe (Obserwacja)** — zbieranie danych o otoczeniu, w tym informacji zwrotnych z własnych wcześniejszych działań. - **Orient (Orientacja)** — nałożenie obserwacji na model pojęciowy i synteza przesłanek do działania. Boyd uważał tę fazę za najważniejszą: ukształtowana przez doświadczenie, kulturę i nawyki, decyduje o jakości całego cyklu i o tym, jak szybko reagujemy „odruchowo". - **Decide (Decyzja)** — wybór (lub odrzucenie) jednego z wariantów działania; świadomy albo rutynowy. - **Act (Działanie)** — realizacja, która jest zarazem testem decyzji i modelu pojęciowego, a przez interakcję z otoczeniem — źródłem nowych obserwacji. Pętla się zamyka i zaczyna od nowa. Kluczowa teza Boyda: kto **szybciej i celniej domyka swoją pętlę**, ten narzuca tempo — „działa wewnątrz cyklu OODA przeciwnika", zanim ten zdąży zareagować. Z czasem model wyszedł poza lotnictwo: trafił do doktryny US Marine Corps i wojny sieciocentrycznej, a dziś opisuje też organizacje adaptacyjne i uczące się, konkurujące na zmiennych rynkach przez szybkość, zakres, częstotliwość, precyzję, skuteczność i koszt zmiany. I tu wraca platform engineering. Cykl życia zmiany w oprogramowaniu — *zdobądź kontekst → zmień → zweryfikuj → wypuść → obserwuj → napraw* — to w istocie organizacyjna pętla OODA. **Normalizacja pracy to celowe skracanie i synchronizowanie tej pętli:** - złote ścieżki i self-service **skracają czas** od obserwacji do działania (mniej oczekiwania, mniej ręcznych kroków, mniej ticketów po drodze); - everything-as-code i spójne bramki **poprawiają orientację** — dają wspólny, czytelny model tego, jak system działa i co wolno, więc cała organizacja „orientuje się" tak samo; - standaryzacja **poszerza obszar decyzji odruchowych** — rutynowe zmiany (aktualizacje zależności, drobne poprawki) przechodzą domyślną drogą bez naradzania się za każdym razem; - obserwowalność **domyka pętlę**, karmiąc kolejną iterację danymi z produkcji. Organizacja bez platformy ma wolną i rozsynchronizowaną pętlę OODA: każdy zespół orientuje się po swojemu, a decyzje grzęzną w kolejkach zgłoszeń. Platforma sprawia, że ta sama pętla kręci się szybciej i spójniej w całej firmie — i to jest właściwy powód, dla którego w ogóle warto normalizować pracę. > Ta sama optyka prowadzi wprost do reszty serii: cała ewolucja, którą opiszemy — od automatyzacji po agentów — to kolejne sposoby na **kompresję pętli OODA**, aż po moment, w którym jej fragmenty zaczyna domykać sama platforma, bez człowieka w środku. ## Z czego składa się platforma Choć narzędzia bywają różne, struktura jest powtarzalna. Typowa platforma spina: - **Hosting kodu i przeglądy** — np. [Gitea](/katalog/gitea) lub [GitLab](/katalog/gitlab) jako źródło prawdy. - **CI/CD i orkiestracja wdrożeń** — pipeline'y (np. [Woodpecker](/katalog/woodpecker), [Dagger](/katalog/dagger)) i GitOps ([Argo CD](/katalog/argo-cd), [Flux](/katalog/flux)). - **Infrastruktura jako kod** — [OpenTofu](/katalog/opentofu) lub [Terraform](/katalog/terraform), zwykle na [Kubernetes](/katalog/kubernetes). - **Bezpieczeństwo i polityki** — sekrety ([SOPS](/katalog/sops), [Vault](/katalog/vault)) i policy-as-code ([OPA](/katalog/open-policy-agent)). - **Portal i katalog usług** — np. [Backstage](/katalog/backstage), spinający to w „jedną szybę". Gotowe platformy „w pudełku" (jak [Harness](/katalog/harness)) próbują dostarczyć większość z tego od razu; podejście składane daje więcej kontroli kosztem integracji. Niezależnie od wyboru — to wciąż te same cegiełki. ## Zalety - **Spójność i przewidywalność** — wszystkie usługi działają wedle tych samych reguł; mniej „specjalnych przypadków" do utrzymania. - **Szybszy onboarding** — nowa osoba lub nowy zespół rusza w dni, nie tygodnie, bo droga jest gotowa. - **Mniej toilu i ticketów** — samoobsługa zdejmuje rutynę z zespołów infrastrukturalnych. - **Bezpieczeństwo i zgodność „wbudowane"** — skany, polityki i audyt są częścią ścieżki, a nie dodatkiem na końcu. - **Skalowalność organizacyjna** — platforma rośnie raz, korzystają z niej wszystkie zespoły; wiedza nie zależy od pojedynczych osób. - **Lepsze „day-2"** — utrzymanie, aktualizacje i obserwowalność są zaprojektowane, nie improwizowane. ## Wady i koszty - **Wysoki koszt początkowy** — zbudowanie sensownej platformy to miesiące pracy, zanim pojawi się zwrot. - **Potrzebny dedykowany zespół** — platforma bez właściciela degraduje się do zbioru porzuconych skryptów. - **Ryzyko „złotej klatki"** — zbyt sztywne ścieżki frustrują zespoły o nietypowych potrzebach; bez „escape hatchy" platforma staje się hamulcem. - **Over-engineering** — łatwo zbudować rozbudowaną platformę dla problemu, którego organizacja jeszcze nie ma. - **Produkt, który nikt nie używa** — jeśli platformy nie traktuje się jak produktu (badanie potrzeb, adopcja, wsparcie), powstaje narzędzie omijane przez zespoły. - **Przeciekająca abstrakcja** — gdy coś się psuje pod spodem, deweloper i tak musi zrozumieć warstwę, którą platforma miała ukryć. ## Kiedy to nie ma sensu Platform engineering to inwestycja, która zwraca się przy skali i powtarzalności. Bywa przedwczesna, gdy: - masz **jeden, dwa zespoły i kilka usług** — narzut platformy przewyższy korzyść; - jesteś **wczesnym startupem**, gdzie produkt i kierunek zmieniają się co tydzień — standaryzujesz coś, co jutro wyrzucisz; - **powtarzalność jest niska** — robisz rzeczy na tyle różne, że nie ma czego normalizować; - **zarządzany PaaS w zupełności wystarcza** — jeśli gotowa usługa pokrywa Twoje potrzeby, budowanie własnej platformy to wyważanie otwartych drzwi. W takich sytuacjach lepszy jest pragmatyzm: rozsądny zarządzany hosting, kilka konwencji i minimum automatyki. Platformę buduje się, gdy *ból powtarzalności* zaczyna realnie kosztować. ## Kiedy ma sens I odwrotnie — sygnały, że czas na platformę: - **wiele zespołów i usług**, które rozjeżdżają się w sposobach pracy; - **powtarzający się toil** (te same tickety, te same konfiguracje w kółko); - **presja regulacyjna** (audyt, zgodność, bezpieczeństwo), którą trudno spełniać ad hoc; - potrzeba **skrócenia czasu od pomysłu do produkcji** przy rosnącej organizacji. > Reguła kciuka: buduj platformę, gdy koszt braku standardu (chaos, czas, ryzyko) zaczyna przewyższać koszt jego utrzymania. Ani wcześniej, ani — co gorsza — dużo później. ## Co dalej w tej serii To wprowadzenie zakreśla fundament. W kolejnych częściach pójdziemy w głąb dwóch wielkich kierunków, w których platform engineering ewoluuje: - **Agentowość** — jak platforma musi się zmienić, by bezpiecznie zaprząc AI: [od IDP do platformy agentowej (ADP)](/blog/od-idp-do-adp), [cztery poziomy dojrzałości agentowego wytwarzania](/blog/cztery-poziomy-agentowego-wytwarzania), oraz [deterministyczny szkielet](/blog/deterministyczny-szkielet-adp) (walidacja jako pętla, policy-as-code), który czyni agentów bezpiecznymi. - **Suwerenność i zgodność** — platforma jako [„exit-by-design"](/blog/suwerenny-idp-exit-by-design), przenośność przez everything-as-code i GitOps, [otwartość a suwerenność](/blog/open-source-a-suwerennosc) oraz [suwerenne AI na modelach open-weight](/blog/suwerenne-ai-open-weight), a do tego [Security Plane](/blog/security-plane-sekrety-tozsamosc-policy) (tożsamość, sekrety, policy). Pokażemy też, jak regulacje UE — **[DORA](https://eur-lex.europa.eu/eli/reg/2022/2554/oj)** ([w praktyce platformy](/blog/dora-w-praktyce-platformy)) i **[AI Act](https://digital-strategy.ec.europa.eu/en/policies/regulatory-framework-ai)** ([a agentowy SDLC](/blog/ai-act-a-agentowy-sdlc)) — wprost kształtują architekturę: od testowalnych strategii wyjścia po nadzór nad AI w cyklu wytwarzania. Każdą z tych części osadzimy w praktyce i powiążemy z konkretnymi narzędziami z katalogu. Najpierw jednak warto zapamiętać jedno: platform engineering nie jest celem samym w sobie. Jest sposobem na to, by powtarzalna praca przestała być źródłem chaosu — a zaczęła być przewidywalną, wspólną drogą. ## Podsumowanie Platform engineering normalizuje wytwarzanie oprogramowania: zamienia rozproszone, ręczne czynności w spójne, samoobsługowe złote ścieżki utrzymywane jak produkt. Daje spójność, prędkość i wbudowane bezpieczeństwo — kosztem realnej inwestycji w budowę i utrzymanie platformy oraz ryzyka nadmiaru. Nie każda organizacja go potrzebuje: przy małej skali i niskiej powtarzalności bywa przerostem formy nad treścią. Kluczem jest trzeźwa ocena, po której stronie tej granicy się znajdujesz — i właśnie od tej oceny zaczyna się cała seria. Jeśli wyjdzie Ci „jeszcze nie teraz" — spoko, to też jest dobra odpowiedź. A jeśli „tak", to reszta serii jest właśnie dla Ciebie. --- # Design-as-Code: tokeny jako standard UI w platformie agentowej URL: https://eiac.dev/blog/design-as-code-tokeny-od-zera Filar: Design-as-Code Data: 2026-02-27 Tagi: tokeny, design-system, css, adp, design-as-code, human-in-the-loop Skrót: Tokeny zamieniają decyzje wizualne w jedno, audytowalne źródło prawdy. Dlaczego deterministyczną warstwę UI da się powierzyć agentowi, a UX zostaje przy człowieku w pętli. Kiedy ostatnio kłóciłeś się z kimś, czy ten guzik jest `#A8482A`, czy jednak `#A94A2B`? Ja swoje odkłóciłem — i dlatego kolory, typografię i odstępy trzymam dziś nie w pliku graficznym, tylko jako **dane**. To z pozoru drobna zmiana nośnika ma daleko idącą konsekwencję: decyzja wizualna, która jest danymi, daje się wersjonować, walidować i egzekwować jak każdy inny kod. A skoro tak, to można ją powierzyć maszynie do *stosowania*, zostawiając człowiekowi to, czego maszyna nie udźwignie: osąd. Ten artykuł rozwija tokeny od zera, a potem stawia tezę dla platformy agentowej (ADP, którą opisujemy [od IDP do ADP](/blog/od-idp-do-adp)): **design-as-code to warstwa, w której platforma egzekwuje standardy UI maszynowo — a UX zostaje przy człowieku w pętli.** Sprawdzimy, czy ten podział jest prawidłowy, pokażemy gdzie się rozmywa, przedstawimy konkurencyjną koncepcję (generative UI) i damy macierz wyboru ścieżki wdrożenia.
Teza

Tokeny czynią deterministyczną warstwę UI (kolor, odstęp, typografia, promień) maszynowo egzekwowalną — agent wybiera z zamkniętego zbioru, a audyt w CI odrzuca odstępstwa. Warstwa osądu (architektura informacji, przepływy, dobór komponentu, intencja dostępności) pozostaje przy człowieku. Granica nie biegnie więc dokładnie między „UI" a „UX", lecz między tym, co deterministyczne, a tym, co wymaga osądu.

## Dlaczego tokeny Token to nazwana wartość — `color.link = #A8482A` — której używają jednocześnie strona, komponenty i materiały marketingowe. Zmiana w jednym miejscu propaguje się wszędzie. To samo, co Infrastructure-as-Code zrobił z serwerami — zamienił ręcznie strojone, nigdy nie identyczne maszyny w odtwarzalną, audytowalną konfigurację — tokeny robią z decyzjami wizualnymi: przestają być „bo ktoś tak kiedyś kliknął w Figmie", a stają się reprodukowalnym faktem w repo. Wartość tokenów rośnie wprost proporcjonalnie do liczby miejsc, w których ta sama decyzja musi być spójna: light/dark, wiele marek, web/iOS/Android, aplikacja i landing. Bez tokenów każde z tych miejsc dryfuje niezależnie. Z tokenami dryf jest wykrywalny i odwracalny. ## Anatomia: trzy warstwy tokenów Dojrzały zbiór tokenów to nie płaska lista, lecz trzy warstwy pośrednictwa — i to właśnie pośrednictwo daje siłę. 1. **Prymitywy (primitive / global)** — surowa paleta faktów: `--ds-rust-600: #A8482A`, `--ds-space-2: 8px`. Bez znaczenia, sama wartość. 2. **Tokeny semantyczne (alias)** — nadają prymitywom rolę: `--color-link: var(--ds-rust-600)`, `--space-inset-sm: var(--ds-space-2)`. To tu mieszka intencja („to jest kolor linku"), nie konkretny hex. 3. **Tokeny komponentu** — opcjonalna warstwa najbliżej UI: `--button-bg: var(--color-link)`. Komponent nigdy nie sięga do prymitywu ani do surowej wartości. ```json // W3C DTCG: prymitywy i alias ($value/$type, alias przez {ścieżka}) { "ds": { "rust": { "600": { "$value": "#A8482A", "$type": "color" } }, "space": { "2": { "$value": "8px", "$type": "dimension" } } }, "color": { "link": { "$value": "{ds.rust.600}", "$type": "color" } }, "space": { "inset-sm": { "$value": "{ds.space.2}", "$type": "dimension" } } } ``` ```css /* Ta sama hierarchia w CSS — trzy warstwy pośrednictwa */ :root { --ds-rust-600: #A8482A; /* prymityw */ --color-link: var(--ds-rust-600); /* semantyka */ } .button { color: var(--color-link); } /* komponent */ ``` Pośrednictwo jest tym, co ratuje skórę: gdy marka zmienia odcień, podmieniasz **jeden** prymityw; gdy dochodzi dark mode czy druga marka, przepinasz **warstwę alias** — komponenty nie wiedzą o niczym. Płaska lista hexów takiej operacji nie przeżywa. ## Standard, nie dialekt: W3C DTCG Do niedawna każde narzędzie miało własny format tokenów. To się zmieniło: [Design Tokens Format Module](https://www.designtokens.org/tr/) grupy [W3C Design Tokens Community Group](https://www.w3.org/community/design-tokens/) osiągnął [pierwszą stabilną wersję (2025.10)](https://www.w3.org/community/design-tokens/2025/10/28/design-tokens-specification-reaches-first-stable-version/) — wendor-neutralny JSON z polami `$value`/`$type`, aliasami, theming/multi-brand i nowoczesnymi przestrzeniami koloru (Display P3, Oklch, CSS Color 4). Trzymanie się standardu, zamiast formatu jednego dostawcy, to dokładnie ta sama zasada, którą stosujemy wobec [licencji i suwerenności](/blog/open-source-a-suwerennosc): unikasz zamknięcia. Ekosystem narzędziowy zna już ten format. W praktyce sięga się po [Style Dictionary](/katalog/style-dictionary) (transpilacja jednego źródła do CSS/iOS/Android/Flutter), [Tokens Studio](/katalog/tokens-studio) (pomost Figma ↔ repo), a do dokumentacji i izolowanego rozwoju komponentów [Storybook](/katalog/storybook); całość projektowa może żyć w otwartym [Penpot](/katalog/penpot). Wspólny mianownik: **tokeny są źródłem, a kod i materiały są generowane** — nie odwrotnie. ## Tokeny jako guardrails dla agenta Tu wchodzi platforma agentowa. Gdy interfejs pisze (lub współpisze) model, pojawia się problem, którego nie ma przy człowieku z dobrą pamięcią zespołową. Asystent kodujący nie *odpytuje* design systemu — on **generuje prawdopodobnie wyglądające wartości**. W jednej sesji potrafi podjąć 200–300 mikrodecyzji wizualnych (padding, odcień, promień), każda z osobna sensowna, a w sumie niespójna; a następna sesja nie pamięta poprzedniej i zgaduje od nowa ([opis problemu i metoda — Hardik Pandya](https://hvpandya.com/llm-design-systems)). Trzy słabości modeli i ich tokenowe przeciwlekarstwa: - **Fabrykuje wartości** → daj **zamkniętą warstwę tokenów**: agent wybiera z `var(--color-link)`, a nie wymyśla `#1D4ED8`. Nie ma „złego niebieskiego", bo jest tylko jeden. - **Nie ma pamięci między sesjami** → daj **pliki spec w repo** (foundations + komponenty), które model czyta na starcie każdej sesji. Decyzję podjął człowiek raz; model ją *odczytuje*. - **Nie czyta intencji ze źródła** → **audyt w CI**: skrypt skanuje CSS, a każda surowa wartość to błąd ze wskazaniem właściwego tokenu i `exit 1`. Czego nie da się scalić, tego nie ma. ```bash # Bramka tokenowa w CI: zero surowych wartości w UI $ npm run token-audit src/components/Nav.css ✗ L42: zakodowany #1868DB → użyj var(--color-link) ✗ L78: surowy 12px w padding → użyj var(--space-inset-sm) Errors: 2 # exit 1 → PR nie przechodzi ``` To jest dokładnie ten sam ruch, co [deterministyczny szkielet ADP](/blog/deterministyczny-szkielet-adp): nie ufamy modelowi „że będzie ładnie", tylko zamykamy go w polityce, która jest [policy-as-code](/blog/policy-as-code-dla-zespolow) i bramką w pipeline. Smak człowieka wchodzi raz — do tokenów i specyfikacji — a model stosuje go mechanicznie. Tokeny są więc dla UI tym, czym OPA dla wdrożeń: zamkniętym zbiorem dozwolonych decyzji.
Prymitywy Tokeny semantyczne Komponenty Audyt w CI #A8482A · 8px --color-link var(--…) exit 1 = stop człowiek: smak raz → agent: stosuje mechanicznie, audyt pilnuje
Tokeny jako guardrails: człowiek ustawia warstwę raz, agent wybiera wyłącznie z zamkniętego zbioru, a audyt w CI odrzuca surowe wartości.
## Gdzie kończy się automat: weryfikacja tezy Czy założenie „UI maszynowo, UX przy człowieku" jest prawidłowe? Źródła w większości je potwierdzają — ale z istotną korektą, którą trzeba uczciwie postawić. **Co potwierdza tezę.** Praktyka pokazuje, że gdy tylko zamkniesz warstwę tokenów i dodasz audyt, jakość wizualna dziesiątej sesji agenta dorównuje pierwszej — czyli deterministyczna część UI faktycznie się automatyzuje. Po drugiej stronie, UX z udziałem AI jest dziś opisywany jako wzorzec **human-in-the-loop**: AI proponuje, człowiek zatwierdza lub koryguje, bo to człowiek odpowiada za zaufanie, prowadzenie użytkownika i nadzór ([wzorzec HITL w UX](https://www.aufaitux.com/blog/human-in-the-loop-ux/)). AI ma być współpracownikiem, nie zamiennikiem projektanta. **Gdzie teza wymaga korekty.** Linia podziału nie biegnie czysto między „UI" a „UX". Część UI to wciąż osąd: *który* komponent użyć (modal czy inline message), jak ułożyć architekturę informacji, jak brzmi mikrokopia, jaka jest *intencja* dostępności (nie samo `aria-`, lecz sensowny przepływ dla czytnika ekranu). Tego model nie wyczyta ze źródła — ta wiedza „mieszka w głowach projektantów" i musi zostać spisana albo dostarczona przez człowieka. Dlatego trafniejsza granica brzmi: **deterministyczne (tokeny, audyt, stany komponentu) → maszyna; wymagające osądu (IA, przepływy, dobór, kopia, intencja a11y) → człowiek w pętli.** Sam zgodny token nie gwarantuje dobrego doświadczenia — gwarantuje tylko spójność. To rozróżnienie ma też wymiar regulacyjny: nadzór człowieka nad istotnymi decyzjami i ślad audytowy to nie tylko dobra praktyka UX, ale i kierunek, w którym idzie [AI Act](/blog/ai-act-a-agentowy-sdlc). ## Koncepcja alternatywna: generative UI Powyższe zakłada **statyczny** interfejs: tokeny i komponenty są ustalone, a agent wypełnia je w czasie budowy. Istnieje jednak inna szkoła — **generative UI (GenUI)**: interfejs nie jest z góry zaprojektowany, lecz **składany przez AI w czasie działania**, dopasowany do kontekstu i intencji użytkownika ([przegląd GenUI](https://www.builder.io/blog/designing-generative-ui-in-an-agent-native-world)). Zamiast kodować każdy wariant ekranu, projektant ustawia *guardrails* — system prompt, model intencji i **kuratorowany katalog komponentów** — w których AT generuje UI na bieżąco. Co istotne dla naszej tezy: nawet GenUI nie znosi standardów — przesuwa je. Nadal potrzebuje zamkniętego katalogu komponentów i tokenów jako budulca; zmienia się tylko *moment* składania (runtime zamiast build-time). Spotykane są trzy tryby, o rosnącym ryzyku: - **Statyczny (parametryczny)** — AI wypełnia z góry zaprojektowane sloty danymi. Przewidywalny. - **Deklaratywny (z rejestru)** — AI komponuje UI z zamkniętego rejestru komponentów. Zwykle najlepszy kompromis elastyczność/niezawodność. - **W pełni generatywny** — AI emituje surowy HTML/CSS. Maksymalna elastyczność, maksymalne ryzyko (niespójność, halucynacje komponentów, bezpieczeństwo). GenUI płaci za elastyczność znanymi kosztami: spójność (każde wygenerowanie może wyglądać inaczej), wydajność (generowanie trwa), bezpieczeństwo (dynamiczny kod) i halucynacje. Dlatego nie jest „następcą" design systemu, lecz innym punktem na tej samej osi — z tym samym fundamentem tokenów pod spodem. ## Wybierz ścieżkę wdrożenia Nie ma jednej słusznej drogi — jest spektrum, a wybór zależy od tolerancji ryzyka, skali i tego, jak bardzo interfejs musi się adaptować do użytkownika. Trzy realne ścieżki: | Ścieżka | Kiedy ma sens | Rola agenta | Człowiek w pętli | Główne ryzyko | |---|---|---|---|---| | **A. Statyczny design system + tokeny** | Większość produktów; potrzeba spójności i audytowalności | Pisze kod w granicach tokenów; audyt go pilnuje | Ustala tokeny/spec, projektuje IA i przepływy, recenzuje | Sztywność; „złota klatka" przy nietypowych potrzebach | | **B. Deklaratywny GenUI (z rejestru)** | Interfejsy mocno kontekstowe (asystenci, dashboardy dopasowane do roli) | Składa UI z zamkniętego rejestru w runtime | Projektuje rejestr + guardrails, definiuje intencje, nadzoruje | Niespójność między wygenerowaniami; wydajność | | **C. W pełni generatywny** | Eksperymenty, prototypy, wysoce spersonalizowane nisze | Emituje surowy markup w runtime | Definiuje twarde bariery bezpieczeństwa, waliduje wyjście | Halucynacje, bezpieczeństwo, brak powtarzalności | Reguła kciuka: **zacznij od A** (tokeny + audyt to fundament, który i tak przyda się w B i C), sięgnij po **B**, gdy realnie potrzebujesz adaptacji do kontekstu, a **C** trzymaj za barierą człowieka w pętli i poza ścieżką krytyczną. We wszystkich trzech tokeny pozostają wspólnym mianownikiem — różni się tylko, *kiedy* i *jak swobodnie* agent z nich korzysta. Mapuje się to wprost na [cztery poziomy agentowego wytwarzania](/blog/cztery-poziomy-agentowego-wytwarzania): im wyżej autonomia, tym mocniejsze muszą być guardrails i tym wyraźniejszy punkt, w którym decyzję zatwierdza człowiek. ## Pierwszy plik Niezależnie od ścieżki, start jest ten sam — jeden plik, który staje się źródłem prawdy: ```json { "color": { "link": { "$value": "#A8482A", "$type": "color" } } } ``` Stąd generujesz CSS variables, motywy i dokumentację — wszystko z repo, wszystko audytowalne, wszystko gotowe, by agent z tego korzystał, a nie zgadywał. ## Podsumowanie Design-as-code zamienia decyzje wizualne w dane, a tokeny — w trójwarstwowy, standaryzowany ([W3C DTCG](https://www.designtokens.org/)) zbiór, który platforma agentowa potrafi egzekwować maszynowo: zamknięta warstwa tokenów, pliki spec i audyt w CI sprawiają, że agent stosuje smak człowieka, zamiast go wymyślać. Teza „UI dla maszyny, UX dla człowieka" jest w rdzeniu prawidłowa, ale precyzyjniej brzmi: **deterministyczne dla maszyny, wymagające osądu dla człowieka w pętli.** Alternatywa — generative UI — nie znosi tego fundamentu, tylko przesuwa moment składania na runtime. Wybór ścieżki (statyczny DS, deklaratywny GenUI, pełna generacja) należy do Ciebie i Twojej tolerancji ryzyka — ale każda z nich stoi na tym samym fundamencie tokenów. Zacznij od jednego pliku tokenów i audytu w CI, a potem sam zdecyduj, jak daleko wpuścisz agenta. Polecam się tym pobawić. :) --- # Policy-as-Code dla zespołów: warstwa kontroli platformy URL: https://eiac.dev/blog/policy-as-code-dla-zespolow Filar: SDLC / Policy-as-Code Data: 2026-02-23 Tagi: opa, rego, security, ci, policy-as-code, platform-engineering, adp, guardrails Skrót: Polityka, której nie da się uruchomić, to dokument. Jak zamienić bezpieczeństwo i zgodność w warstwową płaszczyznę kontroli — od PR po admission — egzekwowaną jako guardrail, nie bramkarza. Znasz to: w firmowej wiki leży „standard", którego nikt nie czyta, a na review i tak przechodzi PR łamiący zasadę — bo recenzent akurat jej nie pamiętał. Sam nieraz byłem tym recenzentem. Polityka, której nie da się uruchomić, to nie polityka, tylko dokument. **Policy-as-code (PaC)** zamienia ją w coś przeciwnego: regułę zapisaną jako kod, którą maszyna sprawdza przy każdej zmianie — deterministycznie, w tym samym miejscu co reszta pipeline'u, z wynikiem, który albo przepuszcza, albo zatrzymuje. W [wprowadzeniu do serii](/blog/platform-engineering-normalizacja-pracy) postawiliśmy tezę, że platform engineering to normalizacja pracy — kodowanie osądu *raz* i stosowanie go *wszędzie*. Policy-as-code jest tej tezy najczystszym wcieleniem: zamiast debatować każdy przypadek z osobna, zespół platformowy zapisuje regułę i pozwala jej działać w kółko. Ten artykuł rozwija PaC od pojedynczej bramki w CI do **warstwowej płaszczyzny kontroli** całej platformy — i pokazuje, dlaczego to ona staje się fundamentem zarówno zgodności regulacyjnej, jak i bezpiecznej autonomii agentów.
Teza

Policy-as-code to nie pojedynczy skan w CI, lecz warstwa kontroli rozłożona wzdłuż całego cyklu — od IDE i PR, przez build i plan IaC, po admission w klastrze. Egzekwowana automatycznie i blisko miejsca, gdzie pracuje inżynier, zamienia bezpieczeństwo i zgodność z bramkarza, który blokuje, w guardrail, który prowadzi — i daje gotowy ślad audytowy jako produkt uboczny.

## Co właściwie znaczy „as code" Sednem PaC jest **oddzielenie decyzji od egzekwowania**. Zamiast zaszywać logikę „czy wolno?" w każdej aplikacji i każdym skrypcie, opisujesz ją deklaratywnie w jednym miejscu, a silnik polityk odpowiada na pytania w czasie, gdy decyzja jest potrzebna. To daje trzy własności, których dokument nigdy nie miał: - **Wersjonowanie** — polityka żyje w repo, ma historię zmian, autora i przegląd jak każdy inny kod. - **Testowalność** — regułę można pokryć testami i uruchomić lokalnie, zanim trafi na produkcję. - **Audytowalność** — każde uruchomienie zostawia ślad: co sprawdzono, na jakich danych i z jakim wynikiem. To ta sama zmiana nośnika, którą opisaliśmy przy [tokenach designu](/blog/design-as-code-tokeny-od-zera): gdy reguła staje się danymi, przestaje zależeć od ludzkiej pamięci, a zaczyna od pipeline'u. ## OPA i Rego: uniwersalny silnik [Open Policy Agent](/katalog/open-policy-agent) (OPA) to ogólnego przeznaczenia silnik polityk i [projekt CNCF na poziomie „graduated"](https://www.cncf.io/projects/) — czyli najwyższym poziomie dojrzałości. Jego siła to uniwersalność: jednym językiem opiszesz reguły dla Kubernetes, planu [Terraform/OpenTofu](/blog/suwerenny-idp-exit-by-design), API mikroserwisu czy pipeline'u CI. OPA nie wie nic o domenie — dostaje dane wejściowe (JSON) i zwraca decyzję. Reguły pisze się w [Rego](https://www.openpolicyagent.org/docs/policy-language) — deklaratywnym języku wywodzącym się z Datalog, zaprojektowanym do odpytywania złożonych, zagnieżdżonych struktur danych. Prosty przykład bramki w CI, która odrzuca obraz z tagiem `latest`: ```rego package ci.images # odrzuć każdy kontener używający :latest deny contains msg if { some c in input.spec.containers endswith(c.image, ":latest") msg := sprintf("obraz %v używa :latest — przypnij wersję", [c.image]) } ``` ```bash # ta sama reguła jako bramka w pipeline (bez klastra) $ conftest test deployment.yaml FAIL - deployment.yaml - ci.images - obraz app:latest używa :latest — przypnij wersję 1 test, 0 passed, 1 failure # exit 1 → PR nie przechodzi ``` Tu rolę uruchamiacza w CI pełni [Conftest](/katalog/conftest) (Rego poza klastrem), a tę samą politykę w klastrze egzekwuje jako admission webhook [OPA Gatekeeper](/katalog/gatekeeper). Uczciwa uwaga: Rego bywa stromy — opanowanie go to realnie kilkadziesiąt godzin nauki, a w 2026 r. ekosystem OPA przeszedł zmiany właścicielskie (część twórców i inżynierów Styra dołączyła do Apple). To nie podważa dojrzałości projektu, ale warto znać krajobraz alternatyw. ## Nie tylko OPA: krajobraz silników „Policy-as-code" to kategoria, nie jedno narzędzie. Wybór zależy od tego, *co* egzekwujesz i *kto* ma pisać reguły. | Silnik | Język / format | Najlepszy do | Cena wyboru | |---|---|---|---| | [OPA](/katalog/open-policy-agent) + [Conftest](/katalog/conftest) | Rego | Spójne reguły w całym stacku (K8s, IaC, API, CI) | Stroma krzywa Rego | | [Kyverno](/katalog/kyverno) | YAML (zasoby K8s) | Governance Kubernetes bez nowego języka | Mocno związany z K8s | | [Gatekeeper](/katalog/gatekeeper) | Rego (CRD) | Admission control w klastrze na bazie OPA | Tylko klaster | | Cedar | [Cedar](https://www.cedarpolicy.com/) | Autoryzacja aplikacyjna (czytelna, szybka, analizowalna) | Węższy zakres, ekosystem AWS | | [Checkov](/katalog/checkov) / [Terrascan](/katalog/terrascan) | wbudowane reguły | Skan IaC out-of-the-box | Mniej elastyczne niż własne reguły | | [Casbin](/katalog/casbin) | modele (ACL/RBAC/ABAC) | Autoryzacja wewnątrz aplikacji | To biblioteka, nie bramka CI | Dwie osie pomagają wybrać. Pierwsza: **uniwersalność vs prostota** — OPA daje jeden język na wszystko kosztem nauki Rego; Kyverno zostaje w YAML, ale tylko dla Kubernetes. Druga: **kto czyta regułę** — Cedar jest celowo czytelny i ściśle typowany (łatwiejszy do przejrzenia także dla nie-programisty oraz do automatycznej analizy), Rego bywa gęsty. W EIAC nie stawiamy na konkretne narzędzie, lecz na zasadę: reguła jest kodem, bramką i śladem — niezależnie od silnika. ## Warstwowa płaszczyzna kontroli Najczęstszy błąd to potraktowanie PaC jak pojedynczego skanu w CI. Dojrzała platforma rozkłada polityki **warstwowo**, tak by każda bramka działała tam, gdzie ma najwięcej kontekstu i najmniej przeszkadza: - **Źródło i projekt (IDE, PR)** — linty, szablony, walidacja konwencji; najtańsze i najszybsze sprzężenie zwrotne. - **Build** — polityki nad Dockerfile i obrazami (brak `latest`, brak roota, dozwolone bazowe obrazy), skan zależności ([Trivy](/katalog/trivy)). - **Plan / provisioning** — reguły nad planem [IaC](/katalog/checkov) (zanim cokolwiek powstanie: brak otwartych portów, wymagane szyfrowanie, tagi właściciela). - **Deploy / runtime** — admission controller ([Gatekeeper](/katalog/gatekeeper)/[Kyverno](/katalog/kyverno)) odrzuca niezgodne zasoby przy `kubectl apply`/`helm`.
IDE / PR Build Plan IaC Admission / runtime lint / spec obraz / SBOM plan deny webhook taniej, szybciej naprawić ← → drożej, później
Policy-as-code jako płaszczyzna kontroli: ta sama zasada egzekwowana na kolejnych etapach. Im wcześniej bramka złapie naruszenie, tym taniej je naprawić.
Kluczowe jest, by **ta sama intencja** była egzekwowana na wielu warstwach: „brak `latest`" sprawdzasz w CI (szybkie sprzężenie dla dewelopera) *i* w admission (twarda gwarancja, że nic nie obejdzie pipeline'u). Warstwy się nie wykluczają — uzupełniają. ## Guardrails, nie bramkarze Najważniejsza zmiana myślenia: PaC ma być **guardrailem, nie bramkarzem**. Bramkarz blokuje i zmusza do proszenia o zgodę; guardrail wyznacza bezpieczny tor, po którym jedzie się samoobsługowo. Google Cloud opisuje [cztery mechanizmy kontroli platformy](https://cloud.google.com/blog/products/application-modernization/platform-engineering-control-mechanisms): złote ścieżki (domyślne, wspierane drogi), guardrails (automatyczne granice), siatki bezpieczeństwa (wykrywanie po fakcie) i ręczne punkty kontrolne (gdy naprawdę trzeba człowieka). PaC realizuje przede wszystkim guardrails — i to one skalują się najlepiej, bo „kodują osąd raz i stosują go nieustannie". Z tego wynika praktyczna reguła doboru: **shift-left to nie tylko „wcześniej", ale „wcześniej i automatycznie"** — walidacja tam, gdzie inżynier już pracuje (IDE, PR, CI, deploy), ze sprzężeniem, które jest *szybkie, konkretne i naprawialne*. Polityka, która zwraca „odmowa" bez wskazania, co poprawić, jest bramkarzem. Polityka, która mówi „użyj `var(--space-2)` zamiast `12px`" albo „przypnij wersję obrazu" — jest guardrailem. Różnica decyduje o tym, czy zespoły platformę pokochają, czy zaczną ją obchodzić. ## Policy-as-code w platformie agentowej Tu PaC przestaje być wygodą, a staje się warunkiem koniecznym. Gdy część pracy w pętli wykonuje agent AI, a nie człowiek, znika naturalny punkt kontroli, jakim był recenzent przy klawiaturze. Pętla narzędziowa agenta sama z siebie **nie ma punktu decyzyjnego** „czy wolno?" — i to policy-as-code go dostarcza: deklaratywną bramkę, przez którą musi przejść każde działanie, niezależnie od tego, czy zainicjował je człowiek, czy model. To jest dokładnie rdzeń [deterministycznego szkieletu ADP](/blog/deterministyczny-szkielet-adp): nie ufamy modelowi „że zrobi dobrze", tylko zamykamy go w polityce egzekwowanej maszynowo. Im wyżej w [czterech poziomach autonomii](/blog/cztery-poziomy-agentowego-wytwarzania), tym mocniejsze muszą być te bramki — bo tym mniej człowieka zostaje w pętli. PaC łączy się tu wprost z [Security Plane](/blog/security-plane-sekrety-tozsamosc-policy): tożsamość mówi *kto/co* działa (także tożsamość nie-ludzka agenta), a polityka — *co temu komuś wolno*. ```yaml # Kyverno: w klastrze nic nie wystartuje jako root — dotyczy tak samo # wdrożeń człowieka, jak i tych zainicjowanych przez agenta apiVersion: kyverno.io/v1 kind: ClusterPolicy metadata: { name: require-non-root } spec: validationFailureAction: Enforce rules: - name: check-runAsNonRoot match: { any: [{ resources: { kinds: ["Pod"] } }] } validate: message: "kontener musi działać jako non-root" pattern: spec: securityContext: { runAsNonRoot: true } ``` ## Zgodność jako produkt uboczny Ponieważ każde uruchomienie polityki zostawia ślad — co sprawdzono, z jakim wynikiem — PaC daje *za darmo* to, co regulacje wymagają osobno: dowód. Zamiast ręcznych audytów raz na kwartał masz ciągły, maszynowy zapis zgodności. To wprost odpowiada na wymóg [DORA](/blog/dora-w-praktyce-platformy), by zgodność dało się *wykazać*, oraz na oczekiwania [AI Act](/blog/ai-act-a-agentowy-sdlc) co do śladu i nadzoru. „Compliance by design" nie jest hasłem — to konsekwencja tego, że reguła jest kodem, który się wykonuje i loguje. Granica uczciwości: PaC pokrywa *techniczną* część zgodności. Procesy organizacyjne — rejestr ryzyka, raportowanie incydentów, role i odpowiedzialności — to wciąż praca ludzi. Platforma jest warunkiem koniecznym zgodności, nie wystarczającym. ## Wybierz ścieżkę Nie ma jednej słusznej drogi wdrożenia — jest sekwencja, którą warto przejść etapami: 1. **Zacznij od jednej bramki w CI** — np. [Conftest](/katalog/conftest) lub [Checkov](/katalog/checkov) na PR. Niski koszt, szybka wartość, uczy zespół myślenia regułami. 2. **Dołóż admission w klastrze** — [Kyverno](/katalog/kyverno) (gdy zespół woli YAML) lub [Gatekeeper](/katalog/gatekeeper) (gdy już używasz Rego). Domyka lukę „co z tym, co omija CI". 3. **Ujednolić język, jeśli rośnie zakres** — gdy reguły mnożą się w wielu miejscach (K8s, IaC, API), rozważ [OPA](/katalog/open-policy-agent)/Rego jako wspólny silnik; do czystej autoryzacji aplikacyjnej — Cedar lub [Casbin](/katalog/casbin). 4. **Traktuj polityki jak produkt** — wersjonuj, testuj, dawaj czytelne komunikaty naprawcze. Guardrail bez dobrego UX zamienia się w bramkarza, którego zespoły obchodzą. Reguła kciuka: **najpierw jedna warstwa, potem szerokość, na końcu unifikacja języka.** Budowanie od razu uniwersalnej platformy polityk dla problemu, którego jeszcze nie masz, to ten sam over-engineering, przed którym ostrzegaliśmy przy [samej platformie](/blog/platform-engineering-normalizacja-pracy). ## Podsumowanie Policy-as-code zamienia zasady bezpieczeństwa i zgodności z dokumentów, które nikt nie egzekwuje, w testowalne bramki, które działają same. Jego dojrzała forma to nie skan w CI, lecz warstwowa płaszczyzna kontroli — od IDE po admission — egzekwowana jako guardrail blisko miejsca pracy inżyniera, a nie jako bramkarz na końcu. W platformie agentowej PaC jest tym punktem decyzyjnym, którego pętla agenta sama nie ma, a przy okazji dostarcza ciągły ślad audytowy spełniający wymogi DORA i AI Act. Wybór silnika należy do Ciebie — OPA, Kyverno, Cedar czy inny — bo w EIAC liczy się zasada, nie narzędzie: reguła jest kodem, bramką i śladem. A od strony praktycznej: zacznij od jednej reguły w CI. Zobaczysz, ile spokoju daje świadomość, że standard egzekwuje się sam, a nie zależy od tego, czy ktoś go akurat pamiętał na review. --- # Wersjonowanie z automatu: SemVer i Conventional Commits URL: https://eiac.dev/blog/wersjonowanie-semver-conventional-commits Filar: SDLC / Policy-as-Code Data: 2026-02-16 Tagi: semver, conventional-commits, release, automation, semantic-release, gitlab Skrót: Wersja to interfejs komunikacyjny, nie kosmetyka. Jak SemVer i Conventional Commits zamieniają historię commitów w automatyczne, przewidywalne wydania — i gdzie kończy się sens automatu. Ile razy bumpnąłeś wersję „na oko", bo trzeba było coś wypuścić, a nikt nie pamiętał, czy ta zmiana to jeszcze `1.4.3`, czy już `2.0.0`? U mnie — za dużo razy, i za każdym numer wersji trochę kłamał. Bo numer wersji to najmniejszy interfejs Twojego oprogramowania. Zanim ktokolwiek zajrzy w changelog, podejmuje decyzję na podstawie trzech liczb: czy to bezpieczne, czy coś się zepsuje, czy warto. Jeśli nadaje je człowiek na oko, interfejs kłamie — a wraz z nim cała automatyzacja, która na nim polega. Ten artykuł pokazuje, jak zamienić wersjonowanie z rytuału w funkcję: deterministyczną, wyprowadzaną wprost z historii commitów. Po drodze: dogłębna analiza problemu, standard **SemVer**, specyfikacja **Conventional Commits** i narzędzia, które spinają to w pipeline.
Teza

Wersja nie powinna być decyzją podejmowaną na końcu. Powinna być obliczana z tego, co już zapisałeś w commitach.

## Problem: dlaczego ręczne wersjonowanie zawodzi Na pierwszy rzut oka nadanie wersji to trywialna czynność — podbij liczbę, otaguj, opublikuj. W praktyce to miejsce, w którym kumuluje się dług całego procesu wydawniczego. Kilka warstw problemu: ### 1. Wersja zależy od wiedzy, która nie jest zapisana Żeby poprawnie podbić wersję, trzeba wiedzieć, _co_ zmieniło się od ostatniego wydania i _czy_ któraś zmiana łamie kompatybilność. Ta wiedza zwykle żyje w głowach autorów i rozprasza się z każdym dniem. Po dwóch tygodniach i czterdziestu commitach nikt nie odtworzy z pamięci, czy gdzieś nie zmienił się kontrakt API. ### 2. Człowiek myli „dla mnie" z „dla użytkownika" Autor zmiany ocenia ją z perspektywy implementacji („mała poprawka"), a nie konsumenta API („zmieniła się sygnatura, to breaking change"). To systematyczny błąd poznawczy — i główne źródło wersji, które obiecują kompatybilność, a jej nie dają. ### 3. Changelog rozjeżdża się z kodem Ręcznie pisany changelog to osobne źródło prawdy, które trzeba pamiętać, by zaktualizować. Im więcej pośpiechu, tym większy dryf między tym, co naprawdę się zmieniło, a tym, co opisano. ### 4. Wydanie staje się wąskim gardłem Skoro „wydanie" wymaga człowieka, który zbierze odpowiedzialność za numer, changelog i tag — wydania robi się rzadziej, większymi partiami. A większe partie to trudniejszy przegląd, większe ryzyko i wolniejszy feedback. Klasyczna spirala. ### 5. Niespójność między projektami i ludźmi Każdy nadaje wersje trochę inaczej. W monorepo albo w organizacji z dziesiątkami usług brak jednej, egzekwowalnej reguły oznacza, że „2.3.0" w jednym repo znaczy co innego niż w drugim. > Wersjonowanie to nie problem „podbicia liczby". To problem **utrwalenia intencji zmiany w momencie jej powstania** i deterministycznego wyprowadzenia z niej konsekwencji. Rozwiązanie ma więc dwie części: standard, który nadaje liczbom znaczenie (SemVer), oraz konwencję, która utrwala intencję w commicie (Conventional Commits). Reszta to już automat. ## SemVer — kontrakt w trzech liczbach [Semantic Versioning](https://semver.org) (SemVer 2.0.0) definiuje wersję jako `MAJOR.MINOR.PATCH`, gdzie każdy człon ma ścisłe znaczenie: | Człon | Kiedy rośnie | Obietnica dla konsumenta | | ----- | -------------------------------- | --------------------------------------------- | | MAJOR | zmiana łamiąca kompatybilność | „możesz musieć poprawić swój kod" | | MINOR | nowa funkcja, wstecznie zgodna | „możesz aktualizować bezpiecznie, są nowości" | | PATCH | poprawka błędu, wstecznie zgodna | „aktualizuj bez obaw" | Kluczowa zasada: numer to **kontrakt**, nie metryka aktywności. Podbicie MAJOR nie znaczy „dużo pracy", tylko „złamaliśmy obietnicę zgodności". Podbicie PATCH nie znaczy „mała zmiana", tylko „nic się dla Ciebie nie zmienia poza naprawą". ### Pre-release i metadane builda SemVer pozwala oznaczyć wersje niestabilne i dołączyć metadane: ```text 1.4.0-rc.1 # pre-release: 1.4.0 jeszcze nie gotowe 1.4.0-beta.2+exp.7 # pre-release + metadane builda (po +) ``` Wersje pre-release mają **niższy priorytet** niż odpowiadające im wydanie (`1.4.0-rc.1 < 1.4.0`). Metadane po `+` są ignorowane przy porównywaniu — służą tylko identyfikacji builda. ### Zakresy: caret i tilde Menedżery pakietów pozwalają deklarować, na jakie aktualizacje się godzisz. Dwa najważniejsze operatory: | Zapis | Znaczenie | Dopuszcza | | -------- | -------------- | ---------------- | | `^1.4.2` | zgodny z MAJOR | `>=1.4.2 <2.0.0` | | `~1.4.2` | zgodny z MINOR | `>=1.4.2 <1.5.0` | `^` (caret) to domyślny wybór w większości ekosystemów — ufasz, że MINOR i PATCH są bezpieczne. To zaufanie działa tylko wtedy, gdy autorzy uczciwie trzymają się SemVer. Stąd waga automatyzacji: jeśli bump liczy maszyna z reguł, kontrakt przestaje zależeć od dyscypliny.
Pułapka 0.x

Dla wersji 0.y.z SemVer nie gwarantuje stabilności — tu nawet MINOR może łamać kompatybilność. „Jedynka" (1.0.0) to deklaracja: „API jest stabilne, od teraz obowiązuje pełny kontrakt".

## Conventional Commits — commit jako dane SemVer mówi, _co_ znaczą liczby. Brakuje ogniwa, które w momencie pisania kodu utrwali intencję zmiany w formie nadającej się do maszynowego odczytu. Tym ogniwem jest [Conventional Commits](https://www.conventionalcommits.org) (1.0.0) — lekka konwencja formatu komunikatu commita: ```text [opcjonalny zakres][!]: [opcjonalne ciało] [opcjonalne stopki] ``` Przykłady: ```text feat(catalog): dodaj filtr po filarze fix(nav): popraw kontrast linku w trybie ciemnym docs: uzupełnij sekcję deploymentu refactor(api)!: zmień kształt odpowiedzi /tools ``` Najważniejsze elementy: - **typ** — `feat`, `fix`, `docs`, `refactor`, `perf`, `test`, `build`, `ci`, `chore` i inne. Tylko dwa mają wpływ na wersję (patrz niżej). - **zakres** (scope) — opcjonalny obszar zmiany w nawiasie, np. `(catalog)`. - **`!`** — wykrzyknik przed dwukropkiem oznacza **breaking change**. - **stopka `BREAKING CHANGE:`** — alternatywny, jawny sposób oznaczenia złamania kompatybilności, z opisem migracji. ```text feat(api): obsługa paginacji w katalogu BREAKING CHANGE: endpoint /tools zwraca teraz obiekt { items, next } zamiast tablicy. Zaktualizuj klientów odczytujących odpowiedź. ``` Zysk jest podwójny: commit staje się **czytelny dla człowieka** (od razu wiadomo, co i gdzie) i **parsowalny dla maszyny** (typ + flaga breaking → konkretny bump SemVer). ## Od commita do wersji: jak liczy się bump Mapowanie jest proste i deterministyczne. Narzędzie patrzy na wszystkie commity od ostatniego tagu i wybiera **najwyższy** wymagany bump: | W commitach pojawia się… | Bump | Przykład | | ------------------------------ | ------------ | --------------- | | `BREAKING CHANGE` lub `typ!` | MAJOR | `1.4.2 → 2.0.0` | | przynajmniej jeden `feat` | MINOR | `1.4.2 → 1.5.0` | | tylko `fix` (i neutralne typy) | PATCH | `1.4.2 → 1.4.3` | | tylko `docs`/`chore`/`test`… | brak wydania | — | Changelog powstaje przy okazji: narzędzie grupuje commity wg typu („Features", „Bug Fixes", „BREAKING CHANGES") i zapisuje je w `CHANGELOG.md`. Jedno źródło prawdy — historia Git — zasila i numer, i notatki, i tag. ## Narzędzia: od konwencji do wydania Ekosystem dzieli się na trzy role: **egzekwowanie** konwencji przy commicie, **liczenie** wersji i changelogu, oraz **uruchamianie** tego wszystkiego w pipeline. ### Liczenie wersji i wydania To serce automatyzacji — i tu kończy się różnica „narzędziowa", a zaczyna wybór **modelu wydań**. Dwa dominujące podejścia realizują tę samą ideę (wersja liczona z commitów), różniąc się momentem publikacji: **Model „release PR".** [release-please](/katalog/release-please) zbiera commity, wylicza wersję i otwiera pull request z podbiciem wersji oraz changelogiem. Publikacja następuje dopiero po scaleniu tego PR — masz więc jawny, recenzowalny artefakt, zanim cokolwiek wyjdzie na świat. To „bramka wersji" wbudowana w proces. **Model „publish-on-merge".** [semantic-release](/katalog/semantic-release) idzie krok dalej: po merge do gałęzi wydawniczej sam analizuje commity, ustala wersję, generuje changelog i — przez bogaty system wtyczek — publikuje artefakt (npm, GitLab/GitHub Releases, obraz [OCI](https://opencontainers.org/) itd.) oraz odkłada tag. Brak ręcznego kroku to najkrótsza droga od merge do wydania; kontrolę przenosisz wtedy na etap PR z kodem (bo to on jest ostatnią bramką przed `main`). semantic-release wyróżnia się dodatkowo **kanałami wydawniczymi**: z `main` publikujesz wydania stabilne, z `next`/`beta`/`alpha` — pre-release (`1.5.0-beta.1`), a z gałęzi `1.x` — wydania utrzymaniowe. To kompletny, deklaratywny model cyklu życia wersji. Ten sam wzorzec mają inne narzędzia: `changesets` (świetny do monorepo — intencję zapisuje się w osobnych plikach, nie tylko w commitach) czy `git-cliff` (sam generator changelogu). Różnią się ergonomią, nie ideą. ### release-please kontra semantic-release Oba liczą wersję z Conventional Commits, ale realizują dwie różne filozofie wydań. Najważniejsza różnica to **rozdzielenie „przygotowania" od „publikacji"**: release-please je rozdziela (najpierw PR z wersją, publikacja dopiero po jego scaleniu), a semantic-release scala w jeden, automatyczny krok po merge. | Wymiar | release-please | semantic-release | | ------------------------ | -------------------------------------------------------- | --------------------------------------------------------- | | Model | release PR → publikacja po scaleniu | publish-on-merge (od razu po merge) | | Bramka wersji | wbudowana — osobny PR z wersją i changelogiem | brak osobnej; bramką jest PR z kodem | | Kontrola momentu wydania | wysoka (mergujesz, gdy chcesz wydać) | niska (wydanie = skutek merge’a) | | Publikacja artefaktów | nie publikuje sama (robi tag/release; publish dokładasz) | publikuje przez wtyczki (npm, Releases, registry…) | | Changelog | `CHANGELOG.md` widoczny w release PR | generowany przy wydaniu (wtyczka) | | Pre-release / kanały | podstawowe | rozbudowane (`next`/`beta`/`alpha`, gałęzie utrzymaniowe) | | Monorepo | natywne (wiele pakietów, osobne release PR-y) | słabiej, wymaga dodatków | | Konfiguracja | manifest + plik konfiguracyjny | `.releaserc` + dobór wtyczek | | Krzywa wejścia | niska | średnia (wtyczki, tokeny, uprawnienia) | Co z tego wynika w praktyce: - **Kontrola czasu i treści wydania.** release-please daje „poczekalnię": kilka feature’ów może czekać w jednym release PR, a Ty decydujesz, kiedy je wydać i możesz jeszcze dopieścić notatki. semantic-release wydaje, gdy tylko zmiana wejdzie na gałąź — świetne do ciągłego dostarczania, mniej wygodne, gdy chcesz „zebrać" wydanie albo zsynchronizować je z czymś poza repo. - **Co znaczy „wydanie".** release-please domyślnie kończy na tagu i wpisie release — samą publikację artefaktu (npm, obraz) dokładasz osobnym krokiem. semantic-release traktuje publikację jako część procesu: jego siłą jest ekosystem wtyczek, który w jednym przebiegu zaktualizuje changelog, opublikuje pakiet, utworzy release i odłoży tag (atomowo — albo wszystko, albo nic). - **Audyt i zgodność.** Jawny release PR to naturalny punkt przeglądu i zatwierdzenia („czy na pewno 2.0.0?”) — bywa wymagany przy regulacjach. W modelu publish-on-merge ten przegląd musi wydarzyć się wcześniej, na PR z kodem, bo po merge nie ma już ręcznego hamulca. - **Pre-release i utrzymanie wielu linii.** Jeśli prowadzisz równolegle `1.x`, `2.x` i kanał beta, rozbudowany model gałęzi semantic-release jest tu znacząco wygodniejszy. - **Monorepo.** Przy wielu pakietach w jednym repo release-please ma przewagę (osobne wersje i release PR-y per pakiet); semantic-release wymaga obejść, a często lepszym wyborem bywa wtedy `changesets`. W skrócie: wybierz **release-please**, gdy cenisz jawną bramkę wersji, kontrolę momentu wydania i monorepo; wybierz **semantic-release**, gdy chcesz maksymalnej automatyzacji „od merge do opublikowanego artefaktu" i bogatych kanałów wydawniczych. ### Egzekwowanie konwencji Automatyczne liczenie wersji działa tylko wtedy, gdy commity faktycznie trzymają się konwencji. Dlatego warto ją wymusić: lokalnie (hook pre-commit / `commitlint`) i w CI. Wygodnie zrobić to przez [MegaLinter](/katalog/megalinter), który potrafi uruchomić walidację komunikatów commitów obok reszty linterów — jednym krokiem w pipeline. ### Uruchamianie w pipeline Cała mechanika żyje w repozytorium i CI — i jest przenośna między platformami. Na [Gitea](/katalog/gitea) odpalisz ją jako Gitea Actions, na [GitLab](/katalog/gitlab) jako pipeline w `.gitlab-ci.yml`, a ten sam automat zadziała też na innym CI. Do przenośnych, kontenerowych kroków pasuje [Dagger](/katalog/dagger), a jeśli wolisz dedykowany silnik — [Woodpecker](/katalog/woodpecker). Dla bezpieczeństwa łańcucha dostaw warto podpisywać tagi/commity wydań, np. bezkluczowo przez [gitsign](/katalog/gitsign). ## Pipeline w praktyce Ten sam wzorzec, dwie platformy i dwa modele wydań. **Gitea Actions + release-please (model „release PR").** Przy pushu do `main` powstaje lub aktualizuje się release PR; po jego scaleniu — tag i wydanie. ```yaml # .gitea/workflows/release.yml name: release on: push: branches: [main] jobs: release-please: runs-on: ubuntu-latest steps: - uses: googleapis/release-please-action@v4 with: release-type: node # albo: simple, python, go… ``` **GitLab CI + semantic-release (model „publish-on-merge").** Po merge do `main` job sam liczy wersję, tworzy changelog, tag i release. ```yaml # .gitlab-ci.yml release: image: node:20 rules: - if: '$CI_COMMIT_BRANCH == "main"' script: - npx semantic-release ``` ```json // .releaserc.json { "branches": ["main", { "name": "beta", "prerelease": true }], "plugins": [ "@semantic-release/commit-analyzer", "@semantic-release/release-notes-generator", "@semantic-release/changelog", "@semantic-release/gitlab", "@semantic-release/git" ] } ``` Oba modele sprowadzają się do tego samego cyklu:
feat · fix · feat! automat: liczy wersję i changelog tag vX.Y.Z + release release PR → review albo: merge → publish
Ten sam cykl w obu modelach: z commitów automat liczy wersję i changelog, a po bramce (release PR albo merge) powstaje tag i wydanie.
Walidację konwencji dokładasz jako wcześniejszą bramkę (commitlint / [MegaLinter](/katalog/megalinter)), a podpisywanie tagów jako krok po wydaniu. Każdy element jest deklaratywny i wersjonowany — wydania przestają być czynnością, a stają się właściwością repozytorium. ## Pułapki i dobre praktyki - **Squash vs merge.** Jeśli scalasz PR-y przez squash, to _tytuł_ squasha musi być zgodny z Conventional Commits — bo to on trafia do historii `main`. Wymuś walidację tytułu PR. - **`0.x` to nie wymówka.** Brak stabilności w `0.y.z` nie znaczy, że można ignorować breaking changes — oznaczaj je, by changelog był uczciwy, i świadomie zaplanuj `1.0.0`. - **Nie kłam typem.** `feat` użyty do poprawki zawyża wersje i psuje zaufanie do `^`. Konsekwencja w typach jest ważniejsza niż ich liczba. - **Monorepo.** Przy wielu pakietach w jednym repo rozważ narzędzie świadome granic pakietów (np. changesets) albo release-please w trybie wielopakietowym — inaczej jeden `feat` podbije wszystko. - **Człowiek w pętli.** Automat ma _przygotować_ wydanie (PR/draft), nie publikować bez kontroli. To ta sama zasada, co przy każdym automacie treści i infrastruktury — zgodna z podejściem [Policy-as-Code](/blog/policy-as-code-dla-zespolow): reguły egzekwuje maszyna, decyzję zatwierdza człowiek. ## Podsumowanie Ręczne wersjonowanie zawodzi, bo wymaga, by człowiek odtworzył i poprawnie ocenił wiedzę, której nigdzie nie zapisał. SemVer nadaje trzem liczbom znaczenie kontraktu; Conventional Commits utrwalają intencję zmiany w chwili jej powstania; automat — czy to [release-please](/katalog/release-please) (model „release PR"), czy [semantic-release](/katalog/semantic-release) (model „publish-on-merge") — zamienia tę historię w deterministyczny numer, changelog i tag. Platforma, na której to działa ([Gitea](/katalog/gitea), [GitLab](/katalog/gitlab) czy inna), jest tu wymienna. Najważniejsze nie jest jednak narzędzie, lecz podejście: wersja przestaje być decyzją podejmowaną w pośpiechu na końcu, a staje się obliczalną konsekwencją tego, jak pracujesz. Czyli dokładnie tym, czym numer wersji być powinien. Weź to na warsztat na jednym repo — raz skonfigurowany automat sprawia, że o wersjonowaniu po prostu przestajesz myśleć. A to jedna z przyjemniejszych rzeczy, jakie możesz sobie sprawić. :) --- ======== KATALOG ======== ## age — Security-as-Code URL: https://eiac.dev/katalog/age Repo: https://github.com/FiloSottile/age Licencja: BSD-3-Clause age to proste i nowoczesne narzędzie (oraz biblioteka Go) do szyfrowania plików. Stawia na minimalizm: małe, jawne klucze, brak opcji konfiguracyjnych i kompozycyjność w stylu UNIX. Świetnie nadaje się do szyfrowania sekretów, backupów czy artefaktów — i jest domyślnym, wygodnym backendem kluczy dla [SOPS](/katalog/sops). ## Kiedy używać - Potrzebujesz prostego szyfrowania plików bez ciężaru PGP. - Szyfrujesz sekrety/backupy w skryptach i CI. - Chcesz kluczy łatwych do zarządzania i wersjonowania. ## Przykład użycia ```bash age-keygen -o key.txt # klucz prywatny + publiczny age -r age1qz... -o secret.age secret.txt # szyfrowanie do odbiorcy age -d -i key.txt secret.age # odszyfrowanie ``` ## Warto wiedzieć - Idealny jako backend kluczy dla [SOPS](/katalog/sops). - Małe klucze łatwo trzymać w sekretach CI/menedżerze sekretów. --- ## Ansible — Infrastructure-as-Code URL: https://eiac.dev/katalog/ansible Repo: https://github.com/ansible/ansible Licencja: GPL-3.0 Ansible automatyzuje konfigurację serwerów, wdrożenia aplikacji i zadania operacyjne, używając prostych plików YAML (playbooków). Działa bezagentowo — łączy się przez SSH (lub WinRM), więc nie wymaga instalowania niczego na hostach docelowych. Moduły są idempotentne: ponowne uruchomienie playbooka nie zmienia już zgodnego stanu. ## Kiedy używać - Konfigurujesz istniejące serwery (pakiety, usługi, pliki) w powtarzalny sposób. - Orkiestrujesz wieloetapowe wdrożenia i zadania utrzymaniowe. - Wolisz podejście proceduralne/idempotentne bez instalowania agentów. ## Przykład użycia ```yaml - hosts: web become: true tasks: - name: Zainstaluj nginx ansible.builtin.package: name: nginx state: present - name: Uruchom i włącz usługę ansible.builtin.service: name: nginx state: started enabled: true ``` ```bash ansible-playbook -i inventory.ini site.yml ``` ## Warto wiedzieć - Świetny do konfiguracji i orkiestracji; do provisioningu chmury często łączony z [Terraform](/katalog/terraform). - Role i kolekcje (Ansible Galaxy) pozwalają reużywać gotowe komponenty. --- ## APM (Agent Package Manager) — SDLC / Policy-as-Code URL: https://eiac.dev/katalog/apm Repo: https://github.com/microsoft/apm Licencja: MIT APM (Agent Package Manager) traktuje **kontekst agenta jak zależności kodu** — tak jak npm czy pip traktują biblioteki. W jednym pliku `apm.yml` deklarujesz skille, prompty, instrukcje, wtyczki i serwery MCP, których potrzebuje projekt, a każdy, kto sklonuje repo, po `apm install` dostaje identyczną konfigurację agenta — na GitHub Copilot, Claude Code, Cursor, OpenCode, Codex, Gemini i Windsurf. Lockfile przypina wersje i hasze treści, więc świeży klon odtwarza setup co do bajta. ## Kiedy używać - Chcesz **odtwarzalnego, przenośnego kontekstu agenta** wersjonowanego razem z kodem (agent-context-as-code). - Ujednolicasz pracę wielu „harnessów" AI w zespole — jeden manifest, każde narzędzie skonfigurowane tak samo. - Potrzebujesz governance nad tym, co agent może zainstalować (skille, MCP) — na poziomie repo, org i przedsiębiorstwa. ## Przykład użycia ```yaml # apm.yml — jedzie z repo, jak package.json name: my-project version: 1.0.0 dependencies: apm: - anthropics/skills/skills/frontend-design - github/awesome-copilot/plugins/context-engineering#v2.1 mcp: - io.github.github/github-mcp-server ``` ```bash git clone && cd && apm install ``` ## Warto wiedzieć - Zbudowany na otwartych standardach: [AGENTS.md](https://agents.md), [Agent Skills](https://agentskills.io) i [MCP](https://modelcontextprotocol.io); bez centralnego rejestru — zależności to adresy repozytoriów Git (mniejsza powierzchnia ataku). - Secure-by-default: skan ukrytego Unicode, przypięte hasze integralności, blokada tranzytywnych serwerów MCP; polityki (`apm-policy.yml`) egzekwowane przy instalacji — to [policy-as-code](/blog/policy-as-code-dla-zespolow) dla kontekstu agenta. - Naturalny element [deterministycznego szkieletu ADP](/blog/deterministyczny-szkielet-adp): odtwarzalny, audytowalny wsad dla agentów w [czterech poziomach autonomii](/blog/cztery-poziomy-agentowego-wytwarzania). --- ## Argo CD — SDLC / Policy-as-Code URL: https://eiac.dev/katalog/argo-cd Repo: https://github.com/argoproj/argo-cd Licencja: Apache-2.0 Argo CD to deklaratywne narzędzie continuous delivery dla Kubernetes w modelu GitOps. Repozytorium Git jest źródłem prawdy o pożądanym stanie klastra; Argo CD nieustannie porównuje ten stan z rzeczywistym i synchronizuje różnice (automatycznie lub po akceptacji). Dostajesz pełną historię zmian, łatwe wycofywanie i czytelny podgląd „drift" między Gitem a klastrem. ## Kiedy używać - Wdrażasz na Kubernetes i chcesz, by każda zmiana szła przez Git (audyt, review, rollback). - Zarządzasz wieloma klastrami/środowiskami z jednego miejsca. - Łączysz z [Helm](/katalog/helm) lub Kustomize do szablonowania manifestów. ## Przykład użycia ```yaml apiVersion: argoproj.io/v1alpha1 kind: Application metadata: name: eiac-web spec: project: default source: repoURL: https://git.eiac.dev/eiac/deploy.git path: web targetRevision: main destination: server: https://kubernetes.default.svc namespace: web syncPolicy: automated: { prune: true, selfHeal: true } ``` `selfHeal` przywróci stan z Gita, jeśli ktoś zmieni zasób ręcznie w klastrze. ## Warto wiedzieć - Repo z manifestami trzymamy na Gitei — Argo CD ciągnie z dowolnego Git. - `prune` usuwa zasoby skasowane w repo; włączaj świadomie. --- ## Argo CD Vault Plugin — Security-as-Code URL: https://eiac.dev/katalog/argocd-vault-plugin Repo: https://github.com/argoproj-labs/argocd-vault-plugin Licencja: Apache-2.0 Argo CD Vault Plugin rozwiązuje problem sekretów w GitOps: w repo trzymasz manifesty z placeholderami zamiast wartości, a wtyczka podczas synchronizacji pobiera prawdziwe sekrety z backendu ([Vault](/katalog/vault), [OpenBao](/katalog/openbao), menedżery chmurowe) i wstrzykuje je do zasobów Kubernetes. Dzięki temu sekrety nigdy nie lądują w Git, a deklaratywny model [Argo CD](/katalog/argo-cd) pozostaje nienaruszony. ## Kiedy używać - Robisz GitOps z [Argo CD](/katalog/argo-cd) i potrzebujesz sekretów bez trzymania ich w repo. - Masz już backend sekretów (Vault/OpenBao/chmura) jako źródło prawdy. - Chcesz placeholdery w manifestach zamiast zaszyfrowanych wartości. ## Przykład użycia ```yaml # manifest w repo — placeholder zamiast wartości apiVersion: v1 kind: Secret metadata: { name: db } stringData: password: ``` Przy synchronizacji wtyczka podstawia wartość z Vaulta. ## Warto wiedzieć - Alternatywa wobec szyfrowania w repo ([SOPS](/katalog/sops)) — tu sekrety zostają w backendzie. - Wymaga skonfigurowanego dostępu Argo CD do backendu sekretów. --- ## Backstage — SDLC / Policy-as-Code URL: https://eiac.dev/katalog/backstage Repo: https://github.com/backstage/backstage Licencja: Apache-2.0 Backstage to framework do budowy wewnętrznych portali developerskich (IDP). Skupia w jednym miejscu katalog serwisów, dokumentację (TechDocs), szablony scaffoldingu i wtyczki do narzędzi. Kluczowe: encje opisujesz jako pliki `catalog-info.yaml` w repozytoriach, więc katalog organizacji jest „as-code" — wersjonowany i utrzymywany razem z kodem usług. ## Kiedy używać - Masz wiele serwisów/zespołów i chcesz jednego źródła wiedzy o nich. - Standaryzujesz zakładanie nowych projektów (Software Templates). - Chcesz, by katalog i dokumentacja żyły w repo, nie w wiki. ## Przykład użycia ```yaml # catalog-info.yaml w repo usługi apiVersion: backstage.io/v1alpha1 kind: Component metadata: name: eiac-web annotations: backstage.io/techdocs-ref: dir:. spec: type: website lifecycle: production owner: team-platform ``` Backstage zaciąga ten plik i pokazuje usługę w katalogu wraz z dokumentacją. ## Warto wiedzieć - Wymaga utrzymania (to aplikacja, nie SaaS), ale daje pełną kontrolę. - Bogaty ekosystem wtyczek; integruje CI/CD, chmurę i obserwowalność. --- ## Buildah — App-as-Code URL: https://eiac.dev/katalog/buildah Repo: https://github.com/containers/buildah Licencja: Apache-2.0 Buildah buduje obrazy zgodne z OCI bez działającego demona Dockera — z Dockerfile albo skryptem krok po kroku. Działa rootless, dobrze nadaje się do CI i pozwala precyzyjnie kontrolować zawartość warstw. Budowanie obrazów staje się powtarzalnym, skryptowalnym krokiem pipeline'u, bez zależności od demona w tle. ## Kiedy używać - Budujesz obrazy w CI bez demona Dockera (bezpieczniej, rootless). - Chcesz pełnej kontroli nad warstwami (skryptowe budowanie). - Standaryzujesz produkcję obrazów OCI. ## Przykład użycia ```bash buildah bud -t registry.eiac.dev/eiac/web:1.0.0 . # z Dockerfile # albo krok po kroku: ctr=$(buildah from node:20) buildah run $ctr -- npm ci buildah commit $ctr eiac/web ``` ## Warto wiedzieć - Z rodziny Podman; dobrze współgra ze skanami [Trivy](/katalog/trivy)/[Grype](/katalog/grype). - Obrazy publikujesz do rejestru jak [Harbor](/katalog/harbor). --- ## Casbin — Security-as-Code URL: https://eiac.dev/katalog/casbin Repo: https://github.com/casbin/casbin Licencja: Apache-2.0 Casbin to biblioteka autoryzacji, w której logikę dostępu opisujesz deklaratywnie: model (np. RBAC, ABAC, ACL) i polityki trzymasz w plikach lub bazie, a kod tylko pyta „czy ten podmiot może wykonać tę akcję na tym zasobie?". Dzięki temu reguły dostępu są oddzielone od aplikacji, wersjonowane i spójne między usługami — dostępny jest w wielu językach (Go, Node, Python, PHP i inne). ## Kiedy używać - Potrzebujesz elastycznej autoryzacji (role, atrybuty) wspólnej dla wielu usług. - Chcesz oddzielić reguły dostępu od kodu aplikacji. - Zależy Ci na jednym modelu autoryzacji w różnych językach. ## Przykład użycia ```ini # model.conf — definicja RBAC [request_definition] r = sub, obj, act [policy_definition] p = sub, obj, act [role_definition] g = _, _ [matchers] m = g(r.sub, p.sub) && r.obj == p.obj && r.act == p.act ``` ```csv # policy.csv p, editor, article, write g, alice, editor ``` ## Warto wiedzieć - Działa na poziomie aplikacji (authz), podczas gdy [Open Policy Agent](/katalog/open-policy-agent) jest uniwersalnym silnikiem polityk. - Polityki możesz trzymać w Gicie albo w bazie (adaptery). --- ## cert-manager — Security-as-Code URL: https://eiac.dev/katalog/cert-manager Repo: https://github.com/cert-manager/cert-manager Licencja: Apache-2.0 cert-manager automatyzuje wydawanie i odnawianie certyfikatów TLS w Kubernetes. Certyfikaty i ich źródła (Let's Encrypt/ACME, własne CA, [Vault](/katalog/vault)) opisujesz jako obiekty Kubernetes (CRD), a kontroler dba o ich pozyskanie, montowanie w sekretach i odnawianie przed wygaśnięciem. TLS staje się deklaratywnym, samonaprawiającym się elementem klastra. ## Kiedy używać - Chcesz automatycznego, odnawialnego TLS dla usług w [Kubernetes](/katalog/kubernetes). - Wydajesz certyfikaty z ACME (wildcard przez DNS-01) lub własnego CA. - Zależy Ci na certyfikatach „as-code" zamiast ręcznego zarządzania. ## Przykład użycia ```yaml apiVersion: cert-manager.io/v1 kind: Certificate metadata: { name: eiac-tls, namespace: web } spec: secretName: eiac-tls dnsNames: ["eiac.dev", "www.eiac.dev"] issuerRef: { name: letsencrypt, kind: ClusterIssuer } ``` ## Warto wiedzieć - Poza klastrem podobną rolę pełni [lego](/katalog/lego) (ACME CLI/biblioteka). - Integruje DNS-01 z dziesiątkami dostawców DNS (też przez [external-dns](/katalog/external-dns)). --- ## Checkov — Security-as-Code URL: https://eiac.dev/katalog/checkov Repo: https://github.com/bridgecrewio/checkov Licencja: Apache-2.0 Checkov analizuje statycznie infrastrukturę jako kod (Terraform, CloudFormation, Kubernetes, Helm, Dockerfile, ARM) i wykrywa błędy konfiguracji oraz naruszenia zasad bezpieczeństwa, zanim trafią na produkcję. Ma setki wbudowanych reguł, a własne polityki zapiszesz w Pythonie lub YAML — bezpieczeństwo staje się bramką w pipeline, nie ręcznym przeglądem. ## Kiedy używać - Skanujesz [Terraform](/katalog/terraform)/[Kubernetes](/katalog/kubernetes) pod kątem złych konfiguracji w CI. - Chcesz egzekwować własne reguły zgodności (custom policies). - Zależy Ci na szybkim feedbacku już na etapie PR. ## Przykład użycia ```bash checkov -d . # skan katalogu IaC checkov -d . --compact --quiet # tylko naruszenia ``` ```yaml # krok w Gitea Actions — twarda bramka - run: checkov -d infra --soft-fail-on LOW ``` ## Warto wiedzieć - Uzupełnia skan obrazów/zależności ([Trivy](/katalog/trivy)) o warstwę polityk IaC. - Alternatywy o podobnym zakresie: Terrascan, KICS. --- ## ClusterFuzzLite — Security-as-Code URL: https://eiac.dev/katalog/clusterfuzzlite Repo: https://github.com/google/clusterfuzzlite Licencja: Apache-2.0 ClusterFuzzLite to lekka wersja ClusterFuzz przeznaczona do uruchamiania fuzzingu bezpośrednio w CI. Przy każdym pull requeście testuje zmieniony kod losowymi/wygenerowanymi danymi wejściowymi, wyłapując crash-e i błędy bezpieczeństwa zanim trafią na produkcję. Konfigurację trzymasz w repo, więc fuzzing staje się powtarzalnym krokiem pipeline'u, a nie jednorazową akcją. ## Kiedy używać - Chcesz wykrywać błędy pamięci/parsowania i podatności wcześnie, w PR. - Masz kod podatny na nietypowe dane wejściowe (parsery, formaty, protokoły). - Wolisz fuzzing zintegrowany z CI niż osobną infrastrukturę. ## Przykład użycia ```yaml # krok w CI (skrót) — fuzzing przy PR - run: | python infra/cifuzz/cifuzz.py \ --fuzz-seconds 300 --sanitizer address ``` Wykryte awarie raportowane są wraz z reprodukującym wejściem. ## Warto wiedzieć - Uzupełnia skany statyczne ([Trivy](/katalog/trivy)/[Checkov](/katalog/checkov)) o testy dynamiczne. - Najwięcej daje przy kodzie przetwarzającym nieufne dane wejściowe. --- ## Coder — App-as-Code URL: https://eiac.dev/katalog/coder Repo: https://github.com/coder/coder Licencja: AGPL-3.0 Coder to samodzielnie hostowana platforma do tworzenia zdalnych środowisk deweloperskich (CDE). Szablony workspace'ów definiujesz w… [Terraform](/katalog/terraform) — więc całe środowisko (maszyna, kontener, narzędzia, dostęp) jest kodem, wersjonowanym i powtarzalnym. Deweloperzy dostają spójne, gotowe środowiska na żądanie, a Ty kontrolujesz zasoby i bezpieczeństwo. ## Kiedy używać - Chcesz spójnych, odtwarzalnych środowisk dev dla zespołu (i agentów AI). - Standaryzujesz onboarding i eliminujesz „u mnie działa". - Wolisz self-hosting i kontrolę nad zasobami/dostępem. ## Przykład użycia ```hcl # szablon workspace (Terraform) resource "docker_container" "workspace" { image = "codercom/enterprise-base:ubuntu" name = "eiac-${data.coder_workspace.me.name}" } ``` ```bash coder templates push eiac coder create --template eiac my-dev ``` ## Warto wiedzieć - Szablony to Terraform → środowiska prowizjonujesz jak infrastrukturę. - Dobrze pasuje do pracy z agentami AI w izolowanych, kontrolowanych workspace'ach. --- ## Conftest — SDLC / Policy-as-Code URL: https://eiac.dev/katalog/conftest Repo: https://github.com/open-policy-agent/conftest Licencja: Apache-2.0 Conftest pozwala pisać testy względem ustrukturyzowanych plików konfiguracyjnych — manifestów Kubernetes, planów Terraform, Dockerfile, YAML/JSON/HCL — przy użyciu języka Rego z [Open Policy Agent](/katalog/open-policy-agent). Reguły trzymasz w repo i uruchamiasz jako krok CI, dzięki czemu zgodność konfiguracji jest deterministyczną bramką, a nie audytem po wdrożeniu. ## Kiedy używać - Chcesz egzekwować własne reguły na manifestach/IaC w pipeline (np. zakaz `:latest`, wymagane labelki, limity). - Wolisz Rego i ekosystem OPA, ale potrzebujesz prostego CLI do plików, nie serwera polityk. - Standaryzujesz bramki konfiguracji w wielu repozytoriach. ## Przykład użycia ```rego # policy/deployment.rego package main deny contains msg if { input.kind == "Deployment" not input.spec.template.spec.securityContext.runAsNonRoot msg := "kontener musi działać jako non-root" } ``` ```bash conftest test k8s/ --policy policy/ # bramka w CI ``` ## Warto wiedzieć - Ten sam język (Rego) co [OPA](/katalog/open-policy-agent) i egzekwowanie w klastrze przez [OPA Gatekeeper](/katalog/gatekeeper) — statycznie w CI, dynamicznie w klastrze. - Uzupełnia skanery jak [Checkov](/katalog/checkov)/[Trivy](/katalog/trivy) o Twoje własne, dziedzinowe reguły. --- ## Crossplane — Infrastructure-as-Code URL: https://eiac.dev/katalog/crossplane Repo: https://github.com/crossplane/crossplane Licencja: Apache-2.0 Crossplane zamienia Kubernetes w uniwersalny control plane do zarządzania infrastrukturą. Zasoby chmurowe deklarujesz jako obiekty Kubernetes, a kontrolery nieustannie uzgadniają stan rzeczywisty z pożądanym (reconciliation). Pozwala też budować własne, wysokopoziomowe abstrakcje (Compositions) i udostępniać je zespołom jako self-service. ## Kiedy używać - Standaryzujesz na Kubernetes i chcesz tym samym API zarządzać też infrastrukturą. - Budujesz wewnętrzną platformę (IDP) z self-service dla deweloperów. - Zależy Ci na ciągłym uzgadnianiu stanu, nie jednorazowym `apply`. ## Przykład użycia ```yaml apiVersion: s3.aws.upbound.io/v1beta1 kind: Bucket metadata: name: eiac-assets spec: forProvider: region: eu-central-1 ``` ```bash kubectl apply -f bucket.yaml kubectl get buckets ``` Crossplane utrzyma zasób w zadanym stanie — jeśli ktoś zmieni go ręcznie, kontroler go skoryguje. ## Warto wiedzieć - Projekt CNCF; dojrzały ekosystem providerów (Upbound). - Compositions + Claims pozwalają ukryć złożoność za prostym API dla zespołów. --- ## Dagger — SDLC / Policy-as-Code URL: https://eiac.dev/katalog/dagger Repo: https://github.com/dagger/dagger Licencja: Apache-2.0 Dagger pozwala definiować pipeline'y CI/CD jako kod uruchamiany w kontenerach, identycznie lokalnie i na dowolnym CI. Każdy krok to operacja na kontenerach z cache'owaniem, więc buildy są powtarzalne i szybkie, a logikę pipeline'u piszesz w wybranym języku (Go, Python, TypeScript) albo wywołujesz przez CLI. Koniec z „działa tylko na CI" — ten sam pipeline odpalisz na laptopie. ## Kiedy używać - Chcesz przenośnych pipeline'ów niezwiązanych z jednym dostawcą CI (np. Gitea Actions, ale też lokalnie). - Zależy Ci na powtarzalności i cache'owaniu kroków build/test. - Wolisz logikę CI w prawdziwym języku zamiast rozrastającego się YAML-a. ## Przykład użycia ```bash # ten sam pipeline lokalnie i w CI dagger call test --source=. dagger call build --source=. export --path=./dist ``` ```go // funkcja pipeline w Go (skrót) func (m *Eiac) Test(ctx context.Context, source *Directory) (string, error) { return dag.Container().From("node:20"). WithDirectory("/src", source).WithWorkdir("/src"). WithExec([]string{"npm", "ci"}). WithExec([]string{"npm", "test"}). Stdout(ctx) } ``` ## Warto wiedzieć - Uruchamiasz z dowolnego CI — wystarczy Docker; dobrze pasuje do Gitea Actions. - Cache warstw kontenerów znacząco skraca czas powtarzanych buildów. --- ## Dex — Security-as-Code URL: https://eiac.dev/katalog/dex Repo: https://github.com/dexidp/dex Licencja: Apache-2.0 Dex to dostawca tożsamości OpenID Connect, który działa jako „pośrednik" do innych źródeł logowania (LDAP, SAML, GitHub, Google i inne) przez pluggable connectors. Aplikacje integrują się z jednym, standardowym OIDC, a Dex federuje uwierzytelnianie do wybranych backendów. Konfigurację (connectory, klienci) trzymasz deklaratywnie — tożsamość staje się częścią infrastruktury jako kod. ## Kiedy używać - Chcesz jednego punktu OIDC przed wieloma źródłami logowania. - Dodajesz SSO do Kubernetes, [Argo CD](/katalog/argo-cd), wewnętrznych narzędzi. - Wolisz lekki IdP konfigurowany deklaratywnie. ## Przykład użycia ```yaml # config.yaml (fragment) issuer: https://auth.eiac.dev/dex connectors: - type: github id: github config: { clientID: $GH_ID, clientSecret: $GH_SECRET } staticClients: - id: argo-cd redirectURIs: ["https://cd.eiac.dev/auth/callback"] name: Argo CD ``` ## Warto wiedzieć - Lekki broker tożsamości; do pełnego OAuth2/OIDC „as a service" zob. [Ory Hydra](/katalog/ory-hydra). - Bardzo popularny jako warstwa SSO dla Kubernetes i Argo CD. --- ## Encore — App-as-Code URL: https://eiac.dev/katalog/encore Repo: https://github.com/encoredev/encore Licencja: MPL-2.0 Encore to framework do backendów, w którym infrastrukturę wywodzi się z kodu. Deklarujesz serwisy, endpointy, bazy danych czy kolejki jako konstrukcje w kodzie (Go lub TypeScript), a Encore analizuje je statycznie i sam provisionuje potrzebne zasoby — lokalnie i w chmurze. Stawia na konwencję zamiast konfiguracji, więc mniej „kleju" infrastrukturalnego. ## Kiedy używać - Budujesz backend/mikroserwisy i chcesz, by infrastruktura wynikała z kodu bez osobnego IaC. - Cenisz konwencję, wbudowane tracing/obserwowalność i lokalny dashboard. - Zespół pracuje w Go lub TypeScript. ## Przykład użycia ```ts import { api } from "encore.dev/api"; export const hello = api( { method: "GET", path: "/hello/:name", expose: true }, async ({ name }: { name: string }) => { return { message: `Cześć, ${name}!` }; } ); ``` ```bash encore run # lokalnie, z dashboardem encore deploy # wdrożenie ``` ## Warto wiedzieć - Mocniejsza konwencja niż [SST](/katalog/sst) — mniej elastyczności, mniej decyzji. - Można hostować na Encore Cloud lub eksportować do własnej chmury. --- ## env0 — Infrastructure-as-Code URL: https://eiac.dev/katalog/env0 Licencja: Proprietary env0 to komercyjna platforma automatyzacji IaC (TACOS), która obok standardowego zestawu (GitOps, RBAC, drift detection, polityki) kładzie wyraźny nacisk na **FinOps** — widoczność i kontrolę kosztów infrastruktury. Obsługuje wiele silników w jednym miejscu: [Terraform](/katalog/terraform), [OpenTofu](/katalog/opentofu), [Terragrunt](/katalog/terragrunt), [Pulumi](/katalog/pulumi), [Helm](/katalog/helm) i [Kubernetes](/katalog/kubernetes). ## Kiedy używać - Chcesz jedną platformę na wiele narzędzi IaC z kontrolą kosztów (FinOps) w komplecie. - Potrzebujesz samoobsługowych szablonów środowisk dla zespołów (self-service). - Zależy Ci na drift detection, RBAC i politykach w jednym przepływie. ## Przykład użycia ```yaml # env0.yml — definicja środowiska jako szablonu samoobsługowego deploy: steps: terraformPlan: after: [ "conftest test $TF_PLAN" ] configuration: - name: TF_VAR_region value: eu-central-1 ``` ## Warto wiedzieć - Rozliczenia per apply / per środowisko; brak wieczystego darmowego planu (tylko trial). - Alternatywy: [Spacelift](/katalog/spacelift) (mocny GitOps), [Scalr](/katalog/scalr) (drop-in TFC), [OpenTaco](/katalog/digger) (open-source, w Twoim CI). - Kontrola kosztów łączy się naturalnie z obserwowalnością platformy (FinOps/GreenOps). --- ## ExternalDNS — Infrastructure-as-Code URL: https://eiac.dev/katalog/external-dns Repo: https://github.com/kubernetes-sigs/external-dns Licencja: Apache-2.0 ExternalDNS synchronizuje rekordy DNS u zewnętrznych dostawców (Cloudflare, Route 53, Google i dziesiątki innych) na podstawie zasobów Kubernetes — Service i Ingress. Zamiast ręcznie zakładać wpisy DNS, deklarujesz je adnotacjami/hostami w manifestach, a kontroler utrzymuje strefę w zgodzie z klastrem. DNS staje się kodem, wersjonowanym razem z aplikacją. ## Kiedy używać - Chcesz, by wpisy DNS powstawały automatycznie z Ingress/Service. - Zarządzasz wieloma domenami/strefami i nie chcesz robić tego ręcznie. - Pracujesz w GitOps i traktujesz DNS jak resztę infrastruktury. ## Przykład użycia ```yaml apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: web annotations: external-dns.alpha.kubernetes.io/hostname: eiac.dev spec: rules: [{ host: eiac.dev, http: { paths: [ ... ] } }] ``` ExternalDNS utworzy i zaktualizuje rekord `eiac.dev` u dostawcy DNS. ## Warto wiedzieć - Świetnie współgra z [cert-manager](/katalog/cert-manager) (DNS-01) i [Kubernetes](/katalog/kubernetes). - Wspiera wielu providerów DNS przez jeden kontroler. --- ## Falco — Security-as-Code URL: https://eiac.dev/katalog/falco Repo: https://github.com/falcosecurity/falco Licencja: Apache-2.0 Falco to silnik wykrywania zagrożeń w czasie działania. Obserwuje wywołania systemowe jądra (i zdarzenia Kubernetes) i w czasie rzeczywistym alarmuje o podejrzanych zachowaniach — uruchomieniu powłoki w kontenerze, zapisie do wrażliwych ścieżek, nietypowych połączeniach sieciowych. Reguły opisujesz deklaratywnie w YAML, więc polityka detekcji jest wersjonowana i recenzowana jak kod. ## Kiedy używać - Potrzebujesz wykrywania zagrożeń w runtime, nie tylko skanów statycznych. - Działasz na Kubernetes/Linux i chcesz alertów o anomaliach zachowania. - Chcesz reguł detekcji utrzymywanych „as-code". ## Przykład użycia ```yaml # reguła: powłoka uruchomiona w kontenerze - rule: Terminal shell in container desc: Wykryto powłokę interaktywną w kontenerze condition: spawned_process and container and shell_procs output: "Powłoka w kontenerze (proc=%proc.name pod=%k8s.pod.name)" priority: WARNING ``` ```bash falco -r custom-rules.yaml ``` ## Warto wiedzieć - Projekt CNCF; uzupełnia skany statyczne ([Trivy](/katalog/trivy)) o warstwę runtime. - Alerty kierujesz do SIEM/alertingu przez Falcosidekick. --- ## Flux — SDLC / Policy-as-Code URL: https://eiac.dev/katalog/flux Repo: https://github.com/fluxcd/flux2 Licencja: Apache-2.0 Flux to zestaw kontrolerów GitOps (GitOps Toolkit), które utrzymują stan klastra Kubernetes zgodny z repozytorium Git. Definiujesz źródła (Git, Helm, OCI) i obiekty synchronizacji, a Flux automatycznie pobiera zmiany, stosuje je i pilnuje, by klaster nie „odjechał" od repo. Wszystko jest deklaratywne i wersjonowane — wdrożenia stają się zwykłymi commitami. ## Kiedy używać - Chcesz GitOps na Kubernetes z natywnymi kontrolerami (CRD). - Automatyzujesz wdrożenia Helm/Kustomize/OCI z Gita. - Zależy Ci na auto-synchronizacji i wykrywaniu dryfu. ## Przykład użycia ```yaml apiVersion: kustomize.toolkit.fluxcd.io/v1 kind: Kustomization metadata: { name: web, namespace: flux-system } spec: interval: 5m sourceRef: { kind: GitRepository, name: eiac } path: ./deploy/web prune: true ``` ## Warto wiedzieć - Alternatywa/uzupełnienie [Argo CD](/katalog/argo-cd) — Flux jest bardziej „kontrolerowy", Argo ma bogaty UI. - Świetnie łączy się z [Helm](/katalog/helm) i [Kustomize](/katalog/kustomize); repo trzymamy na Gitei. --- ## Gitea — SDLC / Policy-as-Code URL: https://eiac.dev/katalog/gitea Repo: https://github.com/go-gitea/gitea Licencja: MIT Gitea to lekka, samodzielnie hostowana platforma do wytwarzania oprogramowania: hosting repozytoriów Git, pull requesty i code review, rejestr pakietów oraz wbudowane **Gitea Actions** (CI/CD zgodne składniowo z GitHub Actions). Wszystko działa z jednego, niewymagającego binarium — to pełna kontrola nad kodem i pipeline'ami u siebie. eiac.dev hostuje na niej repo i automaty. ## Kiedy używać - Chcesz pełnej kontroli nad hostingiem Git i CI/CD bez zależności od zewnętrznych usług. - Potrzebujesz lekkiej platformy z PR-ami, rejestrem pakietów i Actions. - Migrujesz workflowy z GitHub Actions (składnia jest zgodna). ## Przykład użycia ```yaml # .gitea/workflows/build.yml — Gitea Actions on: { push: { branches: [main] } } jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - run: npm ci && npm run build ``` Runner (`act_runner`) wykonuje workflowy zupełnie jak GitHub Actions. ## Warto wiedzieć - Świetnie łączy się z GitOps ([Argo CD](/katalog/argo-cd)/[Flux](/katalog/flux)) i CI ([Woodpecker](/katalog/woodpecker)). - W EIAC to fundament: repo, PR-y i automaty publikacji żyją na Gitei. --- ## GitLab — SDLC / Policy-as-Code URL: https://eiac.dev/katalog/gitlab Repo: https://gitlab.com/gitlab-org/gitlab Licencja: MIT GitLab to kompletna platforma DevOps w jednym produkcie: hosting Git i merge requesty, pipeline'y CI/CD (definiowane w `.gitlab-ci.yml`), rejestr kontenerów i pakietów, skanowanie bezpieczeństwa, środowiska i wiele więcej. Można ją hostować samodzielnie (Community Edition na licencji MIT) lub korzystać z gitlab.com. Pipeline'y i konfiguracja żyją w repo, więc cały SDLC jest wersjonowany i powtarzalny. ## Kiedy używać - Chcesz „wszystko w jednym" (SCM + CI/CD + rejestr + security) na własnej infrastrukturze. - Potrzebujesz dojrzałych pipeline'ów jako kod (`.gitlab-ci.yml`) i środowisk. - Standaryzujesz pracę wielu zespołów na jednej platformie. ## Przykład użycia ```yaml # .gitlab-ci.yml stages: [build, release] build: image: node:20 stage: build script: [npm ci, npm run build] release: image: node:20 stage: release rules: [{ if: '$CI_COMMIT_BRANCH == "main"' }] script: [npx semantic-release] ``` ## Warto wiedzieć - Lżejsza, minimalistyczna alternatywa do samego hostingu Git + CI: [Gitea](/katalog/gitea). - Dobrze współgra z [semantic-release](/katalog/semantic-release) (wtyczka GitLab) i GitOps ([Argo CD](/katalog/argo-cd)/[Flux](/katalog/flux)). --- ## Gitleaks — Security-as-Code URL: https://eiac.dev/katalog/gitleaks Repo: https://github.com/gitleaks/gitleaks Licencja: MIT Gitleaks skanuje repozytoria i całą historię Git w poszukiwaniu przypadkowo zacommitowanych sekretów — kluczy API, tokenów, haseł. Działa lokalnie (hook pre-commit) i w CI jako bramka, a reguły wykrywania konfigurujesz deklaratywnie (TOML), z możliwością allowlist dla fałszywych alarmów. To prosta, wysokowartościowa warstwa „security-as-code". ## Kiedy używać - Chcesz wyłapać sekrety zanim trafią do repo (pre-commit) lub w PR (CI). - Audytujesz istniejącą historię Git pod kątem wycieków. - Potrzebujesz konfigurowalnych reguł i allowlist. ## Przykład użycia ```bash gitleaks detect --source . --redact # skan repo + historii gitleaks protect --staged # przed commitem ``` ```yaml # .gitea/workflows/security.yml (fragment) - run: gitleaks detect --no-banner --exit-code 1 ``` Niezerowy kod wyjścia zatrzymuje pipeline, gdy wykryto sekret. ## Warto wiedzieć - Najlepiej działa jako hook pre-commit + bramka w Gitea Actions jednocześnie. - Reguły i allowlist trzymaj w `.gitleaks.toml` w repo. --- ## gitsign — Security-as-Code URL: https://eiac.dev/katalog/gitsign Repo: https://github.com/sigstore/gitsign Licencja: Apache-2.0 gitsign umożliwia podpisywanie commitów i tagów Git bez zarządzania długożyciowymi kluczami — wykorzystuje Sigstore (keyless): tożsamość OIDC, krótkożyciowy certyfikat i publiczny log przejrzystości (Rekor). Dzięki temu autentyczność historii repo staje się weryfikowalna i automatyzowalna, co wzmacnia bezpieczeństwo łańcucha dostaw oprogramowania. ## Kiedy używać - Chcesz podpisywać commity bez utrzymywania kluczy GPG. - Wzmacniasz integralność łańcucha dostaw (provenance). - Weryfikujesz autentyczność commitów w CI. ## Przykład użycia ```bash git config --local commit.gpgsign true git config --local gpg.x509.program gitsign git config --local gpg.format x509 git commit -m "feat: nowy wpis katalogu" # podpis keyless przez Sigstore ``` ## Warto wiedzieć - Bezkluczowy model: tożsamość OIDC + krótkożyciowy cert + log Rekor. - Element szerszego ekosystemu Sigstore (cosign) do podpisywania artefaktów. --- ## Grype — Security-as-Code URL: https://eiac.dev/katalog/grype Repo: https://github.com/anchore/grype Licencja: Apache-2.0 Grype to szybki skaner podatności dla obrazów kontenerów i systemów plików. Świetnie współpracuje z Syft (generatorem SBOM) — najpierw tworzysz listę składników (SBOM), potem skanujesz ją pod kątem znanych CVE. Dzięki prostemu CLI i przewidywalnym kodom wyjścia łatwo wpina się w pipeline jako bramka jakości. ## Kiedy używać - Skanujesz obrazy i artefakty pod kątem CVE w CI. - Pracujesz w modelu SBOM-first (Syft → Grype). - Chcesz lekkiego, szybkiego skanera obok [Trivy](/katalog/trivy). ## Przykład użycia ```bash grype ghcr.io/eiac/web:1.0.0 # skan obrazu syft ghcr.io/eiac/web:1.0.0 -o spdx-json | grype # ze SBOM ``` ```yaml # fail przy wysokiej severity - run: grype ghcr.io/eiac/web:1.0.0 --fail-on high ``` ## Warto wiedzieć - Syft + Grype rozdzielają „co jest w artefakcie" od „co jest podatne". - Komplementarny do [Trivy](/katalog/trivy) — część zespołów uruchamia oba. --- ## Harbor — SDLC / Policy-as-Code URL: https://eiac.dev/katalog/harbor Repo: https://github.com/goharbor/harbor Licencja: Apache-2.0 Harbor to otwarty, samodzielnie hostowany rejestr obrazów kontenerów i artefaktów OCI z funkcjami bezpieczeństwa łańcucha dostaw: skanowaniem podatności, podpisywaniem, politykami replikacji i kontrolą dostępu (RBAC). Konfigurację projektów i polityk utrzymujesz deklaratywnie, więc dystrybucja artefaktów staje się audytowalnym elementem pipeline'u. ## Kiedy używać - Potrzebujesz własnego rejestru obrazów/artefaktów z kontrolą dostępu. - Chcesz skanu CVE i podpisywania artefaktów przy publikacji. - Replikujesz obrazy między środowiskami/regionami. ## Przykład użycia ```bash docker tag eiac/web registry.eiac.dev/eiac/web:1.0.0 docker push registry.eiac.dev/eiac/web:1.0.0 # Harbor automatycznie skanuje obraz i blokuje pull przy krytycznych CVE (polityka) ``` ## Warto wiedzieć - Wbudowane skanowanie integruje silniki takie jak [Trivy](/katalog/trivy)/[Grype](/katalog/grype). - Polityki „prevent vulnerable images from running" to bramka bezpieczeństwa w dostawie. --- ## Harness Open Source — SDLC / Policy-as-Code URL: https://eiac.dev/katalog/harness Repo: https://github.com/harness/harness Licencja: Apache-2.0 Harness Open Source to kompletna, samodzielnie hostowana platforma dla zespołów: hosting repozytoriów (SCM), pipeline'y CI/CD, hostowane środowiska deweloperskie i rejestry artefaktów — w jednym miejscu. Pipeline'y i konfigurację opisujesz deklaratywnie, więc cały cykl wytwarzania (od kodu po artefakt) jest wersjonowany i powtarzalny. ## Kiedy używać - Chcesz jednej, otwartej platformy zamiast sklejać osobne narzędzia. - Potrzebujesz SCM + CI/CD + rejestru artefaktów u siebie. - Standaryzujesz workflow zespołów end-to-end. ## Przykład użycia ```yaml # .harness/pipeline.yml (skrót) pipeline: stages: - stage: name: build spec: steps: - step: { type: Run, spec: { command: "npm ci && npm run build" } } ``` ## Warto wiedzieć - Konkuruje zakresowo z platformami typu GitLab; w EIAC repo trzymamy na Gitei, więc traktuj Harness jako opcję „wszystko w jednym". - Open Source to rdzeń; część funkcji enterprise jest płatna. --- ## Helm — App-as-Code URL: https://eiac.dev/katalog/helm Repo: https://github.com/helm/helm Licencja: Apache-2.0 Helm to menedżer pakietów dla Kubernetes. Aplikacje i ich zależności pakujesz w „charty" — szablonowane manifesty z parametrami (`values.yaml`), które instalujesz, aktualizujesz i wycofujesz jako jedną, wersjonowaną jednostkę (release). Dzięki temu to samo wdrożenie powtarzasz w wielu środowiskach, zmieniając tylko wartości. ## Kiedy używać - Wdrażasz aplikacje na Kubernetes i chcesz je wersjonować oraz łatwo wycofywać. - Parametryzujesz to samo wdrożenie dla dev/stage/prod przez `values`. - Korzystasz z gotowych chartów (bazy, ingress, narzędzia) z repozytoriów. ## Przykład użycia ```bash helm repo add bitnami https://charts.bitnami.com/bitnami helm install web bitnami/nginx -f values.prod.yaml helm upgrade web bitnami/nginx --set replicaCount=3 helm rollback web 1 # powrót do poprzedniej wersji ``` Szablony chartu używają wartości, np. `replicas: {{ .Values.replicaCount }}`. ## Warto wiedzieć - Często łączony z [Argo CD](/katalog/argo-cd) w podejściu GitOps. - Trzymaj `values` w repo — to one są „kodem" wdrożenia. --- ## Infisical — Security-as-Code URL: https://eiac.dev/katalog/infisical Repo: https://github.com/Infisical/infisical Licencja: MIT Infisical to otwarta platforma do zarządzania sekretami z naciskiem na DX: synchronizuje sekrety między środowiskami, integruje się z CI/CD i Kubernetes, wykrywa wycieki i obsługuje certyfikaty oraz dostęp uprzywilejowany. Sekrety i ich konfigurację trzymasz scentralizowanie, a aplikacje pobierają je w runtime — zamiast plików `.env` w repo. ## Kiedy używać - Chcesz przyjaznej deweloperom alternatywy do zarządzania sekretami. - Synchronizujesz sekrety do CI/CD, Kubernetes i lokalnego dev. - Potrzebujesz wykrywania wycieków i zarządzania certyfikatami w jednym. ## Przykład użycia ```bash infisical login infisical run -- npm start # wstrzykuje sekrety do procesu infisical secrets set DB_URL="postgres://…" --env=prod ``` ## Warto wiedzieć - Lżejsza, „produktowa" alternatywa do [Vault](/katalog/vault)/[OpenBao](/katalog/openbao). - Można hostować samodzielnie (open source) lub korzystać z chmury. --- ## Istio — App-as-Code URL: https://eiac.dev/katalog/istio Repo: https://github.com/istio/istio Licencja: Apache-2.0 Istio to service mesh dla Kubernetes, który dodaje warstwę sieciową między usługami: szyfrowanie mTLS, sterowanie ruchem (routing, canary, retry), polityki dostępu i pełną obserwowalność — bez zmian w kodzie aplikacji. Wszystko konfigurujesz deklaratywnie przez obiekty Kubernetes (CRD), więc zachowanie sieci między usługami staje się wersjonowanym kodem. ## Kiedy używać - Masz wiele usług i potrzebujesz mTLS, routingu i polityk bez zmian w kodzie. - Robisz zaawansowane wdrożenia (canary, mirroring, A/B). - Chcesz spójnej obserwowalności ruchu między usługami. ## Przykład użycia ```yaml apiVersion: networking.istio.io/v1 kind: VirtualService metadata: { name: web } spec: hosts: [web] http: - route: - { destination: { host: web, subset: v1 }, weight: 90 } - { destination: { host: web, subset: v2 }, weight: 10 } ``` ## Warto wiedzieć - Bogaty, ale cięższy od lekkich meshy jak [Linkerd](/katalog/linkerd). - Działa na [Kubernetes](/katalog/kubernetes); polityki wersjonujesz jak manifesty. --- ## k3s — App-as-Code URL: https://eiac.dev/katalog/k3s Repo: https://github.com/k3s-io/k3s Licencja: Apache-2.0 k3s to certyfikowana, odchudzona dystrybucja Kubernetes spakowana w jedno binarium (<100 MB), z rozsądnymi domyślnymi ustawieniami. Idealna na edge, IoT, CI i małe serwery, gdzie pełny klaster byłby przesadą — a jednocześnie w pełni zgodna z [Kubernetes](/katalog/kubernetes), więc te same manifesty działają bez zmian. Klaster stawiasz jednym poleceniem i opisujesz deklaratywnie jak każdy k8s. ## Kiedy używać - Potrzebujesz lekkiego Kubernetes na brzegu sieci, w CI lub homelab. - Chcesz pełnej zgodności z k8s przy minimalnym narzucie. - Stawiasz klastry szybko i powtarzalnie (skrypt/IaC). ## Przykład użycia ```bash curl -sfL https://get.k3s.io | sh - # serwer (control plane) sudo k3s kubectl get nodes # dołączenie agenta: curl -sfL https://get.k3s.io | K3S_URL=https://server:6443 K3S_TOKEN=… sh - ``` ## Warto wiedzieć - Te same manifesty/[Helm](/katalog/helm) co na „dużym" k8s — bez zmian. - Świetnie nadaje się pod GitOps ([Flux](/katalog/flux)/[Argo CD](/katalog/argo-cd)). --- ## kind — App-as-Code URL: https://eiac.dev/katalog/kind Repo: https://github.com/kubernetes-sigs/kind Licencja: Apache-2.0 kind (Kubernetes IN Docker) uruchamia pełny klaster Kubernetes w kontenerach Dockera — idealnie do testów i CI. Konfigurację klastra (liczba węzłów, wersja, porty) opisujesz w pliku YAML, więc te same, powtarzalne klastry stawiasz lokalnie i w pipeline. To standard do testowania manifestów, operatorów i całych wdrożeń przed produkcją. ## Kiedy używać - Testujesz manifesty/Helm/operatory w CI na prawdziwym k8s API. - Chcesz szybkich, jednorazowych klastrów lokalnie. - Reprodukujesz środowisko k8s deterministycznie. ## Przykład użycia ```yaml # kind.yaml kind: Cluster apiVersion: kind.x-k8s.io/v1alpha4 nodes: [{ role: control-plane }, { role: worker }, { role: worker }] ``` ```bash kind create cluster --config kind.yaml kubectl apply -k overlays/dev kind delete cluster ``` ## Warto wiedzieć - Świetny do bramek „deploy test" w [Gitea](/katalog/gitea) Actions/CI. - Do trwałych, lekkich klastrów wybierz [k3s](/katalog/k3s). --- ## Knative — App-as-Code URL: https://eiac.dev/katalog/knative Repo: https://github.com/knative/serving Licencja: Apache-2.0 Knative dodaje do Kubernetes model serverless: usługi skalują się automatycznie wraz z ruchem, aż do zera, gdy nie ma żądań. Aplikację opisujesz jednym deklaratywnym obiektem (Service), a Knative zarządza wersjami, ruchem i autoskalowaniem. To sposób na uruchamianie aplikacji „na żądanie" przy zachowaniu pełni ekosystemu k8s. ## Kiedy używać - Chcesz serverless (scale-to-zero) na własnym klastrze [Kubernetes](/katalog/kubernetes). - Masz zmienny ruch i zależy Ci na oszczędności zasobów. - Potrzebujesz prostego wdrażania wersji i podziału ruchu. ## Przykład użycia ```yaml apiVersion: serving.knative.dev/v1 kind: Service metadata: { name: web } spec: template: spec: containers: - image: ghcr.io/eiac/web:1.0.0 ``` Knative samo skaluje `web` od zera w górę zależnie od ruchu. ## Warto wiedzieć - Łączy się z service mesh ([Istio](/katalog/istio)/[Linkerd](/katalog/linkerd)) do routingu. - Dobrze pasuje do GitOps ([Argo CD](/katalog/argo-cd)/[Flux](/katalog/flux)). --- ## kOps — Infrastructure-as-Code URL: https://eiac.dev/katalog/kops Repo: https://github.com/kubernetes/kops Licencja: Apache-2.0 kOps (Kubernetes Operations) provisionuje i utrzymuje produkcyjne klastry Kubernetes z deklaratywnej specyfikacji. Opisujesz pożądany stan klastra (wersja, grupy węzłów, sieć), a kOps tworzy, aktualizuje i skaluje całą infrastrukturę — łącznie z generowaniem manifestów lub kodu Terraform. Cały cykl życia klastra staje się wersjonowanym kodem. ## Kiedy używać - Stawiasz i utrzymujesz pełne klastry k8s (głównie AWS, też inne). - Chcesz deklaratywnej specyfikacji klastra i powtarzalnych aktualizacji. - Wolisz generowanie planu/Terraform zamiast ręcznej konfiguracji. ## Przykład użycia ```bash kops create cluster --name eiac.k8s.local --zones eu-central-1a --node-count 3 kops update cluster --name eiac.k8s.local --yes # provisioning kops edit cluster eiac.k8s.local # zmiana specyfikacji kops rolling-update cluster --yes # bezpieczna aktualizacja ``` ## Warto wiedzieć - Może generować [Terraform](/katalog/terraform) zamiast działać bezpośrednio. - Alternatywa oparta o Ansible na dowolnych hostach: [Kubespray](/katalog/kubespray). --- ## kube-bench — Security-as-Code URL: https://eiac.dev/katalog/kube-bench Repo: https://github.com/aquasecurity/kube-bench Licencja: Apache-2.0 kube-bench sprawdza, czy klaster Kubernetes jest skonfigurowany zgodnie z najlepszymi praktykami z CIS Kubernetes Benchmark. Uruchamiasz go jako zadanie w klastrze, a wynik to zestaw testów (pass/fail/warn) z konkretnymi zaleceniami. Konfiguracja testów jest deklaratywna (YAML), więc audyt zgodności sam staje się kodem — powtarzalnym i wersjonowanym. ## Kiedy używać - Audytujesz hardening klastra [Kubernetes](/katalog/kubernetes) wg uznanego standardu. - Chcesz powtarzalnego raportu zgodności (np. cyklicznie w CI/cronie). - Przygotowujesz się do wymagań compliance. ## Przykład użycia ```bash # jako Job w klastrze kubectl apply -f https://raw.githubusercontent.com/aquasecurity/kube-bench/main/job.yaml kubectl logs job/kube-bench ``` ```text [PASS] 1.2.1 Ensure that the --anonymous-auth argument is set to false [FAIL] 1.2.6 Ensure that the --kubelet-certificate-authority is set ``` ## Warto wiedzieć - Uzupełnia skan manifestów ([Checkov](/katalog/checkov)) o audyt działającego klastra. - Wyniki łatwo kierować do raportu lub bramki w pipeline. --- ## Kubernetes — App-as-Code URL: https://eiac.dev/katalog/kubernetes Repo: https://github.com/kubernetes/kubernetes Licencja: Apache-2.0 Kubernetes to standard orkiestracji kontenerów: deklarujesz pożądany stan aplikacji (ile replik, jakie zasoby, jak sieć), a klaster nieustannie utrzymuje ten stan — restartuje padnięte pody, skaluje i wdraża nowe wersje. To fundament „App-as-Code": całe środowisko uruchomieniowe opisujesz w wersjonowanych manifestach YAML. ## Kiedy używać - Uruchamiasz wiele usług/kontenerów i potrzebujesz skalowania oraz samonaprawiania. - Chcesz deklaratywnie opisać runtime i wdrażać przez GitOps. - Standaryzujesz platformę pod wiele zespołów i środowisk. ## Przykład użycia ```yaml apiVersion: apps/v1 kind: Deployment metadata: { name: web } spec: replicas: 3 selector: { matchLabels: { app: web } } template: metadata: { labels: { app: web } } spec: containers: - name: web image: ghcr.io/eiac/web:1.0.0 ports: [{ containerPort: 8080 }] ``` ```bash kubectl apply -f deployment.yaml kubectl get pods -l app=web ``` ## Warto wiedzieć - Manifesty szablonuj przez [Helm](/katalog/helm) lub [Kustomize](/katalog/kustomize). - Wdrażaj deklaratywnie z Gita przez [Argo CD](/katalog/argo-cd). --- ## Kubescape — Security-as-Code URL: https://eiac.dev/katalog/kubescape Repo: https://github.com/kubescape/kubescape Licencja: Apache-2.0 Kubescape to otwarta platforma bezpieczeństwa Kubernetes działająca w IDE, CI/CD i w klastrze. Skanuje manifesty i klaster pod kątem błędów konfiguracji, analizuje ryzyko i sprawdza zgodność z ramami takimi jak NSA-CISA czy MITRE ATT&CK. Wyniki i polityki są deklaratywne, więc bezpieczeństwo k8s staje się powtarzalną bramką, a nie jednorazowym audytem. ## Kiedy używać - Skanujesz manifesty/klaster [Kubernetes](/katalog/kubernetes) pod kątem misconfig i ryzyka. - Chcesz zgodności z uznanymi ramami (NSA-CISA, MITRE) w CI. - Potrzebujesz jednego narzędzia od IDE po klaster. ## Przykład użycia ```bash kubescape scan --format json --output res.json # cały klaster/manifesty kubescape scan framework nsa # konkretne ramy kubescape scan . --severity-threshold high # bramka w CI ``` ## Warto wiedzieć - Uzupełnia [kube-bench](/katalog/kube-bench) (CIS) o szersze ramy i analizę ryzyka. - Egzekwowanie w klastrze realizujesz przez [OPA Gatekeeper](/katalog/gatekeeper). --- ## Kubespray — Infrastructure-as-Code URL: https://eiac.dev/katalog/kubespray Repo: https://github.com/kubernetes-sigs/kubespray Licencja: Apache-2.0 Kubespray wdraża produkcyjne klastry Kubernetes na dowolnej infrastrukturze (bare metal, VM, chmura) za pomocą [Ansible](/katalog/ansible). Konfigurację klastra trzymasz w plikach inventory i zmiennych, a playbooki idempotentnie instalują i aktualizują wszystkie komponenty. To podejście „cluster-as-code" niezależne od dostawcy — ten sam kod stawia klaster wszędzie. ## Kiedy używać - Stawiasz k8s na własnych serwerach/bare metal lub wielu chmurach. - Już używasz Ansible i chcesz spójnego, idempotentnego provisioningu. - Zależy Ci na niezależności od konkretnego dostawcy. ## Przykład użycia ```bash # inventory + zmienne opisują klaster ansible-playbook -i inventory/eiac/hosts.yaml cluster.yml ansible-playbook -i inventory/eiac/hosts.yaml upgrade-cluster.yml ``` ## Warto wiedzieć - Inventory i zmienne trzymaj w repo (Gitea) — to one są „kodem" klastra. - Alternatywa z własnym modelem stanu/chmurowym: [kOps](/katalog/kops). --- ## KubeVirt — App-as-Code URL: https://eiac.dev/katalog/kubevirt Repo: https://github.com/kubevirt/kubevirt Licencja: Apache-2.0 KubeVirt pozwala uruchamiać i zarządzać maszynami wirtualnymi obok kontenerów, w tym samym klastrze Kubernetes. VM definiujesz jako obiekty Kubernetes (CRD), więc korzystają z tego samego deklaratywnego API, GitOps i narzędzi co reszta workloadów. To sposób na włączenie „starszych" obciążeń wymagających pełnego systemu do platformy opartej na kodzie. ## Kiedy używać - Masz workloady, które muszą działać jako VM, ale chcesz nimi zarządzać jak k8s. - Konsolidujesz kontenery i VM-y na jednej platformie. - Chcesz VM-y pod GitOps (deklaratywnie, w repo). ## Przykład użycia ```yaml apiVersion: kubevirt.io/v1 kind: VirtualMachine metadata: { name: eiac-vm } spec: running: true template: spec: domain: resources: { requests: { memory: 1Gi } } ``` ```bash kubectl apply -f vm.yaml kubectl get vms ``` ## Warto wiedzieć - Działa na [Kubernetes](/katalog/kubernetes); VM-y wersjonujesz jak każdy manifest. - Wymaga wsparcia wirtualizacji na węzłach (KVM). --- ## Kustomize — App-as-Code URL: https://eiac.dev/katalog/kustomize Repo: https://github.com/kubernetes-sigs/kustomize Licencja: Apache-2.0 Kustomize to bezszablonowy sposób na dostosowywanie manifestów Kubernetes. Zamiast szablonów z parametrami trzymasz bazowe manifesty i nakładasz na nie „overlays" — łatki dla konkretnych środowisk (dev/prod). Jest wbudowany w `kubectl`, więc nie wymaga dodatkowych narzędzi, a wynik to czysty YAML. ## Kiedy używać - Chcesz wariantów wdrożenia (środowiska) bez logiki szablonów. - Wolisz patche YAML zamiast `values` jak w [Helm](/katalog/helm). - Trzymasz bazę + nakładki w Gicie pod GitOps. ## Przykład użycia ```yaml # overlays/prod/kustomization.yaml resources: [../../base] replicas: - name: web count: 5 images: - name: ghcr.io/eiac/web newTag: 1.0.0 ``` ```bash kubectl apply -k overlays/prod ``` ## Warto wiedzieć - Wbudowany w `kubectl` (`-k`); zero dodatkowych zależności. - Często łączony z [Argo CD](/katalog/argo-cd); bywa stosowany razem z Helm. --- ## Kyverno — Security-as-Code URL: https://eiac.dev/katalog/kyverno Repo: https://github.com/kyverno/kyverno Licencja: Apache-2.0 Kyverno to silnik polityk zaprojektowany specjalnie dla Kubernetes. W odróżnieniu od [OPA](/katalog/open-policy-agent)/[Gatekeeper](/katalog/gatekeeper) nie wymaga uczenia się osobnego języka (Rego) — polityki pisze się jako zwykłe **zasoby Kubernetes w YAML**. Działa jako admission controller: potrafi walidować, mutować, generować zasoby oraz weryfikować podpisy obrazów, egzekwując reguły zanim cokolwiek trafi do klastra. ## Kiedy używać - Chcesz policy-as-code dla Kubernetes bez wprowadzania nowego języka (zostajesz w YAML). - Potrzebujesz nie tylko walidacji, ale też mutacji i generowania zasobów (np. domyślne sieci, limity, labelki). - Egzekwujesz reguły w klastrze (admission) i/lub skanujesz manifesty w CI. ## Przykład użycia ```yaml apiVersion: kyverno.io/v1 kind: ClusterPolicy metadata: { name: require-non-root } spec: validationFailureAction: Enforce rules: - name: check-runAsNonRoot match: { any: [{ resources: { kinds: ["Pod"] } }] } validate: message: "kontener musi działać jako non-root" pattern: spec: securityContext: runAsNonRoot: true ``` ```bash # ta sama polityka jako bramka w CI (bez klastra) kyverno apply policy/ --resource manifests/ ``` ## Warto wiedzieć - Projekt CNCF; naturalny wybór, gdy zespół woli YAML zamiast Rego z [OPA](/katalog/open-policy-agent). - Uzupełnia skanery jak [Checkov](/katalog/checkov)/[Trivy](/katalog/trivy); w CI rolę testów konfiguracji pełni też [Conftest](/katalog/conftest). --- ## lego — Security-as-Code URL: https://eiac.dev/katalog/lego Repo: https://github.com/go-acme/lego Licencja: MIT lego to klient ACME (Let's Encrypt i inne CA) oraz biblioteka w Go do automatycznego wydawania i odnawiania certyfikatów TLS. Obsługuje walidację DNS-01 dla dziesiątek dostawców DNS, więc certyfikaty (także wildcard) zdobywasz bez ręcznych kroków. Cykl życia certyfikatu staje się elementem automatyzacji — skryptu lub joba w CI/cronie. ## Kiedy używać - Automatyzujesz wydawanie/odnawianie certyfikatów TLS poza serwerem WWW. - Potrzebujesz wildcardów przez walidację DNS-01. - Wbudowujesz logikę certyfikatów w pipeline lub własne narzędzie (biblioteka Go). ## Przykład użycia ```bash lego --email ops@eiac.dev \ --dns cloudflare \ --domains "*.eiac.dev" \ run ``` ```bash # odnowienie w cronie / Gitea Actions lego --email ops@eiac.dev --dns cloudflare --domains "*.eiac.dev" renew ``` ## Warto wiedzieć - Świetny, gdy TLS kończy poza reverse proxy (np. dla usług wewnętrznych, [Nebula](/katalog/nebula)). - Jako biblioteka Go pozwala wpiąć ACME we własne narzędzia. --- ## Linkerd — App-as-Code URL: https://eiac.dev/katalog/linkerd Repo: https://github.com/linkerd/linkerd2 Licencja: Apache-2.0 Linkerd to ultralekki, stawiający na bezpieczeństwo service mesh dla Kubernetes. Automatycznie włącza mTLS między usługami, dodaje metryki „golden signals" i niezawodność (retry, timeouty), zachowując minimalny narzut i prostotę obsługi. Konfiguracja jest deklaratywna (CRD/adnotacje), więc bezpieczna komunikacja między usługami staje się domyślna i wersjonowana. ## Kiedy używać - Chcesz mTLS i metryk między usługami przy minimalnym narzucie. - Wolisz prostotę i niski koszt operacyjny zamiast pełni funkcji. - Zależy Ci na „zero-config" bezpieczeństwie komunikacji. ## Przykład użycia ```bash linkerd install | kubectl apply -f - # instalacja mesh kubectl annotate ns web linkerd.io/inject=enabled linkerd viz dashboard # metryki ruchu ``` ## Warto wiedzieć - Prostszy i lżejszy niż [Istio](/katalog/istio) — mniej funkcji, mniej narzutu. - mTLS działa domyślnie po wstrzyknięciu proxy do namespace. --- ## Longhorn — App-as-Code URL: https://eiac.dev/katalog/longhorn Repo: https://github.com/longhorn/longhorn Licencja: Apache-2.0 Longhorn to lekki, rozproszony storage blokowy zbudowany dla Kubernetes. Dostarcza trwałe wolumeny z replikacją, snapshotami i backupami — wszystko zarządzane deklaratywnie przez Kubernetes (StorageClass, PVC, CRD). Stan i polityki przechowywania danych stają się częścią kodu klastra, bez zależności od storage konkretnej chmury. ## Kiedy używać - Potrzebujesz trwałego storage'u na własnym klastrze (bare metal, edge). - Chcesz replikacji, snapshotów i backupów zarządzanych deklaratywnie. - Unikasz vendor lock-in storage chmurowego. ## Przykład użycia ```yaml apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: { name: longhorn } provisioner: driver.longhorn.io parameters: { numberOfReplicas: "3" } ``` PVC z `storageClassName: longhorn` dostaje replikowany, trwały wolumen. ## Warto wiedzieć - Projekt CNCF; dobrze pasuje do lekkich klastrów ([k3s](/katalog/k3s)). - Backupy wolumenów uzupełnia backup całych aplikacji ([Velero](/katalog/velero)). --- ## MegaLinter — SDLC / Policy-as-Code URL: https://eiac.dev/katalog/megalinter Repo: https://github.com/oxsecurity/megalinter Licencja: AGPL-3.0 MegaLinter uruchamia w jednym kroku CI dziesiątki linterów i skanerów dla wielu języków i formatów — od stylu kodu, przez literówki, po skany bezpieczeństwa i sekretów. Konfigurację trzymasz deklaratywnie w repo, a narzędzie raportuje problemy (i potrafi auto-naprawiać część z nich). To wygodny „pojedynczy punkt wejścia" do jakości i higieny repozytorium. ## Kiedy używać - Chcesz jednego kroku CI obejmującego lint, formatowanie i podstawowe skany security. - Pracujesz w repo wielojęzycznym i nie chcesz konfigurować każdego lintera osobno. - Zależy Ci na auto-naprawach i spójnym raporcie w PR. ## Przykład użycia ```yaml # .mega-linter.yml APPLY_FIXES: all DISABLE: [SPELL] ENABLE: [REPOSITORY_GITLEAKS, REPOSITORY_TRIVY] ``` ```yaml # krok w Gitea Actions (obraz MegaLinter) - uses: oxsecurity/megalinter@v8 ``` ## Warto wiedzieć - Pod spodem korzysta m.in. z [Gitleaks](/katalog/gitleaks) i [Trivy](/katalog/trivy) — wygodne, gdy chcesz wszystko naraz. - Do dedykowanych, „twardych" bramek lepiej wołać konkretne narzędzia osobno. --- ## Nebula — Security-as-Code URL: https://eiac.dev/katalog/nebula Repo: https://github.com/slackhq/nebula Licencja: MIT Nebula to skalowalna sieć overlay (mesh VPN) z naciskiem na wydajność, prostotę i bezpieczeństwo. Tożsamość hostów opiera o certyfikaty, a reguły dostępu (firewall, grupy) definiujesz deklaratywnie w plikach konfiguracyjnych — sieć i jej polityki bezpieczeństwa stają się kodem, wersjonowanym i powtarzalnym. Świetnie sprawdza się do łączenia maszyn między chmurami i lokacjami. ## Kiedy używać - Łączysz hosty z wielu chmur/lokacji w jedną, szyfrowaną sieć. - Chcesz mikrosegmentacji i reguł dostępu jako konfiguracji. - Zależy Ci na wydajnym, prostym mesh zamiast ciężkiego VPN. ## Przykład użycia ```yaml # config.yml (fragment) — reguły firewalla per grupa firewall: inbound: - port: 443 proto: tcp groups: [web] - port: any proto: icmp host: any ``` ```bash nebula -config config.yml ``` ## Warto wiedzieć - Tożsamość przez certyfikaty (CA) — wydawanie i rotację automatyzujesz w CI. - Konfiguracja per host w repo = audytowalna, powtarzalna topologia. --- ## Nitric — App-as-Code URL: https://eiac.dev/katalog/nitric Repo: https://github.com/nitrictech/nitric Licencja: Apache-2.0 Nitric to **wielojęzyczny framework** (TypeScript, Python, Go i inne), który realizuje infrastructure-from-code w sposób celowo *uzupełniający* klasyczne IaC, a nie zastępujący je. Piszesz kod aplikacji i deklarujesz jej wymagania (np. „potrzebuję kolejki", „bucketa", „API"), a Nitric **wywodzi z tego specyfikację wymagań** i przekazuje ją pluginom wdrożeniowym, które generują konfigurację przez [Pulumi](/katalog/pulumi) lub [Terraform](/katalog/terraform). Dzięki temu IaC pozostaje w synchronizacji z aplikacją, a Ty nie piszesz go ręcznie. Nitric odcina aplikację od konkretnej chmury — ten sam kod wdrożysz na AWS, Azure, GCP czy [Kubernetes](/katalog/kubernetes). ## Kiedy używać - Chcesz wygody infrastructure-from-code, ale **bez utraty kontroli** — pod spodem zostaje jawny Terraform/Pulumi, który możesz podejrzeć i dostroić. - Zależy Ci na przenośności między chmurami i automatyzacji uprawnień (least privilege generowany z wymagań). - Piszesz w różnych językach i potrzebujesz jednego modelu dla całego zespołu. ## Przykład użycia ```typescript import { api, bucket } from '@nitric/sdk'; // wymaganie infrastruktury wywnioskowane z kodu const images = bucket('images').allow('read', 'write'); api('public').get('/img/:name', async (ctx) => { const img = await images.file(ctx.req.params.name).read(); ctx.res.body = img; }); ``` ## Warto wiedzieć - Architektura pluginowa: domyślnie deployment przez [Pulumi](/katalog/pulumi)/[Terraform](/katalog/terraform), ale możesz napisać własny plugin. - Świadomie *dopełnia* IaC (utrzymuje je w synchronizacji z kodem), w odróżnieniu od [Encore](/katalog/encore), który separację aplikacja–infrastruktura znosi całkowicie; szerzej: [IaC w 2026](/blog/iac-2026-przeglad). - Otwarty (Apache-2.0) i self-hostowalny — pasuje do podejścia „w Twoim CI, z Twoim stanem". --- ## Nix — Infrastructure-as-Code URL: https://eiac.dev/katalog/nix Repo: https://github.com/NixOS/nix Licencja: LGPL-2.1 Nix to menedżer pakietów i system buildów oparty na czystych, deklaratywnych wyrażeniach. Każdy artefakt jest funkcją swoich wejść, więc buildy są powtarzalne i izolowane — to samo wejście zawsze daje ten sam wynik, niezależnie od maszyny. Z `flakes` opisujesz środowiska deweloperskie, pakiety i całe systemy (NixOS) w jednym, wersjonowanym pliku. ## Kiedy używać - Chcesz identycznych środowisk dev/CI/prod, bez „u mnie działa". - Potrzebujesz powtarzalnych, audytowalnych buildów. - Zarządzasz wieloma toolchainami bez konfliktów wersji. ## Przykład użycia ```nix # flake.nix — środowisko deweloperskie { outputs = { self, nixpkgs }: { devShells.x86_64-linux.default = with nixpkgs.legacyPackages.x86_64-linux; mkShell { packages = [ nodejs_20 git ]; }; }; } ``` ```bash nix develop # wchodzisz w powłokę z dokładnie tymi narzędziami ``` ## Warto wiedzieć - Krzywa wejścia jest stroma, ale powtarzalność jest bezkonkurencyjna. - `flakes` to dziś de facto standard; przypina wersje przez `flake.lock`. --- ## OPA Gatekeeper — Security-as-Code URL: https://eiac.dev/katalog/gatekeeper Repo: https://github.com/open-policy-agent/gatekeeper Licencja: Apache-2.0 Gatekeeper to kontroler polityk dla Kubernetes oparty o [Open Policy Agent](/katalog/open-policy-agent). Działa jako admission webhook: zanim zasób trafi do klastra, sprawdza go względem polityk (ConstraintTemplate + Constraint) i odrzuca naruszenia. Polityki są deklaratywne (Rego), wersjonowane i audytowalne — to guardrails dla całego klastra „as-code". ## Kiedy używać - Chcesz egzekwować reguły (np. wymagane labelki, zakaz `latest`, limity) na poziomie klastra. - Standaryzujesz guardrails dla wielu zespołów/namespace'ów. - Wolisz polityki w Rego, spójne z ekosystemem OPA. ## Przykład użycia ```yaml apiVersion: constraints.gatekeeper.sh/v1beta1 kind: K8sRequiredLabels metadata: { name: must-have-owner } spec: match: { kinds: [{ apiGroups: [""], kinds: ["Namespace"] }] } parameters: { labels: ["owner"] } ``` Próba utworzenia namespace bez `owner` zostanie odrzucona. ## Warto wiedzieć - Statyczne sprawdzanie tych samych reguł w CI realizuje [Conftest](/katalog/conftest). - Alternatywa trzymająca polityki w YAML (bez Rego): [Kyverno](/katalog/kyverno). - Wykrywanie ryzyka uzupełnia [Kubescape](/katalog/kubescape). --- ## Open Policy Agent — SDLC / Policy-as-Code URL: https://eiac.dev/katalog/open-policy-agent Repo: https://github.com/open-policy-agent/opa Licencja: Apache-2.0 Open Policy Agent (OPA) to uniwersalny silnik polityk, który oddziela decyzje autoryzacyjne i zgodności od kodu aplikacji. Reguły piszesz w języku Rego, a OPA odpowiada na pytania „czy to działanie jest dozwolone?" na podstawie danych wejściowych. Tę samą politykę można egzekwować w pipeline CI, w Kubernetes (Gatekeeper), w API gateway czy w samej aplikacji. ## Kiedy używać - Chcesz spójnie egzekwować zasady bezpieczeństwa/zgodności w wielu miejscach. - Polityka ma być testowalna, wersjonowana i recenzowana jak kod. - Bramkujesz PR-y, manifesty Kubernetes albo plan Terraform. ## Przykład użycia ```rego package eiac.authz default allow := false allow if { input.method == "GET" startswith(input.path, "/public/") } ``` ```bash opa eval -d policy.rego -i input.json "data.eiac.authz.allow" opa test . # testy jednostkowe polityk ``` ## Warto wiedzieć - Z Conftest sprawdzisz pliki konfiguracyjne (YAML/JSON/HCL) w CI. - W Kubernetes popularny przez OPA Gatekeeper (admission control). --- ## OpenBao — Security-as-Code URL: https://eiac.dev/katalog/openbao Repo: https://github.com/openbao/openbao Licencja: MPL-2.0 OpenBao to społecznościowy fork [Vault](/katalog/vault) pod skrzydłami Linux Foundation, powstały po zmianie licencji HashiCorp na BUSL. Zachowuje zgodność z API, silnikami sekretów i CLI Vaulta, więc dla większości wdrożeń jest niemal drop-in, a rozwija się jako projekt w pełni open source (MPL-2.0). Tak jak pierwowzór: centralizuje sekrety, generuje je dynamicznie i szyfruje dane jako usługa. ## Kiedy używać - Chcesz funkcji Vaulta, ale na licencji open source bez ograniczeń BUSL. - Migrujesz istniejące wdrożenie Vault i zależy Ci na zgodności API/CLI. - Wolisz projekt zarządzany przez fundację i społeczność. ## Przykład użycia ```bash # CLI jest zgodne z Vault — często wystarczy zamiana binarki bao kv put secret/eiac/db password="s3cret" bao kv get -field=password secret/eiac/db ``` ```hcl # polityka dostępu jako kod (jak w Vault) path "secret/data/eiac/*" { capabilities = ["read"] } ``` ## Warto wiedzieć - Zgodność celowana w wersje Vault z okresu forka; najnowsze funkcje HashiCorp mogą się różnić. - Provisioning zautomatyzujesz [Terraform](/katalog/terraform)/[OpenTofu](/katalog/opentofu). --- ## OpenTaco (Digger) — Infrastructure-as-Code URL: https://eiac.dev/katalog/digger Repo: https://github.com/diggerhq/digger Licencja: Apache-2.0 OpenTaco to **open-source** następca projektu Digger (rebrand z listopada 2025, ten sam silnik). Uruchamia [Terraform](/katalog/terraform)/[OpenTofu](/katalog/opentofu) w Twoim istniejącym pipelinie CI, zamiast stawiać osobny serwer automatyzacji — komentuje plany w PR, zarządza blokadami stanu i kolejnością, egzekwuje polityki. Nowy kierunek to **state-first**: zarządzanie plikami stanu z kontrolą dostępu i historią wersji (interfejs zgodny z HCP Terraform), a docelowo samo-hostowalna alternatywa dla Terraform Cloud/Enterprise (zdalne uruchomienia, PR automation, drift). ## Kiedy używać - Chcesz `plan`/`apply` w PR i zarządzanie stanem bez osobnego serwera (alternatywa dla Atlantis/TFC). - Masz już CI (np. Gitea Actions) i wolisz trzymać tam orkiestrację oraz stan — po swojej stronie. - Zależy Ci na otwartej, self-hostowalnej kategorii TACOS (kontrola, suwerenność). ## Przykład użycia ```yaml # digger.yml projects: - name: infra dir: infra workflow: default workflows: default: plan: { steps: [init, plan] } apply: { steps: [init, apply] } ``` PR dostaje komentarz z planem; `apply` po zatwierdzeniu i merge. ## Warto wiedzieć - Łączy się z politykami [Open Policy Agent](/katalog/open-policy-agent)/[Checkov](/katalog/checkov). - Model „w Twoim CI, z Twoim stanem" wspiera [exit-by-design](/blog/suwerenny-idp-exit-by-design); w EIAC pasuje wprost do Gitea Actions. - Komercyjne odpowiedniki: [Spacelift](/katalog/spacelift), [env0](/katalog/env0), [Scalr](/katalog/scalr); lekki orkiestrator open-source to [Terramate](/katalog/terramate). --- ## OpenTofu — Infrastructure-as-Code URL: https://eiac.dev/katalog/opentofu Repo: https://github.com/opentofu/opentofu Licencja: MPL-2.0 OpenTofu to społecznościowy fork Terraform pod skrzydłami Linux Foundation, powstały po zmianie licencji HashiCorp na BUSL. Zachowuje zgodność z językiem HCL, formatem stanu i ekosystemem providerów, więc dla większości projektów jest niemal drop-in. Rozwija też własne funkcje, np. szyfrowanie stanu po stronie klienta. ## Kiedy używać - Chcesz pozostać na licencji open source (MPL-2.0) bez ograniczeń BUSL. - Migrujesz istniejący kod Terraform i zależy Ci na zgodności. - Potrzebujesz funkcji jak natywne szyfrowanie stanu. ## Przykład użycia ```bash # migracja z Terraform jest zwykle zamianą binarki tofu init tofu plan tofu apply ``` Pliki `.tf`, moduły i providerzy działają bez zmian — różni się przede wszystkim komenda (`tofu` zamiast `terraform`). ## Warto wiedzieć - Zgodność celowana w wersje Terraform z okresu forka; nowsze funkcje HashiCorp mogą się różnić. - Wspierany przez wielu dostawców i zintegrowany z popularnymi platformami CI/CD. --- ## Ory Hydra — Security-as-Code URL: https://eiac.dev/katalog/ory-hydra Repo: https://github.com/ory/hydra Licencja: Apache-2.0 Ory Hydra to certyfikowany serwer OAuth2 i OpenID Connect klasy „internet-scale". Jest headless — nie narzuca własnego UI ani bazy użytkowników, a integrujesz go ze swoim zarządzaniem tożsamością przez API. Klientów OAuth2, zakresy i polityki konfigurujesz deklaratywnie (pliki/API), więc tożsamość i dostęp stają się elementem infrastruktury jako kod. ## Kiedy używać - Potrzebujesz własnego, zgodnego ze standardami dostawcy OAuth2/OIDC. - Chcesz konfigurować klientów i przepływy deklaratywnie, nie klikać w panelu. - Budujesz SSO/autoryzację dla wielu aplikacji i API. ## Przykład użycia ```bash # rejestracja klienta OAuth2 z konfiguracji hydra create client \ --endpoint http://localhost:4445 \ --grant-type client_credentials \ --name eiac-ci ``` ```yaml # fragment konfiguracji serwera (hydra.yml) urls: self: issuer: https://auth.eiac.dev strategies: access_token: jwt ``` ## Warto wiedzieć - Headless: łączysz z własnym logowaniem/consent przez API. - Do autoryzacji na poziomie aplikacji łącz z [Casbin](/katalog/casbin) lub [Open Policy Agent](/katalog/open-policy-agent). --- ## Penpot — Design-as-Code URL: https://eiac.dev/katalog/penpot Repo: https://github.com/penpot/penpot Licencja: MPL-2.0 Penpot to otwarte (MPL-2.0) narzędzie do projektowania interfejsów i prototypowania, działające w przeglądarce i oparte na standardach (SVG/CSS). Jako jeden z nielicznych edytorów natywnie wspiera design tokeny i można je z niego eksportować, co czyni go naturalnym mostem między pracą projektanta a „design-as-code". Da się też hostować samodzielnie. ## Kiedy używać - Chcesz otwartej alternatywy dla zamkniętych narzędzi, z możliwością self-hostingu. - Projektujesz UI i chcesz utrzymywać tokeny blisko kodu. - Zależy Ci na formatach zgodnych z webem (SVG/CSS). ## Przykład użycia ```text 1. Zdefiniuj tokeny (kolory, spacing) w panelu Tokens. 2. Wyeksportuj tokeny do JSON. 3. Podaj JSON jako źródło do Style Dictionary → tokens.css. ``` ```bash # self-hosting przez Docker Compose docker compose -f docker-compose.yaml up -d ``` W ten sposób decyzje projektowe z Penpot trafiają do kodu jako wersjonowane tokeny. ## Warto wiedzieć - Eksport tokenów dobrze łączy się ze [Style Dictionary](/katalog/style-dictionary). - Pełnia funkcji rośnie szybko; sprawdź aktualny zakres przed migracją z innego narzędzia. --- ## promptfoo — Security-as-Code URL: https://eiac.dev/katalog/promptfoo Repo: https://github.com/promptfoo/promptfoo Licencja: MIT promptfoo to narzędzie do testowania, ewaluacji i red-teamingu aplikacji opartych o LLM — promptów, agentów i RAG-ów. Scenariusze testowe i asercje opisujesz deklaratywnie (YAML), a narzędzie porównuje modele, wykrywa regresje jakości oraz skanuje pod kątem podatności (np. prompt injection, wycieki). Bezpieczeństwo i jakość AI stają się powtarzalnym krokiem w pipeline, nie ręcznym sprawdzaniem. ## Kiedy używać - Testujesz i porównujesz prompty/modele z asercjami w CI. - Robisz red-teaming aplikacji LLM (injection, jailbreak, wycieki). - Chcesz wykrywać regresje jakości przy zmianach promptów/modeli. ## Przykład użycia ```yaml # promptfooconfig.yaml prompts: ["Odpowiedz po polsku: {{pytanie}}"] providers: [openai:gpt-4o, anthropic:claude-3-5-sonnet] tests: - vars: { pytanie: "Czym jest IaC?" } assert: - type: contains value: "infrastruktura" ``` ```bash npx promptfoo eval # ewaluacja npx promptfoo redteam run # skan bezpieczeństwa ``` ## Warto wiedzieć - Configi trzymaj w repo — ewaluacja i red-teaming jako bramka w Gitea Actions. - Wspiera wielu dostawców modeli jednocześnie (porównania). --- ## Pulumi — Infrastructure-as-Code URL: https://eiac.dev/katalog/pulumi Repo: https://github.com/pulumi/pulumi Licencja: Apache-2.0 Pulumi pozwala opisywać infrastrukturę w pełnoprawnych językach programowania — TypeScript, Python, Go, C# — zamiast w dedykowanym DSL. Dzięki temu masz pętle, funkcje, pakiety, testy jednostkowe i podpowiedzi IDE bezpośrednio przy definicji zasobów. Pod spodem korzysta z tego samego modelu deklaratywnego co inne narzędzia IaC. ## Kiedy używać - Twój zespół woli język programowania i istniejące narzędzia (testy, lintery, pakiety) zamiast HCL. - Potrzebujesz abstrakcji wyższego poziomu i logiki przy generowaniu zasobów. - Chcesz współdzielić komponenty jako zwykłe biblioteki. ## Przykład użycia ```ts import * as aws from "@pulumi/aws"; const bucket = new aws.s3.Bucket("assets", { tags: { project: "eiac" }, }); export const bucketName = bucket.id; ``` ```bash pulumi preview # podgląd zmian pulumi up # wdrożenie ``` ## Warto wiedzieć - Stan trzymany w Pulumi Cloud lub własnym backendzie (S3/GCS/Azure Blob). - Umożliwia testy jednostkowe i policy-as-code (CrossGuard). --- ## release-please — SDLC / Policy-as-Code URL: https://eiac.dev/katalog/release-please Repo: https://github.com/googleapis/release-please Licencja: Apache-2.0 release-please automatyzuje wydania: na podstawie commitów w stylu Conventional Commits wylicza kolejną wersję (SemVer), generuje changelog i otwiera „release PR". Po jego scaleniu tworzy tag i release. Cały proces wydawniczy staje się powtarzalnym, sterowanym z repo krokiem — bez ręcznego pilnowania wersji i notatek. ## Kiedy używać - Chcesz automatycznych wersji i changelogów z historii commitów. - Stosujesz Conventional Commits i SemVer. - Wolisz „release PR" do akceptacji zamiast ręcznych tagów. ## Przykład użycia ```text feat: dodaj filtr katalogu → bump minor (1.1.0 → 1.2.0) fix: popraw link w stopce → bump patch (1.2.0 → 1.2.1) feat!: zmiana API → bump major (1.x → 2.0.0) ``` release-please zbiera takie commity i otwiera PR z nową wersją + changelogiem. ## Warto wiedzieć - Działa jako akcja CI; wpinasz w [Gitea](/katalog/gitea) Actions / inne CI. - Spina się z konwencją commitów egzekwowaną np. w [MegaLinter](/katalog/megalinter). --- ## Scalr — Infrastructure-as-Code URL: https://eiac.dev/katalog/scalr Licencja: Proprietary Scalr to komercyjna platforma TACOS zaprojektowana jako **drop-in zamiennik Terraform Cloud/Enterprise**: oferuje ten sam model remote-operations backend (zgodne CLI, API i model stanu), więc migracja bywa płynna. Wspiera [Terraform](/katalog/terraform) i [OpenTofu](/katalog/opentofu), GitOps, przepływy API-driven oraz no-code, z politykami na bazie [OPA](/katalog/open-policy-agent). ## Kiedy używać - Migrujesz z Terraform Cloud i chcesz zachować ten sam CLI/API/model stanu. - Wolisz rozliczenie zależne od liczby uruchomień, nie od współbieżności. - Potrzebujesz hierarchii środowisk i polityk na wielu poziomach. ## Przykład użycia ```hcl # backend zgodny z modelem zdalnym — minimalna zmiana przy migracji terraform { cloud { hostname = "scalr.io" organization = "eiac" workspaces { name = "sovereign-eu" } } } ``` ## Warto wiedzieć - Rozliczenie per run (współbieżność i self-hostowani agenci nie są czynnikiem cennika); jest darmowy próg miesięcznych uruchomień. - Alternatywy: [Spacelift](/katalog/spacelift), [env0](/katalog/env0) (FinOps), [OpenTaco](/katalog/digger) (open-source, self-hosted). - Polityki utrzymuj jako [policy-as-code](/blog/policy-as-code-dla-zespolow). --- ## semantic-release — SDLC / Policy-as-Code URL: https://eiac.dev/katalog/semantic-release Repo: https://github.com/semantic-release/semantic-release Licencja: MIT semantic-release w pełni automatyzuje cykl wydawniczy: po merge do gałęzi wydawniczej analizuje commity (Conventional Commits), ustala kolejną wersję wg SemVer, generuje changelog i publikuje wydanie — przez bogaty ekosystem wtyczek (npm, GitLab/GitHub Releases, obrazy i inne). W odróżnieniu od modelu „release PR" działa w trybie *publish-on-merge*: nie ma ręcznego kroku zatwierdzenia wersji, więc droga od merge do wydania jest najkrótsza. ## Kiedy używać - Chcesz pełnej automatyzacji wydań bez ręcznego podbijania wersji. - Publikujesz pakiety/artefakty często i chcesz krótkiej drogi merge → release. - Potrzebujesz kanałów wydawniczych (stable / next / beta / maintenance). ## Przykład użycia ```json // .releaserc.json — kanały + wtyczki { "branches": ["main", { "name": "beta", "prerelease": true }], "plugins": [ "@semantic-release/commit-analyzer", "@semantic-release/release-notes-generator", "@semantic-release/changelog", "@semantic-release/gitlab", "@semantic-release/git" ] } ``` ```bash npx semantic-release # zwykle uruchamiane w CI po merge do main ``` ## Warto wiedzieć - Kanały: `main` → stabilne, `next`/`beta` → pre-release, `1.x` → wydania utrzymaniowe. - Model „publish-on-merge" — kontrolę przenosisz na etap PR z kodem; jeśli wolisz jawną „bramkę wersji", rozważ [release-please](/katalog/release-please). - Działa na [GitLab](/katalog/gitlab), [Gitea](/katalog/gitea) i innych platformach przez wtyczki. --- ## Semaphore — Infrastructure-as-Code URL: https://eiac.dev/katalog/semaphore Repo: https://github.com/semaphoreui/semaphore Licencja: MIT Semaphore to nowoczesny interfejs i API do uruchamiania narzędzi DevOps: [Ansible](/katalog/ansible), [Terraform](/katalog/terraform)/[OpenTofu](/katalog/opentofu)/[Terragrunt](/katalog/terragrunt), PowerShell i innych. Zamiast odpalać playbooki i plany z konsoli, masz centralne miejsce z harmonogramami, uprawnieniami, sekretami i historią uruchomień — przy zachowaniu kodu (repozytoria) jako źródła prawdy. ## Kiedy używać - Chcesz kontrolowanego uruchamiania IaC/Ansible przez zespół (kto, co, kiedy). - Potrzebujesz harmonogramów, uprawnień i audytu uruchomień. - Wolisz UI/API zamiast luźnych skryptów, ale trzymasz kod w repo. ## Przykład użycia ```text 1. Podłącz repozytorium (np. z Gitei) z playbookami/modułami. 2. Zdefiniuj „Template" (Ansible playbook lub Terraform plan/apply). 3. Uruchom ręcznie lub w harmonogramie; przeglądaj log i historię. ``` ## Warto wiedzieć - Kod (playbooki/moduły) pozostaje w Gicie; Semaphore to warstwa uruchomieniowa. - Do orkiestracji IaC w samym CI rozważ też [Digger](/katalog/digger). --- ## SOPS — Security-as-Code URL: https://eiac.dev/katalog/sops Repo: https://github.com/getsops/sops Licencja: MPL-2.0 SOPS szyfruje wartości w plikach YAML/JSON/ENV (zostawiając klucze czytelnymi), używając kluczy z KMS (AWS/GCP/Azure), [age](/katalog/age) lub PGP. Dzięki temu sekrety możesz bezpiecznie trzymać w repozytorium Git — zaszyfrowane — i odszyfrowywać dopiero przy wdrożeniu. To kanoniczne podejście „secrets-as-code" w świecie GitOps. ## Kiedy używać - Chcesz wersjonować sekrety w Git bez ujawniania wartości. - Pracujesz w GitOps ([Flux](/katalog/flux)/[Argo CD](/katalog/argo-cd)) i potrzebujesz szyfrowanych manifestów. - Wolisz proste szyfrowanie plików zamiast serwera sekretów. ## Przykład użycia ```bash # szyfrowanie kluczem age sops --encrypt --age $AGE_PUBKEY secrets.yaml > secrets.enc.yaml sops --decrypt secrets.enc.yaml ``` ```yaml # secrets.enc.yaml — klucze jawne, wartości zaszyfrowane db_password: ENC[AES256_GCM,data:…,tag:…] ``` ## Warto wiedzieć - Najczęściej używany z [age](/katalog/age) (proste klucze) albo KMS chmury. - Uzupełnia, a nie zastępuje, serwery sekretów jak [Vault](/katalog/vault)/[OpenBao](/katalog/openbao). --- ## Spacelift — Infrastructure-as-Code URL: https://eiac.dev/katalog/spacelift Licencja: Proprietary Spacelift to komercyjna platforma z kategorii **TACOS** (Terraform/OpenTofu Automation and Collaboration Software) — warstwa zarządzania nad samym silnikiem IaC. Spina w spójny przepływ GitOps wiele narzędzi naraz ([Terraform](/katalog/terraform), [OpenTofu](/katalog/opentofu), [Pulumi](/katalog/pulumi), CloudFormation, [Kubernetes](/katalog/kubernetes), [Ansible](/katalog/ansible)), dokładając to, czego nie daje zwykłe CI: blokady stanu, prywatne rejestry, granularny RBAC, wykrywanie i naprawę driftu oraz polityki jako kod. ## Kiedy używać - Masz wiele zespołów i stacków IaC, które rozjeżdżają się w sposobach pracy. - Potrzebujesz drift detection z automatyczną naprawą i twardego RBAC. - Chcesz egzekwować polityki (na bazie [OPA](/katalog/open-policy-agent)) na etapie planu i przed `apply`. ## Przykład użycia ```yaml # .spacelift/config.yml — polityki i hooki wpięte w stack version: "1" stack: before_apply: - conftest test plan.json policies: - plan-must-be-encrypted ``` ## Warto wiedzieć - Model rozliczeń oparty o liczbę workerów (= maksymalna współbieżność); płatny tier startuje wysoko — to wybór dla większych organizacji. - Otwartą, „w Twoim CI" alternatywą jest [OpenTaco](/katalog/digger); lekki orkiestrator open-source to [Terramate](/katalog/terramate). - Polityki pisze się jako [policy-as-code](/blog/policy-as-code-dla-zespolow), spójnie z resztą platformy. --- ## SST — App-as-Code URL: https://eiac.dev/katalog/sst Repo: https://github.com/sst/sst Licencja: MIT SST to framework do budowy i wdrażania aplikacji na AWS, w którym infrastrukturę i kod aplikacji opisujesz razem w TypeScript. Wersja v3 stoi na silniku Pulumi/Terraform, a tryb `dev` daje lokalną pętlę developerską z podglądem na żywo zasobów w chmurze. Zamiast ręcznie składać dziesiątki usług, korzystasz z gotowych, wysokopoziomowych komponentów. ## Kiedy używać - Budujesz aplikacje serverless/full-stack na AWS i chcesz mieć infrastrukturę w tym samym repo. - Zależy Ci na szybkim DX (live dev, typowanie zasobów) bez ręcznego klikania w konsoli. - Wdrażasz frontend (Next/Astro/itd.) razem z backendem i bazą. ## Przykład użycia ```ts // sst.config.ts export default $config({ app: () => ({ name: "eiac", home: "aws" }), async run() { const bucket = new sst.aws.Bucket("Assets"); new sst.aws.Astro("Web", { link: [bucket] }); }, }); ``` ```bash npx sst dev # lokalna pętla developerska npx sst deploy # wdrożenie na AWS ``` ## Warto wiedzieć - `link` automatycznie przekazuje uprawnienia i zmienne do aplikacji — mniej ręcznej konfiguracji IAM. - Alternatywa o silniejszej konwencji: [Encore](/katalog/encore). --- ## Storybook — Design-as-Code URL: https://eiac.dev/katalog/storybook Repo: https://github.com/storybookjs/storybook Licencja: MIT Storybook to środowisko do budowania i dokumentowania komponentów UI w izolacji od aplikacji. Każdy stan komponentu opisujesz jako „story" — żywą, interaktywną dokumentację, która jednocześnie służy jako baza testów wizualnych i dostępności. To pomost między design systemem a kodem: komponenty z tokenów żyją, są przeglądalne i testowalne. ## Kiedy używać - Budujesz bibliotekę komponentów / design system i chcesz ją dokumentować na żywo. - Potrzebujesz testów wizualnych, interakcji i dostępności komponentów. - Chcesz przeglądać warianty komponentu bez uruchamiania całej aplikacji. ## Przykład użycia ```ts // Button.stories.ts import type { Meta, StoryObj } from '@storybook/your-framework'; import { Button } from './Button'; const meta: Meta = { component: Button }; export default meta; export const Primary: StoryObj = { args: { variant: 'primary', label: 'Zapisz się' }, }; ``` ```bash npm run storybook # lokalny warsztat komponentów ``` ## Warto wiedzieć - Wspiera większość frameworków (React, Vue, Svelte, web components). - Komponenty zasilane tokenami ze [Style Dictionary](/katalog/style-dictionary) prezentujesz tu jako żywą dokumentację. --- ## Style Dictionary — Design-as-Code URL: https://eiac.dev/katalog/style-dictionary Repo: https://github.com/amzn/style-dictionary Licencja: Apache-2.0 Style Dictionary to build system dla design tokenów. Definiujesz wartości (kolory, typografię, odstępy) raz, w plikach JSON/JSON5, a narzędzie generuje z nich pliki dla wielu platform: CSS variables, SCSS, stałe iOS/Android, JS/TS i inne. To fundament „design-as-code" — jedno źródło prawdy zasila kod, stronę i materiały marki. ## Kiedy używać - Utrzymujesz spójny system kolorów/typografii w wielu produktach i platformach. - Chcesz, by zmiana tokenu propagowała się automatycznie do całego kodu. - Budujesz własny design system (np. dla eiac.dev). ## Przykład użycia ```json // tokens/color.json { "color": { "rust": { "value": "#A8482A" } } } ``` ```js // config.js — eksport do CSS variables export default { source: ["tokens/**/*.json"], platforms: { css: { transformGroup: "css", files: [{ destination: "tokens.css", format: "css/variables" }] } } }; ``` ```bash npx style-dictionary build # → tokens.css z :root { --color-rust: #A8482A; } ``` ## Warto wiedzieć - Wspiera własne transformy i formaty — dopasujesz output do swojego stacku. - Świetnie współgra z narzędziami projektowymi eksportującymi tokeny (np. [Penpot](/katalog/penpot)). --- ## Task — SDLC / Policy-as-Code URL: https://eiac.dev/katalog/task Repo: https://github.com/go-task/task Licencja: MIT Task to szybki, wieloplatformowy task runner — nowoczesna alternatywa dla Make. Zadania (build, test, deploy, lint) definiujesz deklaratywnie w `Taskfile.yml`, z zależnościami, zmiennymi i inteligentnym pomijaniem zadań, gdy nic się nie zmieniło. To prosty sposób, by „polecenia projektu" stały się wersjonowanym kodem, identycznym lokalnie i w CI. ## Kiedy używać - Chcesz czytelnych, wieloplatformowych komend projektu w jednym pliku. - Zastępujesz rozjeżdżające się skrypty `Makefile`/bash. - Współdzielisz te same zadania między dev i CI. ## Przykład użycia ```yaml # Taskfile.yml version: '3' tasks: build: cmds: [npm ci, npm run build] sources: ["src/**/*"] deploy: deps: [build] cmds: [npx wrangler pages deploy dist --project-name=eiac] ``` ```bash task build task deploy ``` ## Warto wiedzieć - `sources` pozwala pomijać zadania, gdy pliki się nie zmieniły. - Świetnie współgra z CI ([Woodpecker](/katalog/woodpecker)) i [Dagger](/katalog/dagger). --- ## Teller — Security-as-Code URL: https://eiac.dev/katalog/teller Repo: https://github.com/tellerops/teller Licencja: Apache-2.0 Teller to narzędzie CLI do pracy z sekretami z wielu źródeł jednocześnie (Vault, chmurowe menedżery sekretów, pliki) bez opuszczania terminala. Konfigurację mapowania sekretów opisujesz deklaratywnie w YAML, a Teller wstrzykuje je do procesu, skanuje repo pod kątem wycieków i synchronizuje między backendami. Sekrety pozostają poza repo, a ich źródło jest jawnie zdefiniowane jako kod. ## Kiedy używać - Łączysz sekrety z wielu providerów w jednym, spójnym widoku. - Chcesz wstrzykiwać sekrety do procesów lokalnie i w CI. - Potrzebujesz wykrywania wycieków i synchronizacji między backendami. ## Przykład użycia ```yaml # .teller.yml providers: vault: kind: hashicorp_vault maps: - id: db path: secret/eiac/db ``` ```bash teller run -- npm start # wstrzyknięcie sekretów do procesu teller scan # wykrywanie wycieków w repo ``` ## Warto wiedzieć - Warstwa „spinająca" nad backendami jak [Vault](/katalog/vault)/[OpenBao](/katalog/openbao) i [Infisical](/katalog/infisical). - Mapowania trzymaj w repo; same sekrety pozostają w backendach. --- ## Terraform — Infrastructure-as-Code URL: https://eiac.dev/katalog/terraform Repo: https://github.com/hashicorp/terraform Licencja: BUSL-1.1 Terraform to standard branżowy dla infrastruktury jako kod. Opisujesz docelowy stan zasobów (sieci, maszyny, bazy, uprawnienia) w deklaratywnym języku HCL, a Terraform wylicza różnicę między stanem zapisanym a rzeczywistym i wykonuje tylko potrzebne zmiany. Dzięki setkom providerów obejmuje praktycznie każdą chmurę i usługę SaaS z jednego, spójnego workflow. ## Kiedy używać - Zarządzasz infrastrukturą w wielu chmurach lub usługach i chcesz jednego, deklaratywnego narzędzia. - Zależy Ci na podglądzie zmian (`plan`) przed ich wprowadzeniem i na powtarzalnych środowiskach. - Budujesz reużywalne moduły współdzielone między zespołami. ## Przykład użycia ```hcl terraform { required_providers { aws = { source = "hashicorp/aws", version = "~> 5.0" } } } resource "aws_s3_bucket" "assets" { bucket = "eiac-assets" tags = { project = "eiac" } } ``` ```bash terraform init # pobranie providerów terraform plan # podgląd zmian terraform apply # wprowadzenie zmian ``` `plan` pokazuje dokładnie, co zostanie utworzone/zmienione/usunięte, zanim cokolwiek dotknie infrastruktury. ## Warto wiedzieć - Stan trzymaj zdalnie (np. backend S3 + blokada), nigdy w repo. - Po zmianie licencji na BUSL część społeczności przeszła na [OpenTofu](/katalog/opentofu) (fork MPL-2.0). - Strukturyzuj kod w moduły i środowiska (workspaces lub osobne katalogi). --- ## Terragrunt — Infrastructure-as-Code URL: https://eiac.dev/katalog/terragrunt Repo: https://github.com/gruntwork-io/terragrunt Licencja: MIT Terragrunt to cienka nakładka na Terraform i [OpenTofu](/katalog/opentofu), która rozwiązuje problemy skali: powtarzalną konfigurację backendu, zależności między modułami i zarządzanie wieloma środowiskami bez kopiowania kodu. Dzięki niej trzymasz infrastrukturę „DRY" — wspólne ustawienia definiujesz raz i dziedziczysz w katalogach środowisk. ## Kiedy używać - Masz wiele środowisk (dev/stage/prod) i nie chcesz duplikować kodu Terraform. - Potrzebujesz zależności między modułami i spójnej konfiguracji backendu. - Chcesz uruchamiać zmiany w wielu modułach jednym poleceniem. ## Przykład użycia ```hcl # terragrunt.hcl — w katalogu środowiska include "root" { path = find_in_parent_folders() } terraform { source = "git::https://git.eiac.dev/eiac/modules.git//vpc?ref=v1.2.0" } inputs = { cidr = "10.0.0.0/16" } ``` ```bash terragrunt run-all plan # plan dla wszystkich modułów terragrunt run-all apply ``` ## Warto wiedzieć - Działa z Terraform i OpenTofu; konfigurację backendu generuje automatycznie. - Dobrze łączy się z wersjonowanymi modułami trzymanymi w Gitei. --- ## Terramate — Infrastructure-as-Code URL: https://eiac.dev/katalog/terramate Repo: https://github.com/terramate-io/terramate Licencja: MPL-2.0 Terramate CLI to **open-source** (licencja [MPL 2.0](https://www.mozilla.org/en-US/MPL/2.0/)) silnik orkiestracji i generowania kodu, który pozwala skalować IaC: [Terraform](/katalog/terraform), [OpenTofu](/katalog/opentofu), [Terragrunt](/katalog/terragrunt) i [Kubernetes](/katalog/kubernetes). Dzieli wielki, monolityczny stan („Terralith") na mniejsze jednostki — **stacki** — i uruchamia je równolegle, deployując tylko te, w których wykryto zmianę (change detection oparte o Git). ## Kiedy używać - Twój stan IaC urósł w monolit i chcesz go podzielić na niezależne stacki. - Zależy Ci na uruchamianiu tylko zmienionych stacków (szybkie CI, mniejszy promień rażenia). - Chcesz ograniczyć duplikację przez generowanie konfiguracji backendu/providerów. ## Przykład użycia ```hcl # stack.tm.hcl — definicja stacku Terramate stack { name = "sovereign-eu-web" description = "Web w suwerennej lokalizacji EU" } ``` ```bash # uruchom tylko stacki ze zmianami względem main terramate run --changed -- tofu apply ``` ## Warto wiedzieć - Wpina się w istniejący projekt jedną komendą, bez ruszania obecnej konfiguracji. - Firma oferuje też Terramate Cloud (komercyjnie: observability, drift detection, polityki). - Lekka, otwarta alternatywa wobec platform jak [Spacelift](/katalog/spacelift)/[env0](/katalog/env0); do orkiestracji w samym CI zob. [OpenTaco](/katalog/digger). --- ## Terrascan — Security-as-Code URL: https://eiac.dev/katalog/terrascan Repo: https://github.com/tenable/terrascan Licencja: Apache-2.0 Terrascan wykrywa naruszenia bezpieczeństwa i zgodności w infrastrukturze jako kod (Terraform, Kubernetes, Helm, Dockerfile) zanim cokolwiek zostanie zaprovisionowane. Reguły opiera o politykę pisaną w Rego (jak [Open Policy Agent](/katalog/open-policy-agent)), więc własne standardy zapiszesz deklaratywnie i wymusisz w pipeline. ## Kiedy używać - Skanujesz IaC ([Terraform](/katalog/terraform)/[Kubernetes](/katalog/kubernetes)) pod kątem zgodności i bezpieczeństwa. - Chcesz polityk w Rego, spójnych z ekosystemem OPA. - Bramkujesz PR-y i plan przed `apply`. ## Przykład użycia ```bash terrascan scan -i terraform -d . terrascan scan -i k8s -d ./manifests ``` ```yaml # Gitea Actions — fail przy naruszeniach - run: terrascan scan -d infra --verbose ``` ## Warto wiedzieć - Pokrywa się funkcjonalnie z [Checkov](/katalog/checkov) — wybór zależy od preferencji (Rego vs Python/YAML). - Polityki trzymaj w repo i wersjonuj jak kod. --- ## Toast — SDLC / Policy-as-Code URL: https://eiac.dev/katalog/toast Repo: https://github.com/stepchowfun/toast Licencja: MIT Toast pozwala definiować zadania dev i CI w pliku YAML, gdzie każdy krok wykonuje się w kontenerze. Dzięki temu te same, powtarzalne środowiska działają identycznie lokalnie i na CI — z cache'owaniem i zależnościami między zadaniami. To sposób, by „jak budujemy i testujemy" stało się przenośnym kodem, niezależnym od konkretnego dostawcy CI. ## Kiedy używać - Chcesz powtarzalnych, kontenerowych zadań dev/CI niezwiązanych z jednym CI. - Zależy Ci na identycznym środowisku lokalnie i w pipeline. - Wolisz prosty plik YAML zamiast skryptów per-CI. ## Przykład użycia ```yaml # toast.yml tasks: build: image: node:20 command: npm ci && npm run build test: dependencies: [build] command: npm test ``` ```bash toast build # uruchomienie w kontenerze ``` ## Warto wiedzieć - Pokrewne ideowo z [Dagger](/katalog/dagger) (przenośne, kontenerowe pipeline'y). - Dobrze sprawdza się jako wspólny „runner" zadań dla dev i CI. --- ## Tokens Studio — Design-as-Code URL: https://eiac.dev/katalog/tokens-studio Repo: https://github.com/tokens-studio/figma-plugin Licencja: MIT Tokens Studio pozwala tworzyć i utrzymywać design tokeny bezpośrednio w narzędziu projektowym, a następnie synchronizować je z repozytorium Git jako pliki JSON. Dzięki temu projektant i kod pracują na jednym źródle prawdy: zmiana tokenu w projekcie trafia do repo, a stamtąd — np. przez [Style Dictionary](/katalog/style-dictionary) — do CSS i kodu. ## Kiedy używać - Chcesz, by tokeny powstawały po stronie projektu i automatycznie wracały do kodu. - Utrzymujesz wiele motywów/marek i potrzebujesz aliasów oraz semantycznych warstw tokenów. - Domykasz pętlę „design ↔ code" bez ręcznego przepisywania wartości. ## Przykład użycia ```json // tokens.json synchronizowane z repo { "color": { "rust": { "value": "#A8482A", "type": "color" }, "link": { "value": "{color.rust}", "type": "color" } } } ``` ```bash # w repo: tokens.json → Style Dictionary → tokens.css npx style-dictionary build ``` ## Warto wiedzieć - Aliasy (`{color.rust}`) pozwalają budować semantyczne warstwy tokenów. - Naturalnie spina się ze [Style Dictionary](/katalog/style-dictionary) i [Penpot](/katalog/penpot). --- ## Trivy — Security-as-Code URL: https://eiac.dev/katalog/trivy Repo: https://github.com/aquasecurity/trivy Licencja: Apache-2.0 Trivy to wszechstronny skaner bezpieczeństwa: wykrywa znane podatności (CVE) w obrazach kontenerów i zależnościach, błędy konfiguracji w plikach IaC (Terraform, Kubernetes, Dockerfile), wycieki sekretów oraz generuje SBOM. Jest szybki, działa offline z lokalną bazą i łatwo wpina się w pipeline — bezpieczeństwo staje się bramką w CI, nie ręcznym audytem. ## Kiedy używać - Skanujesz obrazy i zależności pod kątem CVE przed wdrożeniem. - Sprawdzasz manifesty IaC/Kubernetes pod kątem złych konfiguracji. - Chcesz jednego narzędzia do CVE, sekretów, IaC i SBOM. ## Przykład użycia ```bash trivy image ghcr.io/eiac/web:1.0.0 # podatności w obrazie trivy config ./infra # błędy konfiguracji IaC trivy fs --scanners secret . # wycieki sekretów ``` ```yaml # krok w pipeline — fail przy krytycznych CVE - run: trivy image --exit-code 1 --severity CRITICAL ghcr.io/eiac/web:1.0.0 ``` ## Warto wiedzieć - Dobrze łączy się z politykami [Open Policy Agent](/katalog/open-policy-agent) (Conftest/Rego). - `--exit-code` zamienia skan w twardą bramkę CI. --- ## TruffleHog — Security-as-Code URL: https://eiac.dev/katalog/trufflehog Repo: https://github.com/trufflesecurity/trufflehog Licencja: AGPL-3.0 TruffleHog skanuje repozytoria, historię Git, obrazy, logi i wiele innych źródeł w poszukiwaniu sekretów — a co kluczowe, potrafi je **zweryfikować**, sprawdzając, czy znaleziony klucz nadal działa. To ogranicza szum fałszywych alarmów i pozwala priorytetyzować realne wycieki. Wpina się w pre-commit i CI jako bramka. ## Kiedy używać - Chcesz wykrywać sekrety z weryfikacją „czy ten klucz żyje". - Skanujesz nie tylko repo, ale też obrazy, S3, logi. - Budujesz bramkę w CI i hook pre-commit. ## Przykład użycia ```bash trufflehog git https://git.eiac.dev/eiac/web --only-verified trufflehog filesystem ./ --only-verified ``` ```yaml # Gitea Actions — fail przy zweryfikowanym sekrecie - run: trufflehog git file://. --only-verified --fail ``` ## Warto wiedzieć - Komplementarny do [Gitleaks](/katalog/gitleaks): TruffleHog weryfikuje, Gitleaks jest lekki i regułowy — wielu używa obu. - `--only-verified` mocno redukuje fałszywe alarmy. --- ## Vault — Security-as-Code URL: https://eiac.dev/katalog/vault Repo: https://github.com/hashicorp/vault Licencja: BUSL-1.1 Vault centralizuje sekrety (klucze API, hasła, certyfikaty) i udostępnia je aplikacjom przez API, zamiast trzymać je w plikach czy zmiennych środowiskowych. Potrafi generować sekrety dynamicznie i krótkożyciowo (np. czasowe dane dostępowe do bazy), szyfrować dane „as a service" oraz egzekwować polityki dostępu. Konfigurację — politykę, silniki sekretów, role — opisujesz deklaratywnie, więc bezpieczeństwo też staje się kodem. ## Kiedy używać - Chcesz wyeliminować sekrety z repo i plików konfiguracyjnych. - Potrzebujesz krótkożyciowych, automatycznie rotowanych poświadczeń. - Egzekwujesz dostęp do sekretów politykami (least privilege). ## Przykład użycia ```bash vault kv put secret/eiac/db password="s3cret" vault kv get -field=password secret/eiac/db ``` ```hcl # polityka dostępu jako kod path "secret/data/eiac/*" { capabilities = ["read"] } ``` Aplikacja uwierzytelnia się (np. tokenem K8s) i pobiera sekret w runtime — nic nie ląduje w repo. ## Warto wiedzieć - Provisioning Vaulta zautomatyzujesz [Terraform](/katalog/terraform)/[OpenTofu](/katalog/opentofu) (provider Vault). - Dynamiczne sekrety mocno ograniczają „blast radius" wycieku. - Otwarta alternatywa po zmianie licencji na BUSL: [OpenBao](/katalog/openbao) (fork MPL-2.0). --- ## Velero — App-as-Code URL: https://eiac.dev/katalog/velero Repo: https://github.com/velero-io/velero Licencja: Apache-2.0 Velero wykonuje backup i przywracanie zasobów Kubernetes oraz trwałych wolumenów, a także migruje aplikacje między klastrami. Harmonogramy i zakres backupów definiujesz deklaratywnie (CRD), więc disaster recovery staje się powtarzalnym, wersjonowanym procesem — a nie ręczną akcją „na już". Backupy lądują w obiektowym storage (S3-kompatybilnym). ## Kiedy używać - Potrzebujesz backupu/DR aplikacji i wolumenów w [Kubernetes](/katalog/kubernetes). - Migrujesz workloady między klastrami/chmurami. - Chcesz harmonogramów backupu opisanych deklaratywnie. ## Przykład użycia ```bash velero backup create eiac-daily --include-namespaces web velero schedule create daily --schedule "0 3 * * *" --include-namespaces web velero restore create --from-backup eiac-daily ``` ## Warto wiedzieć - Backup wolumenów uzupełnia storage z replikacją ([Longhorn](/katalog/longhorn)). - Definicje backupów/harmonogramów trzymaj w repo (GitOps). --- ## Warpgate — Security-as-Code URL: https://eiac.dev/katalog/warpgate Repo: https://github.com/warp-tech/warpgate Licencja: Apache-2.0 Warpgate to w pełni transparentny bastion (PAM — Privileged Access Management) dla SSH, HTTPS, MySQL, Postgres i Kubernetes, napisany w bezpiecznym Rust. Uwierzytelnia użytkownika, a potem przezroczyście przekazuje połączenie do serwera docelowego, robiąc po drodze nagranie sesji do audytu. Kluczowa różnica wobec zwykłego jump-hosta: **precyzyjne przypisanie 1:1 użytkownik↔usługa** zamiast dostępu do całej sieci — i to bez instalowania klienta po stronie użytkownika. ## Kiedy używać - Chcesz kontrolowanego, audytowalnego dostępu do infrastruktury (SSH/bazy/K8s) z jednego miejsca. - Potrzebujesz SSO (OIDC), 2FA i RBAC „z pudełka", bez doklejania wtyczek PAM. - Zależy Ci na self-hostingu — jeden binarny plik lub obraz Docker na własnym sprzęcie, dane po Twojej stronie. ## Przykład użycia ```bash # specjalnie formatowana nazwa użytkownika wybiera cel przez bastion $ ssh c.wilde:staging-env@warpgate.acme.inc Warpgate Selected target: staging-env ✓ Warpgate connected root@staging-env ~ $ ``` Dostępem (użytkownicy, cele, kto co widzi) zarządzasz deklaratywnie, a każda sesja zostawia nagranie i log do audytu. ## Warto wiedzieć - Pełni rolę bramy tożsamości i dostępu w [Security Plane](/blog/security-plane-sekrety-tozsamosc-policy); SSO domykają brokerzy OIDC jak [Dex](/katalog/dex)/[Ory Hydra](/katalog/ory-hydra). - Sekrety i poświadczenia trzymaj w [Vault](/katalog/vault)/[OpenBao](/katalog/openbao); polityki dostępu opisuj jako [policy-as-code](/blog/policy-as-code-dla-zespolow). - 100% open-source (Apache-2.0), finansowany kontraktami wsparcia — bez płatnych planów i modelu SaaS. --- ## Watchtower — SDLC / Policy-as-Code URL: https://eiac.dev/katalog/watchtower Repo: https://github.com/containrrr/watchtower Licencja: Apache-2.0 Watchtower obserwuje uruchomione kontenery i automatycznie aktualizuje je, gdy w rejestrze pojawi się nowy obraz dla używanego tagu — pobiera nową wersję i wdraża ją z zachowaniem dotychczasowej konfiguracji. To prosty sposób na ciągłe dostarczanie dla środowisk opartych o Docker/Compose, bez pełnego klastra Kubernetes. ## Kiedy używać - Hostujesz usługi w Dockerze/Compose i chcesz automatycznych aktualizacji obrazów. - Nie potrzebujesz pełnego GitOps na Kubernetes, a chcesz „auto-update". - Utrzymujesz mały serwer/homelab z wieloma kontenerami. ## Przykład użycia ```bash docker run -d --name watchtower \ -v /var/run/docker.sock:/var/run/docker.sock \ containrrr/watchtower --interval 3600 ``` Watchtower co godzinę sprawdza rejestr i aktualizuje kontenery z nowym obrazem. ## Warto wiedzieć - Dla Kubernetes zamiast tego używaj GitOps ([Argo CD](/katalog/argo-cd)/[Flux](/katalog/flux)). - Dobrze współgra z własnym rejestrem ([Harbor](/katalog/harbor)). --- ## Winglang (Wing) — App-as-Code URL: https://eiac.dev/katalog/winglang Repo: https://github.com/winglang/wing Licencja: MIT Wing to **zorientowany na chmurę język programowania**, którego teza jest mocna: istniejące języki nie wystarczają, by dobrze opisać aplikacje chmurowe, bo mieszają dwie fazy życia kodu. Wing rozdziela je jawnie: **preflight** to kod wykonywany raz, przy kompilacji, który generuje konfigurację infrastruktury (kompiluje się do Terraform lub CDK), a **inflight** to kod aplikacji działający w runtime. Usługi chmurowe są tu obywatelami pierwszej kategorii, a kompilator pilnuje granicy między fazami. Dla zespołów, które nie chcą uczyć się nowego języka, Wing oferuje też SDK dla TypeScript. ## Kiedy używać - Chcesz opisać aplikację i jej infrastrukturę w **jednym, spójnym modelu**, bez rozjeżdżania się kodu i IaC. - Zależy Ci na jawnym rozróżnieniu „co dzieje się przy wdrożeniu" vs „co w runtime" — z kontrolą kompilatora. - Celujesz w przenośność między chmurami (Wing kompiluje do znanych silników, nie zamyka Cię w jednej platformie). ## Przykład użycia ```js // preflight: definicja infrastruktury (bucket) bring cloud; let store = new cloud.Bucket(); // inflight: logika runtime reagująca na zdarzenie let handler = inflight (msg: str) => { store.put("ostatni.txt", msg); }; ``` ## Warto wiedzieć - Kompiluje się do [Terraform](/katalog/terraform)/[OpenTofu](/katalog/opentofu) lub CDK — infrastruktura zostaje w otwartych, znanych formatach. - To inny punkt na osi „infrastructure-from-code" niż [SST](/katalog/sst) (framework IaC) czy [Encore](/katalog/encore) (infra wywodzona z kodu); porównanie podejść: [IaC w 2026](/blog/iac-2026-przeglad). - Nowy język to koszt wejścia — SDK dla TypeScript łagodzi go, ale warto policzyć adopcję zespołu. --- ## Woodpecker CI — SDLC / Policy-as-Code URL: https://eiac.dev/katalog/woodpecker Repo: https://github.com/woodpecker-ci/woodpecker Licencja: Apache-2.0 Woodpecker to lekki, samodzielnie hostowany silnik CI/CD. Pipeline'y opisujesz deklaratywnie w pliku YAML w repo, a każdy krok uruchamia się w kontenerze. Jest prosty w utrzymaniu i dobrze integruje się z serwerami Git (w tym z naszą Gitą), więc stanowi naturalną, otwartą alternatywę dla zamkniętych usług CI. ## Kiedy używać - Chcesz self-hostowanego CI/CD blisko repozytoriów (np. Gitea). - Wolisz prosty, kontenerowy model pipeline'ów jako kod. - Zależy Ci na lekkości i przejrzystości zamiast rozbudowanej platformy. ## Przykład użycia ```yaml # .woodpecker.yml steps: build: image: node:20 commands: - npm ci - npm run build deploy: image: node:20 commands: [npx wrangler pages deploy dist --project-name=eiac] when: { branch: main } ``` ## Warto wiedzieć - Składnia zbliżona do innych systemów pipeline-as-code; łatwa migracja. - Do przenośnych kroków buildu łącz z [Dagger](/katalog/dagger). ---