# OmniRoute Fly.io Deployment Guide (Bosanski) 🌐 **Languages:** 🇺🇸 [English](../../../../ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇪🇹 [am](../../../am/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇸🇦 [ar](../../../ar/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇦🇿 [az](../../../az/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇧🇬 [bg](../../../bg/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇧🇩 [bn](../../../bn/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇨🇿 [cs](../../../cs/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇩🇰 [da](../../../da/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇩🇪 [de](../../../de/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇬🇷 [el](../../../el/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇪🇸 [es](../../../es/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇪🇪 [et](../../../et/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇮🇷 [fa](../../../fa/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇫🇮 [fi](../../../fi/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇫🇷 [fr](../../../fr/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇮🇪 [ga](../../../ga/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇮🇳 [gu](../../../gu/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇳🇬 [ha](../../../ha/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇮🇱 [he](../../../he/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇮🇳 [hi](../../../hi/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇭🇷 [hr](../../../hr/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇭🇺 [hu](../../../hu/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇦🇲 [hy](../../../hy/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇮🇩 [id](../../../id/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇳🇬 [ig](../../../ig/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇮🇹 [it](../../../it/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇯🇵 [ja](../../../ja/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇬🇪 [ka](../../../ka/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇰🇭 [km](../../../km/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇮🇳 [kn](../../../kn/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇰🇷 [ko](../../../ko/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇱🇹 [lt](../../../lt/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇱🇻 [lv](../../../lv/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇮🇳 [ml](../../../ml/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇮🇳 [mr](../../../mr/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇲🇾 [ms](../../../ms/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇲🇹 [mt](../../../mt/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇲🇲 [my](../../../my/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇳🇵 [ne](../../../ne/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇳🇱 [nl](../../../nl/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇳🇴 [no](../../../no/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇮🇳 [or](../../../or/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇮🇳 [pa](../../../pa/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇵🇭 [phi](../../../phi/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇵🇱 [pl](../../../pl/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇵🇹 [pt](../../../pt/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇧🇷 [pt-BR](../../../pt-BR/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇷🇴 [ro](../../../ro/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇷🇺 [ru](../../../ru/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇱🇰 [si](../../../si/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇸🇰 [sk](../../../sk/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇸🇮 [sl](../../../sl/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇷🇸 [sr](../../../sr/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇸🇪 [sv](../../../sv/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇰🇪 [sw](../../../sw/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇮🇳 [ta](../../../ta/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇮🇳 [te](../../../te/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇹🇭 [th](../../../th/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇹🇷 [tr](../../../tr/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇺🇦 [uk-UA](../../../uk-UA/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇵🇰 [ur](../../../ur/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇺🇿 [uz](../../../uz/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇻🇳 [vi](../../../vi/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇳🇬 [yo](../../../yo/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇨🇳 [zh-CN](../../../zh-CN/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) · 🇹🇼 [zh-TW](../../../zh-TW/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) --- # OmniRoute Vodič za Deployment na Fly.io Ovaj dokument opisuje stvarni proces deploymenta za OmniRoute na Fly.io, pokrivajući dva scenarija: - Deploy trenutnog projekta na Fly.io po prvi put - Objavljivanje naknadnih ažuriranja koda - Novi projekti koji prate isti workflow deploymenta Ovaj vodič je zasnovan na verifikovanoj radnoj konfiguraciji za trenutni projekat. Naziv aplikacije je `omniroute`. --- ## 1. Ciljevi Deploymenta - Platforma: Fly.io - Metoda deploymenta: Lokalni `flyctl` direktni publish - Runtime: Korištenje postojećeg `Dockerfile` i `fly.toml` u repozitorijumu - Perzistencija podataka: Fly Volume montiran na `/data` - URL za pristup: `https://omniroute.fly.dev/` --- ## 2. Ključna Konfiguracija Trenutnog Projekta Potvrđeno je da `fly.toml` u trenutnom repozitorijumu sadrži sljedeće ključne stavke: ```toml app = 'omniroute' primary_region = 'sin' [[mounts]] source = 'data' destination = '/data' [processes] app = 'node run-standalone.mjs' [http_service] internal_port = 20128 [env] TZ = "Asia/Shanghai" HOST = "0.0.0.0" HOSTNAME = "0.0.0.0" BIND = "0.0.0.0" ``` Napomene: - `app = 'omniroute'` određuje na koju Fly aplikaciju deployment cilja - `destination = '/data'` određuje direktorijum za montiranje perzistentnog volumena - Ovaj projekat mora postaviti `DATA_DIR=/data`, u suprotnom će baza podataka i ključevi biti zapisani u privremeni direktorijum kontejnera --- ## 3. Preduslovi ### 3.1 Instalacija Fly CLI-ja Windows PowerShell: ```powershell pwsh -Command "iwr https://fly.io/install.ps1 -useb | iex" ``` Ako instalacijska skripta ne uspije u vašem okruženju, možete ručno preuzeti `flyctl` binarni fajl i dodati ga u vaš `PATH`. ### 3.2 Prijava na vaš Fly račun ```powershell flyctl auth login ``` ### 3.3 Verifikacija statusa prijave ```powershell flyctl auth whoami flyctl version ``` --- ## 4. Prvi Deployment Trenutnog Projekta ### 4.1 Kloniranje koda i ulazak u direktorijum ```powershell git clone https://github.com/diegosouzapw/OmniRoute.git cd OmniRoute ``` ### 4.2 Potvrda naziva aplikacije Otvorite `fly.toml` i provjerite sljedeću liniju: ```toml app = 'omniroute' ``` Ako deployate na svoju novu aplikaciju, možete je promijeniti u globalno jedinstven naziv, na primjer: ```toml app = 'omniroute-vaseime' ``` Napomena: - Provjerite da li aplikacija koju vidite u konzoli odgovara vrijednosti `app` u `fly.toml` - Ako ste prethodno koristili drugačiji naziv, kao što je `oroute`, nemojte ga miješati sa `omniroute` ### 4.3 Kreiranje aplikacije Ako aplikacija još ne postoji: ```powershell flyctl apps create omniroute ``` Ako ste promijenili naziv aplikacije, zamijenite `omniroute` svojim odabranim nazivom. ### 4.4 Prvi Deploy ```powershell flyctl deploy ``` --- ## 5. Potrebni Parametri Ovaj projekat preporučuje konfigurisanje najmanje sljedećih parametara na Fly.io. ### 5.1 Verifikovani Parametri Ovi parametri su korišteni u stvarnim deploymentima na trenutnoj `omniroute` aplikaciji: - `API_KEY_SECRET` - `DATA_DIR` - `JWT_SECRET` - `MACHINE_ID_SALT` - `NEXT_PUBLIC_BASE_URL` - `OMNIROUTE_WS_BRIDGE_SECRET` (obavezno u produkciji — koristi se za WebSocket bridge autentifikaciju) - `STORAGE_ENCRYPTION_KEY` ### 5.2 O `INITIAL_PASSWORD` Trenutni projekat ne postavlja `INITIAL_PASSWORD` jer ovaj deployment to ne zahtijeva. Ako nije postavljen: - Log pri pokretanju će ukazati da je defaultna lozinka `CHANGEME` - Trebali biste promijeniti lozinku za prijavu u sistemskim postavkama što je prije moguće nakon deploymenta Ako želite inicijalizovati lozinku backenda bez nadzora, možete je dodati kasnije: - `INITIAL_PASSWORD` --- ## 6. Preporučeni parametri ### 6.1 Konfiguracija tajni (Secrets) Sljedeće varijable su preporučene za Fly Secrets: | Varijabla | Preporuka | Opis | | ------------------------------- | --------------------- | ---------------------------------------------------------- | | `API_KEY_SECRET` | Obavezno | Koristi se za generisanje i validaciju API ključeva | | `JWT_SECRET` | Obavezno | Koristi se za sesije prijave i JWT potpisivanje | | `OMNIROUTE_WS_BRIDGE_SECRET` | Obavezno u produkciji | Tajna za autentifikaciju WebSocket bridge-a | | `STORAGE_ENCRYPTION_KEY` | Snažno preporučeno | Šifruje osjetljive informacije o povezivanju pri mirovanju | | `MACHINE_ID_SALT` | Preporučeno | Generiše stabilni identifikator mašine | | `INITIAL_PASSWORD` | Opcionalno | Postavlja početnu lozinku backend-a pri prvom deploymentu | | OAuth/API privatni kredencijali | Po potrebi | Konfiguracija autentifikacije eksternih platformi | ### 6.2 Preporučene vrijednosti za trenutni projekat | Varijabla | Preporučena vrijednost | | ---------------------- | --------------------------- | | `DATA_DIR` | `/data` | | `NEXT_PUBLIC_BASE_URL` | `https://omniroute.fly.dev` | Napomene: - `DATA_DIR=/data` je kritično i mora odgovarati Fly Volume mount tački - `NEXT_PUBLIC_BASE_URL` koristi scheduler, frontend callback-ovi i slični scenariji ### 6.3 Konfiguracija OAuth Callback URL-a Ako trebate omogućiti provajdere zasnovane na OAuth-u (npr. Antigravity, Gemini, Cursor) na Fly.io deploymentu, provjerite sljedeće dvije stavke: 1. **Postavite `NEXT_PUBLIC_BASE_URL` na vaš javni HTTPS domen** ```powershell flyctl secrets set NEXT_PUBLIC_BASE_URL=https://omniroute.fly.dev -a omniroute ``` Ako koristite prilagođeni domen, zamijenite ga odgovarajućim domenom (npr. `https://omniroute.yourdomain.com`). 2. **Konfigurišite callback URL na konzoli provajdera** Svi OAuth provajderi dijele jednu callback putanju `/callback` — NE postoji zasebna callback ruta po provajderu: ```text /callback ``` Na primjer, bez obzira na Gemini, Antigravity, Cursor ili GitLab Duo: - `https://omniroute.fly.dev/callback` Ako `NEXT_PUBLIC_BASE_URL` ne odgovara callback URL-u registrovanom kod provajdera, OAuth proces će zakazati u koraku preusmjeravanja pretraživača. --- ## 7. Postavka tajni jednom komandom Sljedeće komande generišu sigurne nasumične vrijednosti i upisuju sve potrebne parametre za trenutni projekat u Fly Secrets u jednom koraku. Napomene: - Ne uključuje `INITIAL_PASSWORD` - Namijenjeno za trenutni projekat `omniroute` ```powershell $apiKeySecret = [Convert]::ToHexString((1..32 | ForEach-Object { Get-Random -Minimum 0 -Maximum 256 })).ToLower() $jwtSecret = [Convert]::ToHexString((1..64 | ForEach-Object { Get-Random -Minimum 0 -Maximum 256 })).ToLower() $machineIdSalt = [Convert]::ToHexString((1..32 | ForEach-Object { Get-Random -Minimum 0 -Maximum 256 })).ToLower() $storageKey = [Convert]::ToHexString((1..32 | ForEach-Object { Get-Random -Minimum 0 -Maximum 256 })).ToLower() $wsBridgeSecret = [Convert]::ToHexString((1..32 | ForEach-Object { Get-Random -Minimum 0 -Maximum 256 })).ToLower() flyctl secrets set ` API_KEY_SECRET=$apiKeySecret ` JWT_SECRET=$jwtSecret ` MACHINE_ID_SALT=$machineIdSalt ` STORAGE_ENCRYPTION_KEY=$storageKey ` OMNIROUTE_WS_BRIDGE_SECRET=$wsBridgeSecret ` DATA_DIR=/data ` NEXT_PUBLIC_BASE_URL=https://omniroute.fly.dev ` -a omniroute ``` Na Linux / macOS sistemima, možete koristiti i `openssl rand -hex 32`: ```bash flyctl secrets set OMNIROUTE_WS_BRIDGE_SECRET=$(openssl rand -hex 32) -a omniroute ``` Napomene: - `OMNIROUTE_WS_BRIDGE_SECRET` je obavezan u produkciji; njegovo izostavljanje će prekinuti WebSocket bridge handshake Ako također želite postaviti početnu lozinku: ```powershell flyctl secrets set INITIAL_PASSWORD=your-strong-password -a omniroute ``` --- ## 8. Pregled trenutnih parametara ```powershell flyctl secrets list -a omniroute ``` Ako stranica `Secrets` u konzoli ne prikazuje očekivane varijable, provjerite: - Da pregledate aplikaciju `omniroute` - Da vrijednost `app` u `fly.toml` odgovara aplikaciji u konzoli --- ## 9. Naknadna ažuriranja i izdanja Nakon ažuriranja koda, proces izdavanja je jednostavan: ```powershell git pull flyctl deploy ``` Ako trebate samo ažurirati parametre bez mijenjanja koda: ```powershell flyctl secrets set KEY=value -a omniroute ``` Fly će automatski izvršiti postupno ažuriranje (rolling update) mašina. ### 9.1 Praćenje ažuriranja upstream repozitorija uz očuvanje `fly.toml` datoteke vašeg forka Ako je trenutni repozitorij fork i želite sinhronizirati ažuriranja iz upstream-a `https://github.com/diegosouzapw/OmniRoute`, slijedite donji radni proces. Prvo, provjerite svoje remote-ove: ```powershell git remote -v ``` Trebali biste vidjeti najmanje: - `origin` koji pokazuje na vaš vlastiti fork - `upstream` koji pokazuje na originalni repozitorij Ako `upstream` nije konfigurisan, dodajte ga: ```powershell git remote add upstream https://github.com/diegosouzapw/OmniRoute.git ``` Prije sinhronizacije sa upstream-om, preuzmite najnovije commit-ove i tagove: ```powershell git fetch upstream --tags ``` Provjerite trenutnu verziju i upstream tagove: ```powershell git describe --tags --always git show --no-patch --oneline v3.4.7 ``` > Napomena: Trenutna verzija projekta je `v3.8.0`. Reference na `v3.4.7` u nastavku zadržane su samo kao historijski primjeri. Za stvarne izdanja, koristite `:latest` ili tag trenutne verzije (npr. `:v3.8.0`). Ako želite spojiti najnoviji upstream `main` dok prisilno zadržavate `fly.toml` svog forka, slijedite ovaj radni proces: ```powershell git merge upstream/main git checkout HEAD~1 -- fly.toml git add -- fly.toml git commit -m "chore(deploy): keep fork fly.toml" git push origin main ``` Napomene: - `git merge upstream/main` sinhronizira najnoviji kod iz originalnog repozitorija - `git checkout HEAD~1 -- fly.toml` vraća vlastiti `fly.toml` vašeg forka iz stanja prije spajanja (merge) - Ako upstream nije izmijenio `fly.toml`, ovaj korak neće uvesti nikakve razlike - Ako je upstream izmijenio `fly.toml`, ovaj korak osigurava da naziv vaše Fly aplikacije, mount volumena, regija i ostale konfiguracije deploymenta specifične za fork ne budu prepisani Ako želite uskladiti s određenim tagom izdanja (npr. `v3.4.7`), prvo provjerite da li je tag već uključen u `upstream/main`: ```powershell git merge-base --is-ancestor v3.4.7 upstream/main ``` Uspješan povrat znači da `upstream/main` već sadrži tu verziju; možete spojiti `upstream/main`. ### 9.2 Standardni redoslijed izdanja nakon sinhronizacije upstream-a Nakon sinhronizacije s originalnim repozitorijem, slijedite ovaj preporučeni redoslijed izdanja: 1. `git fetch upstream --tags` 2. `git merge upstream/main` 3. Vratite `fly.toml` forka 4. `git push origin main` 5. `flyctl deploy` 6. `flyctl status -a omniroute` 7. `flyctl logs --no-tail -a omniroute` Ovo je stvarni radni proces koji se koristio prilikom nadogradnje trenutnog projekta na `v3.4.7` (primjer se odnosi na historijsku verziju; trenutna stvarna verzija je `v3.8.0`). --- ## 10. Provjere nakon implementacije ### 10.1 Provjera statusa aplikacije ```powershell flyctl status -a omniroute ``` ### 10.2 Pregled logova pri pokretanju ```powershell flyctl logs --no-tail -a omniroute ``` ### 10.3 Verifikacija dostupnosti stranice ```powershell try { (Invoke-WebRequest -Uri "https://omniroute.fly.dev" -MaximumRedirection 5 -UseBasicParsing).StatusCode } catch { if ($_.Exception.Response) { $_.Exception.Response.StatusCode.value__ } else { throw } } ``` Povratna vrijednost `200` ukazuje na to da stranica normalno odgovara. --- ## 11. Indikatori uspjeha Nakon uspješne implementacije, logovi bi trebali prikazati sadržaj sličan ovome: ```text [bootstrap] Secrets persisted to: /data/server.env [DB] SQLite database ready: /data/storage.sqlite ``` Ove dvije stavke su kritične: - `/data/server.env` potvrđuje da su runtime tajne zapisane u persistentni volumen - `/data/storage.sqlite` potvrđuje da je baza podataka zapisana u persistentni volumen Ako umjesto toga vidite `/app/data/...`, `DATA_DIR` je pogrešno konfigurisan i mora se odmah ispraviti. --- ## 12. Uobičajeni problemi ### 12.1 Stranica `Secrets` je prazna Obično postoje dva razloga: - Još uvijek niste pokrenuli `flyctl secrets set` - Pregledate drugu aplikaciju (npr. `oroute` umjesto `omniroute`) ### 12.2 `flyctl deploy` prijavljuje `app not found` Prvo kreirajte aplikaciju: ```powershell flyctl apps create omniroute ``` ### 12.3 Greška pri parsiranju `fly.toml` Provjerite sljedeće: - Postoje li nečitljivi znakovi u komentarima - Jesu li TOML navodnici i uvlačenje (indentacija) ispravni ### 12.4 Podaci se ne čuvaju (persistence) Provjerite obje sljedeće stavke: - `fly.toml` sadrži `destination = '/data'` - `DATA_DIR` je postavljen na `/data` ### 12.5 Može li raditi bez `INITIAL_PASSWORD`? Da, može raditi. Koristit će podrazumijevanu lozinku `CHANGEME`. Preporučuje se da lozinka backend-a u produkciji bude promijenjena što je prije moguće. --- ## 13. Ponovna upotreba za nove projekte Ako implementirate novi projekat prateći ovaj dokument, potrebno je promijeniti samo sljedeće stavke: 1. Promijenite vrijednost `app` u `fly.toml` 2. Promijenite `NEXT_PUBLIC_BASE_URL` 3. Zadržite `DATA_DIR=/data` 4. Ponovo generišite `API_KEY_SECRET`, `JWT_SECRET`, `MACHINE_ID_SALT` i `STORAGE_ENCRYPTION_KEY` 5. Nakon prve implementacije, provjerite da li se logovi zapisuju u `/data` Ne koristite ponovo ključeve iz prethodnog projekta. --- ## 14. Minimalna kontrolna lista za izdanja trenutnog projekta Najčešće korištene komande za naredna izdanja su: ```powershell flyctl auth whoami flyctl status -a omniroute flyctl secrets list -a omniroute flyctl deploy flyctl logs --no-tail -a omniroute ``` Za normalno izdanje, osnovna komanda je jednostavno: ```powershell flyctl deploy ``` Za prvu implementaciju u novom okruženju, osnovni koraci su: 1. `flyctl auth login` 2. `flyctl apps create omniroute` 3. `flyctl secrets set ... -a omniroute` 4. `flyctl deploy` 5. `flyctl logs --no-tail -a omniroute`