# OmniRoute Fly.io Deployment Guide (Nederlands) 🌐 **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) · 🇳🇴 [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) --- Dit document beschrijft het daadwerkelijke implementatieproces voor OmniRoute op Fly.io en behandelt twee scenario's: - Het huidige project voor het eerst implementeren op Fly.io - Latere code-updates publiceren - Nieuwe projecten die dezelfde implementatieworkflow volgen Deze handleiding is gebaseerd op een geverifieerde, werkende configuratie voor het huidige project. De applicatienaam is `omniroute`. --- ## 1. Implementatiedoelen - Platform: Fly.io - Implementatiemethode: rechtstreeks lokaal publiceren met `flyctl` - Runtime: gebruik van de bestaande `Dockerfile` en `fly.toml` in de repository - Gegevenspersistentie: Fly Volume gekoppeld aan `/data` - Toegangs-URL: `https://omniroute.fly.dev/` --- ## 2. Belangrijkste configuratie van het huidige project Er is bevestigd dat het bestand `fly.toml` in de huidige repository de volgende belangrijke onderdelen bevat: ```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" ``` Opmerkingen: - `app = 'omniroute'` bepaalt op welke Fly-applicatie de implementatie is gericht - `destination = '/data'` bepaalt de map waarin het persistente volume wordt gekoppeld - Voor dit project moet `DATA_DIR=/data` worden ingesteld, anders worden de database en sleutels naar de tijdelijke map van de container geschreven --- ## 3. Vereisten ### 3.1 De Fly CLI installeren Windows PowerShell: ```powershell pwsh -Command "iwr https://fly.io/install.ps1 -useb | iex" ``` Als het installatiescript in uw omgeving mislukt, kunt u het binaire bestand `flyctl` ook handmatig downloaden en aan uw `PATH` toevoegen. ### 3.2 Aanmelden bij uw Fly-account ```powershell flyctl auth login ``` ### 3.3 De aanmeldingsstatus controleren ```powershell flyctl auth whoami flyctl version ``` --- ## 4. Eerste implementatie van het huidige project ### 4.1 De code klonen en de map openen ```powershell git clone https://github.com/diegosouzapw/OmniRoute.git cd OmniRoute ``` ### 4.2 De applicatienaam controleren Open `fly.toml` en controleer de volgende regel: ```toml app = 'omniroute' ``` Als u naar uw eigen nieuwe applicatie implementeert, kunt u deze wijzigen in een wereldwijd unieke naam, bijvoorbeeld: ```toml app = 'omniroute-yourname' ``` Opmerking: - Zorg ervoor dat de applicatie die u in de console ziet, overeenkomt met de `app`-waarde in `fly.toml` - Als u eerder een andere naam hebt gebruikt, zoals `oroute`, verwar deze dan niet met `omniroute` ### 4.3 De applicatie aanmaken Als de applicatie nog niet bestaat: ```powershell flyctl apps create omniroute ``` Als u de applicatienaam hebt gewijzigd, vervangt u `omniroute` door de door u gekozen naam. ### 4.4 Eerste implementatie ```powershell flyctl deploy ``` --- ## 5. Vereiste parameters Voor dit project wordt aanbevolen om ten minste de volgende parameters op Fly.io te configureren. ### 5.1 Geverifieerde parameters Deze parameters zijn gebruikt bij daadwerkelijke implementaties van de huidige applicatie `omniroute`: - `API_KEY_SECRET` - `DATA_DIR` - `JWT_SECRET` - `MACHINE_ID_SALT` - `NEXT_PUBLIC_BASE_URL` - `OMNIROUTE_WS_BRIDGE_SECRET` (vereist in productie — wordt gebruikt voor WebSocket-bridgeverificatie) - `STORAGE_ENCRYPTION_KEY` ### 5.2 Over `INITIAL_PASSWORD` In het huidige project is `INITIAL_PASSWORD` niet ingesteld, omdat dit voor deze implementatie niet vereist is. Als dit niet is ingesteld: - Het opstartlogboek vermeldt dat het standaardwachtwoord `CHANGEME` is - U moet het aanmeldingswachtwoord zo snel mogelijk na de implementatie wijzigen in de systeeminstellingen Als u het backendwachtwoord zonder toezicht wilt initialiseren, kunt u dit later toevoegen: - `INITIAL_PASSWORD` --- ## 6. Aanbevolen parameters ### 6.1 Configuratie van geheimen De volgende variabelen worden aanbevolen voor Fly Secrets: | Variabele | Aanbeveling | Beschrijving | | ---------------------------- | -------------------- | --------------------------------------------------------------------- | | `API_KEY_SECRET` | Vereist | Wordt gebruikt voor het genereren en valideren van API-sleutels | | `JWT_SECRET` | Vereist | Wordt gebruikt voor aanmeldsessies en het ondertekenen van JWT's | | `OMNIROUTE_WS_BRIDGE_SECRET` | Vereist in productie | Authenticatiegeheim voor de WebSocket-bridge | | `STORAGE_ENCRYPTION_KEY` | Sterk aanbevolen | Versleutelt gevoelige verbindingsgegevens wanneer die zijn opgeslagen | | `MACHINE_ID_SALT` | Aanbevolen | Genereert een stabiele machine-id | | `INITIAL_PASSWORD` | Optioneel | Stelt bij de eerste implementatie het initiële backendwachtwoord in | | Privégegevens voor OAuth/API | Naar behoefte | Authenticatieconfiguratie voor externe platforms | ### 6.2 Aanbevolen waarden voor het huidige project | Variabele | Aanbevolen waarde | | ---------------------- | --------------------------- | | `DATA_DIR` | `/data` | | `NEXT_PUBLIC_BASE_URL` | `https://omniroute.fly.dev` | Opmerkingen: - `DATA_DIR=/data` is essentieel en moet overeenkomen met het koppelpunt van het Fly Volume - `NEXT_PUBLIC_BASE_URL` wordt gebruikt door de planner, frontend-callbacks en vergelijkbare scenario's ### 6.3 Configuratie van de OAuth-callback-URL Als u op de Fly.io-implementatie providers op basis van OAuth moet inschakelen (bijvoorbeeld Antigravity, Gemini of Cursor), let dan op de volgende twee punten: 1. **Stel `NEXT_PUBLIC_BASE_URL` in op uw openbare HTTPS-domein** ```powershell flyctl secrets set NEXT_PUBLIC_BASE_URL=https://omniroute.fly.dev -a omniroute ``` Als u een aangepast domein gebruikt, vervangt u dit door het bijbehorende domein (bijvoorbeeld `https://omniroute.yourdomain.com`). 2. **Configureer de callback-URL in de beheerconsole van de provider** Alle OAuth-providers delen hetzelfde callbackpad `/callback` — er is GEEN afzonderlijke callbackroute per provider: ```text /callback ``` Bijvoorbeeld, ongeacht of het om Gemini, Antigravity, Cursor of GitLab Duo gaat: - `https://omniroute.fly.dev/callback` Als `NEXT_PUBLIC_BASE_URL` niet overeenkomt met de callback-URL die bij de provider is geregistreerd, mislukt de OAuth-stroom tijdens de omleiding in de browser. --- ## 7. Geheimen instellen met één opdracht De volgende opdrachten genereren veilige willekeurige waarden en schrijven alle vereiste parameters voor het huidige project in één stap naar Fly Secrets. Opmerkingen: - Bevat geen `INITIAL_PASSWORD` - Bedoeld voor het huidige project `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 ``` Op Linux / macOS kunt u ook `openssl rand -hex 32` gebruiken: ```bash flyctl secrets set OMNIROUTE_WS_BRIDGE_SECRET=$(openssl rand -hex 32) -a omniroute ``` Opmerkingen: - `OMNIROUTE_WS_BRIDGE_SECRET` is vereist in productie; als deze ontbreekt, mislukt de handshake van de WebSocket-bridge Als u ook een initieel wachtwoord wilt instellen: ```powershell flyctl secrets set INITIAL_PASSWORD=your-strong-password -a omniroute ``` --- ## 8. Huidige parameters bekijken ```powershell flyctl secrets list -a omniroute ``` Als de pagina `Secrets` in de console niet de verwachte variabelen toont, controleer dan: - Of je de applicatie `omniroute` bekijkt - Of de waarde `app` in `fly.toml` overeenkomt met de applicatie in de console --- ## 9. Latere updates en releases Na code-updates is het releaseproces eenvoudig: ```powershell git pull flyctl deploy ``` Als je alleen parameters hoeft bij te werken zonder de code te wijzigen: ```powershell flyctl secrets set KEY=value -a omniroute ``` Fly voert automatisch een rolling update van de machines uit. ### 9.1 Updates van de upstream-repository volgen met behoud van `fly.toml` in je fork Als de huidige repository een fork is en je updates vanuit de upstream-repository `https://github.com/diegosouzapw/OmniRoute` wilt synchroniseren, volg je de onderstaande workflow. Controleer eerst je remotes: ```powershell git remote -v ``` Je zou ten minste het volgende moeten zien: - `origin` die naar je eigen fork verwijst - `upstream` die naar de oorspronkelijke repository verwijst Als `upstream` niet is geconfigureerd, voeg je deze toe: ```powershell git remote add upstream https://github.com/diegosouzapw/OmniRoute.git ``` Haal vóór het synchroniseren met upstream de nieuwste commits en tags op: ```powershell git fetch upstream --tags ``` Controleer de huidige versie en de upstream-tags: ```powershell git describe --tags --always git show --no-patch --oneline v3.4.7 ``` > Opmerking: de huidige projectversie is `v3.8.0`. De onderstaande verwijzingen naar `v3.4.7` worden uitsluitend als historische voorbeelden behouden. Gebruik voor daadwerkelijke releases `:latest` of de tag van de huidige versie (bijvoorbeeld `:v3.8.0`). Als je de nieuwste upstream-versie van `main` wilt mergen en daarbij de `fly.toml` van je fork geforceerd wilt behouden, volg je deze workflow: ```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 ``` Opmerkingen: - `git merge upstream/main` synchroniseert de nieuwste code vanuit de oorspronkelijke repository - `git checkout HEAD~1 -- fly.toml` herstelt de eigen `fly.toml` van je fork van vóór de merge - Als upstream `fly.toml` niet heeft gewijzigd, introduceert deze stap geen verschillen - Als upstream `fly.toml` wel heeft gewijzigd, zorgt deze stap ervoor dat de naam van je Fly-applicatie, de volumekoppeling, de regio en andere forkspecifieke implementatieconfiguratie niet worden overschreven Als je wilt afstemmen op een specifieke releasetag (bijvoorbeeld `v3.4.7`), controleer dan eerst of de tag al in `upstream/main` is opgenomen: ```powershell git merge-base --is-ancestor v3.4.7 upstream/main ``` Een geslaagde uitvoering betekent dat `upstream/main` die versie al bevat; je kunt dan eenvoudig `upstream/main` mergen. ### 9.2 Standaard releasevolgorde na synchronisatie met upstream Volg na het synchroniseren met de oorspronkelijke repository deze aanbevolen releasevolgorde: 1. `git fetch upstream --tags` 2. `git merge upstream/main` 3. Herstel de `fly.toml` van de fork 4. `git push origin main` 5. `flyctl deploy` 6. `flyctl status -a omniroute` 7. `flyctl logs --no-tail -a omniroute` Dit is de daadwerkelijk gebruikte workflow bij het upgraden van het huidige project naar `v3.4.7` (het voorbeeld verwijst naar een historische versie; de huidige daadwerkelijke versie is `v3.8.0`). --- ## 10. Controles na implementatie ### 10.1 Applicatiestatus controleren ```powershell flyctl status -a omniroute ``` ### 10.2 Opstartlogboeken bekijken ```powershell flyctl logs --no-tail -a omniroute ``` ### 10.3 Toegankelijkheid van de site controleren ```powershell try { (Invoke-WebRequest -Uri "https://omniroute.fly.dev" -MaximumRedirection 5 -UseBasicParsing).StatusCode } catch { if ($_.Exception.Response) { $_.Exception.Response.StatusCode.value__ } else { throw } } ``` Een retourwaarde van `200` geeft aan dat de site normaal reageert. --- ## 11. Indicatoren voor een geslaagde implementatie Na een geslaagde implementatie zouden de logboeken inhoud moeten tonen die lijkt op: ```text [bootstrap] Secrets persisted to: /data/server.env [DB] SQLite database ready: /data/storage.sqlite ``` Deze twee punten zijn essentieel: - `/data/server.env` bevestigt dat de runtimegeheimen naar het persistente volume zijn geschreven - `/data/storage.sqlite` bevestigt dat de database naar het persistente volume is geschreven Als u in plaats daarvan `/app/data/...` ziet, is `DATA_DIR` onjuist geconfigureerd en moet dit onmiddellijk worden gecorrigeerd. --- ## 12. Veelvoorkomende problemen ### 12.1 De pagina `Secrets` is leeg Hiervoor zijn doorgaans twee redenen: - U hebt `flyctl secrets set` nog niet uitgevoerd - U bekijkt een andere applicatie (bijvoorbeeld `oroute` in plaats van `omniroute`) ### 12.2 `flyctl deploy` meldt `app not found` Maak eerst de applicatie aan: ```powershell flyctl apps create omniroute ``` ### 12.3 Parseren van `fly.toml` mislukt Controleer het volgende: - Of opmerkingen onleesbare tekens bevatten - Of de aanhalingstekens en inspringing in TOML correct zijn ### 12.4 Gegevens blijven niet behouden Controleer beide volgende punten: - `fly.toml` bevat `destination = '/data'` - `DATA_DIR` is ingesteld op `/data` ### 12.5 Kan de applicatie zonder `INITIAL_PASSWORD` worden uitgevoerd? Ja, dat kan. Er wordt dan teruggevallen op het standaardwachtwoord `CHANGEME`. Het wordt aanbevolen om het backendwachtwoord in productie zo snel mogelijk te wijzigen. --- ## 13. Hergebruik voor nieuwe projecten Als u aan de hand van dit document een nieuw project implementeert, hoeft u alleen deze items te wijzigen: 1. Wijzig de waarde van `app` in `fly.toml` 2. Wijzig `NEXT_PUBLIC_BASE_URL` 3. Behoud `DATA_DIR=/data` 4. Genereer `API_KEY_SECRET`, `JWT_SECRET`, `MACHINE_ID_SALT` en `STORAGE_ENCRYPTION_KEY` opnieuw 5. Controleer na de eerste implementatie of logboeken naar `/data` worden geschreven Hergebruik geen sleutels van een eerder project. --- ## 14. Minimale releasechecklist voor het huidige project De meestgebruikte opdrachten voor volgende releases zijn: ```powershell flyctl auth whoami flyctl status -a omniroute flyctl secrets list -a omniroute flyctl deploy flyctl logs --no-tail -a omniroute ``` Voor een normale release is de kernopdracht simpelweg: ```powershell flyctl deploy ``` Voor een eerste implementatie in een nieuwe omgeving zijn dit de belangrijkste stappen: 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`