diff --git a/public/diagrams/architektura-maszyna.svg b/public/diagrams/architektura-maszyna.svg new file mode 100644 index 0000000..bda902b --- /dev/null +++ b/public/diagrams/architektura-maszyna.svg @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + MASZYNA DEMO · PODMAN + osobne kontenery pod systemd · wszystko w jednym katalogu użytkownika + + + + + + + + Redaktor + przeglądarka · /admin/ (Sveltia) + edycja WYSIWYG, podgląd 1:1 + + + + + + + + Czytelnik + publiczna strona portalu + czysty, szybki HTML + + + + + + GITEA + + :3000 + + repo ctao/portal + treść: Markdown + obrazy (WebP) + każda zmiana = commit + pełna historia + rollback za darmo + + + + + + BUILD · ASTRO + + KONTENER JEDNORAZOWY + timer systemd (co ~10 s) sprawdza, + czy w repo jest nowy commit + jeśli tak: git fetch → checkout → + Markdown → statyczny HTML + po buildzie kontener znika + + + + + + releases/ + + WOLUMEN + 9f2c1d/ poprzednia wersja + 71b980/ ← current (symlink) + podmiana atomowa — zero przestoju + + + + + + NGINX + + :8080 + serwuje releases/current + wyłącznie statyczne pliki + brak aplikacji · brak bazy · brak PHP + + + + zapis przez API (OAuth) + + + git fetch + + + nowa wersja strony + + + current/ + + + statyczny HTML + diff --git a/public/diagrams/cover-git-cms.svg b/public/diagrams/cover-git-cms.svg new file mode 100644 index 0000000..565f5fe --- /dev/null +++ b/public/diagrams/cover-git-cms.svg @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + M↓ + + diff --git a/public/diagrams/od-zapisu-do-publikacji.svg b/public/diagrams/od-zapisu-do-publikacji.svg new file mode 100644 index 0000000..471b2ad --- /dev/null +++ b/public/diagrams/od-zapisu-do-publikacji.svg @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + 2 + 3 + 4 + 5 + + + Zapis w edytorze + Sveltia · WYSIWYG + podgląd artykułu 1:1 + obrazy → WebP przy uploadzie + + + Commit w repo + Gitea · logowanie OAuth + zapis przez API = commit + historia każdej zmiany + + + Detekcja zmiany + timer systemd + sprawdza repo co ~10 s + brak zmian = brak pracy + + + Build strony + jednorazowy kontener + Astro: Markdown → + statyczny HTML + + + Publikacja + atomowa podmiana symlinka + nginx od razu serwuje + nową wersję + + + + awaria builda? strona działa dalej na starej wersji + + rollback = git revert — jedna komenda + diff --git a/public/diagrams/powierzchnia-ataku.svg b/public/diagrams/powierzchnia-ataku.svg new file mode 100644 index 0000000..839e6f3 --- /dev/null +++ b/public/diagrams/powierzchnia-ataku.svg @@ -0,0 +1,48 @@ + + + + + + + + + + + + + CMS Z BAZĄ DANYCH + internet + + + ▪ aplikacja CMS (PHP / Node) — publiczna + ▪ panel logowania — publiczny + ▪ baza danych z treścią + ▪ pluginy i zależności + wszystko działa non stop i wymaga patchowania + + + + + + TO ROZWIĄZANIE + internet + + + ▪ pliki HTML — i nic więcej + nie ma czego zhakować ani patchować + + edycja + + + ▪ git (Gitea) — tylko zalogowani + docelowo za VPN, poza publicznym internetem + diff --git a/src/content/news/architektura-demo-git-cms.md b/src/content/news/architektura-demo-git-cms.md index 7e96cb8..125a118 100644 --- a/src/content/news/architektura-demo-git-cms.md +++ b/src/content/news/architektura-demo-git-cms.md @@ -1,9 +1,10 @@ --- title: "Jak działa to demo: portal statyczny + CMS oparty o git" description: "Architektura rozwiązania, przydatne linki i porównanie klas rozwiązań: strona w 100% statyczna z graficznym edytorem treści vs CMS z własną bazą danych." -date: 2026-07-28 +date: 2026-07-23 category: demo author: Cyfronet +cover: /diagrams/cover-git-cms.svg draft: false --- @@ -12,28 +13,18 @@ w repozytorium git. Redaktor dostaje **graficzny edytor w przeglądarce** — a mimo to w produkcji nie działa żadna aplikacja, żadna baza danych. Ten artykuł został napisany i opublikowany dokładnie tą ścieżką. -## Jak to działa +## Od zapisu do publikacji -``` - redaktor (przeglądarka) - │ edycja WYSIWYG + upload obrazów - ▼ - Sveltia CMS (/admin/ — statyczne pliki JS, zero własnego backendu) - │ zapis = commit przez API (logowanie OAuth) - ▼ - Gitea (repozytorium: treść w Markdown + obrazy) - │ poller sprawdza nowe commity (systemd timer, co ~10 s) - ▼ - build w kontenerze (Astro: Markdown → HTML, ~225 stron) - │ atomowa podmiana symlinka na nową wersję - ▼ - nginx — serwuje wyłącznie statyczne pliki -``` +![Pięć kroków publikacji: zapis w edytorze → commit w repo → detekcja zmiany → build strony → publikacja](/diagrams/od-zapisu-do-publikacji.svg) Publikacja jest automatyczna — zapis w edytorze po chwili sam pojawia się na stronie, bez żadnego ręcznego deployu. Każda zmiana to commit, więc **pełna historia treści i możliwość cofnięcia są w gicie za darmo**. +## Jak to wygląda na maszynie + +![Architektura na maszynie demo: redaktor zapisuje przez Sveltię do Gitei, timer systemd uruchamia jednorazowy kontener builda Astro, wynik trafia do wolumenu releases, a nginx serwuje czytelnikom wyłącznie statyczne pliki](/diagrams/architektura-maszyna.svg) + ## Gdzie co jest | Co | Gdzie | @@ -49,15 +40,7 @@ i jednorazowy kontener builda odpalany przez systemd timer. ## Dlaczego strona statyczna -``` - CMS z bazą danych: to rozwiązanie: - - internet ──► aplikacja CMS (PHP/Node) internet ──► pliki HTML - + baza danych (nie ma czego zhakować, - + pluginy nie ma czego patchować) - ▲ wszystko publiczne, - wszystko trzeba patchować edycja ──► git (tylko zalogowani) -``` +![Porównanie powierzchni ataku: CMS z bazą wystawia publicznie aplikację, panel logowania, bazę i pluginy — tu publiczne są tylko pliki HTML, a edycja idzie przez git dla zalogowanych](/diagrams/powierzchnia-ataku.svg) - **Bezpieczeństwo**: publicznie wystawione są tylko pliki. Nie istnieje panel admina dostępny z internetu, baza do wykradzenia ani runtime z CVE.