Variabile de mediu
Această pagină enumeră variabilele de mediu acceptate pentru operatori, citite de backend-ul, frontend-ul și scripturile de întreținere actuale ale Libre WebUI. Valorile canary interne folosite numai în teste sunt omise intenționat.
Server backend
| Variabilă | Implicit | Scop |
|---|---|---|
NODE_ENV | development | Mod runtime |
PORT | 3001 în dezvoltare, 8080 în producție | Port HTTP backend |
TRUST_PROXY | nesetat (0 în Helm) | Număr exact de hopuri reverse proxy de încredere folosit pentru adresa clientului |
CORS_ORIGIN | origini locale de dezvoltare | Origini permise ale browserului, separate prin virgule |
SERVE_FRONTEND | nesetat | Servește frontend-ul compilat din backend când este true |
DOCKER_ENV | nesetat | Activează comportamentul orientat spre Docker când este true |
DATA_DIR | backend/data; ~/.libre-webui în CLI-ul împachetat | Director de date persistent |
PLATFORM_PREFLIGHT_TMP_DIR | backend/temp/preflight; cache utilizator în CLI-ul împachetat | Spațiu temporar pentru copia privată de inspecție DB/WAL la pornire; dimensionați-l pentru baza de date și WAL |
PLUGIN_UPLOAD_TEMP_DIR | libre-webui-plugin-uploads în directorul temporar al OS | Spațiu temporar pentru încărcările de pluginuri în curs |
PLUGINS_DIR | $DATA_DIR/plugins | Director inscriptibil pentru pluginuri instalate/personalizate |
BASE_URL | http://localhost:3001 | URL de bază pentru valorile callback OAuth implicite |
LOG_LEVEL | info (warn în teste) | Nivel de jurnalizare backend |
LOG_FORMAT | text | json activează jurnale structurate pe un rând, cu marcaje temporale, id-uri de corelare și cenzurare |
OTEL_EXPORTER_OTLP_ENDPOINT | nesetat | Export opțional de telemetrie OTLP/HTTP JSON; nesetat înseamnă că telemetria nu părăsește procesul |
OTEL_EXPORTER_OTLP_HEADERS | nesetat | Antete key=value separate prin virgulă trimise colectorului OTLP (de exemplu, autentificare) |
OTEL_SERVICE_NAME | libre-webui | Atributul resursei service.name în telemetria exportată |
WEBUI_HOST | loopback; 0.0.0.0 în Docker | Adresa de ascultare HTTP |
OPEN_BROWSER | true când este servit frontend-ul | Setați false pentru a împiedica deschiderea automată a browserului |
FULL_DOCUMENT_CONTEXT_MAX_TOKENS | 32000 | Limită de tokenuri pentru modul document integral per chat (1000-2000000) |
GALLERY_RETENTION_DAYS | nesetat (păstrează permanent) | Șterge conținutul media din galerie mai vechi de acest număr de zile prin planificator |
RECOVERY_DRILL_INTERVAL_HOURS | nesetat (exerciții oprite) | Rulează automat un exercițiu de recuperare verificat la fiecare N ore (profil solo) |
RECOVERY_DRILL_HISTORY | 60 | Intrări păstrate în istoricul exercițiilor de recuperare |
Pornirile din sursă ancorează valorile relative DATA_DIR, PLUGINS_DIR și PLATFORM_PREFLIGHT_TMP_DIR în directorul backend, independent de directorul de lucru al shell-ului. Cu DATA_DIR nesetat — sau cu exemplul nou DATA_DIR=./data — comenzile din rădăcină și spațiul de lucru backend folosesc astfel backend/data. Pentru compatibilitate, o configurație existentă cu DATA_DIR=./backend/data continuă să selecteze backend/backend/data; schimbați-o numai ca parte a unei copieri de rezervă și migrări deliberate, cu serviciul oprit. Un profil sursă nesetat continuă și el să folosească backend/backend/data când acesta este singurul spațiu persistent existent. Dacă ambele locații conțin stare și nu este selectată o cale, pornirea eșuează în siguranță în loc să ghicească, să copieze sau să îmbine.
Lansatoarele npx, npm global și Homebrew interactiv păstrează în schimb datele în ~/.libre-webui. Un DATA_DIR relativ explicit furnizat lansatorului este rezolvat din directorul de lucru al apelantului și convertit într-o cale absolută înainte de pornirea backend-ului. Un PLUGINS_DIR relativ configurat explicit urmează aceeași regulă; când nu este setat, pluginurile inscriptibile rămân în $DATA_DIR/plugins. Spațiul temporar de inspecție folosește implicit un cache inscriptibil de utilizator în afara directorului de date: ~/Library/Caches/libre-webui pe macOS, %LOCALAPPDATA%\libre-webui pe Windows sau ${XDG_CACHE_HOME:-~/.cache}/libre-webui pe alte sisteme. Serviciul Homebrew fixează același director de date de acasă și folosește var/libre-webui/preflight din Homebrew pentru spațiul temporar. Setați explicit PLATFORM_PREFLIGHT_TMP_DIR când acest cache nu poate conține baza de date și WAL-ul. Implementările Docker și Helm furnizate folosesc căile absolute /app/backend/data și /app/backend/temp/preflight, susținute de montări separate.
Fundația platformei
Profilul implicit solo folosește SQLite, bloburi locale criptate, vectori integrați criptați, coordonare locală și un worker persistent integrat. Profilul team folosește PostgreSQL, bloburi private compatibile cu S3, PGVector, Redis și un worker extern. Configurația team eșuează în siguranță: toate dependențele partajate trebuie selectate împreună.
| Variabilă | Implicit | Scop |
|---|---|---|
LIBRE_PLATFORM_MODE | solo | Selectează profilul coerent solo sau team |
DATABASE_BACKEND | sqlite | Selectează sqlite sau postgres |
DATABASE_URL | nesetat | URL de conexiune PostgreSQL, obligatoriu cu postgres |
DATABASE_SSL_MODE | verify-full | Politică TLS PostgreSQL: disable, require sau verify-full cu verificarea numelui gazdei |
POSTGRES_MIGRATION_MODE | apply | Rulează migrări compatibile sub blocarea liderului sau validate pentru verificarea schemei numai în citire |
POSTGRES_POOL_MAX | 10 | Număr maxim de conexiuni PostgreSQL per proces de aplicație sau worker (1-100) |
POSTGRES_CONNECT_TIMEOUT_MS | 5000 | Timeout de conectare PostgreSQL (1-60000 ms) |
POSTGRES_IDLE_TIMEOUT_MS | 30000 | Timeout pentru conexiunea PostgreSQL inactivă (1-600000 ms) |
POSTGRES_STATEMENT_TIMEOUT_MS | 30000 | Timeout pentru instrucțiuni PostgreSQL (1-600000 ms) |
POSTGRES_MIGRATION_LOCK_TIMEOUT_MS | 60000 | Timp de așteptare pentru blocarea liderului migrării (1-600000 ms) |
BLOB_STORE_BACKEND | local | Selectează stocarea criptată local sau privată s3 |
VECTOR_STORE_BACKEND | embedded cu SQLite | Selectează vectori criptați embedded sau pgvector |
COORDINATION_BACKEND | local în solo; redis în team | Selectează coordonarea locală procesului sau Redis |
REDIS_URL | nesetat | URL redis: sau rediss:, obligatoriu cu coordonarea Redis |
REDIS_KEY_PREFIX | libre | Namespace de 1-64 de caractere pentru cheile de coordonare Libre |
REDIS_CONNECT_TIMEOUT_MS | 5000 | Timeout inițial de conectare Redis, limitat la 60 de secunde |
JOB_WORKER_MODE | embedded în solo; external în team | Rulează handler-ele în aplicație sau în workerul partajat independent |
RESOURCE_LEASE_TTL_MS | 30000 | TTL al concesiunii de coordonare pentru proprietatea resurselor joburilor persistente (5000-300000; pornirea eșuează în afara intervalului) |
JOB_WORKER_CONCURRENCY | 4 | Joburi persistente pe care le poate rula simultan un worker (1-32) |
CHAT_STREAM_EVENT_RETENTION_HOURS | 24 | Ore de păstrare a evenimentelor fragmentelor fluxului de chat înainte de curățarea orară |
PLATFORM_EVENT_RETENTION_DAYS | 30 | Zile de păstrare a oricărui eveniment persistent înainte de curățarea orară |
PLATFORM_JOB_RETENTION_DAYS | 30 | Zile de păstrare a joburilor finalizate, din afara ciclului de viață, înainte de curățarea orară |
LIBRE_SKIP_STARTUP_INTEGRITY_SCAN | nesetat | 1 omite scanarea profundă a textului cifrat vechi la următoarea pornire (ieșire de urgență; altfel scanarea este memorată per generație de schemă) |
STORAGE_ENCRYPTION_KEYS | nesetat | Hartă secretă de chei JSON; trebuie să includă legacy care corespunde ENCRYPTION_KEY |
STORAGE_ENCRYPTION_ACTIVE_KEY_ID | nesetat | ID-ul cheii folosite pentru scrieri noi de bloburi locale și vectori integrați |
BLOB_QUOTA_BYTES_PER_USER | 10737418240 | Număr maxim persistent de octeți blob în text simplu per proprietar (număr întreg pozitiv sigur) |
BLOB_QUOTA_RESERVATION_TTL_MS | 3600000 | Durata unei rezervări abandonate de cotă în flux (cel puțin 60000 ms) |
S3_BUCKET | nesetat | Bucket privat compatibil S3, obligatoriu cu s3 |
S3_REGION | nesetat | Regiune S3, obligatorie cu s3 |
S3_ENDPOINT | valoarea implicită a furnizorului | Endpoint HTTP(S) absolut opțional pentru MinIO sau alt serviciu compatibil |
S3_ACCESS_KEY_ID | lanț de credențiale SDK | Cheie de acces S3 explicită opțională |
S3_SECRET_ACCESS_KEY | lanț de credențiale SDK | Obligatorie când este setată o cheie de acces explicită |
S3_SESSION_TOKEN | nesetat | Token opțional care însoțește credențialele S3 explicite |
S3_FORCE_PATH_STYLE | false | Setați true pentru servicii care necesită adresare în stil cale |
S3_BLOB_PREFIX | libre/blobs | Prefix opac al cheii de bucket, deținut de Libre |
Când harta versionată a cheilor de stocare lipsește, adaptoarele de stocare folosesc ENCRYPTION_KEY existent ca ID de cheie legacy; când lipsește și acesta, citesc ${DATA_DIR}/.encryption_key existent fără a-l genera sau modifica. Configurația explicită și fișierul persistent trebuie să corespundă. Dacă este introdusă o hartă versionată în timp ce există o cheie veche, păstrați cheia sub ID-ul exact legacy până când toate obiectele și vectorii au fost rescrise sau reînfășurate și verificate. Conflictele, permisiunile nesigure ale fișierelor, legăturile simbolice și cheile configurate lipsă eșuează în siguranță.
Redis este folosit pentru coordonare, nu pentru persistență canonică. Selectarea sa singură nu face SQLite, fișierele locale sau altă stare deținută de proces sigură între replici. În modul team, limitele de rată HTTP, conexiunile chat/WebSocket, activitatea furnizorilor STT/TTS/audio, importurile de arhive și sesiunile terminalului Work folosesc admitere partajată susținută de Redis. Capacitățile se aplică tuturor replicilor, nu o dată per proces. Eșecurile de admitere și permisiune reînnoibilă returnează 503 sau anulează operația în curs; Libre nu revine niciodată la un contor local independent. Consultați Fundația platformei.
Profilul team Compose și chart-ul Helm incluse transmit fiecare selector și valoare de reglare de mai sus atât aplicației, cât și workerului extern. În chart-ul Helm, selectorii care nu sunt secreți se află sub env; setați secrets.redisUrl, secrets.databaseUrl și secrets.storageEncryptionKeys pentru materialul de conexiune sau chei. Limitele pool-ului PostgreSQL sunt per proces: rezervați în baza de date cel puțin (replicaCount + worker.replicaCount) * POSTGRES_POOL_MAX conexiuni, plus marjă pentru operatori și migrări. Păstrați DATABASE_SSL_MODE=verify-full pentru PostgreSQL gestionat sau la distanță. Numai profilul team Compose inclus selectează disable, deoarece listener-ul bazei este izolat în rețeaua privată a proiectului. Team Helm necesită și un secrets.jwtSecret stabil și montează aceeași cheie Secret în fiecare Pod al aplicației și workerului; altfel, omiterea secretului JWT ar genera material de semnare local procesului. S3 primește chei opace și text cifrat; URL-urile bucketului și furnizorului nu sunt stocate în metadatele aplicației.
Arhivele integrate solo și team păstrează setările pool-ului și timeout-urilor PostgreSQL, timeout-ul conexiunii Redis, ambele setări ale cotei blob, selectorii platformei și setările de adresare S3 în configurația lor protejată, semnată și criptată. Astfel, o restaurare curată poate publica valorile operaționale necesare pentru recrearea implementării corespunzătoare fără a le plasa în text simplu în metadatele arhivei.
Perechile aplicație/worker extern din team Compose și Helm primesc aceleași valori rezolvate OLLAMA_BASE_URL, OLLAMA_TIMEOUT, OLLAMA_LONG_OPERATION_TIMEOUT și OLLAMA_MAX_CONTEXT. Apelurile furnizorilor pentru embedding-uri de documente, chaturi persistente și execuții Work rulează în worker, deci valorile nu trebuie să difere între procese. Ambele puncte de intrare ale serverului analizează cele trei valori numerice ca întregi pozitivi compleți în baza 10 înainte de a crea stare locală sau a se conecta la starea partajată. Valorile parțiale precum 300000ms, notația exponențială/hexazecimală, valorile în afara intervalului și un timeout pentru operații lungi mai mic decât cel standard opresc pornirea.
Helm limitează TRUST_PROXY la un număr întreg exact de hopuri între 0 și 16 și îl transmite numai Podurilor aplicației HTTP. Păstrați valoarea implicită 0 pentru traficul direct. Setați numărul fix exact pentru un lanț ingress/load balancer; nu folosiți niciodată forma nelimitată true a runtime-ului. Un număr greșit fie grupează clienții sub o adresă proxy pentru limite de rată partajate, fie acordă încredere unei adrese furnizate de client.
Compatibilitatea schemei PostgreSQL necesită versiunea exactă. Aplicația și workerul Helm folosesc Recreate; goliți și terminați fiecare Pod vechi înainte de o actualizare team, apoi lăsați un singur proces nou să migreze sub blocarea consultativă a liderului. Nu rulați versiuni binare mixte și nu pretindeți o lansare a schemei fără întreruperi. Revenirea înseamnă restaurarea arhivei team verificate dinaintea actualizării în ținte PostgreSQL/S3 curate înainte de pornirea binarului mai vechi corespunzător.
O aplicație team activă necesită worker.replicaCount >= 1; Helm respinge o aplicație activă fără worker persistent în loc să aștepte eșecul stării de pregătire. Setați la zero atât numărul aplicațiilor, cât și al workerilor pentru suspendare completă. Zero aplicații cu un număr pozitiv de workeri reprezintă un mod intenționat de golire sau recuperare numai pentru worker și continuă să consume joburile din coadă fără a servi trafic web.
Utilitar pentru copii de rezervă private
Aceste variabile configurează deploy/private/libre-webui-backup și sunt citite de scriptul de întreținere, nu de procesul aplicației:
| Variabilă | Implicit | Scop |
|---|---|---|
LIBRE_WEBUI_STACK_DIR | /opt/libre-webui | Directorul care conține fișierul Compose privat |
LIBRE_WEBUI_BACKUP_DIR | /var/backups/libre-webui | Director protejat pentru seturile de copii și fișierul de blocare |
LIBRE_WEBUI_BACKUP_RETENTION_DAYS | 14 | Vârsta după care sunt eliminate seturile finalizate de copii |
LIBRE_WEBUI_CONTAINER_NAME | libre-webui | Containerul aplicației implementate de inspectat |
LIBRE_WEBUI_BACKUP_KEY_DIR | /etc/libre-webui/backup-keys | Director privat pentru cheile de criptare și semnare a arhivei |
LIBRE_WEBUI_RESTORE_IMAGE | obligatoriu pentru restaurare | ID sau digest imuabil și verificat al imaginii Libre |
LIBRE_WEBUI_RESTORE_CONFIG_DIR | cale per volum sub /etc/libre-webui/restored | Director nou pentru configurația recuperată |
Unitatea systemd încarcă suprascrierile copiilor de rezervă din fișierul opțional /etc/libre-webui/backup.env, deținut de root. Setați modul 0600. Directorul stivei, păstrarea, numele containerului și directorul cheilor de rezervă pot fi setate direct acolo. Sandbox-ul sistemului de fișiere al unității permite scrieri numai sub directorul implicit de copii. Un LIBRE_WEBUI_BACKUP_DIR personalizat necesită în plus acel director exact, creat în prealabil, într-un drop-in de serviciu ReadWritePaths=; consultați Implementare privată la distanță.
Autentificare și securitate
| Variabilă | Implicit | Scop |
|---|---|---|
ENABLE_SIGNUP | false | Permite înregistrarea după primul administrator local |
JWT_SECRET | generat/de rezervă în dezvoltare | Secret de semnare JWT; setați-l explicit în producție |
JWT_EXPIRES_IN | 7d | Durata de viață a tokenului de sesiune |
ENCRYPTION_KEY | generat automat | Cheie hexazecimală de 64 de caractere pentru valorile criptate |
DEBUG_ENCRYPTION | nesetat | Jurnalizează ieșirea de depanare a criptării când este setat |
TURNSTILE_SITE_KEY | nesetat | Cheie de site Cloudflare Turnstile pentru autentificare și înregistrare |
TURNSTILE_SECRET_KEY | nesetat | Cheie secretă Cloudflare Turnstile pentru verificarea backend |
TURNSTILE_EXPECTED_HOSTNAME | nume de gazdă din BASE_URL | Nume de gazdă obligatoriu în răspunsul de verificare Cloudflare |
MFA_REQUIRED_MODE | nesetat (comutator admin, optional) | Fixează politica în doi pași la optional sau required |
WEBAUTHN_RP_ID | numele gazdei cererii | ID relying-party fix pentru passkeys în spatele mai multor nume de gazdă |
VAPID_PUBLIC_KEY | generată și stocată criptat | Fixează cheia publică VAPID Web Push (punct base64url P-256) |
VAPID_PRIVATE_KEY | generată și stocată criptat | Fixează cheia privată VAPID Web Push (scalar base64url) |
VAPID_SUBJECT | mailto:admin@localhost | Claim de contact în autorizările Web Push semnate |
Turnstile este activat numai când sunt prezente ambele chei Turnstile.
ENABLE_SIGNUP=false permite în continuare primul administrator local într-o bază de date goală, apoi blochează conturile locale și OAuth suplimentare. Protejați o rută de inițializare accesibilă la distanță cu o limită externă de identitate înainte de prima pornire.
Fiecare JWT emis este legat de o sesiune pe server (claim sid), astfel încât deconectarea sau revocarea unei sesiuni din Setări → Sesiuni invalidează imediat tokenul în fiecare replică și închide conexiunile WebSocket active. Păstrarea auditului de securitate este configurabilă:
| Variabilă | Implicit | Scop |
|---|---|---|
AUDIT_RETENTION_DAYS | 180 | Zile de păstrare a rândurilor în jurnalul evenimentelor de audit de securitate |
Autentificare unică OIDC generică
Orice furnizor OpenID Connect cu un document de descoperire poate fi folosit pentru autentificare. Fluxul folosește PKCE (S256), starea CSRF și un nonce verificat în tokenul ID a cărui semnătură este controlată. Identitățile sunt legate prin claim-ul stabil sub.
| Variabilă | Implicit | Scop |
|---|---|---|
OIDC_ISSUER_URL | nesetat | URL de bază a emitentului; descoperirea este preluată din <issuer>/.well-known/openid-configuration |
OIDC_CLIENT_ID | nesetat | ID client OAuth înregistrat la furnizor |
OIDC_CLIENT_SECRET | nesetat | Secret client OAuth |
OIDC_DISPLAY_NAME | Single Sign-On | Eticheta afișată pe butonul de autentificare |
OIDC_SCOPES | openid profile email | Domenii solicitate |
OIDC_CALLBACK_URL | BASE_URL + ruta callback OIDC | URI de redirecționare înregistrat la furnizor |
OIDC_ALLOWED_EMAIL_DOMAINS | nesetat | Listă separată prin virgule; când este setată, este necesar un e-mail verificat într-unul dintre aceste domenii |
OIDC_GROUP_CLAIM | groups | Claim-ul tokenului ID care conține numele grupurilor |
OIDC_ADMIN_GROUPS | nesetat | Listă separată prin virgule; când este setată, rolul admin urmează apartenența din claim la fiecare autentificare |
OIDC_SYNC_GROUPS | false | true reconciliază apartenența la grupurile Libre cu claim-ul de grup la fiecare autentificare |
OIDC este activat numai când sunt prezente URL-ul emitentului, id-ul clientului și secretul clientului. Un e-mail folosit deja de un cont local nelegat este respins, nu îmbinat în tăcere, iar crearea contului respectă în continuare ENABLE_SIGNUP.
Admiterea Chat WebSocket poate fi reglată fără a slăbi autentificarea:
| Variabilă | Implicit | Scop |
|---|---|---|
CHAT_WS_MAX_PAYLOAD_BYTES | 10 MiB | Dimensiunea maximă acceptată a mesajului WebSocket |
CHAT_WS_MAX_MESSAGES_PER_MINUTE | 120 | Număr maxim de mesaje WebSocket per conexiune |
CHAT_WS_MAX_ACTIVE_GENERATIONS_PER_USER | 4 | Generări ale furnizorului permise per cont |
CHAT_WS_MAX_CONNECTIONS_PER_USER | 5 | Socketuri autentificate simultane per cont |
WEBSOCKET_TICKET_TTL_MS | 30000 | Durata biletului Chat/Work de unică folosință; maximum 60 de secunde |
Browserul schimbă antetul Authorization obișnuit cu un bilet opac și introduce în URL-ul de upgrade WebSocket numai valoarea de scurtă durată. Biletele sunt de unică folosință, legate de protocol și sesiune și stocate numai ca hash-uri. Astfel, tokenurile persistente de sesiune nu apar în jurnalele țintelor cererilor reverse proxy. Când este configurat CORS_ORIGIN sau BASE_URL, upgrade-urile browserului cu antet Origin trebuie să corespundă uneia dintre originile configurate. Setați cel puțin una într-o implementare accesibilă la distanță; dacă niciuna nu este configurată, filtrul Origin rămâne permisiv pentru compatibilitate cu dezvoltarea locală. Upgrade-urile fără origine sunt acceptate intenționat pentru Electron și clienții care nu sunt browsere, unde controlul Origin al browserului nu este disponibil; au nevoie în continuare de un bilet valid de unică folosință și primesc aceleași verificări pentru contul curent, accesul Work și sarcină. Tratați biletul ca limită de autentificare și restricționați accesul clienților non-browser prin controalele TLS, firewall și reverse proxy obișnuite ale implementării.
OAuth
| Variabilă | Scop |
|---|---|
GITHUB_CLIENT_ID | ID client GitHub OAuth |
GITHUB_CLIENT_SECRET | Secret client GitHub OAuth |
GITHUB_CALLBACK_URL | Suprascriere URL callback GitHub |
HUGGINGFACE_CLIENT_ID | ID client Hugging Face OAuth |
HUGGINGFACE_CLIENT_SECRET | Secret client Hugging Face OAuth |
HUGGINGFACE_CALLBACK_URL | Suprascriere URL callback Hugging Face |
Dacă URL-urile callback nu sunt setate, Libre WebUI creează valori implicite din BASE_URL.
Ollama
| Variabilă | Implicit | Scop |
|---|---|---|
OLLAMA_BASE_URL | http://localhost:11434 | URL de bază API Ollama |
OLLAMA_TIMEOUT | 300000 | Timeout standard pentru cererea Ollama (1,000-3,600,000 ms) |
OLLAMA_LONG_OPERATION_TIMEOUT | 900000 | Timeout pentru operații lungi (1,000-3,600,000 ms și nu mai mic decât OLLAMA_TIMEOUT) |
OLLAMA_MAX_CONTEXT | 32768 | Context maxim al modelului adoptat automat (128-2,097,152 tokenuri) |
Căutare web
| Variabilă | Implicit | Scop |
|---|---|---|
SEARXNG_URL | nesetat | Endpoint SearXNG implicit pentru căutarea web; administratorul trebuie să îl activeze în Setări > Căutare |
Libre Claw
| Variabilă | Implicit | Scop |
|---|---|---|
LIBRE_CLAW_BASE_URL | http://127.0.0.1:8766 | URL opțional al daemonului Libre Claw |
LIBRE_CLAW_TIMEOUT_MS | 30000 | Timeout al cererii HTTP Libre Claw |
Runtime Work
Aceste variabile configurează execuția Work pe computerul sau clusterul Kubernetes unde rulează backend-ul Libre WebUI. Docker este runtime-ul implicit; chart-ul Helm selectează Kubernetes când work.enabled=true.
| Variabilă | Implicit | Scop |
|---|---|---|
WORK_RUNTIME_IMAGE | node:22.22-bookworm@sha256:2d178f2785b96dfbf62a416ca2e40f50e30150b4ff3320d706f0d96e90600eb3 | Imagine fixată pentru sandbox-urile Work |
WORK_DOCKER_COMMAND | docker | Executabil CLI pentru backend-ul Docker, disponibil procesului |
WORK_COMMAND_TIMEOUT_MS | 120000 | Timeout implicit; un instrument poate solicita până la 600000 ms |
WORK_MAX_OUTPUT_CHARS | 50000 | Limita stdout/stderr capturată, aplicată separat fiecărui flux |
WORK_MAX_AGENT_ROUNDS | 48 | Buget de runde model/instrument pentru o execuție, independent de furnizor |
WORK_STATUS_BLURB_MODEL | 1 | Setați 0 pentru a omite cererea de model care scrie starea agentului după execuție |
WORK_MEMORY_LIMIT | 2g | Limita de memorie pentru fiecare container Work |
WORK_CPU_LIMIT | 2 | Limita CPU pentru fiecare container Work |
WORK_PIDS_LIMIT | 256 | Limita de procese pentru fiecare container Work |
WORK_PREVIEW_PORT | 4173 | Portul pe care trebuie să îl folosească serverul de previzualizare în containerul sarcinii |
WORK_PREVIEW_BIND | 127.0.0.1 | Interfața gazdei pe care este publicat portul de previzualizare; instalările Compose pe Docker Engine nativ trebuie să folosească o interfață de punte nepublică, accesibilă |
WORK_DOCKER_PUBLISHED_HOST | implicit în aplicație: identic cu WORK_PREVIEW_BIND; implicit în Compose: host.docker.internal | Gazda/IP-ul vizibil backend-ului pentru porturile de previzualizare, ecran și audio publicate de Docker |
WORK_COMPUTER_SCREEN_PORT | 6080 | Portul containerului pentru puntea ecranului Work Computer (websockify) în sandbox-uri cu GUI |
WORK_COMPUTER_AUDIO_PORT | 6081 | Portul containerului pentru puntea audio Work Computer (websockify → monitor PulseAudio) în sandbox-uri cu GUI |
WORK_MAX_ACTIVE_RUNTIMES_GLOBAL | 3 | Sarcini simultane susținute de runtime în întreaga instanță |
WORK_MAX_ACTIVE_RUNTIMES_PER_USER | 2 | Sarcini simultane susținute de runtime pentru un utilizator |
WORK_MAX_TASKS_GLOBAL | 500 | Număr maxim de sarcini Work persistente în întreaga instanță |
WORK_MAX_TASKS_PER_USER | 100 | Număr maxim de sarcini Work persistente pentru un administrator |
WORK_NETWORK_NAME | libre-webui-work | Rețea bridge gestionată a sandbox-urilor pentru sarcinile în rețea |
WORK_RUN_LEASE_WAIT_MS | 60000 | Timpul de așteptare al execuției pentru concesiunea runtime partajată înainte de conflict de replică (team) |
WORK_RUNTIME_DNS | nesetat | IP-uri de resolver separate prin virgule, impuse sarcinilor în rețea |
WORK_DOCKER_SOCKET | DOCKER_HOST dacă este unix:// sau tcp://, altfel /var/run/docker.sock | Endpoint Docker Engine pentru terminale și diagnostic |
WORK_TERMINAL_MAX_SESSIONS_PER_TASK | 2 | Terminale de browser simultane atașate unei sarcini |
WORK_TERMINAL_IDLE_TIMEOUT_MS | 900000 | Timp de inactivitate înainte de închiderea sesiunii terminalului |
WORK_RUNTIME_IDLE_TIMEOUT_MS | 0 (dezactivat) | Oprește un sandbox după această perioadă de inactivitate (și previzualizările) |
WORK_HOST_WORKSPACES_ENABLED | false | Permite unei sarcini să folosească un dosar al gazdei în locul unui volum |
WORK_HOST_WORKSPACE_ROOTS | directorul de acasă al utilizatorului serverului | Rădăcini separate prin : în care trebuie să se afle spațiul de lucru al gazdei |
WORK_RUNTIME_BACKEND | docker | Backend sandbox: docker sau kubernetes |
WORK_K8S_NAMESPACE | libre-webui-work | Namespace care conține Podurile sandbox Kubernetes și PVC-urile |
WORK_K8S_STORAGE_CLASS | valoarea implicită a clusterului | StorageClass pentru PVC-urile spațiului de lucru |
WORK_K8S_WORKSPACE_SIZE | 5Gi | Dimensiunea PVC per sarcină (cotă reală de disc) |
WORK_K8S_POD_READY_TIMEOUT_MS | 900000 | Așteaptă ca un Pod sandbox să ajungă în Running (include descărcările) |
WORK_K8S_POD_GONE_TIMEOUT_MS | 60000 | Așteaptă dispariția unui Pod sandbox șters |
AGENT_CLI_MODELS_ENABLED | nesetat (comutator admin, oprit) | Fixează funcția Agenți activată/dezactivată; nesetat o lasă comutatorului din Gestionarea utilizatorilor |
TOOLS_ACCESS_MODE | nesetat (comutator admin, numai administratori) | Fixează instrumentele chat la admins sau all-users și blochează comutatorul din Gestionarea utilizatorilor |
STT_ACCESS_MODE | nesetat (comutator admin, toți utilizatorii) | Fixează vorbirea în text la admins sau all-users și blochează comutatorul din Gestionarea utilizatorilor |
TTS_ACCESS_MODE | nesetat (comutator admin, toți utilizatorii) | Fixează textul în vorbire la admins sau all-users și blochează comutatorul din Gestionarea utilizatorilor |
VOICE_MODE_ACCESS_MODE | nesetat (comutator admin, toți utilizatorii) | Fixează modul vocal hands-free la admins sau all-users și blochează comutatorul din Gestionarea utilizatorilor |
VOICE_CLONING_ACCESS_MODE | nesetat (comutator admin, toți utilizatorii) | Fixează clonarea vocii la admins sau all-users și blochează comutatorul din Gestionarea utilizatorilor |
TOOLS_PRIVATE_NETWORK_ALLOWLIST | nesetat | Nume exacte de gazde unde serverele de instrumente și webhook-urile se pot rezolva la adrese private; fixate |
AGENT_CLI_TIMEOUT_MS | 600000 | Durata de rulare a unui CLI de agent înainte de terminare |
CODEX_OAUTH_MODELS_ENABLED | true | Oferă furnizorul Codex (ChatGPT) administratorilor |
CODEX_HOME | ~/.codex | Locul din care este citită autentificarea CLI Codex (auth.json) |
Binarele CLI ale agenților și credențialele Codex OAuth sunt locale nodului. Sunt acceptate numai într-un proces solo, unde descoperirea și execuția văd același sistem de fișiere și mediu. Modul team execută joburi persistente de chat într-un worker extern, deci necesită atât AGENT_CLI_MODELS_ENABLED=false, cât și CODEX_OAUTH_MODELS_ENABLED=false; pornirea respinge orice altă valoare în loc să publice un furnizor care poate exista numai într-o replică a aplicației. Folosiți Ollama sau un plugin de furnizor ale cărui credențiale și rutare sunt stocate în PostgreSQL partajat ori transmise identic fiecărei aplicații și fiecărui worker.
Pe backend-ul Docker, un spațiu de lucru al gazdei montează un director real la /workspace, astfel încât sarcina poate citi și scrie direct acele fișiere, în loc să lucreze în propriul volum Docker. Kubernetes respinge spațiile de lucru cu dosare ale gazdei. Aceasta este o reducere intenționată a izolării sandbox-ului Docker: păstrați WORK_HOST_WORKSPACES_ENABLED dezactivat dacă nu îl doriți și WORK_HOST_WORKSPACE_ROOTS cât mai restrâns. Căile solicitate sunt rezolvate prin legături simbolice înainte de verificarea față de rădăcini, iar dosare precum .ssh, .gnupg, .aws și .config sunt respinse direct.
Modelele CLI ale agenților expun agenții de programare instalați deja pe server (claude, codex) ca modele de chat selectabile, astfel încât un agent cu abonament poate răspunde fără cheie API. Numai administratorii îi văd, CLI-ul rulează ca utilizatorul serverului Libre WebUI și moștenește credențialele agentului acelui utilizator — tratați aceasta ca echivalentă cu acordarea accesului shell acelor agenți.
În Docker, sarcinile Work conectate la rețea se atașează la bridge-ul gestionat WORK_NETWORK_NAME, creat cu comunicarea între containere dezactivată, astfel încât un sandbox să nu poată accesa alt sandbox sau containerele implementării. WORK_RUNTIME_DNS este punctul acceptat pentru politica traficului de ieșire Docker: direcționați-l către un resolver cu filtrare pentru a aplica liste de nume permise/interzise. Intrările care nu sunt adrese IPv4/IPv6 sunt respinse și jurnalizate. Filtrarea DNS nu limitează traficul direct către IP; adăugați reguli de firewall pe gazdă când implementarea necesită acest lucru. Backend-ul Kubernetes folosește în schimb NetworkPolicies default-deny din chart și valorile work.networkPolicy.blockedEgressCidrs.
În Docker, terminalul interactiv și diagnosticele de sistem comunică direct cu API-ul Docker Engine. Urmează WORK_DOCKER_SOCKET când este setat, altfel DOCKER_HOST — fie un socket unix://, fie un endpoint tcp:// prin HTTP simplu, precum un proxy de socket (consultați docker-compose.socket-proxy.yml) — iar în caz contrar /var/run/docker.sock. O valoare DOCKER_HOST cu care clientul nu poate comunica (ssh:// sau tcp:// cu DOCKER_TLS_VERIFY setat) raportează terminalul și diagnosticele Docker ca indisponibile; restul Work continuă să ruleze prin CLI-ul Docker, care înțelege singur aceste endpoint-uri. În Kubernetes, terminalul folosește subresursa exec a Podului și nu utilizează un endpoint Docker.
Work citește aceste valori la pornirea backend-ului. Portul de previzualizare este intern containerului sarcinii; Libre WebUI îl publică pe un port loopback alocat dinamic, în loc să expună valoarea direct pe fiecare interfață a gazdei.
Păstrați imaginea runtime fixată la o versiune sau un digest verificat. Creșterea concurenței ori a limitelor de resurse mărește capacitatea runtime pe care o pot consuma una sau mai multe execuții autonome. WORK_MAX_AGENT_ROUNDS se aplică egal execuțiilor Ollama și celor bazate pe pluginuri; nu există o limită inferioară numai pentru pluginuri. Bugetul de siguranță pentru apelurile instrumentelor este max(128, WORK_MAX_AGENT_ROUNDS × 8). Când o execuție își consumă bugetul de runde, Work cere modelului o predare finală fără instrumente și se încheie în starea terminală needs_input, în loc să returneze o eroare brută de limită sau să pretindă finalizarea cu succes. O execuție ulterioară continuă în același spațiu de lucru persistent. Ieșirea instrumentelor stocată persistent are o limită separată de aproximativ 20,000 de caractere sursă plus un marcaj de trunchiere.
Aceste variabile reglează un runtime Work care este deja accesibil. Implementările Compose cu o singură instanță din depozit îl activează implicit: imaginea include CLI-ul Docker, iar fișierele Compose montează socketul Docker al gazdei. Două variabile la nivel Compose controlează această conectare:
| Variabilă | Implicit | Scop |
|---|---|---|
DOCKER_GID | 0 | ID-ul grupului socketului Docker al gazdei, adăugat utilizatorului containerului |
DOCKER_SOCKET | /var/run/docker.sock | Calea gazdei către socketul Docker de montat |
DOCKER_GID trebuie să fie grupul socketului așa cum este văzut în container; o gazdă macOS raportează altă valoare. Baza team Compose nu montează niciun socket și menține Work cu backend Docker indisponibil până când se adaugă docker-compose.team.work.yml. Overlay-ul de producție oferă aplicației și workerului același endpoint proxy intern filtrat, niciodată o montare sau un grup de socket. Proxy-ul permite numai secțiunile API Docker folosite de runtime, însă crearea containerelor rămâne o credențială de control asupra gazdei Docker; folosiți un daemon Work dedicat sau rootless pentru o limită mai puternică. Chart-ul Helm nu montează niciodată socketul runtime al unui nod. Activați backend-ul nativ Pod/PVC Work cu work.enabled=true.
Profilul solo trebuie să rămână la zero sau o replică a aplicației, deoarece folosește SQLite, fișiere locale și coordonare locală procesului. Chart-ul Helm acceptă zero pentru o suspendare intenționată și respinge un număr mai mare de replici solo sau scalarea automată solo. Un profil team complet poate folosi mai multe replici ale aplicației și un worker extern deoarece PostgreSQL, S3, PGVector și Redis dețin starea partajată. Podurile sandbox Work se scalează independent în oricare profil; în modul team, workerul extern primește aceeași imagine runtime Kubernetes, StorageClass și limite work.env ca Podurile aplicației.
Fișierele Compose din depozit acceptă și WEBUI_BIND_ADDRESS (implicit 127.0.0.1) și WEBUI_PORT (implicit 8080). Păstrați valoarea loopback implicită dacă portul nu trebuie accesat de un LAN de încredere sau de reverse proxy-ul gazdei.
Descoperirea modelelor furnizorilor
Catalogul de modele al unui furnizor este redescoperit automat când lipsește sau este învechit, astfel încât reîncărcarea să reflecte modelele oferite în prezent. Aceste variabile reglează ciclul:
| Variabilă | Implicit | Scop |
|---|---|---|
PLUGIN_MODEL_DISCOVERY_TTL_MS | 21600000 (6 h) | Vârsta la care un catalog stocat este actualizat la următoarea citire a listei de pluginuri |
PLUGIN_MODEL_DISCOVERY_RETRY_MS | 600000 (10 min) | Intervalul minim dintre încercări, pentru ca un furnizor cu erori să nu fie verificat prea des |
PLUGIN_MODEL_DISCOVERY_REFRESH_DEADLINE_MS | 3000 | Timpul în care răspunsul listei de pluginuri așteaptă actualizările înainte să răspundă |
O actualizare care depășește termenul se finalizează totuși și este servită la cererea următoare. Acțiunea explicită Actualizează modelele contactează întotdeauna furnizorul și ignoră intervalul.
Cheile pluginurilor furnizorilor
Pluginurile furnizorilor pot folosi chei de mediu ca valori implicite pentru întreaga implementare:
| Variabilă | Furnizor |
|---|---|
OPENAI_API_KEY | OpenAI și OpenAI TTS |
ANTHROPIC_API_KEY | Anthropic |
GROQ_API_KEY | Groq |
GEMINI_API_KEY | Google Gemini |
MISTRAL_API_KEY | Mistral |
OPENROUTER_API_KEY | OpenRouter |
KIMI_API_KEY | Kimi Code de la Moonshot AI |
GITHUB_API_KEY | Modele GitHub |
HUGGINGFACE_API_KEY | API-uri Hugging Face acolo unde sunt configurate |
ELEVENLABS_API_KEY | ElevenLabs TTS |
COMFYUI_API_KEY | Implementări ComfyUI care necesită o cheie API |
Utilizatorii pot stoca și credențiale de furnizor în interfață când sunt preferate cheile per utilizator. Cheile de mediu sunt folosite numai cu proiecția de rutare și autentificare a unei definiții incluse și neumbrite. Definițiile importate, cele inscriptibile care reutilizează un ID inclus și rutele personalizate salvate de administrator necesită o credențială stocată de contul respectiv. Libre WebUI nu atașează o cheie de mediu acelor rute și nu o expune prin verificările de descoperire și disponibilitate. Încrederea provine din hash-ul compilat al fiecărui manifest livrat, astfel încât aspectele de containere în care directoarele vechi și incluse ale pluginurilor împart o cale rămân acceptate fără a trata un manifest modificat drept inclus.
Cheile salvate de utilizator sunt legate de definiția efectivă a furnizorului, sursă, contractul de autentificare și valorile de rutare. Utilizatorii trebuie să salveze din nou cheia după ce un administrator schimbă destinația. Cheile nelegate dinaintea actualizării sunt acceptate și legate la prima utilizare numai pentru o definiție livrată exactă, folosind ruta sa inclusă.
La pornirile din sursă, valorile relative PLUGINS_DIR sunt rezolvate din directorul backend. Lansatorul împachetat transformă în schimb o valoare relativă configurată explicit într-o cale absolută față de apelant înainte de pornirea backend-ului. Pentru compatibilitate, Libre citește și directorul determinist backend/plugins și locațiile istorice selectate de configurațiile anterioare. Mutați definițiile în $DATA_DIR/plugins; recuperarea raportează căile vechi ca stare externă și blochează un instantaneu numai de volum cât timp definițiile personalizate rămân acolo. Directoarele pluginurilor și definițiile JSON trebuie să fie intrări fizice obișnuite — Libre nu urmează legăturile simbolice ale pluginurilor.
Frontend
| Variabilă | Implicit | Scop |
|---|---|---|
VITE_API_BASE_URL | proxy-ul de dezvoltare pe aceeași origine sau API-ul de producție | URL de bază API frontend |
VITE_WS_BASE_URL | dedus din URL-ul API | Bază absolută ws:/wss: pentru socketurile Chat și Work |
VITE_APP_VERSION | versiunea pachetului injectată de configurația Vite | Versiunea afișată a aplicației |
VITE_DEMO_MODE | false | Activează simulările modului demonstrativ când este true |
VITE_API_TIMEOUT | 300000 | Timeout API frontend în milisecunde |
VITE_BACKEND_URL | http://localhost:3001 | Folosit de unele componente auxiliare de autentificare |
VITE_DEBUG_VERBOSE | nesetat | Activează jurnalele frontend detaliate de depanare în dezvoltare |
VITE_LOG_LEVEL | nesetat | Suprascrie nivelul jurnalizării frontend |
ELECTRON_BUILD | nesetat | Activează comportamentul Vite specific Electron când este true |
VITE_WS_BASE_URL suprascrie fiecare valoare de rezervă WebSocket atât pentru Chat, cât și pentru terminalul Work. Poate include un prefix de cale reverse proxy, dar trebuie să fie un URL absolut ws: sau wss: fără credențiale, interogare sau fragment. Când este nesetat, clienții Electron file: folosesc ws://localhost:3001; clienții browserului își deduc baza din VITE_API_BASE_URL, apoi din originea browserului. Vite direcționează originea de dezvoltare către backend-ul de pe portul 3001.
Scripturi de întreținere
| Variabilă | Scop |
|---|---|
CHANGELOG_AI | Setați 0 pentru a dezactiva ciornele jurnalului de schimbări asistate de AI |
CHANGELOG_AI_MODEL | Model Ollama pentru generarea versiunii/jurnalului de schimbări |
CHANGELOG_AI_TIMEOUT_MS | Timeout în milisecunde pentru generarea jurnalului de schimbări cu AI |
Exemplu:
CHANGELOG_AI_MODEL=glm-5.2:cloud npm run changelog
CHANGELOG_AI=0 npm run release:minor
Exemplu de producție
NODE_ENV=production
PORT=3001
SERVE_FRONTEND=true
DATA_DIR=/data/libre-webui
CORS_ORIGIN=https://librewebui.example
BASE_URL=https://librewebui.example
JWT_SECRET=replace-with-a-long-random-secret
ENCRYPTION_KEY=replace-with-64-hex-characters
ENABLE_SIGNUP=false
OLLAMA_BASE_URL=http://ollama:11434
OLLAMA_TIMEOUT=300000
OLLAMA_LONG_OPERATION_TIMEOUT=900000
OLLAMA_MAX_CONTEXT=32768
TURNSTILE_SITE_KEY=...
TURNSTILE_SECRET_KEY=...
TURNSTILE_EXPECTED_HOSTNAME=librewebui.example