# OmniRoute Fly.io Deployment Guide (Norsk) 🌐 **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) · 🇧🇦 [bs](../../../bs/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) · 🇮🇳 [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) --- Dette dokumentet beskriver den faktiske distribusjonsprosessen for OmniRoute på Fly.io og dekker tre scenarioer: - Førstegangsdistribusjon av det nåværende prosjektet til Fly.io - Publisering av etterfølgende kodeoppdateringer - Nye prosjekter som følger den samme distribusjonsarbeidsflyten Denne veiledningen er basert på en verifisert og fungerende konfigurasjon for det nåværende prosjektet. Applikasjonsnavnet er `omniroute`. --- ## 1. Mål for distribusjonen - Plattform: Fly.io - Distribusjonsmetode: Direkte lokal publisering med `flyctl` - Kjøretidsmiljø: Bruk av eksisterende `Dockerfile` og `fly.toml` i repositoriet - Datalagring: Fly Volume montert på `/data` - Tilgangs-URL: `https://omniroute.fly.dev/` --- ## 2. Nøkkelkonfigurasjon for det nåværende prosjektet Det er bekreftet at `fly.toml` i det nåværende repositoriet inneholder følgende nøkkelelementer: ```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" ``` Merknader: - `app = 'omniroute'` bestemmer hvilken Fly-applikasjon distribusjonen rettes mot - `destination = '/data'` bestemmer monteringskatalogen for det persistente volumet - Dette prosjektet må angi `DATA_DIR=/data`, ellers blir databasen og nøklene skrevet til containerens midlertidige katalog --- ## 3. Forutsetninger ### 3.1 Installere Fly CLI Windows PowerShell: ```powershell pwsh -Command "iwr https://fly.io/install.ps1 -useb | iex" ``` Hvis installasjonsskriptet mislykkes i miljøet ditt, kan du også laste ned den binære `flyctl`-filen manuelt og legge den til i `PATH`. ### 3.2 Logge på Fly-kontoen din ```powershell flyctl auth login ``` ### 3.3 Kontrollere påloggingsstatus ```powershell flyctl auth whoami flyctl version ``` --- ## 4. Førstegangsdistribusjon av det nåværende prosjektet ### 4.1 Klon koden og gå til katalogen ```powershell git clone https://github.com/diegosouzapw/OmniRoute.git cd OmniRoute ``` ### 4.2 Bekreft applikasjonsnavnet Åpne `fly.toml` og kontroller følgende linje: ```toml app = 'omniroute' ``` Hvis du distribuerer til din egen nye applikasjon, kan du endre det til et globalt unikt navn, for eksempel: ```toml app = 'omniroute-yourname' ``` Merk: - Kontroller at applikasjonen du ser i konsollen, samsvarer med `app`-verdien i `fly.toml` - Hvis du tidligere brukte et annet navn, for eksempel `oroute`, må du ikke forveksle det med `omniroute` ### 4.3 Opprett applikasjonen Hvis applikasjonen ikke finnes ennå: ```powershell flyctl apps create omniroute ``` Hvis du endret applikasjonsnavnet, erstatter du `omniroute` med navnet du valgte. ### 4.4 Første distribusjon ```powershell flyctl deploy ``` --- ## 5. Obligatoriske parametere For dette prosjektet anbefales det å konfigurere minst følgende parametere på Fly.io. ### 5.1 Verifiserte parametere Disse parameterne har blitt brukt i faktiske distribusjoner av den nåværende `omniroute`-applikasjonen: - `API_KEY_SECRET` - `DATA_DIR` - `JWT_SECRET` - `MACHINE_ID_SALT` - `NEXT_PUBLIC_BASE_URL` - `OMNIROUTE_WS_BRIDGE_SECRET` (obligatorisk i produksjon — brukes til autentisering av WebSocket-broen) - `STORAGE_ENCRYPTION_KEY` ### 5.2 Om `INITIAL_PASSWORD` Det nåværende prosjektet angir ikke `INITIAL_PASSWORD`, fordi denne distribusjonen ikke krever det. Hvis den ikke er angitt: - Oppstartsloggen vil indikere at standardpassordet er `CHANGEME` - Du bør endre innloggingspassordet i systeminnstillingene så snart som mulig etter distribusjonen Hvis du vil initialisere backend-passordet uten manuell inngripen, kan du legge det til senere: - `INITIAL_PASSWORD` --- ## 6. Anbefalte parametere ### 6.1 Konfigurasjon av hemmeligheter Følgende variabler anbefales for Fly Secrets: | Variabel | Anbefaling | Beskrivelse | | ------------------------------ | -------------------------- | ------------------------------------------------------------- | | `API_KEY_SECRET` | Påkrevd | Brukes til generering og validering av API-nøkler | | `JWT_SECRET` | Påkrevd | Brukes til påloggingsøkter og JWT-signering | | `OMNIROUTE_WS_BRIDGE_SECRET` | Påkrevd i produksjon | Hemmelighet for autentisering av WebSocket-broen | | `STORAGE_ENCRYPTION_KEY` | Anbefales på det sterkeste | Krypterer sensitiv tilkoblingsinformasjon ved lagring | | `MACHINE_ID_SALT` | Anbefalt | Genererer en stabil maskinidentifikator | | `INITIAL_PASSWORD` | Valgfritt | Angir det opprinnelige backend-passordet ved første utrulling | | Private OAuth/API-opplysninger | Etter behov | Autentiseringskonfigurasjon for eksterne plattformer | ### 6.2 Anbefalte verdier for det gjeldende prosjektet | Variabel | Anbefalt verdi | | ---------------------- | --------------------------- | | `DATA_DIR` | `/data` | | `NEXT_PUBLIC_BASE_URL` | `https://omniroute.fly.dev` | Merknader: - `DATA_DIR=/data` er avgjørende og må samsvare med monteringspunktet for Fly Volume - `NEXT_PUBLIC_BASE_URL` brukes av planleggeren, frontend-tilbakekall og lignende scenarioer ### 6.3 Konfigurasjon av OAuth-tilbakekalls-URL Hvis du må aktivere OAuth-baserte leverandører (f.eks. Antigravity, Gemini, Cursor) i Fly.io-utrullingen, må du sørge for følgende to punkter: 1. **Angi `NEXT_PUBLIC_BASE_URL` som det offentlige HTTPS-domenet ditt** ```powershell flyctl secrets set NEXT_PUBLIC_BASE_URL=https://omniroute.fly.dev -a omniroute ``` Hvis du bruker et egendefinert domene, erstatter du det med det aktuelle domenet (f.eks. `https://omniroute.yourdomain.com`). 2. **Konfigurer tilbakekalls-URL-en i leverandørkonsollen** Alle OAuth-leverandører deler den samme tilbakekallsbanen `/callback` — det finnes INGEN separat tilbakekallsrute per leverandør: ```text /callback ``` For eksempel, uansett om det gjelder Gemini, Antigravity, Cursor eller GitLab Duo: - `https://omniroute.fly.dev/callback` Hvis `NEXT_PUBLIC_BASE_URL` ikke samsvarer med tilbakekalls-URL-en som er registrert hos leverandøren, vil OAuth-flyten mislykkes under omdirigeringen i nettleseren. --- ## 7. Oppsett av hemmeligheter med én kommando Følgende kommandoer genererer sikre, tilfeldige verdier og skriver alle nødvendige parametere for det gjeldende prosjektet til Fly Secrets i ett trinn. Merknader: - Inkluderer ikke `INITIAL_PASSWORD` - Beregnet for det gjeldende prosjektet `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 ``` På Linux / macOS kan du også bruke `openssl rand -hex 32`: ```bash flyctl secrets set OMNIROUTE_WS_BRIDGE_SECRET=$(openssl rand -hex 32) -a omniroute ``` Merknader: - `OMNIROUTE_WS_BRIDGE_SECRET` er påkrevd i produksjon. Hvis den mangler, vil håndtrykket for WebSocket-broen mislykkes Hvis du også vil angi et opprinnelig passord: ```powershell flyctl secrets set INITIAL_PASSWORD=your-strong-password -a omniroute ``` --- ## 8. Vise gjeldende parametere ```powershell flyctl secrets list -a omniroute ``` Hvis siden `Secrets` i konsollen ikke viser de forventede variablene, må du kontrollere: - At du viser applikasjonen `omniroute` - At `app`-verdien i `fly.toml` samsvarer med applikasjonen i konsollen --- ## 9. Senere oppdateringer og utrullinger Etter kodeoppdateringer er utrullingsprosessen enkel: ```powershell git pull flyctl deploy ``` Hvis du bare trenger å oppdatere parametere uten å endre koden: ```powershell flyctl secrets set KEY=value -a omniroute ``` Fly utfører automatisk en rullerende oppdatering av maskinene. ### 9.1 Spore oppdateringer fra oppstrømsrepositoriet og samtidig bevare forkens `fly.toml` Hvis det gjeldende repositoriet er en fork og du vil synkronisere oppdateringer fra det oppstrøms repositoriet `https://github.com/diegosouzapw/OmniRoute`, følger du arbeidsflyten nedenfor. Kontroller først fjernrepositoriene dine: ```powershell git remote -v ``` Du bør minst se: - `origin` som peker til din egen fork - `upstream` som peker til det opprinnelige repositoriet Hvis `upstream` ikke er konfigurert, legger du det til: ```powershell git remote add upstream https://github.com/diegosouzapw/OmniRoute.git ``` Før du synkroniserer med oppstrømsrepositoriet, henter du de nyeste commitene og taggene: ```powershell git fetch upstream --tags ``` Kontroller gjeldende versjon og oppstrømstaggene: ```powershell git describe --tags --always git show --no-patch --oneline v3.4.7 ``` > Merk: Gjeldende prosjektversjon er `v3.8.0`. Referansene til `v3.4.7` nedenfor er bare beholdt som historiske eksempler. For faktiske utrullinger bruker du `:latest` eller den gjeldende versjonstaggen (f.eks. `:v3.8.0`). Hvis du vil flette inn den nyeste oppstrømsversjonen av `main` og samtidig tvinge gjennom bevaring av forkens `fly.toml`, følger du denne arbeidsflyten: ```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 ``` Merknader: - `git merge upstream/main` synkroniserer den nyeste koden fra det opprinnelige repositoriet - `git checkout HEAD~1 -- fly.toml` gjenoppretter forkens egen `fly.toml` fra før flettingen - Hvis oppstrømsrepositoriet ikke endret `fly.toml`, vil dette trinnet ikke introdusere noen forskjeller - Hvis oppstrømsrepositoriet endret `fly.toml`, sikrer dette trinnet at navnet på Fly-applikasjonen, volummonteringen, regionen og annen forkspesifikk utrullingskonfigurasjon ikke blir overskrevet Hvis du vil samsvare med en bestemt utgivelsestagg (f.eks. `v3.4.7`), må du først kontrollere at taggen allerede er inkludert i `upstream/main`: ```powershell git merge-base --is-ancestor v3.4.7 upstream/main ``` En vellykket retur betyr at `upstream/main` allerede inneholder denne versjonen. Da kan du ganske enkelt flette inn `upstream/main`. ### 9.2 Standard utgivelsessekvens etter synkronisering med oppstrømsrepositoriet Etter synkronisering med det opprinnelige repositoriet følger du denne anbefalte utgivelsesrekkefølgen: 1. `git fetch upstream --tags` 2. `git merge upstream/main` 3. Gjenopprett forkens `fly.toml` 4. `git push origin main` 5. `flyctl deploy` 6. `flyctl status -a omniroute` 7. `flyctl logs --no-tail -a omniroute` Dette er den faktiske arbeidsflyten som ble brukt da det gjeldende prosjektet ble oppgradert til `v3.4.7` (eksemplet viser til en historisk versjon; den faktiske gjeldende versjonen er `v3.8.0`). --- ## 10. Kontroller etter distribusjon ### 10.1 Kontroller applikasjonsstatus ```powershell flyctl status -a omniroute ``` ### 10.2 Vis oppstartslogger ```powershell flyctl logs --no-tail -a omniroute ``` ### 10.3 Kontroller at nettstedet er tilgjengelig ```powershell try { (Invoke-WebRequest -Uri "https://omniroute.fly.dev" -MaximumRedirection 5 -UseBasicParsing).StatusCode } catch { if ($_.Exception.Response) { $_.Exception.Response.StatusCode.value__ } else { throw } } ``` En returverdi på `200` indikerer at nettstedet svarer som normalt. --- ## 11. Tegn på vellykket distribusjon Etter en vellykket distribusjon skal loggene vise innhold som ligner på dette: ```text [bootstrap] Secrets persisted to: /data/server.env [DB] SQLite database ready: /data/storage.sqlite ``` Disse to punktene er avgjørende: - `/data/server.env` bekrefter at de hemmelige runtime-verdiene er skrevet til det vedvarende volumet - `/data/storage.sqlite` bekrefter at databasen er skrevet til det vedvarende volumet Hvis du ser `/app/data/...` i stedet, er `DATA_DIR` feilkonfigurert og må korrigeres umiddelbart. --- ## 12. Vanlige problemer ### 12.1 `Secrets`-siden er tom Det er vanligvis to årsaker: - Du har ennå ikke kjørt `flyctl secrets set` - Du viser en annen applikasjon (f.eks. `oroute` i stedet for `omniroute`) ### 12.2 `flyctl deploy` rapporterer `app not found` Opprett applikasjonen først: ```powershell flyctl apps create omniroute ``` ### 12.3 Tolking av `fly.toml` mislykkes Kontroller følgende: - Om det finnes uleselige tegn i kommentarer - Om anførselstegn og innrykk i TOML er riktige ### 12.4 Data blir ikke lagret permanent Kontroller begge de følgende punktene: - `fly.toml` inneholder `destination = '/data'` - `DATA_DIR` er satt til `/data` ### 12.5 Kan den kjøre uten `INITIAL_PASSWORD`? Ja, den kan kjøre. Den vil falle tilbake til standardpassordet `CHANGEME`. Det anbefales å endre passordet for backend så snart som mulig i produksjon. --- ## 13. Gjenbruk for nye prosjekter Hvis du distribuerer et nytt prosjekt ved å følge dette dokumentet, trenger du bare å endre følgende: 1. Endre `app`-verdien i `fly.toml` 2. Endre `NEXT_PUBLIC_BASE_URL` 3. Behold `DATA_DIR=/data` 4. Generer `API_KEY_SECRET`, `JWT_SECRET`, `MACHINE_ID_SALT` og `STORAGE_ENCRYPTION_KEY` på nytt 5. Etter den første distribusjonen må du kontrollere at loggene skrives til `/data` Ikke gjenbruk nøkler fra et tidligere prosjekt. --- ## 14. Minimal sjekkliste for utrulling av det nåværende prosjektet De mest brukte kommandoene for etterfølgende utrullinger er: ```powershell flyctl auth whoami flyctl status -a omniroute flyctl secrets list -a omniroute flyctl deploy flyctl logs --no-tail -a omniroute ``` For en normal utrulling er hovedkommandoen ganske enkelt: ```powershell flyctl deploy ``` Ved førstegangsdistribusjon i et nytt miljø er hovedtrinnene: 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`