HIGI — pełny opis systemu

Jak działa nasz GitHub + Cloudflare: repozytorium, środowiska, wgrywanie, sekrety, pełny przepływ zmiany.

Dane zweryfikowane 2026-06-25 z konfiguracji (wrangler.toml), repozytorium i Cloudflare. Identyfikatory zasobów nie są sekretami; klucze/tokeny tu nie występują.

1. Skrót

System stoi na dwóch filarach. GitHub = historia i prawda o kodzie (commity, gałęzie, przeglądy). Cloudflare = miejsce, gdzie kod żyje w sieci (strona + mały serwer + baza). U nas te dwa filary NIE są spięte automatycznie — wgrywanie robię ręcznie z folderu na dysku, niezależnie od gita. Dlatego coś może być „na dev" bez śladu na GitHubie.

2. Repozytorium (GitHub)

github.com/numerika-ai/higi — jedno repo na całość (monorepo). Menedżer paczek: pnpm. Budowanie spina turbo.

FolderCo toTechnologia
apps/webAplikacja w przeglądarce (logowanie, bramka dostępu, edytor ankiety, panele)React + TypeScript + Vite
apps/workersMały serwer („Worker") — API /api/*Cloudflare Workers + Hono
apps/legacySilnik pacjenta — ankieta → plan → PDFczysty JavaScript + Excel (SheetJS)
apps/briefMateriały/brief produktustatyczne
packages/shared-typesWspólne typy/kontrakty front↔serwerTypeScript
packages/uiWspólne elementy interfejsuTypeScript
docs/Architektura, decyzje (DECISIONS), specyfikacjeMarkdown

Model gałęzi

3. Cloudflare — co dokładnie mamy

Konto Cloudflare: 9dba5bd9…b4e53c17. Cztery rodzaje zasobów: Pages (strony), Workers (serwer), D1 (baza), KV (magazyn).

Pages — hosting stron

ProjektAdresRola
higihigi.com.pl · www.higi.com.plPRODUKCJA — prawdziwe higienistki
higi-devdev.higi.com.plDEV — testy zespołu
~15 mikrosajtów (research, specyfikacja, raporty, ten opis…)osobne, pomocnicze strony

Workers — mały serwer (API /api/*)

WorkerAdresBaza D1Rola
higi-apihigi.com.pl/api/*higi · 05affe22…PRODUKCJA
higi-api-devdev.higi.com.pl/api/*higi-dev · 27504c35…DEV

Worker przechwytuje tylko /api/*; całą resztę (strona, /legacy, pliki) serwuje Pages. Ten sam adres = brak problemów z CORS. R2 (pliki) świadomie odłożone — MVP go nie potrzebuje.

4. Dwa światy: Dev kontra Prod

To są całkowicie osobne, niepołączone zestawy zasobów. Zmiana na dev nie dotyka prod — i odwrotnie.

ElementDEVPRODUKCJA
Adresdev.higi.com.plhigi.com.pl
Strona (Pages)higi-devhigi
Serwer (Worker)higi-api-devhigi-api
Baza (D1)higi-devhigi
Magazyn (KV)c0da3925…b95ef4fc…
Automat maili (cron)tak (6:00 UTC, tryb próbny)świadomie nie (dodamy na „promuj")
Kto wgrywa zmianykażda nowa rzecz — najpierw tutylko na wyraźne „promuj" Bartosza

Logowanie (Clerk) to ta sama usługa dla obu — ważne to ta sama subdomena clerk.higi.com.pl; różni się tylko „dozwolony adres" (dev vs prod).

5. Dwie niezależne ścieżki — sedno

🔵 Ścieżka 1 — GIT (trwałość, historia, przegląd)

Folder roboczycommit historia lokalnapush gałąź na GitHubPR + przegląd main

🟠 Ścieżka 2 — WGRYWANIE (żeby działało w sieci)

Folder roboczybuild gotowa paczkawrangler Cloudflare dev

Bierze pliki takie, jakie są w folderze — obojętne, czy zacommitowane. Dlatego u nas Git Provider: No na wszystkich projektach: commit niczego nie wgrywa, wgrywanie niczego nie commituje.

Prawdziwe komendy, których używam

# 1. osobny folder roboczy na nowej gałęzi (z czystego main)
git worktree add /tmp/higi-org -b be/nazwa origin/main

# 2. budowanie
pnpm --filter @higi/web build        # strona (tsc + vite)
pnpm --filter @higi/workers typecheck # sprawdzenie serwera

# 3a. WGRYWANIE serwera (Worker) na dev
wrangler deploy --env dev            # prod: wrangler deploy (bez --env)

# 3b. WGRYWANIE strony (Pages) na dev
wrangler pages deploy apps/web/dist --project-name=higi-dev --branch=main

# ŚCIEŻKA GIT (trwałość) — to było pomijane
git commit -am "opis"  &&  git push origin be/nazwa
gh pr create           # potem /code-review + /security-review → merge

6. Pełny przepływ zmiany — jak POWINNO być

  1. Edycja w folderze roboczym (worktree na gałęzi fe/ lub be/).
  2. Sprawdzenie: typecheck / build lokalnie.
  3. Zapis na GitHub: commitpushPR.
  4. Przegląd: /code-review + /security-review — poprawki w tej samej gałęzi.
  5. Scalenie do main (merge PR).
  6. Wgranie na DEV: build + wrangler → weryfikacja na dev.higi.com.pl.
  7. Produkcja: dopiero na wyraźne „promuj" — wtedy to samo na higi/higi-api.

Klucz: zapis na GitHub (3–5) przed wgraniem (6) — wtedy serwer zawsze ma odpowiednik w historii.

7. Jak „żyje" pojedyncze żądanie użytkownika

Przeglądarka  →  dev.higi.com.pl
        │
        ├─ ścieżka /api/*      → Worker higi-api-dev → D1 (baza) / KV (magazyn)
        │                                         ↳ sprawdza token logowania (Clerk)
        └─ wszystko inne          → Pages higi-dev (pliki strony: HTML/JS/CSS, /legacy)

Logowanie: Clerk (zewnętrzne)   ·   Płatności: Stripe (jeszcze nieaktywne)   ·   Maile: Resend (tryb próbny)

Dane pacjenta (odpowiedzi z ankiety, gotowy plan) zostają w przeglądarce — nie lecą na serwer. To twarda obietnica produktu (decyzja D-08).

8. Sekrety — gdzie są i czego nie wolno

SekretGdzie
Token Cloudflare (do wgrywania)plik na dysku ~/.openclaw/secrets/ — nigdy w repo ani czacie
Klucz tajny Clerk / Resendwrangler secret put … — żyje na Workerze, nie w plikach
Klucze frontu (publiczny Clerk, ceny)apps/web/.env.local — poza repo (.gitignore)

9. Twarde zasady

10. Stan na dziś — dług do spłaty

Część pracy poszła tylko Ścieżką 2 (wgrywanie), bez Ścieżki 1 (git). Skutek: ~53 pliki (gabinety, maile, NIP, warstwa globalna) żyją wyłącznie w folderach /tmp na komputerze — brak na GitHubie, brak historii, brak przeglądu. Skasowanie folderu = utrata pracy.

Naprawa: przepuścić te pliki przez Ścieżkę 1 (commit → push → PR → przegląd). Szczegóły w raporcie stanu: higi-status-raport.pages.dev.

11. Słowniczek

PojęciePo ludzku
commitzapis migawki zmian w historii (na razie tylko na komputerze)
pushwysłanie zapisanych zmian na GitHub
PR (pull request)prośba o włączenie zmian do main — moment na przegląd
mergescalenie zatwierdzonych zmian do main
worktreeosobny folder = kopia repo na danej gałęzi
buildzłożenie kodu w gotową paczkę dla przeglądarki/serwera
wranglernarzędzie Cloudflare do wgrywania (Pages i Worker)
Pages / Workerhosting strony / mały serwer w chmurze (/api/*)
D1 / KVbaza danych / prosty magazyn klucz-wartość
Clerkzewnętrzna usługa logowania (hasła, weryfikacja, sesje)

★ 12. Analiza: czy „GitHub → potem Cloudflare" to najlepsza kolejność?

Pytanie: na początku zakładaliśmy, że zmiana idzie najpierw na GitHub, a stamtąd automatycznie na Cloudflare (workflow'y deploy-*.yml). Czy to najlepsza droga — i jak ją bezpiecznie przywrócić, skoro aplikacja już żyje na produkcji?

Krótka odpowiedź: TAK — „GitHub jako źródło prawdy, Cloudflare poniżej" (model zwany GitOps) to właściwy, standardowy sposób dla produktu idącego na produkcję. Z jednym twardym zastrzeżeniem: produkcja nie może wgrywać się sama po każdym scaleniu — musi mieć ręczną bramkę („promuj"). Zasada: dev = automat, prod = na guzik.

Trzy możliwe modele

ModelJak działaPlusyMinusy
A. GitOps przez GitHub Actions (pierwotny zamysł) merge do main → Actions → wrangler wgrywa jedno źródło prawdy; historia; przegląd; jeden pipeline dla strony + serwera + migracji; łatwa bramka na prod trzeba skonfigurować + włożyć sekrety do GitHub
B. Ręczny wrangler z maszyny TERAZ człowiek odpala deploy z folderu zero konfiguracji; pełna kontrola ad-hoc brak historii; dryf dev↔GitHub; „deploy z niezacommitowanego"; błąd ludzki
C. Natywne podpięcie Cloudflare↔Git projekt Pages podpięty wprost do repo, build w chmurze CF proste dla samych stron tylko Pages (nie obejmuje Workera ani migracji); słabsza bramka na prod

Rekomendacja: Model A (GitHub Actions)

Jako jedyny obejmuje stronę + serwer + migracje w jednym, spójnym torze, z możliwością ręcznej bramki na produkcję. Model C można rozważyć jako uproszczenie wyłącznie dla stron pomocniczych. Model B (dziś) zostawiamy tylko jako awaryjny.

Ryzyka OBECNEGO stanu (Model B) — dlaczego warto naprawić

RyzykoSkutek
Praca tylko w /tmp, niezacommitowanaskasowanie folderu = utrata tygodni pracy (dziś ~53 pliki)
Dryf dev ↔ GitHubnie wiadomo, co naprawdę jest na żywo; trudny powrót do stabilnej wersji
Brak przeglądu kodu/bezpieczeństwabłędy i podatności trafiają bez kontroli (łamie zasadę #8)
Ręczny deploy = błąd ludzkizły projekt, zła kolejność, pominięty krok (już się zdarzyło)
Token-sekret na maszyniewiększa powierzchnia ryzyka niż sekret zamknięty w CI

Ryzyka SAMEJ zmiany (włączenia automatu) — i jak je zdjąć

Ryzyko zmianyZabezpieczenie
Prod wgra się sam po merge → łamie „promuj"GitHub Environments + wymagane zatwierdzenie (albo prod tylko ręcznym workflow_dispatch)
Migracje bazy auto-odpalą się na prodmigracje prod zawsze ręcznie, nigdy w automacie
Sekrety w GitHub = nowa powierzchnia atakutoken o wąskim zakresie (tylko deploy), w GitHub Secrets, z rotacją
Niegotowy merge trafia na żywoochrona gałęzi main + wymagany review przed scaleniem
Pierwszy automat nadpisze niezacommitowaną pracę z devNAJPIERW zacommitować dług, potem włączać automat

Czy to duża zmiana?

I tak, i nie — zależy co liczymy:

Werdykt: zmiana ŚREDNIA, ryzyko NISKIE — jeśli robiona etapami. Każdy etap jest odwracalny, a produkcja rusza dopiero na końcu i tylko ręcznie.

Bezpieczna naprawa — kolejność (każdy krok osobny i odwracalny)

  1. Spłata długu (najpilniejsze, niezależne): zacommitować + wypchnąć na GitHub pracę z /tmp → PR → review. Po tym GitHub = dev. Bez tego każdy automat jest niebezpieczny.
  2. Automat tylko na DEV: workflow, który po merge do main buduje i wgrywa na higi-dev / higi-api-dev. Dev jest bezpieczny — tu testujemy sam mechanizm.
  3. Bramka na PROD: osobny workflow produkcyjny uruchamiany ręcznie z zatwierdzeniem = techniczne „promuj". Nigdy automatycznie.
  4. Migracje bazy: zawsze ręcznie i osobno (dev → prod), poza automatem.
  5. Sekrety i porządki: wąski token deploy do GitHub Secrets; dodać brakujący workflow dla apps/web; poprawić cel legacy (higienistkahigi); wyłączyć martwe/błędne workflow'y.
  6. Ochrona repo: blokada wrzutu wprost na main (wymagany PR + review).
Po naprawie zmiana płynie tak: gałąź → PR → review → merge → automat na dev → weryfikacja → ręczne „promuj" → prod. Koniec „deployów z folderu bez commita".