Zmienne środowiskowe
Zmienne operatora czytane przez backend, frontend i skrypty utrzymaniowe. Testowe canary pominięte.
Backend
Poziom logowania testów może mieć wartość warn.
| Zmienna | Domyślnie | Cel |
|---|---|---|
NODE_ENV | development | Runtime |
PORT | 3001 dev, 8080 prod | HTTP |
TRUST_PROXY | brak (0 Helm) | Dokładna liczba proxy |
CORS_ORIGIN | lokalne | Dozwolone origins |
SERVE_FRONTEND | brak | true serwuje frontend |
DOCKER_ENV | brak | Docker z true |
DATA_DIR | backend/data; CLI ~/.libre-webui | Dane |
PLATFORM_PREFLIGHT_TMP_DIR | backend/temp/preflight; cache | Kopia DB/WAL |
PLUGIN_UPLOAD_TEMP_DIR | libre-webui-plugin-uploads | Upload |
PLUGINS_DIR | $DATA_DIR/plugins | Pluginy |
BASE_URL | http://localhost:3001 | OAuth |
LOG_LEVEL | info | Log |
LOG_FORMAT | text | json strukturalny |
OTEL_EXPORTER_OTLP_ENDPOINT | brak | Opt-in OTLP |
OTEL_EXPORTER_OTLP_HEADERS | brak | key=value |
OTEL_SERVICE_NAME | libre-webui | service.name |
WEBUI_HOST | loopback; Docker 0.0.0.0 | Listen |
OPEN_BROWSER | true | false nie otwiera |
FULL_DOCUMENT_CONTEXT_MAX_TOKENS | 32000 | Pełny dokument |
GALLERY_RETENTION_DAYS | brak | Retencja mediów |
RECOVERY_DRILL_INTERVAL_HOURS | brak | Ćwiczenie co N h |
RECOVERY_DRILL_HISTORY | 60 | Historia |
Source rozwiązuje względne DATA_DIR, PLUGINS_DIR, PLATFORM_PREFLIGHT_TMP_DIR od backendu. DATA_DIR=./data → backend/data; DATA_DIR=./backend/data → backend/backend/data. Zmieniaj tylko po zatrzymaniu i backupie. Dwa stany bez wyboru powodują bezpieczną porażkę.
npx, npm globalny i Homebrew używają ~/.libre-webui; względne ścieżki od katalogu wywołania. Cache: ~/Library/Caches/libre-webui, %LOCALAPPDATA%\libre-webui, ${XDG_CACHE_HOME:-~/.cache}/libre-webui; Homebrew var/libre-webui/preflight; Docker/Helm /app/backend/data, /app/backend/temp/preflight.
Fundament platformy
Tryb TLS może mieć wartość require.
solo: SQLite, lokalne zaszyfrowane bloby/wektory, lokalna koordynacja, worker wbudowany. team: PostgreSQL, S3, PGVector, Redis, zewnętrzny worker. Niepełna konfiguracja odrzucana.
| Zmienna | Domyślnie | Cel |
|---|---|---|
LIBRE_PLATFORM_MODE | solo | solo/team |
DATABASE_BACKEND | sqlite | sqlite/postgres |
DATABASE_URL | brak | PostgreSQL |
DATABASE_SSL_MODE | verify-full | TLS |
POSTGRES_MIGRATION_MODE | apply | apply/validate |
POSTGRES_POOL_MAX | 10 | Pool |
POSTGRES_CONNECT_TIMEOUT_MS | 5000 | Connect |
POSTGRES_IDLE_TIMEOUT_MS | 30000 | Idle |
POSTGRES_STATEMENT_TIMEOUT_MS | 30000 | Statement |
POSTGRES_MIGRATION_LOCK_TIMEOUT_MS | 60000 | Lock |
BLOB_STORE_BACKEND | local | local/s3 |
VECTOR_STORE_BACKEND | embedded | embedded/pgvector |
COORDINATION_BACKEND | local/redis | Koordynacja |
REDIS_URL | brak | Redis |
REDIS_KEY_PREFIX | libre | Namespace |
REDIS_CONNECT_TIMEOUT_MS | 5000 | Timeout |
JOB_WORKER_MODE | embedded/external | Worker |
RESOURCE_LEASE_TTL_MS | 30000 | Lease |
JOB_WORKER_CONCURRENCY | 4 | Jobs |
CHAT_STREAM_EVENT_RETENTION_HOURS | 24 | Chat |
PLATFORM_EVENT_RETENTION_DAYS | 30 | Events |
PLATFORM_JOB_RETENTION_DAYS | 30 | Jobs |
LIBRE_SKIP_STARTUP_INTEGRITY_SCAN | brak | 1 pomija skan |
STORAGE_ENCRYPTION_KEYS | brak | Mapa z legacy = ENCRYPTION_KEY |
STORAGE_ENCRYPTION_ACTIVE_KEY_ID | brak | Aktywny klucz |
BLOB_QUOTA_BYTES_PER_USER | 10737418240 | Quota |
BLOB_QUOTA_RESERVATION_TTL_MS | 3600000 | Rezerwacja |
S3_BUCKET | brak | Bucket |
S3_REGION | brak | Region |
S3_ENDPOINT | provider | Endpoint |
S3_ACCESS_KEY_ID | SDK | Access |
S3_SECRET_ACCESS_KEY | SDK | Secret |
S3_SESSION_TOKEN | brak | Token |
S3_FORCE_PATH_STYLE | false | Path-style |
S3_BLOB_PREFIX | libre/blobs | Prefix |
Bez mapy używa ENCRYPTION_KEY jako legacy, potem ${DATA_DIR}/.encryption_key bez generowania. Klucze muszą się zgadzać; konflikty, prawa, symlink i braki zawodzą bezpiecznie.
Redis to koordynacja, nie dane kanoniczne. Team używa współdzielonej admission dla HTTP/WebSocket/STT/TTS/audio/import/terminal; błąd 503 lub abort, bez lokalnego fallbacku. Fundament.
Team przekazuje wszystko app/worker. Helm: env, sekrety secrets.redisUrl, secrets.databaseUrl, secrets.storageEncryptionKeys. Rezerwuj (replicaCount + worker.replicaCount) * POSTGRES_POOL_MAX; zdalnie DATABASE_SSL_MODE=verify-full, prywatny Compose disable; wspólny secrets.jwtSecret. S3 ma ciphertext.
Archiwa zachowują parametry w szyfrowanej podpisanej konfiguracji. App/worker mają same OLLAMA_BASE_URL, OLLAMA_TIMEOUT, OLLAMA_LONG_OPERATION_TIMEOUT, OLLAMA_MAX_CONTEXT; tylko pełne liczby dziesiętne, 300000ms i inne złe wartości odrzucone.
Helm TRUST_PROXY tylko 0–16, nigdy true. Schema PostgreSQL dokładna, Recreate, bez mixed/zero-downtime. Aktywny team wymaga worker.replicaCount >= 1.
Prywatny helper kopii
Helper znajduje się w deploy/private/libre-webui-backup.
Obraz przywracania jest oznaczony jako required.
| Zmienna | Domyślnie | Cel |
|---|---|---|
LIBRE_WEBUI_STACK_DIR | /opt/libre-webui | Compose |
LIBRE_WEBUI_BACKUP_DIR | /var/backups/libre-webui | Backup |
LIBRE_WEBUI_BACKUP_RETENTION_DAYS | 14 | Retencja |
LIBRE_WEBUI_CONTAINER_NAME | libre-webui | Kontener |
LIBRE_WEBUI_BACKUP_KEY_DIR | /etc/libre-webui/backup-keys | Klucze |
LIBRE_WEBUI_RESTORE_IMAGE | wymagane | Image |
LIBRE_WEBUI_RESTORE_CONFIG_DIR | /etc/libre-webui/restored | Konfiguracja |
/etc/libre-webui/backup.env, root, 0600. Własny LIBRE_WEBUI_BACKUP_DIR wymaga ReadWritePaths=. Wdrożenie prywatne.
Uwierzytelnianie
Koordynacja Redis przyjmuje adresy redis: lub rediss:.
| ENABLE_SIGNUP | false | Rejestracja |
| JWT_SECRET | dev fallback | JWT |
| JWT_EXPIRES_IN | 7d | Sesja |
| ENCRYPTION_KEY | auto | 64 hex |
| DEBUG_ENCRYPTION | brak | Debug |
| TURNSTILE_SITE_KEY | brak | Turnstile |
| TURNSTILE_SECRET_KEY | brak | Secret |
| TURNSTILE_EXPECTED_HOSTNAME | BASE_URL | Host |
| MFA_REQUIRED_MODE | optional | MFA |
| WEBAUTHN_RP_ID | host | Passkey |
| VAPID_PUBLIC_KEY | auto szyfrowany | Push |
| VAPID_PRIVATE_KEY | auto szyfrowany | Push |
| VAPID_SUBJECT | mailto:admin@localhost | Kontakt |
Oba Turnstile wymagane. ENABLE_SIGNUP=false pozwala pierwszy admin. JWT związany z sid. AUDIT_RETENTION_DAYS domyślnie 180.
Ogólny OIDC SSO
Nagłówek Origin musi być zgodny z konfiguracją.
PKCE S256, state, nonce, identyfikacja sub.
| OIDC_ISSUER_URL | brak | <issuer>/.well-known/openid-configuration |
| OIDC_CLIENT_ID | brak | ID |
| OIDC_CLIENT_SECRET | brak | Secret |
| OIDC_DISPLAY_NAME | Single Sign-On | Nazwa |
| OIDC_SCOPES | openid profile email | Scopes |
| OIDC_CALLBACK_URL | BASE_URL + route | Callback |
| OIDC_ALLOWED_EMAIL_DOMAINS | brak | Domeny |
| OIDC_GROUP_CLAIM | groups | Grupy |
| OIDC_ADMIN_GROUPS | brak | Admin |
| OIDC_SYNC_GROUPS | false | Sync |
Wymaga issuer/ID/secret. E-mail lokalny nie jest automatycznie scalany. WebSocket: CHAT_WS_MAX_PAYLOAD_BYTES 10 MiB, CHAT_WS_MAX_MESSAGES_PER_MINUTE 120, CHAT_WS_MAX_ACTIVE_GENERATIONS_PER_USER 4, CHAT_WS_MAX_CONNECTIONS_PER_USER 5, WEBSOCKET_TICKET_TTL_MS 30000. Bilet jednorazowy, Origin zgodny z CORS_ORIGIN/BASE_URL.
OAuth
GITHUB_CLIENT_ID, GITHUB_CLIENT_SECRET, GITHUB_CALLBACK_URL, HUGGINGFACE_CLIENT_ID, HUGGINGFACE_CLIENT_SECRET, HUGGINGFACE_CALLBACK_URL. Brak callbacku używa BASE_URL.
Ollama
OLLAMA_BASE_URL http://localhost:11434; OLLAMA_TIMEOUT 300000; OLLAMA_LONG_OPERATION_TIMEOUT 900000 nie krótszy; OLLAMA_MAX_CONTEXT 32768.
Wyszukiwanie web
SEARXNG_URL ustawia domyślny endpoint; admin nadal aktywuje.
Libre Claw
LIBRE_CLAW_BASE_URL http://127.0.0.1:8766, LIBRE_CLAW_TIMEOUT_MS 30000.
Runtime Work
Backend może mieć wartość kubernetes, a logowanie Codex jest odczytywane z auth.json.
Endpoint ssh:// nie jest obsługiwany przez klienta terminala; Helm przekazuje limity przez work.env.
Korzenie folderów hosta są rozdzielane znakiem :. Tryby dostępu mogą przyjmować admins, admins, admins, all-users, all-users, all-users, all-users i all-users.
Wszystkie zmienne:
WORK_RUNTIME_IMAGE, WORK_DOCKER_COMMAND, WORK_COMMAND_TIMEOUT_MS, WORK_MAX_OUTPUT_CHARS, WORK_MAX_AGENT_ROUNDS, WORK_STATUS_BLURB_MODEL, WORK_MEMORY_LIMIT, WORK_CPU_LIMIT, WORK_PIDS_LIMIT, WORK_PREVIEW_PORT, WORK_PREVIEW_BIND, WORK_DOCKER_PUBLISHED_HOST, WORK_COMPUTER_SCREEN_PORT, WORK_COMPUTER_AUDIO_PORT, WORK_MAX_ACTIVE_RUNTIMES_GLOBAL, WORK_MAX_ACTIVE_RUNTIMES_PER_USER, WORK_MAX_TASKS_GLOBAL, WORK_MAX_TASKS_PER_USER, WORK_NETWORK_NAME, WORK_RUN_LEASE_WAIT_MS, WORK_RUNTIME_DNS, WORK_DOCKER_SOCKET, WORK_TERMINAL_MAX_SESSIONS_PER_TASK, WORK_TERMINAL_IDLE_TIMEOUT_MS, WORK_RUNTIME_IDLE_TIMEOUT_MS, WORK_HOST_WORKSPACES_ENABLED, WORK_HOST_WORKSPACE_ROOTS, WORK_RUNTIME_BACKEND, WORK_K8S_NAMESPACE, WORK_K8S_STORAGE_CLASS, WORK_K8S_WORKSPACE_SIZE, WORK_K8S_POD_READY_TIMEOUT_MS, WORK_K8S_POD_GONE_TIMEOUT_MS, AGENT_CLI_MODELS_ENABLED, TOOLS_ACCESS_MODE, STT_ACCESS_MODE, TTS_ACCESS_MODE, VOICE_MODE_ACCESS_MODE, VOICE_CLONING_ACCESS_MODE, TOOLS_PRIVATE_NETWORK_ALLOWLIST, AGENT_CLI_TIMEOUT_MS, CODEX_OAUTH_MODELS_ENABLED, CODEX_HOME.
Domyślne wartości są jak w tabeli źródłowej: image node:22.22-bookworm@sha256:2d178f2785b96dfbf62a416ca2e40f50e30150b4ff3320d706f0d96e90600eb3, timeout 120000, output 50000, rundy 48, status 1, pamięć 2g, CPU 2, PIDs 256, preview 4173, bind 127.0.0.1, screen 6080, audio 6081, limity 3/2, zadania 500/100, sieć libre-webui-work, lease 60000, terminal 2/900000, idle 0, backend docker, namespace libre-webui-work, PVC 5Gi, Pod 900000/60000, CLI timeout 600000, Codex true, home ~/.codex. W natywnym Docker Engine wdrożenia Compose muszą ustawić WORK_PREVIEW_BIND na osiągalny, niepubliczny interfejs mostka; WORK_DOCKER_PUBLISHED_HOST domyślnie odpowiada w aplikacji wartości WORK_PREVIEW_BIND, a w Compose to host.docker.internal.
Agent CLI/Codex tylko solo; team wymaga AGENT_CLI_MODELS_ENABLED=false, CODEX_OAUTH_MODELS_ENABLED=false. Folder hosta montuje /workspace, odrzuca .ssh, .gnupg, .aws, .config. Modele claude, codex są admin-only.
Sieć używa WORK_NETWORK_NAME, DNS WORK_RUNTIME_DNS; bez ochrony direct IP. Kubernetes work.networkPolicy.blockedEgressCidrs. Terminal używa WORK_DOCKER_SOCKET, potem DOCKER_HOST (unix:///tcp://, docker-compose.socket-proxy.yml), potem /var/run/docker.sock. DOCKER_TLS_VERIFY przy tcp:// blokuje terminal. Narzędzia budżet max(128, WORK_MAX_AGENT_ROUNDS × 8), stan needs_input, output ok. 20 000 znaków.
Compose: DOCKER_GID 0, DOCKER_SOCKET /var/run/docker.sock; team docker-compose.team.work.yml; Helm work.enabled=true. Solo max jedna replika, team wiele. WEBUI_BIND_ADDRESS 127.0.0.1, WEBUI_PORT 8080.
Wykrywanie modeli dostawców
PLUGIN_MODEL_DISCOVERY_TTL_MS 21600000, PLUGIN_MODEL_DISCOVERY_RETRY_MS 600000, PLUGIN_MODEL_DISCOVERY_REFRESH_DEADLINE_MS 3000. Jawne odświeżenie ignoruje interwał.
Klucze providerów
OPENAI_API_KEY, ANTHROPIC_API_KEY, GROQ_API_KEY, GEMINI_API_KEY, MISTRAL_API_KEY, OPENROUTER_API_KEY, KIMI_API_KEY, GITHUB_API_KEY, HUGGINGFACE_API_KEY, ELEVENLABS_API_KEY, COMFYUI_API_KEY.
Klucze środowiskowe tylko dla wbudowanej zaufanej definicji; custom wymaga użytkownika. Klucze wiążą się z trasą. PLUGINS_DIR względny od backendu/source lub wywołującego/pakietu; czyta też backend/plugins; przenieś do $DATA_DIR/plugins, bez symlinków.
Frontend
VITE_API_BASE_URL (domyślnie: proxy deweloperski tego samego pochodzenia lub produkcyjne API), VITE_WS_BASE_URL, VITE_APP_VERSION, VITE_DEMO_MODE, VITE_API_TIMEOUT, VITE_BACKEND_URL, VITE_DEBUG_VERBOSE, VITE_LOG_LEVEL, ELECTRON_BUILD. VITE_WS_BASE_URL absolutne ws:/wss:, bez poświadczeń/query/fragment; Electron file: fallback ws://localhost:3001, przeglądarka wyprowadza bazę z VITE_API_BASE_URL, a potem z pochodzenia przeglądarki — Vite przekierowuje pochodzenie deweloperskie do backendu na porcie 3001.
Skrypty utrzymania
CHANGELOG_AI, CHANGELOG_AI_MODEL, CHANGELOG_AI_TIMEOUT_MS.
CHANGELOG_AI_MODEL=glm-5.2:cloud npm run changelog
CHANGELOG_AI=0 npm run release:minor
Przykład produkcyjny
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