# Bilko Infrastruktura — objašnjeno jednostavno (za CEO) — 2026-06-09

# Bilko Infrastruktura — objašnjeno jednostavno (za CEO)

*Verzija 2026-06-09. Cilj: da za 5 minuta razumiješ gdje Bilko živi, kako kod dođe do kupaca, šta je polomljeno i kako to zaobilazimo. Sve provjereno uživo (gcloud), ne napamet.*

---

## KORAK 1 — Šta gdje radi (okruženja)

Bilko ima 7 Cloud Run "mašina", ali realno **samo 2 okruženja**:

```

PROD  (ono što kupci vide — pravi proizvod, čist, bez demo podataka)
   app.bilko.cloud       ->  bilko-web-demo    (web,  Next.js)
   app-api.bilko.cloud   ->  bilko-api-demo    (API,  Kotlin/Ktor)
                                 |
                             bilko-demo-db     (Postgres 16)

STAGE  (za testiranje prije proda — UAT)
   (interni URL-ovi)     ->  bilko-web-stage  +  bilko-api-stage
                                 |
                             bilko-staging-db
```

### ⚠️ Zašto je zbunjujuće: IMENA LAŽU

Servisi se zovu `...-demo` ali su **to PROD**. Razlog: odlučili smo "reuse demo kao prod" da ne plaćamo novu bazu/servise (0 KM dodatno). Pa `app.bilko.cloud` (tvoj pravi proizvod) radi na mašini koja se istorijski zove `bilko-web-<strong>demo</strong>`. Ime = ostatak iz prošlosti, ne realnost.

### Ostalo (nije bitno za sad)

- `bilko-demo.alai.no` — stari demo URL, sad samo alias na istu PROD mašinu
- `bilko-web` — prazan stub (ništa)
- `bilko-intesa-demo` — odvojen Intesa (banka) demo
- `bilko-unleash` — servis za feature-flagove
- `bilko-db` — nova prazna prod baza, NE koristi se (prod radi na `bilko-demo-db`)

---

## KORAK 2 — Kako kod dođe iz editora na te mašine (deploy)

Postoje **tri odvojena puta** kako kod ide live, zavisno šta se mijenja:

### A) Glavna aplikacija (web + API)

```

ti/agent napišeš kod  ->  PR na GitHub  ->  merge u 'main'
                                              |
                          GitHub javi Google Cloud Build-u (preko "konekcije")
                                              |
                Cloud Build sagradi Docker image + prođe GATE-ove (security, testovi)
                                              |
              STAGE:  push u 'main'  -> trigger 'bilko-stage-auto-deploy'  -> stage mašine
              PROD:   semver tag (npr. v0.2.66) -> trigger 'bilko-main-deploy' -> prod mašine
```

**Gate-ovi** = automatske provjere prije nego se išta pusti: security skener (Trivy), testovi, lint. Ako bilo koji padne — deploy se zaustavi. To je dobro (štiti prod), ali znači da jedan pokvaren gate blokira SVE.

### B) Landing stranice (marketing: bilko.cloud, bilko.io, bilko.company)

```

to su STATIČNE stranice na Cloudflare Pages (ne Cloud Run)
   bilko.cloud     = apps/landing-hr
   bilko.io        = apps/landing-io
   bilko.company   = apps/landing-ba
deploy: GitHub workflow (sad preko FORGE self-hosted runner-a, vidi Korak 3)
```

### C) Baza (migracije)

Promjene strukture baze idu kroz Flyway migracije (V1, V2, ... fajlovi). Pokreću se automatski pri deploy-u API-ja. Nikad se stara migracija ne mijenja — uvijek nova.

---

## KORAK 3 — Šta je POLOMLJENO i kako zaobilazimo (stanje 2026-06-09)

<table id="bkmrk-problem%C5%A0ta-zna%C4%8Dizaob"><tr><th>Problem</th><th>Šta znači</th><th>Zaobilaznica</th><th>Pravi fix (treba CEO)</th></tr><tr><td>**GitHub→CloudBuild konekcija mrtva** (#103276)</td><td>Kad mergeš u main, Google ne dobije signal -&gt; deploy se NE pokrene sam</td><td>Deploy ručno: `gcloud builds submit` (upload koda direktno, preskače mrtvu konekciju, ali vrti sve gate-ove)</td><td>Popraviti konekciju treba `cloudbuild.connections.update` IAM dozvolu — tvoj nalog</td></tr><tr><td>**GitHub Actions istrošen** (#103304)</td><td>Privatni repo ima 2000 besplatnih min/mjesec; potrošeno -&gt; CI + landing deploy padaju</td><td>FORGE self-hosted runner (tvoj Mac Studio, 10.0.0.2) = besplatno, neograničeno. Već radi za landinge.</td><td>Ništa nužno — resetuje se sljedeći mjesec; ili ostavi na FORGE-u zauvijek</td></tr><tr><td>**Trivy security gate** (#103315)</td><td>Našao HIGH CVE u Netty biblioteci -&gt; blokirao sve deploye od 02:00</td><td>Bumpали Netty 4.2.13 -&gt; 4.2.15 (riješeno)</td><td>Riješeno ✓</td></tr><tr><td>**Orphan OAuth brand** (#103296)</td><td>Stari Google OAuth brand ruši "tag" operacije na bilko-web-demo prometu</td><td>Ne koristiti tagove na bilko-web-demo prometu; `--clear-tags` kad treba</td><td>Obrisati brand 762788903040 (Google support)</td></tr></table>

**Pouka:** deploy pipeline ima nekoliko slomljenih karika koje su se nagomilale. Glavna (GitHub konekcija) treba tvoju IAM dozvolu. Dok se ne sredi, deploy je ručni preko `gcloud builds submit`.

---

## KORAK 4 — Kako se korisnici LOGUJU (Entra-only)

Bilko više NEMA email+lozinka login. Sve ide preko **Microsoft Entra External ID (CIAM)**:

- Korisnik ode na `app.bilko.cloud/login` -&gt; Microsoft stranica -&gt; upiše email -&gt; dobije **OTP kod na mail** -&gt; uđe
- Prvi put = automatski mu se napravi prazan "tenant" (njegova firma) + 7-dnevni trial
- Stari seed useri (accountant@bilko.ba itd.) su imali lozinku -&gt; **ne mogu se više logovati** (zato smo ih očistili iz baze)

---

## KORAK 5 — Baze i čišćenje (2026-06-09)

Prod baza (`bilko-demo-db`) je očišćena: sa **167 firmi / 173 korisnika -&gt; 2 firme / 3 korisnika**. Obrisano: 161 test-artefakt + 3 mrtva seed orga. Tvoj nalog `alem@alai.no` migriran na čistu firmu "ALAI Holding AS". Backup napravljen prije (`1781031619853`) — rollback uvijek moguć.

---

## KORAK 6 — Kako TI testiraš

- **Čist proizvod:** `app.bilko.cloud` -&gt; login kao `alem@alai.no` (Entra OTP) -&gt; vidiš prazan, čist Bilko
- **Seed demo (sa podacima):** u izradi — fiksni nalog `demo@alai.no` + tenant napunjen demo podacima (fakture, kontakti)

---

## Vezani MC taskovi

\#103300 (prod topologija), #103276 (GitHub konekcija), #103304 (GitHub Actions billing), #103296 (OAuth brand), #103315 (Netty CVE), #103313 (CEO bug-bash), #103308 (landing deploy-dir).