ข้ามไปยังเนื้อหาหลัก

ตัวแปรสภาพแวดล้อม

หน้านี้แสดงตัวแปรสภาพแวดล้อมสำหรับผู้ปฏิบัติงานที่ backend, frontend และสคริปต์บำรุงรักษา Libre WebUI ปัจจุบันอ่าน โดยละเว้น canary ภายในที่ใช้เฉพาะการทดสอบ

เซิร์ฟเวอร์ backend

ตัวแปรค่าเริ่มต้นวัตถุประสงค์
NODE_ENVdevelopmentโหมด runtime
PORT3001 ในการพัฒนา, 8080 ใน productionพอร์ต HTTP ของ backend
TRUST_PROXYไม่ตั้ง (0 ใน Helm)จำนวน hop ของ reverse proxy ที่เชื่อถือเพื่อหาที่อยู่ไคลเอนต์
CORS_ORIGINorigin พัฒนาในเครื่องorigin เบราว์เซอร์ที่อนุญาต คั่นด้วยจุลภาค
SERVE_FRONTENDไม่ตั้งให้ backend เสิร์ฟ frontend ที่ build เมื่อ true
DOCKER_ENVไม่ตั้งเปิดลักษณะการทำงานสำหรับ Docker เมื่อ true
DATA_DIRbackend/data; ~/.libre-webui ใน CLI แบบแพ็กไดเรกทอรีข้อมูลถาวร
PLATFORM_PREFLIGHT_TMP_DIRbackend/temp/preflight; cache ผู้ใช้ใน CLI แบบแพ็กพื้นที่ชั่วคราวสำหรับสำเนาตรวจ DB/WAL ตอนเริ่ม ให้พอสำหรับฐานข้อมูลและ WAL
PLUGIN_UPLOAD_TEMP_DIRlibre-webui-plugin-uploads ใต้ไดเรกทอรีชั่วคราว OSพื้นที่ชั่วคราวสำหรับ plugin ที่กำลังอัปโหลด
PLUGINS_DIR$DATA_DIR/pluginsไดเรกทอรีเขียนได้สำหรับ plugin ที่ติดตั้ง/กำหนดเอง
BASE_URLhttp://localhost:3001URL ฐานสำหรับ callback OAuth เริ่มต้น
LOG_LEVELinfo (warn ในการทดสอบ)ระดับบันทึก backend
LOG_FORMATtextjson เปลี่ยนเป็นบันทึกมีโครงสร้างหนึ่งบรรทัดพร้อมเวลา ID สหสัมพันธ์ และปกปิดข้อมูล
OTEL_EXPORTER_OTLP_ENDPOINTไม่ตั้งส่งออก telemetry JSON OTLP/HTTP แบบเลือก ไม่ตั้งหมายถึงไม่มี telemetry ออกจากโปรเซส
OTEL_EXPORTER_OTLP_HEADERSไม่ตั้งheader key=value คั่นจุลภาคที่ส่งไปตัวเก็บ OTLP
OTEL_SERVICE_NAMElibre-webuiแอตทริบิวต์ทรัพยากร service.name บน telemetry ที่ส่งออก
WEBUI_HOSTloopback; 0.0.0.0 ใน Dockerที่อยู่รับฟัง HTTP
OPEN_BROWSERtrue เมื่อเสิร์ฟ frontendตั้ง false เพื่อไม่เปิดเบราว์เซอร์อัตโนมัติ
FULL_DOCUMENT_CONTEXT_MAX_TOKENS32000ตัวป้องกัน token สำหรับโหมดบริบทเอกสารเต็มต่อแชต (1000-2000000)
GALLERY_RETENTION_DAYSไม่ตั้ง (เก็บตลอด)ลบสื่อในคลังที่เก่ากว่าจำนวนวันนี้ผ่านการกวาดของตัวจัดกำหนดการ
RECOVERY_DRILL_INTERVAL_HOURSไม่ตั้ง (ปิดการฝึก)รันการฝึกกู้คืนที่ตรวจแล้วอัตโนมัติทุก N ชั่วโมง (โปรไฟล์ solo)
RECOVERY_DRILL_HISTORY60จำนวนประวัติการฝึกกู้คืนที่เก็บ

การรันจากต้นฉบับยึดค่า DATA_DIR, PLUGINS_DIR และ PLATFORM_PREFLIGHT_TMP_DIR แบบสัมพัทธ์ที่ไดเรกทอรี backend โดยไม่ขึ้นกับไดเรกทอรี shell เมื่อไม่ตั้ง DATA_DIR หรือใช้ตัวอย่างใหม่ DATA_DIR=./data คำสั่งพื้นที่ทำงาน root และ backend จะใช้ backend/data เพื่อความเข้ากันได้ ค่าที่มี DATA_DIR=./backend/data ยังเลือก backend/backend/data เปลี่ยนเฉพาะระหว่างการสำรองและย้ายที่หยุดระบบ โปรไฟล์ไม่ตั้งยังใช้ backend/backend/data หากเป็นคลังถาวรเดียว หากทั้งสองตำแหน่งมีสถานะและไม่เลือกเส้นทาง การเริ่มจะปฏิเสธแทนการเดา คัดลอก หรือรวม

ตัวเปิด npx, npm ส่วนกลาง และ Homebrew โต้ตอบจะเก็บข้อมูลใน ~/.libre-webui ค่า DATA_DIR สัมพัทธ์ที่ระบุจะคำนวณจากไดเรกทอรีผู้เรียกและแปลงเป็นเส้นทางสัมบูรณ์ก่อน backend เริ่ม PLUGINS_DIR สัมพัทธ์ใช้กฎเดียวกัน เมื่อไม่ตั้ง plugin เขียนได้อยู่ใน $DATA_DIR/plugins พื้นที่ตรวจเริ่มต้นเป็น cache ผู้ใช้เขียนได้ข้างนอกข้อมูล: ~/Library/Caches/libre-webui บน macOS, %LOCALAPPDATA%\libre-webui บน Windows หรือ ${XDG_CACHE_HOME:-~/.cache}/libre-webui บนระบบอื่น บริการ Homebrew ตรึงไดเรกทอรี home เดิมและใช้ var/libre-webui/preflight ตั้ง PLATFORM_PREFLIGHT_TMP_DIR เมื่อ cache ไม่พอฐานข้อมูลกับ WAL การติดตั้ง Docker และ Helm ใช้เส้นทางสัมบูรณ์ /app/backend/data และ /app/backend/temp/preflight บนเมานต์แยก

รากฐานแพลตฟอร์ม

โปรไฟล์ solo เริ่มต้นใช้ SQLite, blob ในเครื่องเข้ารหัส, vector ฝังเข้ารหัส, การประสานในเครื่อง และ worker ถาวรในตัว โปรไฟล์ team ใช้ PostgreSQL, blob ส่วนตัวที่เข้ากับ S3, PGVector, Redis และ worker ภายนอก การกำหนด team ปฏิเสธอย่างปลอดภัย โดยต้องเลือก dependency ร่วมทั้งหมดพร้อมกัน

ตัวแปรค่าเริ่มต้นวัตถุประสงค์
LIBRE_PLATFORM_MODEsoloเลือกโปรไฟล์ solo หรือ team ที่สอดคล้อง
DATABASE_BACKENDsqliteเลือก sqlite หรือ postgres
DATABASE_URLไม่ตั้งURL เชื่อม PostgreSQL ต้องมีเมื่อใช้ postgres
DATABASE_SSL_MODEverify-fullนโยบาย TLS PostgreSQL: disable, require หรือ verify-full ที่ตรวจชื่อโฮสต์
POSTGRES_MIGRATION_MODEapplyรันการย้ายใต้ leader lock หรือใช้ validate เพื่อตรวจ schema แบบอ่านอย่างเดียว
POSTGRES_POOL_MAX10การเชื่อม PostgreSQL สูงสุดต่อโปรเซสแอปหรือ worker (1-100)
POSTGRES_CONNECT_TIMEOUT_MS5000timeout เชื่อม PostgreSQL (1-60000 ms)
POSTGRES_IDLE_TIMEOUT_MS30000timeout การเชื่อม PostgreSQL ว่าง (1-600000 ms)
POSTGRES_STATEMENT_TIMEOUT_MS30000timeout คำสั่ง PostgreSQL (1-600000 ms)
POSTGRES_MIGRATION_LOCK_TIMEOUT_MS60000เวลารอ migration leader lock (1-600000 ms)
BLOB_STORE_BACKENDlocalเลือกพื้นที่ local เข้ารหัสหรือ s3 ส่วนตัว
VECTOR_STORE_BACKENDembedded กับ SQLiteเลือก vector embedded เข้ารหัสหรือ pgvector
COORDINATION_BACKENDlocal ใน solo; redis ใน teamเลือกการประสานในโปรเซสหรือ Redis
REDIS_URLไม่ตั้งURL redis: หรือ rediss: ต้องมีเมื่อประสานด้วย Redis
REDIS_KEY_PREFIXlibrenamespace 1-64 อักขระสำหรับคีย์ประสาน Libre
REDIS_CONNECT_TIMEOUT_MS5000timeout เชื่อม Redis ครั้งแรก สูงสุด 60 วินาที
JOB_WORKER_MODEembedded ใน solo; external ใน teamรันตัวจัดการในแอปหรือ worker ร่วมแยก
RESOURCE_LEASE_TTL_MS30000TTL lease สำหรับเจ้าของทรัพยากรงานถาวร (5000-300000; นอกช่วงเริ่มไม่สำเร็จ)
JOB_WORKER_CONCURRENCY4งานถาวรที่ worker หนึ่งรันพร้อมกัน (1-32)
CHAT_STREAM_EVENT_RETENTION_HOURS24ชั่วโมงเก็บเหตุการณ์ส่วน stream แชตก่อนกวาดรายชั่วโมง
PLATFORM_EVENT_RETENTION_DAYS30วันเก็บเหตุการณ์ถาวรก่อนกวาดรายชั่วโมง
PLATFORM_JOB_RETENTION_DAYS30วันเก็บงานนอกวงจรชีวิตที่เสร็จก่อนกวาดรายชั่วโมง
LIBRE_SKIP_STARTUP_INTEGRITY_SCANไม่ตั้ง1 ข้ามสแกน ciphertext รุ่นเก่าเชิงลึกครั้งถัดไป (ปกติ cache ต่อรุ่น schema)
STORAGE_ENCRYPTION_KEYSไม่ตั้งแผนที่คีย์ JSON ลับ ต้องมี legacy ตรงกับ ENCRYPTION_KEY
STORAGE_ENCRYPTION_ACTIVE_KEY_IDไม่ตั้งID คีย์สำหรับเขียน blob ในเครื่องและ vector ฝังใหม่
BLOB_QUOTA_BYTES_PER_USER10737418240ไบต์ blob ข้อความธรรมดาถาวรสูงสุดต่อเจ้าของ
BLOB_QUOTA_RESERVATION_TTL_MS3600000อายุการจองโควตา streaming ที่ละทิ้ง (อย่างน้อย 60000 ms)
S3_BUCKETไม่ตั้งbucket ส่วนตัวที่เข้ากับ S3 ต้องมีเมื่อใช้ s3
S3_REGIONไม่ตั้งภูมิภาค S3 ต้องมีเมื่อใช้ s3
S3_ENDPOINTค่าเริ่มต้นผู้ให้บริการendpoint HTTP(S) สัมบูรณ์ที่เลือกได้สำหรับ MinIO หรือบริการอื่น
S3_ACCESS_KEY_IDห่วงโซ่ข้อมูล SDKคีย์เข้าถึง S3 แบบระบุที่เลือกได้
S3_SECRET_ACCESS_KEYห่วงโซ่ข้อมูล SDKต้องมีเมื่อตั้งคีย์เข้าถึงชัดเจน
S3_SESSION_TOKENไม่ตั้งtoken ที่เลือกได้พร้อมข้อมูล S3 ชัดเจน
S3_FORCE_PATH_STYLEfalseตั้ง true สำหรับบริการที่ต้องใช้อ้างที่อยู่แบบเส้นทาง
S3_BLOB_PREFIXlibre/blobsคำนำหน้าคีย์ bucket แบบทึบที่ Libre เป็นเจ้าของ

เมื่อไม่มีแผนที่คีย์แบบมีเวอร์ชัน adapter จะใช้ ENCRYPTION_KEY เดิมเป็น ID legacy; หากไม่มีด้วยจะอ่าน ${DATA_DIR}/.encryption_key เดิมโดยไม่สร้างหรือแก้ ค่าที่ระบุและไฟล์ถาวรต้องตรง หากเพิ่มแผนที่เมื่อมีคีย์เก่า ให้เก็บคีย์นั้นใต้ ID legacy จนเขียนหรือห่อออบเจ็กต์และ vector ใหม่ทั้งหมดพร้อมตรวจ ความขัดแย้ง สิทธิ์ไฟล์ไม่ปลอดภัย symlink และคีย์ที่ขาดจะถูกปฏิเสธ

Redis ใช้ประสาน ไม่ใช่พื้นที่ถาวรมาตรฐาน การเลือกเพียง Redis ไม่ทำให้ SQLite ไฟล์ในเครื่อง หรือสถานะของโปรเซสปลอดภัยข้าม replica ในโหมด team ขีดจำกัด HTTP การเชื่อมแชต/WebSocket งานผู้ให้บริการ STT/TTS/เสียง การนำเข้าคลัง และ terminal Work ใช้การรับร่วมผ่าน Redis ความจุใช้รวมทุก replica ข้อผิดพลาดการรับหรือการต่อสิทธิ์ส่ง 503 หรือยกเลิก Libre ไม่กลับไปตัวนับในเครื่องแยก ดู รากฐานแพลตฟอร์ม

โปรไฟล์ Compose team และ chart Helm ส่งตัวเลือกกับค่าปรับทั้งหมดไปทั้งแอปและ worker ภายนอก ใน Helm ตัวเลือกไม่ลับอยู่ใต้ env; ตั้ง secrets.redisUrl, secrets.databaseUrl และ secrets.storageEncryptionKeys สำหรับการเชื่อมหรือคีย์ ขีดจำกัด pool PostgreSQL ต่อโปรเซส ให้จัดอย่างน้อย (replicaCount + worker.replicaCount) * POSTGRES_POOL_MAX บวกส่วนเผื่อ รักษา DATABASE_SSL_MODE=verify-full สำหรับ PostgreSQL จัดการ/ระยะไกล เฉพาะ Compose team ใช้ disable เพราะ listener แยกในเครือข่ายส่วนตัว Helm team ต้องมี secrets.jwtSecret เสถียรเดียวและเมานต์ Secret เดียวทุก Pod ไม่เช่นนั้นจะสร้างวัสดุลงนามเฉพาะโปรเซส S3 รับคีย์ทึบและ ciphertext โดยไม่เก็บ URL bucket/ผู้ให้บริการในเมทาดาทา

คลัง solo/team รวมเก็บค่าพูลและ timeout PostgreSQL, timeout Redis, โควตา blob ทั้งสอง ตัวเลือกแพลตฟอร์ม และที่อยู่ S3 ในการกำหนดค่าปกป้องที่ลงนามและเข้ารหัส การกู้สะอาดจึงเผยค่าปฏิบัติที่ต้องใช้สร้างการติดตั้งตรงโดยไม่ใส่ในเมทาดาทาข้อความธรรมดา

คู่แอป/worker Compose และ Helm ได้ค่า OLLAMA_BASE_URL, OLLAMA_TIMEOUT, OLLAMA_LONG_OPERATION_TIMEOUT และ OLLAMA_MAX_CONTEXT ที่แปลงตรงกัน คำขอ embedding เอกสาร แชตถาวร และ Work รันใน worker ค่าจึงห้ามต่าง จุดเข้าเซิร์ฟเวอร์แปลงค่าตัวเลขเป็นจำนวนเต็มบวกฐานสิบครบก่อนสร้าง/เชื่อมสถานะ ค่าเช่น 300000ms, เลขยกกำลัง/hex, นอกช่วง หรือ timeout ยาวต่ำกว่ามาตรฐานทำให้เริ่มล้มเหลว

Helm จำกัด TRUST_PROXY เป็นจำนวน hop เต็ม 0 ถึง 16 และส่งเฉพาะ Pod HTTP ใช้ 0 สำหรับทราฟฟิกตรง ตั้งจำนวนคงที่ตรงสำหรับโซ่ ingress/load balancer ห้ามใช้ true ไม่จำกัด จำนวนผิดจะรวมไคลเอนต์ใต้ที่อยู่ proxy สำหรับขีดจำกัดร่วมหรือเชื่อที่อยู่จากไคลเอนต์

ความเข้ากันได้ schema PostgreSQL ต้องตรงเวอร์ชัน แอปและ worker Helm ใช้ Recreate; ระบายและจบ Pod เก่าทั้งหมดก่อนอัปเกรด team แล้วให้โปรเซสใหม่หนึ่งย้ายใต้ leader lock ห้ามรัน binary หลายเวอร์ชันหรืออ้างว่าไม่มี downtime rollback คือกู้คลัง team ก่อนอัปเกรดไปยัง PostgreSQL/S3 สะอาดก่อนเริ่ม binary เก่าตรง

แอป team active ต้องมี worker.replicaCount >= 1; Helm ปฏิเสธแอปสดไม่มี worker แทนรอ readiness ล้มเหลว ตั้งทั้งแอปและ worker เป็นศูนย์เพื่อพักเต็ม แอปศูนย์แต่ worker บวกคือโหมดระบาย/กู้เฉพาะ worker และยังประมวลงานคิวโดยไม่เสิร์ฟเว็บ

ตัวช่วยสำรองข้อมูลส่วนตัว

ตัวแปรเหล่านี้กำหนด deploy/private/libre-webui-backup และสคริปต์บำรุงรักษาเป็นผู้อ่าน ไม่ใช่โปรเซสแอป:

ตัวแปรค่าเริ่มต้นวัตถุประสงค์
LIBRE_WEBUI_STACK_DIR/opt/libre-webuiไดเรกทอรีที่มีไฟล์ Compose ส่วนตัว
LIBRE_WEBUI_BACKUP_DIR/var/backups/libre-webuiไดเรกทอรีปกป้องสำหรับชุดสำรองและไฟล์ล็อก
LIBRE_WEBUI_BACKUP_RETENTION_DAYS14อายุที่ชุดสำรองเสร็จจะถูกลบ
LIBRE_WEBUI_CONTAINER_NAMElibre-webuiคอนเทนเนอร์แอปที่ติดตั้งซึ่งต้องตรวจ
LIBRE_WEBUI_BACKUP_KEY_DIR/etc/libre-webui/backup-keysไดเรกทอรีคีย์เข้ารหัสคลังและลงนามส่วนตัว
LIBRE_WEBUI_RESTORE_IMAGEต้องระบุสำหรับกู้คืนID หรือ digest image Libre ที่ตรวจแล้วและเปลี่ยนไม่ได้
LIBRE_WEBUI_RESTORE_CONFIG_DIRเส้นทางต่อ volume ใต้ /etc/libre-webui/restoredไดเรกทอรีใหม่สำหรับการกำหนดค่าที่กู้

unit systemd โหลดค่าทับจากไฟล์ทางเลือกของ root /etc/libre-webui/backup.env ตั้งโหมด 0600 กำหนดไดเรกทอรี stack การเก็บ ชื่อคอนเทนเนอร์ และไดเรกทอรีคีย์ได้ตรง sandbox ระบบไฟล์อนุญาตเขียนใต้ไดเรกทอรีสำรองเริ่มต้นเท่านั้น LIBRE_WEBUI_BACKUP_DIR แบบกำหนดเองต้องมีไดเรกทอรีตรงที่สร้างไว้ใน drop-in ReadWritePaths= ดู การติดตั้งระยะไกลส่วนตัว

การยืนยันตัวตนและความปลอดภัย

ตัวแปรค่าเริ่มต้นวัตถุประสงค์
ENABLE_SIGNUPfalseอนุญาตลงทะเบียนหลังผู้ดูแลในเครื่องคนแรก
JWT_SECRETสร้าง/fallback ในการพัฒนาข้อมูลลับลงนาม JWT ให้ตั้งใน production
JWT_EXPIRES_IN7dอายุ token เซสชัน
ENCRYPTION_KEYสร้างอัตโนมัติคีย์ hex 64 อักขระสำหรับค่าที่เข้ารหัส
DEBUG_ENCRYPTIONไม่ตั้งบันทึก debug การเข้ารหัสเมื่อกำหนด
TURNSTILE_SITE_KEYไม่ตั้งคีย์ไซต์ Cloudflare Turnstile สำหรับเข้าสู่ระบบ/สมัคร
TURNSTILE_SECRET_KEYไม่ตั้งคีย์ลับ Turnstile สำหรับ backend ตรวจ
TURNSTILE_EXPECTED_HOSTNAMEชื่อโฮสต์จาก BASE_URLชื่อโฮสต์ที่ต้องมีในคำตอบตรวจ Cloudflare
MFA_REQUIRED_MODEไม่ตั้ง (สวิตช์ admin, optional)ตรึงนโยบายสองปัจจัยเป็น optional หรือ required
WEBAUTHN_RP_IDชื่อโฮสต์คำขอID relying party คงที่สำหรับ passkey หลังหลายชื่อโฮสต์
VAPID_PUBLIC_KEYสร้างและเก็บเข้ารหัสตรึงคีย์สาธารณะ VAPID Web Push
VAPID_PRIVATE_KEYสร้างและเก็บเข้ารหัสตรึงคีย์ส่วนตัว VAPID Web Push
VAPID_SUBJECTmailto:admin@localhostข้อมูลติดต่อในสิทธิ์ Web Push ที่ลงนาม

Turnstile เปิดเมื่อมีคีย์ทั้งสองเท่านั้น

ENABLE_SIGNUP=false ยังอนุญาตผู้ดูแลในเครื่องคนแรกในฐานข้อมูลว่าง แล้วบล็อกบัญชีเพิ่มเติม ปกป้องเส้นทางเริ่มต้นที่เข้าถึงระยะไกลด้วยขอบเขตตัวตนภายนอกก่อนเริ่มครั้งแรก

ทุก JWT ผูกกับเซสชันฝั่งเซิร์ฟเวอร์ (claim sid) การออกหรือถอนจาก การตั้งค่า → เซสชัน จึงทำให้ token ใช้ไม่ได้ทันทีทุก replica และปิด WebSocket สด กำหนดการเก็บบันทึกความปลอดภัยได้:

ตัวแปรค่าเริ่มต้นวัตถุประสงค์
AUDIT_RETENTION_DAYS180จำนวนวันที่เก็บแถวในบันทึกเหตุการณ์ความปลอดภัย

การลงชื่อเข้าใช้ครั้งเดียว OIDC ทั่วไป

ผู้ให้บริการ OpenID Connect ที่มีเอกสารค้นหาใช้เข้าสู่ระบบได้ ขั้นตอนใช้ PKCE (S256), สถานะ CSRF และ nonce ที่ตรวจใน token ID ซึ่งตรวจลายเซ็น ตัวตนผูกกับ claim sub ที่เสถียร

ตัวแปรค่าเริ่มต้นวัตถุประสงค์
OIDC_ISSUER_URLไม่ตั้งURL ฐานผู้ออก ดึง discovery จาก <issuer>/.well-known/openid-configuration
OIDC_CLIENT_IDไม่ตั้งID ไคลเอนต์ OAuth ที่ลงทะเบียนกับผู้ให้บริการ
OIDC_CLIENT_SECRETไม่ตั้งข้อมูลลับไคลเอนต์ OAuth
OIDC_DISPLAY_NAMESingle Sign-Onป้ายบนปุ่มเข้าสู่ระบบ
OIDC_SCOPESopenid profile emailขอบเขตที่ร้องขอ
OIDC_CALLBACK_URLBASE_URL + เส้นทาง callback OIDCURI เปลี่ยนทางที่ลงทะเบียน
OIDC_ALLOWED_EMAIL_DOMAINSไม่ตั้งรายการจุลภาค เมื่อกำหนดต้องมีอีเมลยืนยันในโดเมนหนึ่ง
OIDC_GROUP_CLAIMgroupsclaim token ID ที่มีชื่อกลุ่ม
OIDC_ADMIN_GROUPSไม่ตั้งรายการจุลภาค เมื่อกำหนดบทบาท admin ตามสมาชิก claim ทุกครั้ง
OIDC_SYNC_GROUPSfalsetrue ทำสมาชิกกลุ่ม Libre ให้ตรง claim ทุกครั้ง

OIDC เปิดเมื่อมี URL ผู้ออก ID และข้อมูลลับไคลเอนต์ครบ อีเมลที่บัญชีในเครื่องซึ่งไม่ผูกใช้อยู่จะถูกปฏิเสธแทนการรวมเงียบ ๆ และการสร้างบัญชียังเคารพ ENABLE_SIGNUP

ปรับการรับ WebSocket แชตได้โดยไม่ทำให้การยืนยันอ่อนลง:

ตัวแปรค่าเริ่มต้นวัตถุประสงค์
CHAT_WS_MAX_PAYLOAD_BYTES10 MiBขนาดข้อความ WebSocket สูงสุดที่รับ
CHAT_WS_MAX_MESSAGES_PER_MINUTE120เพดานข้อความ WebSocket ต่อการเชื่อม
CHAT_WS_MAX_ACTIVE_GENERATIONS_PER_USER4การสร้างของผู้ให้บริการที่อนุญาตต่อบัญชี
CHAT_WS_MAX_CONNECTIONS_PER_USER5socket ยืนยันพร้อมกันต่อบัญชี
WEBSOCKET_TICKET_TTL_MS30000อายุบัตร Chat/Work ใช้ครั้งเดียว สูงสุด 60 วินาที

เบราว์เซอร์แลก header Authorization เป็นบัตรทึบและใส่เพียงค่าอายุสั้นใน URL อัปเกรด WebSocket บัตรใช้ครั้งเดียว ผูกโพรโทคอล/เซสชัน และเก็บเป็น hash ทำให้ token ถาวรไม่เข้าบันทึก reverse proxy เมื่อกำหนด CORS_ORIGIN หรือ BASE_URL การอัปเกรดที่มี Origin ต้องตรง ตั้งอย่างน้อยหนึ่งในการติดตั้งระยะไกล หากไม่มีทั้งคู่ตัวกรองจะอนุญาตเพื่อพัฒนา การอัปเกรดไม่มี origin รองรับสำหรับ Electron และไคลเอนต์อื่นโดยตั้งใจ แต่ยังต้องมีบัตรใช้ครั้งเดียวและตรวจบัญชี สิทธิ์ Work และงานเหมือนกัน ให้ถือบัตรเป็นขอบเขตยืนยันและจำกัดไคลเอนต์อื่นด้วย TLS ไฟร์วอลล์ และ reverse proxy

OAuth

ตัวแปรวัตถุประสงค์
GITHUB_CLIENT_IDID ไคลเอนต์ GitHub OAuth
GITHUB_CLIENT_SECRETข้อมูลลับไคลเอนต์ GitHub OAuth
GITHUB_CALLBACK_URLURL callback GitHub ที่แทน
HUGGINGFACE_CLIENT_IDID ไคลเอนต์ Hugging Face OAuth
HUGGINGFACE_CLIENT_SECRETข้อมูลลับ Hugging Face OAuth
HUGGINGFACE_CALLBACK_URLURL callback Hugging Face ที่แทน

หากไม่ตั้ง URL callback Libre WebUI สร้างค่าเริ่มต้นจาก BASE_URL

Ollama

ตัวแปรค่าเริ่มต้นวัตถุประสงค์
OLLAMA_BASE_URLhttp://localhost:11434URL ฐาน API Ollama
OLLAMA_TIMEOUT300000timeout คำขอ Ollama มาตรฐาน (1,000-3,600,000 ms)
OLLAMA_LONG_OPERATION_TIMEOUT900000timeout งานยาวและไม่สั้นกว่า OLLAMA_TIMEOUT
OLLAMA_MAX_CONTEXT32768บริบทโมเดลสูงสุดที่รับอัตโนมัติ (128-2,097,152 token)

การค้นหาเว็บ

ตัวแปรค่าเริ่มต้นวัตถุประสงค์
SEARXNG_URLไม่ตั้งendpoint SearXNG เริ่มต้นสำหรับค้นหาเว็บ ผู้ดูแลยังต้องเปิดใน การตั้งค่า > ค้นหา

Libre Claw

ตัวแปรค่าเริ่มต้นวัตถุประสงค์
LIBRE_CLAW_BASE_URLhttp://127.0.0.1:8766URL daemon Libre Claw ที่เลือกได้
LIBRE_CLAW_TIMEOUT_MS30000timeout คำขอ HTTP Libre Claw

runtime ของ Work

ตัวแปรเหล่านี้กำหนดการทำงาน Work บนเครื่องหรือ cluster Kubernetes ที่รัน backend Libre WebUI Docker เป็น runtime เริ่มต้น chart Helm เลือก Kubernetes เมื่อ work.enabled=true

ตัวแปรค่าเริ่มต้นวัตถุประสงค์
WORK_RUNTIME_IMAGEnode:22.22-bookworm@sha256:2d178f2785b96dfbf62a416ca2e40f50e30150b4ff3320d706f0d96e90600eb3image ที่ตรึงสำหรับ sandbox Work
WORK_DOCKER_COMMANDdockerโปรแกรม CLI backend Docker ที่โปรเซสใช้ได้
WORK_COMMAND_TIMEOUT_MS120000timeout เริ่มต้น เครื่องมือขอได้สูงสุด 600000 ms
WORK_MAX_OUTPUT_CHARS50000ขีดจำกัด stdout/stderr ที่จับ ต่อ stream
WORK_MAX_AGENT_ROUNDS48งบประมาณรอบโมเดล/เครื่องมือต่อการทำงาน
WORK_STATUS_BLURB_MODEL1ตั้ง 0 เพื่อข้ามคำขอโมเดลเขียนสถานะเอเจนต์หลังงาน
WORK_MEMORY_LIMIT2gขีดจำกัดหน่วยความจำต่อคอนเทนเนอร์
WORK_CPU_LIMIT2ขีดจำกัด CPU ต่อคอนเทนเนอร์
WORK_PIDS_LIMIT256ขีดจำกัดโปรเซสต่อคอนเทนเนอร์
WORK_PREVIEW_PORT4173พอร์ตเซิร์ฟเวอร์ตัวอย่างในคอนเทนเนอร์งาน
WORK_PREVIEW_BIND127.0.0.1อินเทอร์เฟซโฮสต์ที่เผยแพร่พอร์ตตัวอย่าง การติดตั้ง Compose บน Docker Engine แบบเนทีฟต้องใช้อินเทอร์เฟซ bridge ที่ไม่เปิดสาธารณะแต่เข้าถึงได้
WORK_DOCKER_PUBLISHED_HOSTค่าเริ่มต้นของแอป: เหมือน WORK_PREVIEW_BIND; ค่าเริ่มต้นของ Compose: host.docker.internalhost/IP ฝั่ง backend สำหรับพอร์ตตัวอย่าง หน้าจอ และเสียงจาก Docker
WORK_COMPUTER_SCREEN_PORT6080พอร์ตสะพานหน้าจอ Work Computer ใน sandbox GUI
WORK_COMPUTER_AUDIO_PORT6081พอร์ตสะพานเสียง Work Computer ใน sandbox GUI
WORK_MAX_ACTIVE_RUNTIMES_GLOBAL3งานที่ใช้ runtime พร้อมกันทั้งอินสแตนซ์
WORK_MAX_ACTIVE_RUNTIMES_PER_USER2งานที่ใช้ runtime พร้อมกันต่อผู้ใช้
WORK_MAX_TASKS_GLOBAL500งาน Work ถาวรสูงสุดทั้งอินสแตนซ์
WORK_MAX_TASKS_PER_USER100งาน Work ถาวรสูงสุดต่อผู้ดูแล
WORK_NETWORK_NAMElibre-webui-workเครือข่าย bridge sandbox สำหรับงานมีเครือข่าย
WORK_RUN_LEASE_WAIT_MS60000เวลารอ lease runtime ร่วมก่อนรายงาน replica ขัดแย้ง
WORK_RUNTIME_DNSไม่ตั้งIP resolver คั่นจุลภาคที่บังคับงานมีเครือข่าย
WORK_DOCKER_SOCKETDOCKER_HOST หาก unix:// หรือ tcp://, มิฉะนั้น /var/run/docker.sockendpoint Docker Engine สำหรับ terminal และการวินิจฉัย
WORK_TERMINAL_MAX_SESSIONS_PER_TASK2terminal เบราว์เซอร์พร้อมกันต่องาน
WORK_TERMINAL_IDLE_TIMEOUT_MS900000timeout ว่างก่อนปิด terminal
WORK_RUNTIME_IDLE_TIMEOUT_MS0 (ปิด)หยุด sandbox หลังไม่มีกิจกรรม
WORK_HOST_WORKSPACES_ENABLEDfalseอนุญาตใช้โฟลเดอร์โฮสต์แทน volume
WORK_HOST_WORKSPACE_ROOTSไดเรกทอรี home ของผู้ใช้เซิร์ฟเวอร์root คั่น : ที่พื้นที่โฮสต์ต้องอยู่ภายใน
WORK_RUNTIME_BACKENDdockerbackend sandbox: docker หรือ kubernetes
WORK_K8S_NAMESPACElibre-webui-worknamespace ที่เก็บ Pod/PVC sandbox
WORK_K8S_STORAGE_CLASSค่าเริ่มต้น clusterStorageClass สำหรับ PVC พื้นที่ทำงาน
WORK_K8S_WORKSPACE_SIZE5Giขนาด PVC ต่องาน (โควตาดิสก์จริง)
WORK_K8S_POD_READY_TIMEOUT_MS900000รอ Pod sandbox เป็น Running
WORK_K8S_POD_GONE_TIMEOUT_MS60000รอ Pod ที่ลบหายไป
AGENT_CLI_MODELS_ENABLEDไม่ตั้ง (สวิตช์ admin, ปิด)ตรึงฟีเจอร์เอเจนต์ หรือให้สวิตช์ผู้ดูแลกำหนด
TOOLS_ACCESS_MODEไม่ตั้ง (เฉพาะ admin)ตรึงเครื่องมือเป็น admins หรือ all-users
STT_ACCESS_MODEไม่ตั้ง (ทุกคน)ตรึงเสียงเป็นข้อความเป็น admins หรือ all-users
TTS_ACCESS_MODEไม่ตั้ง (ทุกคน)ตรึงข้อความเป็นเสียงเป็น admins หรือ all-users
VOICE_MODE_ACCESS_MODEไม่ตั้ง (ทุกคน)ตรึงโหมดเสียงราบรื่นเป็น admins หรือ all-users
VOICE_CLONING_ACCESS_MODEไม่ตั้ง (ทุกคน)ตรึงการโคลนเสียงเป็น admins หรือ all-users
TOOLS_PRIVATE_NETWORK_ALLOWLISTไม่ตั้งชื่อโฮสต์ตรงที่เครื่องมือ/webhook แปลงเป็นที่อยู่ส่วนตัวได้
AGENT_CLI_TIMEOUT_MS600000เวลาที่ CLI เอเจนต์รันก่อนถูกหยุด
CODEX_OAUTH_MODELS_ENABLEDtrueเสนอผู้ให้บริการ Codex (ChatGPT) แก่ admin
CODEX_HOME~/.codexตำแหน่งอ่านการเข้าสู่ระบบ Codex (auth.json)

binary CLI เอเจนต์และข้อมูล Codex OAuth อยู่เฉพาะ node รองรับเฉพาะโปรเซส solo ที่การค้นหาและดำเนินเห็นระบบไฟล์/สภาพแวดล้อมเดียว โหมด team ทำงานแชตถาวรใน worker ภายนอก จึงต้องมี AGENT_CLI_MODELS_ENABLED=false และ CODEX_OAUTH_MODELS_ENABLED=false; การเริ่มปฏิเสธค่าอื่นแทนการประกาศผู้ให้บริการที่อาจมีแค่ replica แอป ให้ใช้ Ollama หรือ plugin ที่ข้อมูลและเส้นทางเก็บใน PostgreSQL ร่วมหรือส่งเหมือนกันทุกแอป/worker

บน backend Docker พื้นที่โฮสต์ bind-mount ไดเรกทอรีจริงที่ /workspace งานจึงอ่านเขียนตรงแทน volume ของตน Kubernetes ปฏิเสธโฟลเดอร์โฮสต์ นี่ลด sandbox Docker โดยตั้งใจ ให้ปิด WORK_HOST_WORKSPACES_ENABLED และจำกัด WORK_HOST_WORKSPACE_ROOTS ให้แคบ เส้นทางจะแปลง symlink ก่อนตรวจ และโฟลเดอร์ .ssh, .gnupg, .aws, .config ถูกปฏิเสธ

โมเดล CLI เอเจนต์นำเอเจนต์เขียนโค้ดที่ติดตั้ง (claude, codex) เป็นโมเดลแชตที่เลือกได้ เอเจนต์สมาชิกจึงตอบได้โดยไม่มีคีย์ API เฉพาะผู้ดูแลเห็น CLI รันเป็นผู้ใช้เซิร์ฟเวอร์ Libre WebUI และสืบทอดข้อมูลเอเจนต์ ให้ถือเท่ากับให้สิทธิ์ shell

บน Docker งาน Work ที่มีเครือข่ายต่อ bridge WORK_NETWORK_NAME ที่จัดการ ซึ่งปิดการสื่อสารระหว่างคอนเทนเนอร์เพื่อไม่ให้ sandbox ถึงกันหรือคอนเทนเนอร์การติดตั้ง WORK_RUNTIME_DNS เป็นจุดนโยบาย egress Docker ให้ชี้ resolver กรองเพื่อใช้รายการอนุญาต/ปฏิเสธตามชื่อ ค่าที่ไม่ใช่ IPv4/IPv6 ถูกปฏิเสธและบันทึก การกรอง DNS ไม่จำกัด egress IP ตรง ให้เพิ่มไฟร์วอลล์โฮสต์เมื่อจำเป็น backend Kubernetes ใช้ NetworkPolicy ปฏิเสธเริ่มต้นและ work.networkPolicy.blockedEgressCidrs

บน Docker terminal และการวินิจฉัยสื่อสาร API Docker Engine ตรง ใช้ WORK_DOCKER_SOCKET หรือ DOCKER_HOST ซึ่งเป็น socket unix:// หรือ endpoint tcp:// HTTP ธรรมดาเช่น proxy socket (ดู docker-compose.socket-proxy.yml) มิฉะนั้น /var/run/docker.sock หากไคลเอนต์ใช้ DOCKER_HOST ไม่ได้ (ssh:// หรือ tcp:// กับ DOCKER_TLS_VERIFY) จะรายงาน terminal/วินิจฉัยไม่พร้อม ส่วน Work อื่นยังรันผ่าน CLI Docker บน Kubernetes terminal ใช้ทรัพยากรย่อย exec Pod ไม่ใช้ Docker

Work อ่านค่าเมื่อ backend เริ่ม พอร์ตตัวอย่างอยู่ภายในคอนเทนเนอร์ Libre WebUI เผยแพร่ไปพอร์ต loopback แบบไดนามิกแทนทุกอินเทอร์เฟซ

ตรึง image runtime ที่เวอร์ชัน/digest ตรวจแล้ว การเพิ่มพร้อมกันหรือทรัพยากรเพิ่มความจุที่งานอัตโนมัติใช้ WORK_MAX_AGENT_ROUNDS ใช้เท่ากับ Ollama และ plugin ไม่มีขีดต่ำเฉพาะ plugin งบความปลอดภัยคือ max(128, WORK_MAX_AGENT_ROUNDS × 8) เมื่อใช้หมด Work ขอส่งต่อสุดท้ายแบบไม่มีเครื่องมือและจบ needs_input แทนข้อผิดพลาดดิบ งานต่อไปอยู่ในพื้นที่ถาวรเดิม เอาต์พุตเครื่องมือที่เก็บจำกัดราว 20,000 อักขระพร้อมเครื่องหมายตัด

ตัวแปรต่อไปปรับ runtime Work ที่เข้าถึงได้ การติดตั้ง Compose อินสแตนซ์เดียวเปิดโดยค่าเริ่มต้น image มี CLI Docker และไฟล์ Compose เมานต์ socket โฮสต์ ตัวแปรระดับ Compose สองค่าควบคุม:

ตัวแปรค่าเริ่มต้นวัตถุประสงค์
DOCKER_GID0ID กลุ่ม socket โฮสต์ที่เพิ่มให้ผู้ใช้คอนเทนเนอร์
DOCKER_SOCKET/var/run/docker.sockเส้นทางโฮสต์ socket ที่เมานต์

DOCKER_GID ต้องเป็นกลุ่ม socket ที่เห็นในคอนเทนเนอร์ โฮสต์ macOS รายงานต่าง Compose team ฐานไม่เมานต์ socket และ Work Docker ไม่พร้อมจนเพิ่ม docker-compose.team.work.yml overlay ให้แอปและ worker ใช้ endpoint proxy กรองภายในเดียวโดยไม่เมานต์ socket proxy อนุญาตเฉพาะส่วน API ที่ runtime ใช้ แต่การสร้างคอนเทนเนอร์ยังควบคุมโฮสต์ ให้ใช้ daemon Work เฉพาะ/rootless เพื่อขอบเขตแข็งกว่า Helm ไม่เมานต์ socket node เปิด backend Pod/PVC ด้วย work.enabled=true

โปรไฟล์ solo ต้องมีศูนย์หรือหนึ่ง replica เพราะใช้ SQLite ไฟล์ในเครื่อง และการประสานในโปรเซส Helm รับศูนย์เพื่อพักและปฏิเสธจำนวนมาก/auto scale โปรไฟล์ team เต็มใช้หลาย replica และ worker ภายนอกได้เพราะ PostgreSQL, S3, PGVector, Redis ถือสถานะร่วม Pod sandbox Work scale แยก และใน team worker ได้ image, StorageClass และขีด work.env เดียวกับแอป

ไฟล์ Compose รับ WEBUI_BIND_ADDRESS (ค่าเริ่มต้น 127.0.0.1) และ WEBUI_PORT (8080) รักษา loopback เว้นแต่ LAN ที่เชื่อหรือ reverse proxy ต้องเข้าพอร์ต

การค้นหาโมเดลของผู้ให้บริการ

แคตตาล็อกโมเดลผู้ให้บริการจะค้นหาใหม่เมื่อขาดหรือเก่า การโหลดใหม่จึงสะท้อนโมเดลปัจจุบัน ตัวแปรต่อไปปรับรอบ:

ตัวแปรค่าเริ่มต้นวัตถุประสงค์
PLUGIN_MODEL_DISCOVERY_TTL_MS21600000 (6 ชม.)อายุแคตตาล็อกก่อนรีเฟรชในการอ่านรายการ plugin ครั้งถัดไป
PLUGIN_MODEL_DISCOVERY_RETRY_MS600000 (10 นาที)ช่วงต่ำสุดระหว่างลองเพื่อไม่ตรวจผู้ให้บริการที่ล้มเหลวบ่อย
PLUGIN_MODEL_DISCOVERY_REFRESH_DEADLINE_MS3000เวลาที่คำตอบรายการ plugin รอรีเฟรช

การรีเฟรชเกินเวลาเสร็จได้และให้ในคำขอถัดไป รีเฟรชโมเดล แบบชัดเจนติดต่อผู้ให้บริการและไม่ใช้ช่วง

คีย์ plugin ผู้ให้บริการ

plugin ผู้ให้บริการใช้คีย์สภาพแวดล้อมเป็นค่าเริ่มต้นทั้งการติดตั้งได้:

ตัวแปรผู้ให้บริการ
OPENAI_API_KEYOpenAI และ OpenAI TTS
ANTHROPIC_API_KEYAnthropic
GROQ_API_KEYGroq
GEMINI_API_KEYGoogle Gemini
MISTRAL_API_KEYMistral
OPENROUTER_API_KEYOpenRouter
KIMI_API_KEYKimi Code โดย Moonshot AI
GITHUB_API_KEYGitHub Models
HUGGINGFACE_API_KEYAPI Hugging Face ในจุดที่กำหนด
ELEVENLABS_API_KEYElevenLabs TTS
COMFYUI_API_KEYการติดตั้ง ComfyUI ที่ต้องใช้คีย์ API

ผู้ใช้เก็บข้อมูลผู้ให้บริการใน UI ได้เมื่อเลือกคีย์ต่อผู้ใช้ คีย์สภาพแวดล้อมใช้เฉพาะการกำหนดเส้นทาง/ยืนยันของนิยามที่รวมและไม่ถูกบัง นิยามนำเข้า เขียนได้ที่ใช้ ID รวมซ้ำ และเส้นทางผู้ดูแลบันทึกต้องมีข้อมูลของบัญชีนั้น Libre WebUI ไม่แนบคีย์สภาพแวดล้อมหรือเผยผ่านการค้นหา ความเชื่อมาจาก hash compile ของ manifest ที่ส่ง จึงรองรับเลย์เอาต์คอนเทนเนอร์ที่ไดเรกทอรีเก่ากับรวมใช้เส้นทางเดียวโดยไม่ถือ manifest แก้เป็นของรวม

คีย์ที่ผู้ใช้บันทึกผูกกับนิยาม แหล่ง สัญญายืนยัน และค่าเส้นทางที่มีผล ต้องบันทึกใหม่หลังผู้ดูแลเปลี่ยนปลายทาง คีย์เก่าที่ไม่ผูกจะรับและผูกครั้งแรกเฉพาะนิยามที่ส่งตรงบนเส้นทางรวม

การรันจากต้นฉบับแปลง PLUGINS_DIR สัมพัทธ์จากไดเรกทอรี backend ตัวเปิดแพ็กจะแปลงเป็นเส้นทางสัมบูรณ์ผู้เรียกก่อนเริ่ม เพื่อเข้ากัน Libre อ่าน backend/plugins และตำแหน่งเก่าด้วย ย้ายนิยามไป $DATA_DIR/plugins; การกู้รายงานเส้นทางเก่าเป็นสถานะภายนอกและบล็อก snapshot เฉพาะ volume ขณะยังมีนิยาม ไดเรกทอรี plugin และ JSON ต้องเป็นรายการกายภาพ Libre ไม่ตาม symlink

Frontend

ตัวแปรค่าเริ่มต้นวัตถุประสงค์
VITE_API_BASE_URLพร็อกซี dev แบบ origin เดียวกัน หรือ API การใช้งานจริงURL ฐาน API frontend
VITE_WS_BASE_URLอนุมานจาก URL APIฐาน ws:/wss: สัมบูรณ์สำหรับ socket Chat/Work
VITE_APP_VERSIONเวอร์ชันแพ็กเกจจาก Viteเวอร์ชันแอปที่แสดง
VITE_DEMO_MODEfalseเปิด mock โหมดสาธิตเมื่อ true
VITE_API_TIMEOUT300000timeout API frontend เป็นมิลลิวินาที
VITE_BACKEND_URLhttp://localhost:3001ใช้โดยส่วนช่วยยืนยันบางส่วน
VITE_DEBUG_VERBOSEไม่ตั้งเปิดบันทึก debug frontend ละเอียดในการพัฒนา
VITE_LOG_LEVELไม่ตั้งแทนระดับบันทึก frontend
ELECTRON_BUILDไม่ตั้งเปิดลักษณะ Vite สำหรับ Electron เมื่อ true

VITE_WS_BASE_URL แทน fallback WebSocket ทั้ง Chat และ terminal Work อาจมีคำนำหน้า reverse proxy แต่ต้องเป็น URL ws: หรือ wss: สัมบูรณ์ไม่มีข้อมูล คำค้น หรือ fragment เมื่อไม่ตั้ง ไคลเอนต์ Electron file: ใช้ ws://localhost:3001; เบราว์เซอร์หา base จาก VITE_API_BASE_URL แล้ว origin ของเบราว์เซอร์ Vite จะพร็อกซี origin ของ dev ไปยัง backend พอร์ต 3001

สคริปต์บำรุงรักษา

ตัวแปรวัตถุประสงค์
CHANGELOG_AIตั้ง 0 เพื่อปิดร่าง changelog ด้วย AI
CHANGELOG_AI_MODELโมเดล Ollama สำหรับสร้างรุ่น/changelog
CHANGELOG_AI_TIMEOUT_MStimeout สร้าง changelog AI เป็นมิลลิวินาที

ตัวอย่าง:

CHANGELOG_AI_MODEL=glm-5.2:cloud npm run changelog
CHANGELOG_AI=0 npm run release:minor

ตัวอย่าง production

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

เอกสารที่เกี่ยวข้อง