đł Docker Guide â OmniRoute (Français)
Démarrage rapide
Section intitulĂ©e « DĂ©marrage rapide »Auto-hĂ©berger en une seule commande ? Consultez le guide dâauto-hĂ©bergement â
docker compose -f docker-compose.selfhost.yml up -d(image publiĂ©e + Redis, accessible uniquement via lâinterface de bouclage, sans choix de profil). Le dĂ©marrage rapide ci-dessous correspond Ă lâutilisation dâun conteneur unique pour les utilisateurs qui exĂ©cutent dĂ©jĂ Redis ailleurs.
docker run -d \ --name omniroute \ --restart unless-stopped \ --stop-timeout 40 \ -p 20128:20128 \ -v omniroute-data:/app/data \ diegosouzapw/omniroute:latestAvec un fichier dâenvironnement
Section intitulĂ©e « Avec un fichier dâenvironnement »# Copiez et modifiez dâabord .envcp .env.example .env
docker run -d \ --name omniroute \ --restart unless-stopped \ --stop-timeout 40 \ --env-file .env \ -p 20128:20128 \ -v omniroute-data:/app/data \ diegosouzapw/omniroute:latestDocker Compose
Section intitulée « Docker Compose »# Profil de base (sans outils CLI)docker compose --profile base up -d
# Profil CLI (Claude Code, Codex et OpenClaw intégrés)docker compose --profile cli up -d
# Profil hĂŽte (prioritĂ© Ă Linux ; monte les binaires CLI de lâhĂŽte en lecture seule)docker compose --profile host up -d
# Profil Web (Chromium/Playwright pour les fournisseurs de sessions Web)docker compose --profile web up -d
# Combiner la CLI et le service auxiliaire CLIProxyAPIdocker compose --profile cli --profile cliproxyapi up -dProfils disponibles
Section intitulée « Profils disponibles »OmniRoute fournit des profils Compose pour les principaux types de déploiement. Choisissez celui qui correspond à votre environnement.
| Profil | Service | Quand lâutiliser | Commande |
|---|---|---|---|
base (par défaut) |
omniroute-base |
Serveur sans interface graphique / environnement dâexĂ©cution minimal, sans CLI de fournisseurs intĂ©grĂ©es | docker compose --profile base up -d |
cli |
omniroute-cli |
Workflows agentiques qui appellent omniroute providers/setup/doctor et les CLI intégrées (Codex, Claude Code, Droid, OpenClaw) |
docker compose --profile cli up -d |
host |
omniroute-host |
HĂŽtes Linux nĂ©cessitant un accĂšs de type network_mode aux CLI de lâhĂŽte via le montage en lecture seule de ~/.local/bin, ~/.codex, ~/.claude, etc. |
docker compose --profile host up -d |
cliproxyapi |
cliproxyapi |
Exécuter le side-car CLIProxyAPI sur le port 8317 pour le proxy en amont des CLI |
docker compose --profile cliproxyapi up -d |
web |
omniroute-web |
Fournisseurs basés sur des sessions Web nécessitant un navigateur : gemini-web, claude-web, claude-turnstile (construit runner-web, Chromium inclus) |
docker compose --profile web up -d |
Plusieurs profils peuvent ĂȘtre combinĂ©s :
docker compose --profile cli --profile cliproxyapi up -d.
Configuration des outils CLI de lâhĂŽte lorsquâOmniRoute sâexĂ©cute dans Docker
Section intitulĂ©e « Configuration des outils CLI de lâhĂŽte lorsquâOmniRoute sâexĂ©cute dans Docker »omniroute setup-codex, setup-claude, config set <tool> et le bouton
Enregistrer la configuration du tableau de bord écrivent tous des fichiers tels que ~/.codex/*.config.toml. Ces chemins
nâont de sens que sur la machine oĂč la CLI sâexĂ©cute rĂ©ellement. Si vous les exĂ©cutez dans
le conteneur, lâĂ©criture sâeffectue dans le rĂ©pertoire personnel du conteneur (/home/node â
lâimage sâexĂ©cute avec USER node), quâaucune CLI de lâhĂŽte ne consultera jamais et qui est
supprimé dÚs que le conteneur est recréé.
OmniRoute dĂ©tecte cette situation et refuse lâĂ©criture en fournissant des instructions au lieu de
signaler une rĂ©ussite dont vous ne pourriez pas profiter : la CLI se termine avec le code 2 et lâAPI rĂ©pond 422
avec containerEphemeralTarget: true.
RecommandĂ© : exĂ©cuter la CLI sur lâhĂŽte et OmniRoute dans Docker
Section intitulĂ©e « RecommandĂ© : exĂ©cuter la CLI sur lâhĂŽte et OmniRoute dans Docker »Le conteneur fournit lâAPI ; la CLI configure les outils de votre hĂŽte.
docker compose --profile base up -d
npm install -g omnirouteomniroute connect http://localhost:20128 # fait pointer la CLI vers le conteneuromniroute setup-codex # Ă©crit dans le vĂ©ritable ~/.codex de votre hĂŽteCâest le choix appropriĂ© lorsque Codex, Claude Code, Cursor ou des outils similaires sâexĂ©cutent sur votre ordinateur portable â ce qui correspond Ă la configuration habituelle.
Alternative : monter les rĂ©pertoires de configuration de lâhĂŽte avec un montage liĂ© (profil host)
Section intitulĂ©e « Alternative : monter les rĂ©pertoires de configuration de lâhĂŽte avec un montage liĂ© (profil host) »Si vous souhaitez que le conteneur lui-mĂȘme Ă©crive dans la configuration de votre hĂŽte, montez les
répertoires et faites pointer CLI_CONFIG_HOME vers la racine du montage. Le profil host
le fait déjà :
environment: - CLI_CONFIG_HOME=/host-home - CLI_ALLOW_CONFIG_WRITES=truevolumes: - ~/.codex:/host-home/.codex:rw - ~/.claude:/host-home/.claude:rwCâest le montage liĂ© qui rend le chemin fiable : OmniRoute lit
/proc/self/mountinfo et autorise les écritures dans les chemins montés (ainsi que dans les répertoires
dont les enfants sont des montages, ce qui correspond exactement Ă la structure /host-home ci-dessus), tout en
continuant de refuser les chemins non montés.
Solution de dernier recours : configurer les propres CLI du conteneur (Ă utiliser avec parcimonie)
Section intitulĂ©e « Solution de dernier recours : configurer les propres CLI du conteneur (Ă utiliser avec parcimonie) »Lorsque les CLI se trouvent rĂ©ellement dans le conteneur (profil cli), lâĂ©criture
est intentionnelle. Transmettez --allow-container-write à toute commande setup-*, ou définissez
OMNIROUTE_ALLOW_CONTAINER_CONFIG_WRITE=true pour le serveur. LâĂ©criture est effectuĂ©e
avec un avertissement indiquant quâelle ne survivra pas au conteneur.
Avertissement de sĂ©curitĂ© â profil
cli+ montage dedocker.sock. Le profilclimonte/var/run/docker.sockavec un montage liĂ© afin que le programme de mise Ă jour automatique exĂ©cutĂ© dans le conteneur puisse recrĂ©er la pile Ă partir du dĂ©mon de lâhĂŽte (src/lib/system/autoUpdate.tsvĂ©rifie la prĂ©sence de ce socket et ignore le chemin Docker lorsquâil est absent). Ce socket constitue une frontiĂšre de confiance donnant un accĂšs root Ă lâhĂŽte : tout ce qui peut y accĂ©der contrĂŽle le dĂ©mon Docker de lâhĂŽte en tant que root â et peut crĂ©er, inspecter, arrĂȘter et supprimer nâimporte quel conteneur de lâhĂŽte. ConsĂ©quences :
- Nâexposez jamais le port du profil
clisur le rĂ©seau. Publiez-le sur127.0.0.1(ports: "127.0.0.1:${DASHBOARD_PORT:-20128}:...") â rendre un profilcliaccessible depuis le LAN transforme toute RCE au niveau du tableau de bord en compromission complĂšte de lâhĂŽte.- Ne montez aucun rĂ©pertoire supplĂ©mentaire de lâhĂŽte dans le profil
cli. Le socket Docker combinĂ© Ă tout montage supplĂ©mentaire donne au conteneur un accĂšs complet en lecture/Ă©criture Ă votre systĂšme de fichiers et Ă la configuration de lâhĂŽte. Si un outil doit accĂ©der Ă un projet, exĂ©cutez-le localement avec le binaire CLI â ne le montez pas dans le conteneurcli.Si vous nâavez pas besoin de la mise Ă jour automatique dans le conteneur, laissez le profil
clidésactivé (COMPOSE_PROFILES=core,redisou une valeur plus courte). Les autres profils ne montent pas le socket Docker.Consultez
docs/security/MITM-TPROXY-DECRYPT.md(git ; non compilĂ© dans/docs) pour le modĂšle de menace associĂ© Ă lâinterception MITM, etdocs/security/SUPPLY_CHAIN.mdpour la chaĂźne de provenance des binairescodex/claude-code/droid/openclaw.
Conteneur auxiliaire Redis
Section intitulĂ©e « Conteneur auxiliaire Redis »OmniRoute sâappuie sur Redis pour prendre en charge le limiteur de dĂ©bit distribuĂ© et le cache partagĂ©. Le service redis est toujours dĂ©fini dans docker-compose.yml (il nâest associĂ© Ă aucun profil) et dĂ©marre avec nâimporte quel autre profil.
| Détail | Valeur |
|---|---|
| Image | redis:7-alpine |
| Nom du conteneur | omniroute-redis |
| Port interne | 6379 |
| Port hÎte (remplacement) | REDIS_PORT (6379 par défaut) |
| Adresse hÎte (remplacement) | REDIS_BIND_HOST (127.0.0.1 par défaut) |
| Volume | omniroute-redis-data â /data |
| VĂ©rification de lâĂ©tat | redis-cli ping (intervalle de 10 s) |
Variables dâenvironnement associĂ©es :
REDIS_URLâ chaĂźne de connexion injectĂ©e dans lâapplication (redis://redis:6379par dĂ©faut).REDIS_PORTâ mappage du port cĂŽtĂ© hĂŽte pour le conteneur Redis.REDIS_BIND_HOSTâ interface hĂŽte sur laquelle le port est publiĂ©. Valeur par dĂ©faut :127.0.0.1.
Pourquoi lâinterface de bouclage est utilisĂ©e par dĂ©faut : le conteneur auxiliaire sâexĂ©cute sans
requirepass, et les conteneurs de lâapplication y accĂšdent via le rĂ©seau Compose (redis:6379) â le port publiĂ© sert uniquement aux outils exĂ©cutĂ©s cĂŽtĂ© hĂŽte (redis-cli, une commande localenpm run dev). Une publication sur0.0.0.0exposerait une instance Redis non authentifiĂ©e Ă tous les hĂŽtes de votre rĂ©seau local. Si vous dĂ©finissezREDIS_BIND_HOST=0.0.0.0, ajoutez Ă©galement--requirepassau champcommand:du service.
La dĂ©sactivation de Redis nâest pas recommandĂ©e (le limiteur de dĂ©bit basculera vers une solution de secours en mĂ©moire). Si vous devez le faire, supprimez ou commentez le bloc du service redis: dans docker-compose.yml, ou rĂ©duisez son nombre dâinstances Ă zĂ©ro :
docker compose up -d --scale redis=0Compose de production
Section intitulĂ©e « Compose de production »Pour exĂ©cuter un instantanĂ© de production isolĂ© parallĂšlement Ă lâenvironnement de dĂ©veloppement, utilisez docker-compose.prod.yml.
| Détail | Valeur |
|---|---|
| Fichier | docker-compose.prod.yml |
| Port par défaut du tableau de bord | PROD_DASHBOARD_PORT=20130 (mappé vers le port interne ${DASHBOARD_PORT:-20128}) |
| Port par dĂ©faut de lâAPI | PROD_API_PORT=20131 |
| Image | omniroute:prod (construite Ă partir de la cible runner-cli) |
| Conteneur Redis | omniroute-redis-prod (redis:8.6.2, volume dédié redis-prod-data) |
| Volume de données | omniroute-prod-data (nommé et conservé entre les reconstructions) |
| VĂ©rifications de lâĂ©tat | node healthcheck.mjs + redis-cli ping, avec depends_on conditionnĂ© par lâĂ©tat de santĂ© de Redis |
Utilisation :
# Construire et démarrer la pile de productiondocker compose -f docker-compose.prod.yml up -d --build
# Afficher les journaux en continudocker compose -f docker-compose.prod.yml logs -f
# ArrĂȘter la pile (conserver les volumes)docker compose -f docker-compose.prod.yml downLa pile de production sâexĂ©cute parallĂšlement Ă la configuration Compose de dĂ©veloppement (avec des noms de conteneurs, des ports et des volumes diffĂ©rents). Vous pouvez ainsi poursuivre vos itĂ©rations en local tout en maintenant la production en fonctionnement.
Ătapes du Dockerfile
Section intitulĂ©e « Ătapes du Dockerfile »Le dĂ©pĂŽt fournit un Dockerfile multi-Ă©tapes (Dockerfile). Quatre Ă©tapes sont exposĂ©es ; choisissez la bonne target selon votre cas dâutilisation.
| Ătape | Image de base | Objectif |
|---|---|---|
builder |
node:26-trixie-slim |
Installe les dĂ©pendances (npm ci --legacy-peer-deps) et exĂ©cute npm run build (Turbopack par dĂ©faut â voir Ressources de compilation ci-dessous) |
runner-base |
node:26-trixie-slim |
Environnement dâexĂ©cution de production avec la sortie autonome de Next.js. Aucun CLI de fournisseur inclus. |
runner-cli |
runner-base |
Ajoute git, docker.io, docker-compose et les CLI globaux : @openai/codex, @anthropic-ai/claude-code, droid, openclaw. Choisissez cette option pour les workflows agentiques. |
runner-web |
runner-base |
Ajoute Playwright et un navigateur Chromium (--with-deps) pour les fournisseurs de sessions web : gemini-web, claude-web, claude-turnstile. Choisissez cette option lorsque vous utilisez ces fournisseurs â lâimage standard Ă©choue lors des requĂȘtes sans cela (voir la remarque sur -web dans Canaux de publication). |
Construisez manuellement une cible spécifique :
docker build --target runner-base -t omniroute:base .docker build --target runner-cli -t omniroute:cli .docker build --target runner-web -t omniroute:web .Ressources de compilation
Section intitulĂ©e « Ressources de compilation »Trois arguments de compilation contrĂŽlent les ressources consommĂ©es par lâĂ©tape builder. Ils sâappliquent uniquement Ă la compilation â
OMNIROUTE_MEMORY_MB (ci-dessous) est un paramĂštre dâexĂ©cution distinct.
| Argument de compilation | Valeur par défaut | Effet |
|---|---|---|
OMNIROUTE_USE_TURBOPACK |
1 |
Avec 0, utilise webpack pour la compilation. Pic de mémoire plus faible, mais plus lent. |
OMNIROUTE_BUILD_MEMORY_MB |
6144 |
Plafond du tas V8 (--max-old-space-size) pour le processus next build lancé. |
OMNIROUTE_BUILD_WORKERS |
2 |
Alimente CIRCLE_NODE_TOTAL ; Next en déduit workers = N - 1 pour la collecte des données de page. |
OMNIROUTE_BUILD_WORKERS est le paramĂštre Ă augmenter sur une machine de compilation puissante et celui Ă
suspecter lorsquâune compilation contrainte Ă©choue aprĂšs â Compiled successfully. Chaque
worker de données de page est un processus distinct, tout comme le processus parent next build ;
une reproduction sur un VPS actif (problĂšme #7518) a mesurĂ© le pic de RSS de chaque processus Ă
environ 4,5 Go, indĂ©pendamment de lâoption de tas NODE_OPTIONS (Turbopack compile dans de la
mĂ©moire native/Rust en dehors du tas V8). La valeur par dĂ©faut de 2 (â 1 worker, 2
processus au total) est dimensionnée pour les runners hébergés par GitHub dotés de 16 Go / 4 vCPU
quâutilise le pipeline de publication. Avec 8 (â 7 workers), ce runner a Ă©puisĂ© sa mĂ©moire et
buildkit a fait Ă©chouer lâĂ©tape avec ResourceExhausted: ... cannot allocate memory ;
3 (â 2 workers) ne tenait toujours pas une fois le RSS par processus mesurĂ©
directement plutÎt que déduit. tests/unit/docker-build-memory-budget.test.ts
effectue le calcul Ă partir de la valeur mesurĂ©e et Ă©choue si lâun des deux paramĂštres
dépasse les capacités du runner.
Turbopack compile dans de la mémoire Rust native située en dehors du tas V8, donc
OMNIROUTE_BUILD_MEMORY_MB ne la limite pas. Sur un hĂŽte disposant dâun plafond de mĂ©moire, la
compilation est alors interrompue par SIGKILL par le mĂ©canisme OOM killer, sans aucun message dâerreur â elle
sâarrĂȘte simplement au milieu de Creating an optimized production build, ce qui ressemble davantage Ă un blocage
quâĂ un manque de mĂ©moire. Si les ressources de lâhĂŽte de compilation sont limitĂ©es, changez de bundler :
docker build --target runner-base \ --build-arg OMNIROUTE_USE_TURBOPACK=0 \ -t omniroute:base .webpackBuildWorker est activé, donc next build exécute un processus parent et un processus
worker, chacun respectant séparément OMNIROUTE_BUILD_MEMORY_MB. Dimensionnez le plafond
du conteneur Ă environ deux fois cette valeur, et non une seule fois.
Mesures effectuées sur cette arborescence (--target runner-base, OMNIROUTE_BUILD_MEMORY_MB=6144) :
| Bundler | Plafond du conteneur | Résultat |
|---|---|---|
| Turbopack | 8 Gio / 16 Gio | Interrompu par lâOOM dans les deux cas, silencieusement |
| webpack | 8 Gio | Worker de compilation interrompu par SIGKILL |
| webpack | 12 Gio | Réussi, avec un pic à 11,1 Gio |
Valeurs dâexĂ©cution par dĂ©faut
Section intitulĂ©e « Valeurs dâexĂ©cution par dĂ©faut »Valeurs par dĂ©faut exportĂ©es par runner-base : PORT=20128, HOSTNAME=0.0.0.0, OMNIROUTE_MEMORY_MB=1024, NODE_OPTIONS=--max-old-space-size=1024, DATA_DIR=/app/data, OMNIROUTE_MIGRATIONS_DIR=/app/migrations.
Comportement de la mémoire dans Docker :
- Lâimage dĂ©finit
OMNIROUTE_MEMORY_MB=1024et en dériveNODE_OPTIONS=--max-old-space-size=1024. - Le processus serveur réel est démarré par le lanceur autonome, qui lit
OMNIROUTE_MEMORY_MBet ajoute--max-old-space-size=<OMNIROUTE_MEMORY_MB>. - Node utilise la derniÚre valeur répétée de
--max-old-space-size; dĂ©finirOMNIROUTE_MEMORY_MBpermet donc de contrĂŽler la limite effective du tas dans Docker. - Comme lâimage dĂ©finit toujours cette variable, la valeur de secours du lanceur, calibrĂ©e en fonction de la RAM, ne sâapplique jamais sous Docker. Augmentez-la explicitement en fonction de la charge de travail (tableau ci-dessous).
2048reste insuffisant pour les requĂȘtes/v1/responsesdes agents de programmation.
RAM dâexĂ©cution pour les agents de programmation
Section intitulĂ©e « RAM dâexĂ©cution pour les agents de programmation »La valeur Docker par dĂ©faut de 1âŻGio constitue un minimum pour le tableau de bord et les conversations lĂ©gĂšres, et non une configuration de production. Les corps volumineux de requĂȘtes POST /v1/responses (des centaines de messages, des dizaines dâoutils) conservent plusieurs graphes en mĂ©moire pendant la compression. Deux requĂȘtes simultanĂ©es dâenviron 3âŻMio / 750âŻ000 jetons ont provoquĂ© lâarrĂȘt de V8 avec un espace ancien de 12âŻGio (FATAL ERROR: Reached heap limit) et ont Ă©galement dĂ©clenchĂ© une erreur OOM du cgroup avec 16âŻGio. Voir #7849.
Dimensionnez la valeur cgroup --memory au-dessus de la taille du tas â les tampons natifs, SQLite et les donnĂ©es intermĂ©diaires de compression rĂ©sident en dehors de V8.
| Charge de travail | OMNIROUTE_MEMORY_MB |
Conteneur / cgroup | Remarques |
|---|---|---|---|
| Tableau de bord, une conversation lĂ©gĂšre | 1024 (valeur par dĂ©faut de lâimage) |
â„2âŻGio | |
| Un agent de programmation (Claude/Codex/Grok) | 8192 |
â„10âŻGio | Session /v1/responses unique typique |
Deux longues requĂȘtes /v1/responses simultanĂ©es |
10240â12288 |
â„12â16âŻGio | ArrĂȘt de V8 mesurĂ© avec un tas dâenviron 12âŻGio |
| Trois longs contextes simultanĂ©s ou plus | Ă Ă©viter dans un seul processus | sĂ©rialiser / ajouter de la RAM | Par dĂ©faut, lâadmission des charges lourdes est limitĂ©e Ă 1 requĂȘte en cours ; augmenter cette limite sans ajouter de RAM provoque de nouveau lâarrĂȘt |
Sur une machine physique, omniroute serve calibre la limite Ă environ 35 % de la RAM (bornĂ©e Ă [512, 4096]) lorsque OMNIROUTE_MEMORY_MB nâest pas dĂ©finie. Docker dĂ©finit toujours cette variable sur 1024 ; ce calibrage nâest donc jamais exĂ©cutĂ© dans lâimage officielle.
docker run -d --name omniroute --restart unless-stopped --stop-timeout 40 \ -e OMNIROUTE_MEMORY_MB=8192 --memory=10g \ -p 127.0.0.1:20128:20128 -v omniroute-data:/app/data diegosouzapw/omniroute:latestVariables dâenvironnement critiques
Section intitulĂ©e « Variables dâenvironnement critiques »Au-delĂ des valeurs par dĂ©faut documentĂ©es dans ENVIRONMENT.md, les variables suivantes sont les plus importantes lors de lâexĂ©cution sous Docker :
| Variable | RÎle | Valeur par défaut |
|---|---|---|
OMNIROUTE_WS_BRIDGE_SECRET |
Secret partagĂ© pour le pont WebSocket. Obligatoire en production â dĂ©finissez-le sur une chaĂźne alĂ©atoire robuste. | non dĂ©finie (doit ĂȘtre fournie) |
REDIS_URL |
Chaßne de connexion pour le mécanisme de limitation du débit / le backend de cache | redis://redis:6379 |
REDIS_PORT |
Port cÎté hÎte pour le conteneur Redis inclus | 6379 |
REDIS_BIND_HOST |
Interface de lâhĂŽte sur laquelle le port Redis inclus est publiĂ© (interface de bouclage, sauf si vous ajoutez AUTH) | 127.0.0.1 |
AUTO_UPDATE_HOST_REPO_DIR |
Chemin sur lâhĂŽte montĂ© dans le profil cli Ă lâemplacement /workspace/omniroute pour les workflows de mise Ă jour automatique |
. (répertoire actuel) |
OMNIROUTE_MEMORY_MB |
Plafond du tas Node Ă lâexĂ©cution pour le serveur Docker autonome ; remplace la valeur par dĂ©faut de lâimage indiquĂ©e ci-dessus. Agents de codage : 8192 ou plus (voir la RAM dâexĂ©cution). |
1024 |
DASHBOARD_PORT / API_PORT |
Remplace les ports exposĂ©s du tableau de bord (20128) et de lâAPI (20129) | 20128 / 20129 |
APP_BIND_HOST |
Interface de lâhĂŽte sur laquelle docker-compose publie les ports du tableau de bord, de lâAPI et du WebSocket en direct. Avec REQUIRE_API_KEY=false (valeur par dĂ©faut), 0.0.0.0 expose le proxy /v1 anonyme au rĂ©seau local â nâĂ©largissez lâaccĂšs quâavec REQUIRE_API_KEY=true ou un proxy inverse en amont. |
127.0.0.1 |
CLIPROXY_BIND_HOST |
Interface de lâhĂŽte sur laquelle docker-compose publie le service auxiliaire cliproxyapi â son volume de donnĂ©es contient les identifiants des fournisseurs. |
127.0.0.1 |
OMNIROUTE_PLUGINS_DIR |
RĂ©pertoire lu par lâanalyseur de plugins Ă lâexĂ©cution et dans lequel il les installe. DĂ©finissez-le lorsque les plugins sont montĂ©s avec une liaison : la valeur par dĂ©faut suit HOME, quâune image nâexporte pas nĂ©cessairement. |
~/.omniroute/plugins |
OMNIROUTE_BASE_PATH |
Sous-chemin dâURL lorsque lâapplication est publiĂ©e derriĂšre un proxy inverse (par ex. /omniroute) |
(vide = racine) |
NEXT_PUBLIC_BASE_URL |
Origine publique du navigateur incluant le sous-chemin (par ex. https://host/omniroute) |
non définie |
PROD_DASHBOARD_PORT |
Port du tableau de bord cÎté hÎte pour docker-compose.prod.yml |
20130 |
CLIPROXYAPI_PORT |
Port cÎté hÎte pour le service auxiliaire cliproxyapi |
8317 |
Proxy inverse sur un sous-chemin (Traefik / nginx)
Section intitulée « Proxy inverse sur un sous-chemin (Traefik / nginx) »Le basePath de Next.js est compilé dans le bundle autonome. OmniRoute enregistre la
valeur intĂ©grĂ©e dans un fichier sentinelle Ă la racine de lâapplication (Ă©crit pendant
npm run build ; lu par scripts/docker/ensure-docker-base-path.mjs) et la compare Ă
OMNIROUTE_BASE_PATH au démarrage du conteneur. Lorsque ces valeurs diffÚrent et que
lâimage a Ă©tĂ© construite pour la racine du domaine, le point dâentrĂ©e réécrit les
manifestes autonomes, les littéraux basePath/assetPrefix intégrés (Next 16 génÚre
les URL des ressources SSR uniquement Ă partir de assetPrefix â le correctif y
réplique le sous-chemin), les URL de ressources /_next/static intégrées (manifestes
de rĂ©fĂ©rences client, importations de mĂ©dias, pages dâerreur prĂ©-rendues) ainsi que le
shim client de process.env avant lâexĂ©cution de node dev/run-standalone.mjs.
Construction avec Compose (recommandée)
Section intitulĂ©e « Construction avec Compose (recommandĂ©e) »DĂ©finissez les deux variables dans .env, puis reconstruisez afin que lâimage et
lâenvironnement dâexĂ©cution soient cohĂ©rents :
OMNIROUTE_BASE_PATH=/omnirouteNEXT_PUBLIC_BASE_URL=https://myhostname.example.com/omniroutedocker compose --profile base up -d --builddocker-compose.yml transmet OMNIROUTE_BASE_PATH comme argument de construction
Docker et comme variable dâenvironnement dâexĂ©cution.
Image racine prĂ©construite + sous-chemin Ă lâexĂ©cution
Section intitulĂ©e « Image racine prĂ©construite + sous-chemin Ă lâexĂ©cution »Les images publiĂ©es diegosouzapw/omniroute:* sont construites pour la racine du
domaine. Vous pouvez nĂ©anmoins dĂ©finir OMNIROUTE_BASE_PATH Ă lâexĂ©cution ; le
conteneur corrige le bundle une fois au dĂ©marrage. Associez-le Ă lâorigine publique
correspondante :
services: omniroute: image: diegosouzapw/omniroute:latest environment: OMNIROUTE_BASE_PATH: /omniroute NEXT_PUBLIC_BASE_URL: https://myhostname.example.com/omnirouteConfigurez le proxy inverse pour quâil transmette le chemin externe complet (ne
supprimez pas le préfixe). Traefik doit acheminer PathPrefix(/omniroute) vers le
conteneur sans StripPrefix, afin que Next.js reçoive /omniroute/... et serve les
ressources depuis /omniroute/_next/....
Le contrĂŽle dâintĂ©gritĂ© Docker interroge le point de terminaison lĂ©ger de cycle de vie
/healthz, préfixé par la valeur active de OMNIROUTE_BASE_PATH.
/api/monitoring/health reste disponible pour les diagnostics humains ou de tableaux
de bord ; pour que le HEALTHCHECK du conteneur lâutilise Ă nouveau (par exemple pour
imposer un contrĂŽle dâintĂ©gritĂ© approfondi), dĂ©finissez
OMNIROUTE_HEALTHCHECK_PATH=/api/monitoring/health. Ce chemin effectue un contrĂŽle
approfondi (base de donnĂ©es + rĂ©sumĂ© de la surveillance) â il convient au
HEALTHCHECK peu fréquent de Docker si vous choisissez de le réactiver, mais pas
aux intervalles de livenessProbe de Kubernetes.
Pour les orchestrateurs (Kubernetes, Nomad, etc.) :
| Sonde | à privilégier | à éviter |
|---|---|---|
| Vivacité | HTTP GET /livez, ou TCP sur le port principal (PORT, défaut 20128) |
/api/monitoring/health comme contrÎle de vivacité |
| Disponibilité | HTTP GET /healthz |
Les délais courts qui assimilent une boucle occupée à morte |
| Approfondie / boĂźte noire | /api/monitoring/health |
â |
/healthz indique lâĂ©tat du cycle de vie du processus (ok / starting /
stopping). /livez vérifie uniquement que le processus est actif (200 chaque fois
que le gestionnaire peut sâexĂ©cuter ; il nâattend pas que le service soit prĂȘt). Les
deux sâexĂ©cutent nĂ©anmoins sur la mĂȘme boucle dâĂ©vĂ©nements Node que le traitement des
requĂȘtes ; les opĂ©rations de catalogue ou de compression intensives en CPU peuvent
donc les retarder â occupĂ© â mort. PrivilĂ©giez une sonde de vivacitĂ© TCP si les sondes
HTTP expirent. Guide complet sur les sondes :
Guide de surveillance â recommandations relatives aux sondes Kubernetes.
Docker Compose avec Caddy (TLS automatique HTTPS)
Section intitulĂ©e « Docker Compose avec Caddy (TLS automatique HTTPS) »OmniRoute peut ĂȘtre exposĂ© de maniĂšre sĂ©curisĂ©e grĂące au provisionnement SSL automatique de Caddy. Assurez-vous que lâenregistrement DNS A de votre domaine pointe vers lâadresse IP de votre serveur.
services: omniroute: image: diegosouzapw/omniroute:latest container_name: omniroute restart: unless-stopped volumes: - omniroute-data:/app/data environment: - PORT=20128 # Origine visible par le navigateur pour les rappels OAuth, les liens du tableau de bord et les URL publiques gĂ©nĂ©rĂ©es. - NEXT_PUBLIC_BASE_URL=https://your-domain.com # URL interne de serveur Ă serveur pour les tĂąches planifiĂ©es et les requĂȘtes vers soi-mĂȘme. - BASE_URL=http://omniroute:20128 - AUTH_COOKIE_SECURE=true
caddy: image: caddy:latest container_name: caddy restart: unless-stopped ports: - "80:80" - "443:443" command: caddy reverse-proxy --from https://your-domain.com --to http://omniroute:20128
volumes: omniroute-data:Caddy dĂ©finit les en-tĂȘtes de transfert standard pour le conteneur en amont. OmniRoute utilise
NEXT_PUBLIC_BASE_URL comme origine publique canonique pour les rappels OAuth et les liens publics
gĂ©nĂ©rĂ©s ; les Ă©critures authentifiĂ©es du tableau de bord utilisent des requĂȘtes de mĂȘme origine ainsi quâune protection CSRF
liĂ©e Ă la session. Nâactivez OMNIROUTE_TRUST_PROXY que pour les dĂ©ploiements avancĂ©s dans lesquels vous souhaitez dĂ©libĂ©rĂ©ment
quâOmniRoute dĂ©termine lâorigine publique Ă partir dâen-tĂȘtes de transfert approuvĂ©s plutĂŽt que dâune configuration
explicite.
Tunnel rapide Cloudflare
Section intitulĂ©e « Tunnel rapide Cloudflare »La prise en charge du tableau de bord pour les dĂ©ploiements Docker comprend un tunnel rapide Cloudflare activable en un clic dans Dashboard â Endpoints. Lors de la premiĂšre activation, cloudflared est tĂ©lĂ©chargĂ© uniquement si nĂ©cessaire, un tunnel temporaire vers votre point de terminaison /v1 actuel est dĂ©marrĂ©, et lâURL https://*.trycloudflare.com/v1 gĂ©nĂ©rĂ©e sâaffiche directement sous votre URL publique habituelle.
Les panneaux de tunnel des points de terminaison (Cloudflare, Tailscale, ngrok) peuvent ĂȘtre affichĂ©s ou masquĂ©s depuis Settings â Appearance sans modifier lâĂ©tat actif des tunnels.
Remarques sur les tunnels
Section intitulée « Remarques sur les tunnels »- Les URL des tunnels rapides sont temporaires et changent aprÚs chaque redémarrage.
- Les tunnels rapides ne sont pas restaurĂ©s automatiquement aprĂšs le redĂ©marrage dâOmniRoute ou du conteneur. RĂ©activez-les depuis le tableau de bord lorsque cela est nĂ©cessaire.
- Lâinstallation gĂ©rĂ©e prend actuellement en charge Linux, macOS et Windows sur
x64/arm64. - Les tunnels rapides gĂ©rĂ©s utilisent par dĂ©faut le transport HTTP/2 afin dâĂ©viter les avertissements bruyants liĂ©s aux tampons UDP de QUIC dans les environnements de conteneurs aux ressources limitĂ©es. DĂ©finissez
CLOUDFLARED_PROTOCOL=quicouautosi vous souhaitez utiliser un autre transport. - Les images Docker incluent les autoritĂ©s de certification racines du systĂšme et les transmettent Ă lâinstance gĂ©rĂ©e de
cloudflared, ce qui Ă©vite les Ă©checs de validation TLS lorsque le tunnel sâinitialise Ă lâintĂ©rieur du conteneur. - DĂ©finissez
CLOUDFLARED_BIN=/absolute/path/to/cloudflaredsi vous souhaitez quâOmniRoute utilise un binaire existant au lieu dâen tĂ©lĂ©charger un.
Tags dâimage
Section intitulĂ©e « Tags dâimage »| Image | Tag | Taille | Description |
|---|---|---|---|
diegosouzapw/omniroute |
latest |
~250MB | Version SemVer stable publiée la plus élevée (pas git main) |
diegosouzapw/omniroute |
3.8.0 |
~250MB | Ăpinglez ce type de tag pour GitOps |
Manifeste multiplateforme : linux/amd64 + linux/arm64 natifs (Apple Silicon, AWS Graviton, Raspberry Pi). Docker sĂ©lectionne automatiquement lâarchitecture correspondante ; passez --platform linux/amd64 si vous devez forcer lâĂ©mulation AMD64 sur des hĂŽtes ARM.
Canaux de publication
Section intitulée « Canaux de publication »OmniRoute publie des canaux Docker distincts pour les versions stables, les tests de la branche de publication active et les builds de développement.
| Canal | Source | Mutabilité | Utilisation recommandée |
|---|---|---|---|
:<version> / :<version>-web |
Version signée/versionnée | Immuable | Déploiements en production épinglant une version précise |
:latest / :latest-web |
Version SemVer stable publiĂ©e la plus Ă©levĂ©e | Pointeur stable mutable | Suit les versions stables aprĂšs une tĂąche de publication SemVer â ne suit pas main ni les commits release/v* non publiĂ©s |
:next / :next-web |
Branche release/v* par défaut actuelle |
Pointeur de préversion mutable | Test des correctifs intégrés à la branche de publication active, mais pas encore inclus dans une version stable |
:main / :main-web |
Branche main |
Pointeur de dĂ©veloppement mutable | Uniquement pour les tests de dĂ©veloppement et dâintĂ©gration |
Fournisseurs de sessions web : les images -web
Section intitulĂ©e « Fournisseurs de sessions web : les images -web »Chaque canal ci-dessus est Ă©galement disponible sous forme de tag -web (:latest-web, :<version>-web, :next-web, :main-web), construit Ă partir de lâĂ©tape runner-web â la mĂȘme image, avec Playwright et un navigateur Chromium en plus. Lâimage standard est fournie sans Chromium ; gemini-web, claude-web et claude-turnstile en ont besoin.
LâĂ©chec est diffĂ©rĂ© et ne se produit pas au dĂ©marrage : ces fournisseurs rĂ©pertorient leurs modĂšles et apparaissent comme connectĂ©s dans le tableau de bord, et seule la premiĂšre requĂȘte Ă©choue avec
[500]: Failed to load external module playwright: Error: Cannot find module'/app/node_modules/playwright/node_modules/playwright-core/browsers.json'Si vous utilisez ces fournisseurs, rĂ©cupĂ©rez le tag -web du canal que vous utilisez dĂ©jĂ â rien dâautre ne change. Pour une installation npm/CLI (sans image Docker), lâĂ©lĂ©ment manquant Ă©quivalent est le binaire du navigateur : exĂ©cutez npx playwright install chromium sur lâhĂŽte.
Utilisation du canal de préversion
Section intitulĂ©e « Utilisation du canal de prĂ©version »Le canal next est reconstruit Ă chaque push vers la branche release/v* par dĂ©faut actuelle et est publiĂ© pour AMD64 et ARM64. Les anciennes branches de maintenance ne peuvent pas lâĂ©craser. Ce canal fournit une image rĂ©cupĂ©rable contenant les correctifs fusionnĂ©s dans la branche de publication active avant la crĂ©ation du prochain tag stable.
docker pull diegosouzapw/omniroute:nextdocker pull diegosouzapw/omniroute:next-webPour Docker Compose, remplacez le tag dâimage utilisĂ© par le profil sĂ©lectionnĂ©, puis rĂ©cupĂ©rez lâimage et recrĂ©ez le service :
services: omniroute: image: diegosouzapw/omniroute:nextdocker compose pulldocker compose up -dSécurité et restauration
Section intitulĂ©e « SĂ©curitĂ© et restauration »next est un canal de prĂ©version flottant. Il peut changer Ă chaque push vers la branche de publication active et nâest pas pris en charge pour une utilisation en production. Ăpinglez le digest de lâimage lors de lâĂ©valuation dâun build spĂ©cifique :
docker pull diegosouzapw/omniroute:nextdocker image inspect diegosouzapw/omniroute:next --format '{{index .RepoDigests 0}}'Avant dâeffectuer les tests, sauvegardez le volume de donnĂ©es OmniRoute ou le rĂ©pertoire de donnĂ©es montĂ© par liaison. Pour revenir Ă la version prĂ©cĂ©dente, restaurez la version stable ou le digest prĂ©cĂ©demment utilisĂ©, puis recrĂ©ez le conteneur :
docker pull diegosouzapw/omniroute:<stable-version>docker compose up -dUn build de branche de publication ne peut jamais dĂ©placer latest ; seule une version sĂ©mantique stable admissible peut promouvoir le pointeur stable. Les images next conservent lâinspection des images de publication et le contrĂŽle bloquant des vulnĂ©rabilitĂ©s CRITICAL.
latest ne garantit pas lâactualitĂ© par rapport Ă git. Les correctifs fusionnĂ©s dans main ou dans la branche release/v* active ne sont pas inclus dans :latest tant quâune image SemVer stable nâa pas Ă©tĂ© publiĂ©e et que la tĂąche de publication nâa pas promu :latest (avec le mĂȘme digest que cette version SemVer). Si latest semble figĂ© alors que GitHub affiche dĂ©jĂ le correctif, rĂ©cupĂ©rez :next pour tester la branche de publication ou attendez le tag SemVer.
| Votre objectif | Utilisez |
|---|---|
| GitOps / production ne devant subir aucune dĂ©rive | Ăpinglez :X.Y.Z (ou le digest de lâimage) |
| Suivre les versions stables publiées et accepter une recréation à chaque publication | :latest |
Tester les commits release/v* non publiés |
:next (pas en production) |
Tester main |
:main (pas en production) |
DisponibilitĂ© : SQLite par dĂ©faut ne prend en charge quâun seul rĂ©plica
Section intitulĂ©e « DisponibilitĂ© : SQLite par dĂ©faut ne prend en charge quâun seul rĂ©plica »La configuration Docker / Kubernetes standard dâOmniRoute repose sur un processus Node + un processus dâĂ©criture SQLite. La haute disponibilitĂ© nâest pas prise en charge avec cette topologie.
| Contrainte | Conséquence |
|---|---|
| Processus dâĂ©criture unique | NâexĂ©cutez pas plusieurs rĂ©plicas utilisant le mĂȘme fichier SQLite. Cela corrompt la base de donnĂ©es. |
| RecrĂ©ation / redĂ©marrage / arrĂȘt par HEALTHCHECK | Interruption totale des flux SSE en cours, des sessions du tableau de bord et de lâĂ©tat en mĂ©moire. Chaque client connectĂ© est dĂ©connectĂ©. Les nouvelles requĂȘtes effectuĂ©es pendant la pĂ©riode sans point de terminaison reçoivent du proxy inverse une erreur 502 Bad Gateway: Unknown error, et non du JSON OmniRoute â les clients ne peuvent pas la distinguer dâune dĂ©faillance du fournisseur (#11015). |
MĂȘme boucle dâĂ©vĂ©nements que /healthz |
Une opĂ©ration intensive sur le catalogue ou un cycle de compression peut retarder les sondes ; un dĂ©lai dâexpiration court redĂ©marre alors le seul rĂ©plica. |
Matrice des sondes (voir également les recommandations relatives aux sondes Kubernetes) :
| Sonde | Cible | Ne pas utiliser |
|---|---|---|
| Vivacité | TCP sur PORT (20128 par défaut), ou HTTP souple /healthz |
/api/monitoring/health |
| Disponibilité | HTTP GET /healthz |
Des dĂ©lais dâexpiration courts qui interprĂštent une boucle dâĂ©vĂ©nements occupĂ©e comme un arrĂȘt |
| Approfondie / opérateurs humains | /api/monitoring/health |
La vivacité automatisée du kubelet |
Mises Ă niveau : attendez-vous Ă ce que chaque session soit interrompue. Drainez les clients si possible ; aucune mise Ă jour progressive nâest possible avec la configuration SQLite par dĂ©faut. La combinaison de restart: unless-stopped dans Compose et du HEALTHCHECK Docker remplacera Ă©galement lâunique processus lorsque le conteneur est dans lâĂ©tat Unhealthy â avec le mĂȘme pĂ©rimĂštre dâimpact.
Extrait Kubernetes pour un seul rĂ©plica (Recreate est obligatoire ; nâaugmentez pas replicas pour un mĂȘme fichier SQLite) :
spec: replicas: 1 strategy: type: Recreate template: spec: terminationGracePeriodSeconds: 90 containers: - name: omniroute lifecycle: preStop: exec: command: ["/bin/sleep", "15"] readinessProbe: httpGet: path: /healthz port: 20128 periodSeconds: 5 livenessProbe: tcpSocket: port: 20128 periodSeconds: 20La pause preStop permet Ă kube de retirer les points de terminaison du Service avant SIGTERM, afin que le nouveau trafic cesse dâatteindre le processus en cours dâarrĂȘt. Les flux SSE /v1/responses en cours disposent dâun dĂ©lai de drainage pouvant atteindre SHUTDOWN_TIMEOUT_MS (30 s par dĂ©faut), grĂące Ă des baux dâadmission renforcĂ©s (#11015). Les nouvelles requĂȘtes qui atteignent encore le processus reçoivent 503 + Retry-After: 5. La pĂ©riode sans point de terminaison propre Ă Recreate, jusquâĂ ce que le processus de remplacement soit Ready, reste une interruption totale â elle est inhĂ©rente Ă la topologie SQLite et ne rĂ©sulte pas dâune mauvaise configuration des sondes.
Postgres externe / la haute disponibilitĂ© avec plusieurs processus dâĂ©criture ne constitue pas une configuration standard documentĂ©e. Si vous avez besoin de haute disponibilitĂ©, conservez un seul rĂ©plica ou exĂ©cutez une topologie que le projet a testĂ©e et documentĂ©e sĂ©parĂ©ment. Les travaux relatifs Ă Postgres/MySQL sont suivis dans #8075. En attendant leur livraison, la seule façon prise en charge de multiplier la capacitĂ© pour les requĂȘtes /v1/responses volumineuses consiste Ă utiliser N processus indĂ©pendants (section suivante), et non replicas > 1 sur un mĂȘme volume.
Mise Ă lâĂ©chelle horizontale : N processus indĂ©pendants
Section intitulĂ©e « Mise Ă lâĂ©chelle horizontale : N processus indĂ©pendants »Un processus Node correspond Ă un tas V8. Deux requĂȘtes dâagent de codage POST /v1/responses (RTK + Caveman) simultanĂ©es dâenviron 3âŻMiB / 750 000 tokens font Ă©chouer ce tas aux alentours de 12âŻGio (FATAL ERROR: Reached heap limit) et peuvent provoquer une erreur OOM dans un cgroup de 16âŻGio. Voir #7849. Cette mesure constitue un avertissement relatif au budget mĂ©moire, et non une limite maximale du produit fixĂ©e Ă deux longues requĂȘtes /v1/responses simultanĂ©es. Lâadmission des conversations lourdes est contrĂŽlĂ©e par un budget dâoctets entrants calculĂ© automatiquement (OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES, src/shared/middleware/admissionBudget.ts), dimensionnĂ© Ă partir de cette mĂȘme limite V8/cgroup â le remplacer par une valeur supĂ©rieure (ou dĂ©finir lâancienne limite du nombre de requĂȘtes OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT) sur un processus dĂ©jĂ dimensionnĂ© rĂ©introduit cet Ă©chec. Les petites conversations, /healthz, /v1/models et MCP ne sont pas soumis Ă cette limite.
Un seul processus : plus de deux longues requĂȘtes /v1/responses
Section intitulĂ©e « Un seul processus : plus de deux longues requĂȘtes /v1/responses »Un processus sain (tas infĂ©rieur Ă OMNIROUTE_CHAT_ADMISSION_HEAP_SHED_RATIO, valeur par dĂ©faut 0.75) peut exĂ©cuter plus de deux longues requĂȘtes POST /v1/responses simultanĂ©es lorsque le budget dâoctets en cours Ă lâĂ©chelle du processus (OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES / #10110) dispose encore de capacitĂ©. Les corps dont la taille est supĂ©rieure ou Ă©gale Ă OMNIROUTE_CHAT_LARGE_BODY_BYTES (256âŻKio par dĂ©faut) utilisent le mĂȘme bail pour charge lourde que les requĂȘtes structurellement lourdes et le mĂȘme mĂ©canisme dâĂ©chappement tryAcquireHealthyHeadroom de #10437 (OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM). La prise en charge de dizaines de clients SSE simultanĂ©s et durables (les opĂ©rateurs en ont souvent besoin de 40 Ă 50) relĂšve du budget mĂ©moire â dimensionnez le tas, les emplacements principaux/de rĂ©serve et OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES â et non dâune limite stricte du produit à « 2 maximum ». Un tas sous pression continue de dĂ©lester les requĂȘtes avec une erreur 503 rĂ©essayable afin que le problĂšme #7849 ne rĂ©apparaisse pas.
Pour multiplier les tas (espaces old-space V8 indĂ©pendants) dĂšs aujourdâhui :
| Ă faire | Ă ne pas faire |
|---|---|
Exécuter N conteneurs/pods, chacun avec son propre DATA_DIR / volume |
DĂ©finir replicas > 1 pour un mĂȘme fichier SQLite |
| Dimensionner les requĂȘtes lourdes en cours + la rĂ©serve saine en fonction du tas / budget dâoctets en cours ; 1 Ă 2 est la valeur par dĂ©faut prudente issue de #7849, et non une limite maximale stricte du produit | Attribuer 8Ă plus de RAM Ă un processus et une limite de nombre non bornĂ©e |
Facultatif : QUOTA_STORE_DRIVER=redis + QUOTA_STORE_REDIS_URL pour des compteurs de quotas partagés |
ConsidĂ©rer Redis comme un SQLite partagĂ© â ce nâest pas le cas |
| Dupliquer les secrets des fournisseurs dans chaque instance (ou accepter des tableaux de bord partitionnĂ©s) | Sâattendre Ă disposer dâun seul tableau de bord / journal dâappels pour toutes les instances |
| Placer nâimporte quel Ă©quilibreur de charge en frontal ; une affinitĂ© par clĂ© dâAPI ou par session suffit | Exiger un middleware propre Ă un fournisseur et tenant compte de la taille |
MatĂ©riel : le nombre de longues requĂȘtes /v1/responses simultanĂ©es par instance relĂšve du budget mĂ©moire (tas + octets en cours / #10110). N rĂ©pertoires DATA_DIR indĂ©pendants multiplient toujours les tas : la RAM de lâhĂŽte doit prendre en charge N Ă cgroup, et non « un pod de 16âŻGio avec N=8 ». Nâutilisez jamais replicas > 1 sur un mĂȘme fichier SQLite.
Exemple Compose (deux tas, deux volumes â pas deploy.replicas: 2) :
services: omniroute-a: image: diegosouzapw/omniroute:3.8.49 environment: DATA_DIR: /app/data OMNIROUTE_MEMORY_MB: "12288" QUOTA_STORE_DRIVER: redis QUOTA_STORE_REDIS_URL: redis://redis:6379 volumes: [omniroute-a-data:/app/data] ports: ["20128:20128"] omniroute-b: image: diegosouzapw/omniroute:3.8.49 environment: DATA_DIR: /app/data OMNIROUTE_MEMORY_MB: "12288" QUOTA_STORE_DRIVER: redis QUOTA_STORE_REDIS_URL: redis://redis:6379 volumes: [omniroute-b-data:/app/data] ports: ["20138:20128"]volumes: omniroute-a-data: omniroute-b-data:La densitĂ© au sein dâun mĂȘme processus (compression hors de lâisolate HTTP) est traitĂ©e dans #11023. Un cluster logique unique reposant sur un Ă©tat durable partagĂ© est traitĂ© dans #8075.
Remarques importantes
Section intitulée « Remarques importantes »- Mode WAL de SQLite : Il convient de laisser
docker stopse terminer afin quâOmniRoute puisse rĂ©intĂ©grer les derniĂšres modifications dansstorage.sqlitevia un point de contrĂŽle. Les fichiers Compose fournis dĂ©finissent dĂ©jĂ un dĂ©lai dâarrĂȘt de 40 s. Si vous exĂ©cutez directement lâimage, conservez--stop-timeout 40. DISABLE_SQLITE_AUTO_BACKUP: DĂ©finissez cette variable surtruesi les sauvegardes pĂ©riodiques/avant Ă©criture sont gĂ©rĂ©es en externe. Les migrations de bases de donnĂ©es existantes nĂ©cessitent toujours leur propre instantanĂ© de sĂ©curitĂ© durable ainsi quâune protection contre les migrations massives.- Persistance des donnĂ©es : Montez toujours un volume sur
/app/dataafin de conserver votre base de donnĂ©es, vos clĂ©s et vos configurations lors des redĂ©marrages du conteneur. - Configuration du port : Remplacez la variable dâenvironnement
PORTpour modifier le port par défaut20128.
Voir aussi
Section intitulĂ©e « Voir aussi »- Guide de dĂ©ploiement sur une VM â Configuration dâune VM, de nginx et de Cloudflare
- Guide de dĂ©ploiement sur Fly.io â DĂ©ployer sur Fly.io
- Configuration de lâenvironnement â RĂ©fĂ©rence complĂšte du fichier
.env
HagiCode
HagiCode est un espace de développement agentique qui associe workflows structurés, exécution multi-agent et vues Hero Dungeon.
Transformez vos idées en logiciels utiles grùce à un workflow agentique plus intelligent, rapide et agréable.

- SmartDes workflows structurĂ©s transforment une intention en parcours exĂ©cutable, de lâidĂ©e Ă la livraison.
- EfficientLes workflows multi-agents font avancer recherche, réalisation et revue en parallÚle.
- FunHero Dungeon rend les longues sessions de code plus visuelles et collaboratives.