{"id":500322,"date":"2026-10-26T15:03:42","date_gmt":"2026-10-26T12:03:42","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=500322"},"modified":"2026-10-26T15:03:42","modified_gmt":"2026-10-26T12:03:42","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=500322","title":{"rendered":"\u0420\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e \u043f\u043e \u0441\u0431\u043e\u0440\u043a\u0435 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e AI-\u0441\u0442\u0435\u043a\u0430. \u0427\u0430\u0441\u0442\u044c 5. Open WebUI \u043f\u043e\u0432\u0435\u0440\u0445 llama.cpp"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<h2>\u0420\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e \u043f\u043e \u0441\u0431\u043e\u0440\u043a\u0435 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e AI-\u0441\u0442\u0435\u043a\u0430<\/h2>\n<h3>\u0427\u0430\u0441\u0442\u044c 5. Open WebUI \u043f\u043e\u0432\u0435\u0440\u0445 llama.cpp<\/h3>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u0448\u0430\u0433\u0435 \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c <strong>Open WebUI<\/strong> \u2014 \u0432\u0435\u0431-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0441 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0435\u0439, \u0438\u0441\u0442\u043e\u0440\u0438\u0435\u0439 \u0447\u0430\u0442\u043e\u0432 \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u043e\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043c\u043e\u0434\u0435\u043b\u0435\u0439. \u042d\u0442\u043e \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u043b\u043e\u0439: <code>llama-server<\/code> \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u043e (\u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 <code>127.0.0.1<\/code>), \u0430 Open WebUI \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u00ab\u043f\u0430\u0440\u0430\u0434\u043d\u043e\u0439 \u0434\u0432\u0435\u0440\u044c\u044e\u00bb \u0434\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0438\u0437 LAN.<\/p>\n<h4>\u0417\u0430\u0447\u0435\u043c \u043d\u0443\u0436\u0435\u043d Open WebUI<\/h4>\n<p>\u0420\u043e\u0434\u043d\u043e\u0439 UI <code>llama.cpp<\/code> (Svelte) \u0445\u043e\u0440\u043e\u0448 \u0434\u043b\u044f \u043e\u0442\u043b\u0430\u0434\u043a\u0438, \u043d\u043e \u0443 \u043d\u0435\u0433\u043e <strong>\u043d\u0435\u0442<\/strong>:<\/p>\n<ul>\n<li>\n<p><strong>\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043c\u043e\u0434\u0435\u043b\u044f\u043c\u0438<\/strong> \u2014 \u043d\u0435\u043b\u044c\u0437\u044f \u0437\u0430\u0434\u0430\u0442\u044c per-model \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u043f\u0440\u043e\u043c\u043f\u0442\u044b, \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0441\u044d\u043c\u043f\u043b\u0438\u043d\u0433\u0430, \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435.<\/p>\n<\/li>\n<li>\n<p><strong>\u041c\u043d\u043e\u0433\u043e\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0440\u0435\u0436\u0438\u043c\u0430<\/strong> \u2014 \u043e\u0434\u0438\u043d \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c = \u043e\u0434\u0438\u043d \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442.<\/p>\n<\/li>\n<\/ul>\n<p>Open WebUI \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0432\u0441\u0451 \u044d\u0442\u043e, \u043e\u0441\u0442\u0430\u0432\u0430\u044f\u0441\u044c <strong>\u0442\u043e\u043d\u043a\u043e\u0439 \u043d\u0430\u0434\u0441\u0442\u0440\u043e\u0439\u043a\u043e\u0439<\/strong> \u043d\u0430\u0434 <code>llama-server<\/code>. \u041e\u043d \u0445\u043e\u0434\u0438\u0442 \u043a \u043d\u0435\u043c\u0443 \u043f\u043e OpenAI-\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u043c\u0443 API (<code>\/v1\/chat\/completions<\/code>), \u0442\u0430\u043a \u0447\u0442\u043e <code>llama.cpp<\/code> \u0434\u0430\u0436\u0435 \u043d\u0435 \u0437\u043d\u0430\u0435\u0442, \u0447\u0442\u043e \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0434\u0440\u0443\u0433\u043e\u0439 \u043a\u043b\u0438\u0435\u043d\u0442.<\/p>\n<h4>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430<\/h4>\n<pre><code>LAN 0.0.0.0:8080 (Open WebUI) -&gt; Local 127.0.0.1:10000 llama-server<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper\"><\/span><\/a><\/div><\/pre>\n<p><strong>\u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u044b:<\/strong><\/p>\n<ul>\n<li>\n<p><code>llama-server<\/code> \u0441\u043b\u0443\u0448\u0430\u0435\u0442 <strong>\u0442\u043e\u043b\u044c\u043a\u043e<\/strong> <code>127.0.0.1:10000<\/code>. \u0421\u043d\u0430\u0440\u0443\u0436\u0438 \u043a \u043d\u0435\u043c\u0443 \u043d\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f.<\/p>\n<\/li>\n<li>\n<p>Open WebUI \u0441\u043b\u0443\u0448\u0430\u0435\u0442 <code>0.0.0.0:8080<\/code>, \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0438\u0437 LAN, \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043b\u043e\u0433\u0438\u043d.<\/p>\n<\/li>\n<li>\n<p><strong>\u0421\u0435\u043a\u0440\u0435\u0442\u044b<\/strong> (API-\u043a\u043b\u044e\u0447 llama + \u0441\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 WebUI) \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 <code>.secrets<\/code> (chmod 600), \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043e\u0434\u0438\u043d \u0440\u0430\u0437.<\/p>\n<\/li>\n<li>\n<p><strong>\u041e\u0440\u043a\u0435\u0441\u0442\u0440\u0430\u0442\u043e\u0440<\/strong> <code>run_<\/code><a href=\"http:\/\/webui.sh\" rel=\"noopener nofollow\"><code>webui.sh<\/code><\/a> \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u0442 \u043e\u0431\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430, \u0436\u0434\u0451\u0442 \u0433\u043e\u0442\u043e\u0432\u043d\u043e\u0441\u0442\u0438 <code>llama-server<\/code>, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 WebUI, \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u043e\u0431\u0430 \u043f\u043e <code>Ctrl+C<\/code>.<\/p>\n<\/li>\n<\/ul>\n<h4>\u0421\u0435\u043a\u0440\u0435\u0442\u044b: .secrets \u0438 init_secrets.sh<\/h4>\n<p>\u041f\u0435\u0440\u0435\u0434 \u043f\u0435\u0440\u0432\u044b\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u043e\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c <code>.secrets<\/code> \u2014 \u0444\u0430\u0439\u043b \u0441 \u0434\u0432\u0443\u043c\u044f \u043a\u043b\u044e\u0447\u0430\u043c\u0438:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\u041a\u043b\u044e\u0447<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0414\u043b\u044f \u0447\u0435\u0433\u043e<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u041a\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code><strong>LLAMA_API_KEY<\/strong><\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0410\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043a <code>llama-server<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">Open WebUI (\u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442 \u0432 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0435 <code>Authorization: Bearer ...<\/code>), \u0432\u043d\u0435\u0448\u043d\u0438\u0435 \u043a\u043b\u0438\u0435\u043d\u0442\u044b<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code><strong>WEBUI_SECRET_KEY<\/strong><\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041f\u043e\u0434\u043f\u0438\u0441\u044c JWT-\u0442\u043e\u043a\u0435\u043d\u043e\u0432 \u0441\u0435\u0441\u0441\u0438\u0439 Open WebUI<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0421\u0430\u043c Open WebUI (\u0431\u0435\u0437 \u043d\u0435\u0433\u043e \u0432\u0441\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u0440\u0430\u0437\u043b\u043e\u0433\u0438\u043d\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0435)<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p><strong>\u0412\u0430\u0436\u043d\u043e \u043f\u0440\u043e <\/strong><code><strong>WEBUI_SECRET_KEY<\/strong><\/code><strong>.<\/strong> \u0415\u0441\u043b\u0438 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0435 (<code>secrets.token_hex(32)<\/code> \u0432 Python), \u0442\u043e <strong>\u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0435 WebUI \u0432\u0441\u0435 \u0441\u0435\u0441\u0441\u0438\u0438 \u0441\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f<\/strong> \u2014 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u0432\u044b\u043d\u0443\u0436\u0434\u0435\u043d\u044b \u043b\u043e\u0433\u0438\u043d\u0438\u0442\u044c\u0441\u044f \u0437\u0430\u043d\u043e\u0432\u043e. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043a\u043b\u044e\u0447 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0432 \u0444\u0430\u0439\u043b\u0435 \u0438 \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f. <code>init_<\/code><a href=\"http:\/\/secrets.sh\" rel=\"noopener nofollow\"><code>secrets.sh<\/code><\/a> \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0444\u0430\u0439\u043b <strong>\u043e\u0434\u0438\u043d \u0440\u0430\u0437<\/strong>, \u043f\u0440\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043c\u0435\u043d\u044f\u0435\u0442.<\/p>\n<p><strong>\u0424\u043e\u0440\u043c\u0430\u0442 <\/strong><code><strong>.secrets<\/strong><\/code> \u2014 \u043f\u0440\u043e\u0441\u0442\u044b\u0435 <code>KEY=VALUE<\/code>, \u0447\u0438\u0442\u0430\u044e\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 <code>source<\/code> \u0432 bash \u0438 \u0447\u0435\u0440\u0435\u0437 <code>open()<\/code> \u0432 Python:<\/p>\n<pre><code># \u0421\u0435\u043a\u0440\u0435\u0442\u044b \u043f\u0440\u043e\u0435\u043a\u0442\u0430. \u041d\u0435 \u043a\u043e\u043c\u043c\u0438\u0442\u0438\u0442\u044c \u0432 git. chmod 600.LLAMA_API_KEY=&lt;48 hex-\u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432&gt;WEBUI_SECRET_KEY=&lt;64 hex-\u0441\u0438\u043c\u0432\u043e\u043b\u0430&gt;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p><strong>\u041f\u0440\u0430\u0432\u0430 <\/strong><code><strong>600<\/strong><\/code> \u2014 \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u043b\u0430\u0434\u0435\u043b\u0435\u0446 \u043c\u043e\u0436\u0435\u0442 \u0447\u0438\u0442\u0430\u0442\u044c. \u042d\u0442\u043e \u043a\u0440\u0438\u0442\u0438\u0447\u043d\u043e: \u043a\u043b\u044e\u0447\u0438 \u0434\u0430\u044e\u0442 \u043f\u043e\u043b\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0443.<\/p>\n<h4>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 Open WebUI<\/h4>\n<p>Open WebUI \u0441\u0442\u0430\u0432\u0438\u0442\u0441\u044f \u0432 <strong>\u0442\u043e\u0442 \u0436\u0435 <\/strong><code><strong>venv<\/strong><\/code>, \u0447\u0442\u043e \u0438 \u0432\u0441\u0451 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 (<code>venv\/<\/code>). \u042d\u0442\u043e \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 wheelhouse (\u043e\u0434\u0438\u043d \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0430\u043a\u0435\u0442\u043e\u0432) \u0438 \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0432\u0442\u043e\u0440\u043e\u0439 Python-\u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440.<\/p>\n<pre><code class=\"bash\">.\/venv\/bin\/pip install --upgrade pip.\/venv\/bin\/pip install torch --index-url https:\/\/download.pytorch.org\/whl\/cpu.\/venv\/bin\/pip install open-webui<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>CPU-\u0432\u0435\u0440\u0441\u0438\u044f <code>torch<\/code> \u0441\u0442\u0430\u0432\u0438\u0442\u0441\u044f <strong>\u0434\u043e<\/strong> <code>open-webui<\/code>, \u0438\u043d\u0430\u0447\u0435 pip \u043f\u0440\u0438\u0442\u044f\u043d\u0435\u0442 CUDA-\u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0441 <code>nvidia-*<\/code> \u043f\u0430\u043a\u0435\u0442\u0430\u043c\u0438 (\u0431\u043e\u043b\u0435\u0435 2 \u0413\u0411 \u043b\u0438\u0448\u043d\u0435\u0433\u043e).<\/p>\n<h4>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 Open WebUI: start_webui.py<\/h4>\n<p>\u0421\u043a\u0440\u0438\u043f\u0442 \u0447\u0438\u0442\u0430\u0435\u0442 <code>.secrets<\/code>, \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 env-\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 <code>open-webui serve<\/code>. \u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438:<\/p>\n<h3>\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a llama-server<\/h3>\n<pre><code class=\"python\">os.environ[\"OPENAI_API_BASE_URL\"] = \"http:\/\/127.0.0.1:10000\/v1\"os.environ[\"OPENAI_API_KEY\"] = llama_api_keyos.environ[\"BYPASS_MODEL_ACCESS_CONTROL\"] = \"True\"<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<ul>\n<li>\n<p><code><strong>OPENAI_API_BASE_URL<\/strong><\/code> \u2014 \u0430\u0434\u0440\u0435\u0441 <code>llama-server<\/code>. \u041f\u043e\u0440\u0442 <code>10000<\/code> \u2014 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 (\u0437\u0430\u0434\u0430\u043d \u0432 <code>run_<\/code><a href=\"http:\/\/webui.sh\" rel=\"noopener nofollow\"><code>webui.sh<\/code><\/a> \u0447\u0435\u0440\u0435\u0437 <code>LLAMA_PORT<\/code>), \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u043e\u0432\u0430\u0442\u044c \u0441 \u0440\u043e\u0434\u043d\u044b\u043c UI <code>llama.cpp<\/code> \u043d\u0430 <code>8080<\/code>.<\/p>\n<\/li>\n<li>\n<p><code><strong>OPENAI_API_KEY<\/strong><\/code> \u2014 \u043a\u043b\u044e\u0447 \u0438\u0437 <code>.secrets<\/code>. Open WebUI \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442 \u0435\u0433\u043e \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u0435, <code>llama-server<\/code> \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442.<\/p>\n<\/li>\n<li>\n<p><code><strong>BYPASS_MODEL_ACCESS_CONTROL<\/strong><\/code> \u2014 \u0432\u0441\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u0438\u0437 \u0440\u043e\u0443\u0442\u0435\u0440\u0430 \u0432\u0438\u0434\u043d\u044b \u0432\u0441\u0435\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c WebUI, \u0431\u0435\u0437 \u0440\u0443\u0447\u043d\u043e\u0433\u043e \u00ab\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u0440\u0430\u0432 \u043d\u0430 \u043c\u043e\u0434\u0435\u043b\u044c\u00bb.<\/p>\n<\/li>\n<\/ul>\n<h3>\u041e\u0444\u0444\u043b\u0430\u0439\u043d-\u0440\u0435\u0436\u0438\u043c<\/h3>\n<pre><code class=\"python\">os.environ[\"OFFLINE_MODE\"] = \"true\"os.environ[\"HF_HUB_OFFLINE\"] = \"1\"os.environ[\"RAG_EMBEDDING_MODEL_AUTO_UPDATE\"] = \"false\"os.environ[\"RAG_RERANKING_MODEL_AUTO_UPDATE\"] = \"false\"os.environ[\"RAG_EMBEDDING_ENGINE\"] = \"\"os.environ[\"RAG_EMBEDDING_MODEL\"] = \"\"os.environ[\"WHISPER_MODEL_AUTO_UPDATE\"] = \"false\"os.environ[\"AUDIO_STT_ENGINE\"] = \"\"<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<ul>\n<li>\n<p><code><strong>OFFLINE_MODE=true<\/strong><\/code> \u2014 \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0439 \u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0441 Hugging Face.<\/p>\n<\/li>\n<li>\n<p><code><strong>RAG_*<\/strong><\/code> \u2014 \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u0442 RAG-\u044d\u043c\u0431\u0435\u0434\u0434\u0438\u043d\u0433\u0438 (\u0438\u043d\u0430\u0447\u0435 \u043f\u0440\u0438 \u043f\u0435\u0440\u0432\u043e\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u0435 WebUI \u043f\u043e\u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u0441\u043a\u0430\u0447\u0430\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u044c \u044d\u043c\u0431\u0435\u0434\u0434\u0438\u043d\u0433\u043e\u0432 ~500 \u041c\u0411).<\/p>\n<\/li>\n<li>\n<p><code><strong>AUDIO_STT_ENGINE=\"\"<\/strong><\/code> \u2014 \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u0442 Whisper (\u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u0435 \u0440\u0435\u0447\u0438), \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0442\u044f\u043d\u0443\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u044c.<\/p>\n<\/li>\n<\/ul>\n<h3>Ollama \u2014 \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u043c<\/h3>\n<pre><code class=\"python\">os.environ[\"ENABLE_OLLAMA_API\"] = \"false\"os.environ[\"OLLAMA_BASE_URL\"] = \"\"<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p><strong>\u0417\u0430\u0447\u0435\u043c.<\/strong> Open WebUI \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0442\u044c Ollama \u043d\u0430 <a href=\"http:\/\/localhost:11434\" rel=\"noopener nofollow\"><code>localhost:11434<\/code><\/a> \u0438 \u00ab\u043f\u043e\u0434\u0440\u0443\u0436\u0438\u0442\u044c\u0441\u044f\u00bb \u0441 \u043d\u0438\u043c. \u0415\u0441\u043b\u0438 Ollama \u043d\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0430, \u0432 \u043b\u043e\u0433\u0430\u0445 \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043e\u0448\u0438\u0431\u043a\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f, \u0430 \u0438\u043d\u043e\u0433\u0434\u0430 WebUI \u00ab\u0437\u0430\u043b\u0438\u043f\u0430\u0435\u0442\u00bb \u043d\u0430 \u043f\u043e\u043f\u044b\u0442\u043a\u0430\u0445 \u0434\u043e\u0441\u0442\u0443\u0447\u0430\u0442\u044c\u0441\u044f \u0438 \u043d\u0435 \u0432\u044b\u0434\u0430\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u0438\u0437 llama-cpp \u0441\u0435\u0440\u0432\u0435\u0440\u0430. \u041e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 <code>ENABLE_OLLAMA_API=false<\/code> \u0443\u0431\u0438\u0440\u0430\u0435\u0442 \u044d\u0442\u0443 \u0433\u043e\u043b\u043e\u0432\u043d\u0443\u044e \u0431\u043e\u043b\u044c (\u043c\u044b \u0443\u0436\u0435 \u043e\u0431\u043e\u0436\u0433\u043b\u0438\u0441\u044c \u043d\u0430 \u044d\u0442\u043e\u043c \u0432 \u0441\u0442\u0430\u0440\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435).<\/p>\n<h3>\u0412\u0435\u0431-\u043f\u043e\u0438\u0441\u043a \u2014 \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c<\/h3>\n<pre><code class=\"python\">os.environ[\"ENABLE_RAG_WEB_SEARCH\"] = \"true\"os.environ[\"ENABLE_WEB_SEARCH\"] = \"true\"os.environ[\"WEB_SEARCH_ENGINE\"] = \"duckduckgo\"<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<ul>\n<li>\n<p><strong>DuckDuckGo<\/strong> \u2014 \u0431\u0435\u0437 API-\u043a\u043b\u044e\u0447\u0430, \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u00ab\u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438\u00bb, \u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442. \u041c\u043e\u0434\u0435\u043b\u044c \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043f\u043e\u0438\u0441\u043a\u0430 \u0434\u043b\u044f \u043e\u0442\u0432\u0435\u0442\u0430 (RAG-\u043f\u043e\u0438\u0441\u043a \u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435). \u0415\u0441\u043b\u0438 \u0441\u0435\u0442\u0438 \u043d\u0435\u0442 \u2014 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u043d\u043e \u043d\u0435 \u043b\u043e\u043c\u0430\u0435\u0442 \u0447\u0430\u0442.<\/p>\n<\/li>\n<\/ul>\n<h3>\u041f\u0440\u043e\u0447\u0438\u0435 \u043c\u0435\u043b\u043e\u0447\u0438<\/h3>\n<pre><code class=\"python\">os.environ[\"ENABLE_IMAGE_GENERATION\"] = \"false\"    # \u043c\u044b \u043d\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c sd-server \u043a WebUIos.environ[\"ENABLE_COMMUNITY_FUNCTIONS\"] = \"false\" # \u043d\u0435 \u0433\u0440\u0443\u0437\u0438\u043c \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0435 \u043f\u043b\u0430\u0433\u0438\u043d\u044bos.environ[\"USER_AGENT\"] = \"OpenWebUI-Offline\/1.0\" # \u0443\u0431\u0438\u0440\u0430\u0435\u0442 \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435 LangChainos.environ[\"DATA_DIR\"] = DATA_DIR                  # \u0434\u0430\u043d\u043d\u044b\u0435 \u0432\u043d\u0443\u0442\u0440\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<h3>\u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f<\/h3>\n<pre><code class=\"python\"># os.environ[\"ENABLE_SIGNUP\"] = \"false\"  # \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u041d\u0415 \u0437\u0430\u0434\u0430\u0451\u043c<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p><strong>\u041b\u043e\u0433\u0438\u043a\u0430 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e:<\/strong><\/p>\n<ul>\n<li>\n<p><code>ENABLE_SIGNUP<\/code> <strong>\u043d\u0435 \u0437\u0430\u0434\u0430\u0451\u043c<\/strong> -&gt; \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u043e\u0442\u043a\u0440\u044b\u0442\u0430.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0435\u0440\u0432\u044b\u0439 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0432\u0448\u0438\u0439\u0441\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f <strong>\u0430\u0434\u043c\u0438\u043d\u043e\u043c<\/strong>.<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0430\u0434\u043c\u0438\u043d\u0430 Open WebUI <strong>\u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044e<\/strong>.<\/p>\n<\/li>\n<li>\n<p>\u0427\u0442\u043e\u0431\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f: \u0430\u0434\u043c\u0438\u043d \u0437\u0430\u0445\u043e\u0434\u0438\u0442 \u0432 <strong>Admin -&gt; Users<\/strong> -&gt; \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044e \u043d\u0430 \u0432\u0440\u0435\u043c\u044f -&gt; \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0430\u043a\u043a\u0430\u0443\u043d\u0442 -&gt; \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u0431\u0440\u0430\u0442\u043d\u043e.<\/p>\n<\/li>\n<\/ul>\n<p>\u0415\u0441\u043b\u0438 \u0436\u0451\u0441\u0442\u043a\u043e \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c <code>ENABLE_SIGNUP=false<\/code> \u0434\u043e \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u2014 \u0434\u0430\u0436\u0435 \u0430\u0434\u043c\u0438\u043d \u043d\u0435 \u0441\u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u0443\u0441\u0442\u044b\u043c.<\/p>\n<h4>\u041e\u0440\u043a\u0435\u0441\u0442\u0440\u0430\u0442\u043e\u0440: run_webui.sh<\/h4>\n<p>\u0421\u043a\u0440\u0438\u043f\u0442 \u0434\u0435\u043b\u0430\u0435\u0442 \u043f\u044f\u0442\u044c \u0432\u0435\u0449\u0435\u0439:<\/p>\n<ol>\n<li>\n<p><strong>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435<\/strong> \u2014 <code>venv<\/code>, <code>open-webui<\/code>, <code>.secrets<\/code>, <code>run_llama_<\/code><a href=\"http:\/\/mmap.sh\" rel=\"noopener nofollow\"><code>mmap.sh<\/code><\/a>, <code>start_webui.py<\/code>. \u0415\u0441\u043b\u0438 \u0447\u0435\u0433\u043e-\u0442\u043e \u043d\u0435\u0442 \u2014 \u0441\u043e\u0437\u0434\u0430\u0451\u0442\/\u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 (\u043f\u0435\u0440\u0432\u044b\u0439 \u0437\u0430\u043f\u0443\u0441\u043a).<\/p>\n<\/li>\n<li>\n<p><strong>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043f\u043e\u0440\u0442\u044b<\/strong> <code>10000<\/code> \u0438 <code>8080<\/code> \u2014 \u0435\u0441\u043b\u0438 \u0437\u0430\u043d\u044f\u0442\u044b, \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439.<\/p>\n<\/li>\n<li>\n<p><strong>\u041e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 IP<\/strong> (\u0447\u0435\u0440\u0435\u0437 <code>nmcli<\/code>), \u0435\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043e\u0442\u0432\u0435\u0442\u0438\u0442 <code>1<\/code>. \u041f\u043e\u043b\u0435\u0437\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u0430\u0434\u0440\u0435\u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043d\u0435 \u043c\u0435\u043d\u044f\u043b\u0441\u044f \u043f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0440\u043e\u0443\u0442\u0435\u0440\u0430.<\/p>\n<\/li>\n<li>\n<p><strong>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 <\/strong><code><strong>llama-server<\/strong><\/code> \u0432 \u0444\u043e\u043d\u0435 \u043d\u0430 <code>127.0.0.1:10000<\/code> \u0447\u0435\u0440\u0435\u0437 <code>PORT=10000 HOST=127.0.0.1 .\/run_llama_<\/code><a href=\"http:\/\/mmap.sh\" rel=\"noopener nofollow\"><code>mmap.sh<\/code><\/a>. \u0416\u0434\u0451\u0442 <code>\/health<\/code> \u0434\u043e 5 \u043c\u0438\u043d\u0443\u0442.<\/p>\n<\/li>\n<li>\n<p><strong>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 Open WebUI<\/strong> \u043d\u0430 <code>0.0.0.0:8080<\/code> \u0447\u0435\u0440\u0435\u0437 <code>start_webui.py<\/code>. \u0423\u0445\u043e\u0434\u0438\u0442 \u0432 <code>wait<\/code>.<\/p>\n<\/li>\n<\/ol>\n<p><strong>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 <\/strong><code><strong>Ctrl+C<\/strong><\/code><strong>.<\/strong> <code>trap cleanup EXIT INT TERM<\/code> \u043b\u043e\u0432\u0438\u0442 \u0441\u0438\u0433\u043d\u0430\u043b \u0438:<\/p>\n<ul>\n<li>\n<p>\u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 WebUI (<code>SIGTERM<\/code>, \u0436\u0434\u0451\u0442 10 \u0441, <code>SIGKILL<\/code>);<\/p>\n<\/li>\n<li>\n<p>\u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 <code>llama-server<\/code> (\u0448\u043b\u0451\u0442 <code>SIGTERM<\/code> \u0432 bash-\u043e\u0431\u0451\u0440\u0442\u043a\u0443 <code>run_llama_<\/code><a href=\"http:\/\/mmap.sh\" rel=\"noopener nofollow\"><code>mmap.sh<\/code><\/a>, \u0435\u0451 <code>trap<\/code> \u0434\u0435\u043b\u0430\u0435\u0442 <code>systemctl --user stop<\/code>, \u0441\u0435\u0440\u0432\u0435\u0440 \u0443\u043c\u0438\u0440\u0430\u0435\u0442);<\/p>\n<\/li>\n<li>\n<p>\u043f\u0440\u0438 \u043e\u0448\u0438\u0431\u043a\u0435 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0445\u0432\u043e\u0441\u0442\u044b \u043b\u043e\u0433\u043e\u0432 \u043e\u0431\u043e\u0438\u0445 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432.<\/p>\n<\/li>\n<\/ul>\n<p><strong>\u041f\u0440\u043e \u043c\u043e\u0434\u0435\u043b\u044c.<\/strong> <code>run_<\/code><a href=\"http:\/\/webui.sh\" rel=\"noopener nofollow\"><code>webui.sh<\/code><\/a> \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u0435\u0440\u0432\u044b\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u2014 \u0438\u043c\u044f \u043c\u043e\u0434\u0435\u043b\u0438. \u0415\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c <code>.\/run_<\/code><a href=\"http:\/\/webui.sh\" rel=\"noopener nofollow\"><code>webui.sh<\/code><\/a><code> Qwen3.5-9B-Q4_K_M<\/code>, \u043e\u043d\u043e \u0443\u0439\u0434\u0451\u0442 \u0432 <code>run_llama_<\/code><a href=\"http:\/\/mmap.sh\" rel=\"noopener nofollow\"><code>mmap.sh<\/code><\/a><code> -m ...<\/code>, \u0438 \u0441\u0435\u0440\u0432\u0435\u0440 \u0441\u0442\u0430\u0440\u0442\u0443\u0435\u0442 \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u043e\u0434\u043d\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438. \u0415\u0441\u043b\u0438 \u043d\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u2014 <code>run_llama_<\/code><a href=\"http:\/\/mmap.sh\" rel=\"noopener nofollow\"><code>mmap.sh<\/code><\/a> \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0441\u044f \u0432 router mode (\u0441\u043f\u0438\u0441\u043e\u043a \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u0432 \u0434\u0440\u043e\u043f\u0434\u0430\u0443\u043d\u0435 WebUI, \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043f\u043e \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044e).<\/p>\n<p><strong>\u041f\u043e\u0447\u0435\u043c\u0443 router mode \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e:<\/strong> WebUI \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u0438 \u0431\u0435\u0437 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430. \u041f\u0435\u0440\u0432\u0430\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043c\u043e\u0434\u0435\u043b\u0438 \u043f\u0440\u0438 \u0432\u044b\u0431\u043e\u0440\u0435 \u2014 \u0434\u043e\u043b\u0433\u0430\u044f, \u043d\u043e \u0434\u0430\u043b\u044c\u0448\u0435 \u2014 \u043a\u043e\u043c\u0444\u043e\u0440\u0442\u043d\u043e. \u0415\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c \u0441\u0440\u0430\u0437\u0443 \u2014 \u043f\u0435\u0440\u0435\u0434\u0430\u0439\u0442\u0435 \u0435\u0451 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u043c, \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u043d\u0430.<\/p>\n<h4>\u0417\u0430\u043f\u0443\u0441\u043a \u0438 \u043f\u0435\u0440\u0432\u044b\u0439 \u0432\u0445\u043e\u0434<\/h4>\n<pre><code class=\"bash\">.\/run_webui.sh<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0412\u044b\u0432\u043e\u0434:<\/p>\n<pre><code>[INFO]  \u0417\u0430\u043f\u0443\u0441\u043a llama-server \u043d\u0430 127.0.0.1:10000...[INFO]  llama-server \u0437\u0430\u043f\u0443\u0449\u0435\u043d (PID 12345)[INFO]  \u0416\u0434\u0443 \u0433\u043e\u0442\u043e\u0432\u043d\u043e\u0441\u0442\u0438 API (\u0434\u043e 5 \u043c\u0438\u043d, \u043d\u0430 HDD \u2014 \u0434\u043e\u043b\u0433\u043e)...[INFO]  llama-server \u0433\u043e\u0442\u043e\u0432.[INFO]  \u0417\u0430\u043f\u0443\u0441\u043a Open WebUI \u043d\u0430 0.0.0.0:8080...[INFO]  \u041e\u0442\u043a\u0440\u044b\u0442\u044c: http:\/\/127.0.0.1:8080[INFO]     \u0438\u043b\u0438:  http:\/\/192.168.1.100:8080<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p><strong>\u041f\u0435\u0440\u0432\u044b\u0439 \u0432\u0445\u043e\u0434:<\/strong><\/p>\n<ol>\n<li>\n<p>\u041e\u0442\u043a\u0440\u043e\u0439\u0442\u0435 <code>http:\/\/&lt;IP&gt;:8080<\/code> \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435.<\/p>\n<\/li>\n<li>\n<p>\u041d\u0430\u0436\u043c\u0438\u0442\u0435 \u00abSign up\u00bb \u2014 \u0441\u043e\u0437\u0434\u0430\u0439\u0442\u0435 \u0430\u043a\u043a\u0430\u0443\u043d\u0442. <strong>\u041f\u0435\u0440\u0432\u044b\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c = \u0430\u0434\u043c\u0438\u043d.<\/strong><\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u0430 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438.<\/p>\n<\/li>\n<li>\n<p>\u0412 \u0434\u0440\u043e\u043f\u0434\u0430\u0443\u043d\u0435 \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u2014 \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0441\u0435\u0445 <code>.gguf<\/code> \u0438\u0437 <code>models\/<\/code>. \u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043d\u0443\u0436\u043d\u0443\u044e.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0438\u0448\u0438\u0442\u0435 \u0432 \u0447\u0430\u0442. \u0418\u0441\u0442\u043e\u0440\u0438\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438.<\/p>\n<\/li>\n<\/ol>\n<p><strong>\u0414\u043b\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f:<\/strong> \u0437\u0430\u0439\u0434\u0438\u0442\u0435 \u043a\u0430\u043a \u0430\u0434\u043c\u0438\u043d -&gt; <strong>Admin Panel -&gt; Users<\/strong> -&gt; \u043a\u043d\u043e\u043f\u043a\u0430 <strong>\u00abEnable Signup\u00bb<\/strong> -&gt; \u0441\u043e\u0437\u0434\u0430\u0439\u0442\u0435 \u0430\u043a\u043a\u0430\u0443\u043d\u0442 \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0438\u043b\u0438 \u0434\u0430\u0439\u0442\u0435 \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0443 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f -&gt; <strong>\u00abDisable Signup\u00bb<\/strong>.<\/p>\n<h4>\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u0432 WebUI<\/h4>\n<p>\u041e\u0434\u043d\u043e \u0438\u0437 \u0433\u043b\u0430\u0432\u043d\u044b\u0445 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432 Open WebUI \u2014 <strong>per-model \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438<\/strong>, \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0435\u0442 \u0432 \u0440\u043e\u0434\u043d\u043e\u043c UI <code>llama.cpp<\/code>:<\/p>\n<ul>\n<li>\n<p><strong>Admin Panel -&gt; Models<\/strong> \u2014 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0434\u0430\u0442\u044c: <\/p>\n<ul>\n<li>\n<p><strong>System Prompt<\/strong> \u2014 \u00ab\u0422\u044b \u2014 \u0430\u0441\u0441\u0438\u0441\u0442\u0435\u043d\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u043a\u0440\u0430\u0442\u043a\u043e\u00bb \u0438 \u0442.\u043f.<\/p>\n<\/li>\n<li>\n<p><strong>Temperature<\/strong>, <strong>top_p<\/strong>, <strong>top_k<\/strong>, <strong>repeat_penalty<\/strong> \u2014 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0441\u044d\u043c\u043f\u043b\u0438\u043d\u0433\u0430.<\/p>\n<\/li>\n<li>\n<p><strong>Function calling<\/strong>, <strong>vision<\/strong>, <strong>file upload<\/strong> \u2014 \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c\/\u0432\u044b\u043a\u043b\u044e\u0447\u0438\u0442\u044c.<\/p>\n<\/li>\n<li>\n<p><strong>Default model<\/strong> \u2014 \u043a\u0430\u043a\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u0438 \u043d\u043e\u0432\u043e\u0433\u043e \u0447\u0430\u0442\u0430.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>\u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u00ab\u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0438 \u0437\u0430\u0431\u044b\u0442\u044c\u00bb: \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043b\u044f <code>OxCoder-9B<\/code> \u2014 <code>temperature=0.2<\/code> (\u043a\u043e\u0434 \u0442\u043e\u0447\u043d\u0435\u0435), \u0434\u043b\u044f <code>Gemma-4-E4B<\/code> \u2014 <code>temperature=0.9<\/code> (\u0420\u041f \u0436\u0438\u0432\u0435\u0435). \u0412 <code>llama.cpp<\/code> \u0442\u0430\u043a\u0438\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0431\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u0435.<\/p>\n<h4>\u041a\u043e\u0434 init_secrets.sh<\/h4>\n<pre><code class=\"bash\">#!\/usr\/bin\/env bash# \u0421\u043e\u0437\u0434\u0430\u0451\u0442 .secrets \u0441 LLAMA_API_KEY \u0438 WEBUI_SECRET_KEY, \u0435\u0441\u043b\u0438 \u0444\u0430\u0439\u043b\u0430 \u043d\u0435\u0442.# \u0418\u0434\u0435\u043c\u043f\u043e\u0442\u0435\u043d\u0442\u0435\u043d: \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u044b\u0439 \u0437\u0430\u043f\u0443\u0441\u043a \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043c\u0435\u043d\u044f\u0435\u0442.set -euo pipefailSCRIPT_DIR=\"$(cd \"$(dirname \"${BASH_SOURCE[0]}\")\" &amp;&amp; pwd)\"SECRETS_FILE=\"$SCRIPT_DIR\/.secrets\"if [ -f \"$SECRETS_FILE\" ]; then    echo \"[*] $SECRETS_FILE \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442, \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043c\u0435\u043d\u044f\u044e.\"    exit 0ficommand -v openssl &gt;\/dev\/null || { echo \"[!] \u043d\u0443\u0436\u0435\u043d openssl\"; exit 1; }LLAMA_API_KEY=\"$(openssl rand -hex 24)\"WEBUI_SECRET_KEY=\"$(openssl rand -hex 32)\"umask 077cat &gt; \"$SECRETS_FILE\" &lt;&lt;EOF# \u0421\u0435\u043a\u0440\u0435\u0442\u044b \u043f\u0440\u043e\u0435\u043a\u0442\u0430. \u041d\u0435 \u043a\u043e\u043c\u043c\u0438\u0442\u0438\u0442\u044c \u0432 git. chmod 600.LLAMA_API_KEY=$LLAMA_API_KEYWEBUI_SECRET_KEY=$WEBUI_SECRET_KEYEOFchmod 600 \"$SECRETS_FILE\"echo \"[*] \u0421\u043e\u0437\u0434\u0430\u043d $SECRETS_FILE\"echo \"    LLAMA_API_KEY=${LLAMA_API_KEY:0:8}... (\u043f\u0435\u0440\u0432\u044b\u0435 8 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432)\"echo \"    WEBUI_SECRET_KEY=${WEBUI_SECRET_KEY:0:8}...\"<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<h4>\u041a\u043e\u0434 run_webui.sh<\/h4>\n<pre><code class=\"bash\">#!\/usr\/bin\/env bash# \u0417\u0430\u043f\u0443\u0441\u043a llama-server (\u043f\u043e\u0440\u0442 10000) + Open WebUI (\u043f\u043e\u0440\u0442 8080).# \u041f\u0440\u0438 \u043f\u0435\u0440\u0432\u043e\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0435: \u0441\u043e\u0437\u0434\u0430\u0451\u0442 venv, \u0441\u0442\u0430\u0432\u0438\u0442 open-webui, \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 .secrets.## Usage: .\/run_webui.sh [model_name]#   model_name \u2014 \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e; \u0435\u0441\u043b\u0438 \u043d\u0435 \u0437\u0430\u0434\u0430\u043d, run_llama_mmap.sh \u0441\u043f\u0440\u043e\u0441\u0438\u0442 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u043e.## Env:#   LLAMA_PORT=10000   \u043f\u043e\u0440\u0442 llama-server (\u0442\u043e\u043b\u044c\u043a\u043e localhost)#   WEBUI_PORT=8080    \u043f\u043e\u0440\u0442 Open WebUI (0.0.0.0, \u0434\u043e\u0441\u0442\u0443\u043f \u0438\u0437 LAN)#   ASK_FIX_IP=1       \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0442\u044c \u043f\u0440\u043e \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 IP (0 \u2014 \u043d\u0435 \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0442\u044c)set -euo pipefailSCRIPT_DIR=\"$(cd \"$(dirname \"${BASH_SOURCE[0]}\")\" &amp;&amp; pwd)\"VENV_DIR=\"$SCRIPT_DIR\/venv\"SECRETS_FILE=\"$SCRIPT_DIR\/.secrets\"OFFLINE_PACKAGES_DIR=\"$SCRIPT_DIR\/offline_packages\"LLAMA_SCRIPT=\"$SCRIPT_DIR\/run_llama_mmap.sh\"WEBUI_SCRIPT=\"$SCRIPT_DIR\/start_webui.py\"INIT_SECRETS=\"$SCRIPT_DIR\/init_secrets.sh\"LLAMA_HOST=\"${LLAMA_HOST:-127.0.0.1}\"LLAMA_PORT=\"${LLAMA_PORT:-10000}\"WEBUI_PORT=\"${WEBUI_PORT:-8080}\"ASK_FIX_IP=\"${ASK_FIX_IP:-1}\"RED='\\033[0;31m'; GREEN='\\033[0;32m'; YELLOW='\\033[1;33m'; NC='\\033[0m'info()  { echo -e \"${GREEN}[INFO]${NC}  $*\"; }warn()  { echo -e \"${YELLOW}[WARN]${NC}  $*\"; }error() { echo -e \"${RED}[ERROR]${NC} $*\" &gt;&amp;2; exit 1; }# ==================================================================# 1. \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \/ \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f# ==================================================================if ! command -v python3 &amp;&gt;\/dev\/null; then    error \"python3 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d. \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0435: sudo apt install python3 python3-venv python3-pip\"fiif [ ! -d \"$VENV_DIR\" ]; then    info \"venv \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u0441\u043e\u0437\u0434\u0430\u044e $VENV_DIR...\"    python3 -m venv \"$VENV_DIR\"    \"$VENV_DIR\/bin\/pip\" install --quiet --upgrade pipfi# open-webui: \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043e\u0444\u0444\u043b\u0430\u0439\u043d, \u043f\u043e\u0442\u043e\u043c \u043e\u043d\u043b\u0430\u0439\u043dif [ ! -x \"$VENV_DIR\/bin\/open-webui\" ]; then    if [ -d \"$OFFLINE_PACKAGES_DIR\" ] &amp;&amp; [ -n \"$(ls -A \"$OFFLINE_PACKAGES_DIR\" 2&gt;\/dev\/null)\" ]; then        info \"\u0421\u0442\u0430\u0432\u043b\u044e open-webui \u0438\u0437 offline_packages...\"        if ! \"$VENV_DIR\/bin\/pip\" install --no-index \\                --find-links=\"$OFFLINE_PACKAGES_DIR\" open-webui; then            warn \"\u041e\u0444\u0444\u043b\u0430\u0439\u043d-\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043d\u0435 \u0443\u0434\u0430\u043b\u0430\u0441\u044c, \u043f\u0440\u043e\u0431\u0443\u044e \u0438\u0437 PyPI...\"            if ! \"$VENV_DIR\/bin\/pip\" show torch &amp;&gt;\/dev\/null; then                \"$VENV_DIR\/bin\/pip\" install torch --index-url https:\/\/download.pytorch.org\/whl\/cpu            fi            \"$VENV_DIR\/bin\/pip\" install open-webui        fi    else        info \"\u0421\u0442\u0430\u0432\u043b\u044e open-webui \u0438\u0437 PyPI...\"        \"$VENV_DIR\/bin\/pip\" install open-webui    fifi[ -x \"$VENV_DIR\/bin\/open-webui\" ] || error \"open-webui \u043d\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d \u0432 venv\"# \u0441\u0435\u043a\u0440\u0435\u0442\u044b[ -x \"$INIT_SECRETS\" ] || [ -f \"$INIT_SECRETS\" ] || error \"\u041d\u0435\u0442 $INIT_SECRETS\"if [ ! -f \"$SECRETS_FILE\" ]; then    info \"\u0421\u0435\u043a\u0440\u0435\u0442\u044b \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u044b, \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e...\"    bash \"$INIT_SECRETS\"fi[ -f \"$LLAMA_SCRIPT\" ] || error \"\u041d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d $LLAMA_SCRIPT\"[ -f \"$WEBUI_SCRIPT\" ] || error \"\u041d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d $WEBUI_SCRIPT\"# ==================================================================# 2. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0437\u0430\u043d\u044f\u0442\u043e\u0441\u0442\u0438 \u043f\u043e\u0440\u0442\u043e\u0432# ==================================================================for p in \"$LLAMA_PORT\" \"$WEBUI_PORT\"; do    if (echo &gt;\/dev\/tcp\/127.0.0.1\/\"$p\") 2&gt;\/dev\/null; then        error \"\u041f\u043e\u0440\u0442 $p \u0443\u0436\u0435 \u0437\u0430\u043d\u044f\u0442. \u041e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u0435 \u0438\u043b\u0438 \u0437\u0430\u0434\u0430\u0439\u0442\u0435 LLAMA_PORT\/WEBUI_PORT.\"    fidone# ==================================================================# 3. \u041e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u0430\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e IP# ==================================================================if [ \"$ASK_FIX_IP\" = \"1\" ] &amp;&amp; command -v nmcli &amp;&gt;\/dev\/null; then    read -n1 -r -p \"\u0421\u0434\u0435\u043b\u0430\u0442\u044c \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 IP \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u041f\u041a? [0 - \u043d\u0435\u0442, 1 - \u0434\u0430]: \" fix_ip    echo ''    if [ \"$fix_ip\" = \"1\" ]; then        echo \"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e IP...\"        iface=\"$(ip route | grep default | cut -d' ' -f5 | head -1)\"        [ -n \"$iface\" ] || error \"\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\"        echo \"\u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441: $iface\"        read -r -p \"IP-\u0430\u0434\u0440\u0435\u0441 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, 192.168.1.100\/24): \" ipaddr        read -r -p \"\u0428\u043b\u044e\u0437 (Enter \u2014 \u0430\u0432\u0442\u043e): \" gateway        read -r -p \"DNS (Enter \u2014 \u0430\u0432\u0442\u043e): \" dns        [ -n \"$gateway\" ] || gateway=\"$(ip route | grep default | cut -d' ' -f3 | head -1)\"        [ -n \"$dns\" ]     || dns=\"$(nmcli dev show | grep 'IP4.DNS' | tr -s ' ' | cut -d' ' -f2 | head -1)\"        sudo nmcli con mod \"$iface\" ipv4.addresses \"$ipaddr\"        sudo nmcli con mod \"$iface\" ipv4.gateway \"$gateway\"        sudo nmcli con mod \"$iface\" ipv4.dns \"$dns\"        sudo nmcli con mod \"$iface\" ipv4.method manual        sudo nmcli con up \"$iface\"        info \"\u0421\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 IP \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d. \u0422\u0435\u043a\u0443\u0449\u0438\u0439 \u0430\u0434\u0440\u0435\u0441: $(hostname -I)\"    fifi# ==================================================================# 4. \u041b\u043e\u0433\u0438 \u0438 trap# ==================================================================LLAMA_LOG=\"$(mktemp -t llama-orch.XXXXXX.log)\"WEBUI_LOG=\"$(mktemp -t webui-orch.XXXXXX.log)\"LLAMA_PID=\"\"WEBUI_PID=\"\"cleanup() {    local ec=$?    trap - EXIT INT TERM    set +e    echo \"\"    info \"\u0417\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435 \u0440\u0430\u0431\u043e\u0442\u044b...\"    # WebUI    if [ -n \"$WEBUI_PID\" ] &amp;&amp; kill -0 \"$WEBUI_PID\" 2&gt;\/dev\/null; then        info \"\u041e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u044e Open WebUI (PID $WEBUI_PID)...\"        kill \"$WEBUI_PID\" 2&gt;\/dev\/null        for _ in $(seq 1 10); do            kill -0 \"$WEBUI_PID\" 2&gt;\/dev\/null || break            sleep 1        done        kill -9 \"$WEBUI_PID\" 2&gt;\/dev\/null        wait \"$WEBUI_PID\" 2&gt;\/dev\/null    fi    # llama (bash-\u043e\u0431\u0451\u0440\u0442\u043a\u0430). \u0412\u043d\u0443\u0442\u0440\u0438 \u0435\u0451 trap \u0441\u0434\u0435\u043b\u0430\u0435\u0442 systemctl stop.    if [ -n \"$LLAMA_PID\" ] &amp;&amp; kill -0 \"$LLAMA_PID\" 2&gt;\/dev\/null; then        info \"\u041e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u044e llama-server (PID $LLAMA_PID)...\"        kill \"$LLAMA_PID\" 2&gt;\/dev\/null        for _ in $(seq 1 15); do            kill -0 \"$LLAMA_PID\" 2&gt;\/dev\/null || break            sleep 1        done        kill -9 \"$LLAMA_PID\" 2&gt;\/dev\/null        wait \"$LLAMA_PID\" 2&gt;\/dev\/null    fi    if [ \"$ec\" -ne 0 ] &amp;&amp; [ \"$ec\" -ne 130 ]; then        echo \"\"; warn \"\u0425\u0432\u043e\u0441\u0442 \u043b\u043e\u0433\u0430 llama:\"; tail -n 20 \"$LLAMA_LOG\" 2&gt;\/dev\/null        echo \"\"; warn \"\u0425\u0432\u043e\u0441\u0442 \u043b\u043e\u0433\u0430 webui:\"; tail -n 20 \"$WEBUI_LOG\" 2&gt;\/dev\/null    fi    rm -f \"$LLAMA_LOG\" \"$WEBUI_LOG\"    info \"\u0412\u0441\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u044b.\"    exit \"$ec\"}trap cleanup EXIT INT TERM# ==================================================================# 5. \u0417\u0430\u043f\u0443\u0441\u043a llama-server \u0432 \u0444\u043e\u043d\u0435# ==================================================================LLAMA_ARGS=()[ $# -ge 1 ] &amp;&amp; LLAMA_ARGS=(-m \"$1\")info \"\u0417\u0430\u043f\u0443\u0441\u043a llama-server \u043d\u0430 $LLAMA_HOST:$LLAMA_PORT...\"info \"\u041b\u043e\u0433: $LLAMA_LOG\"PORT=\"$LLAMA_PORT\" HOST=\"$LLAMA_HOST\" \\    \"$LLAMA_SCRIPT\" \"${LLAMA_ARGS[@]}\" &gt;\"$LLAMA_LOG\" 2&gt;&amp;1 &amp;LLAMA_PID=$!info \"llama-server \u0437\u0430\u043f\u0443\u0449\u0435\u043d (PID $LLAMA_PID)\"# ==================================================================# 6. \u041e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u0433\u043e\u0442\u043e\u0432\u043d\u043e\u0441\u0442\u0438 API# ==================================================================info \"\u0416\u0434\u0443 \u0433\u043e\u0442\u043e\u0432\u043d\u043e\u0441\u0442\u0438 API (\u0434\u043e 5 \u043c\u0438\u043d, \u043d\u0430 HDD \u2014 \u0434\u043e\u043b\u0433\u043e)...\"READY=0for i in $(seq 1 300); do    kill -0 \"$LLAMA_PID\" 2&gt;\/dev\/null || {        warn \"llama-server \u0443\u043c\u0435\u0440. \u041b\u043e\u0433:\"; tail -n 40 \"$LLAMA_LOG\"        exit 1    }    if curl -sf \"http:\/\/$LLAMA_HOST:$LLAMA_PORT\/health\" &gt;\/dev\/null 2&gt;&amp;1; then        READY=1; break    fi    [ $((i % 30)) -eq 0 ] &amp;&amp; info \"  ... \u0436\u0434\u0451\u043c ($i \u0441)\"    sleep 1done[ \"$READY\" -eq 1 ] || { warn \"llama-server \u043d\u0435 \u043f\u043e\u0434\u043d\u044f\u043b\u0441\u044f \u0437\u0430 5 \u043c\u0438\u043d. \u041b\u043e\u0433:\"; tail -n 40 \"$LLAMA_LOG\"; exit 1; }info \"llama-server \u0433\u043e\u0442\u043e\u0432.\"# ==================================================================# 7. \u0417\u0430\u043f\u0443\u0441\u043a Open WebUI (foreground \u043f\u043e \u0441\u0443\u0442\u0438; wait \u043d\u0438\u0436\u0435)# ==================================================================LAN_IP=\"$(hostname -I 2&gt;\/dev\/null | awk '{print $1}')\"info \"\u0417\u0430\u043f\u0443\u0441\u043a Open WebUI \u043d\u0430 0.0.0.0:$WEBUI_PORT...\"info \"\u041e\u0442\u043a\u0440\u044b\u0442\u044c: http:\/\/127.0.0.1:$WEBUI_PORT\"[ -n \"$LAN_IP\" ] &amp;&amp; info \"   \u0438\u043b\u0438:  http:\/\/$LAN_IP:$WEBUI_PORT\"WEBUI_HOST=0.0.0.0 WEBUI_PORT=\"$WEBUI_PORT\" \\    \"$VENV_DIR\/bin\/python\" \"$WEBUI_SCRIPT\" 2&gt;&amp;1 | tee -a \"$WEBUI_LOG\" &amp;WEBUI_PID=$!# \u0416\u0434\u0451\u043c \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f WebUI (Ctrl+C -&gt; trap)wait \"$WEBUI_PID\"<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<h4>\u041a\u043e\u0434 start_webui.py<\/h4>\n<pre><code class=\"python\">#!\/usr\/bin\/env python3\"\"\"\u0417\u0430\u043f\u0443\u0441\u043a Open WebUI \u0441 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c\u0438 \u0434\u043b\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e llama-server.\"\"\"import osimport sysimport subprocessSCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))SECRETS_FILE = os.path.join(SCRIPT_DIR, \".secrets\")DATA_DIR = os.path.join(SCRIPT_DIR, \"open-webui-data\")# --- \u0427\u0442\u0435\u043d\u0438\u0435 \u0441\u0435\u043a\u0440\u0435\u0442\u043e\u0432 \u0438\u0437 .secrets ---def load_secrets(path):    result = {}    if not os.path.isfile(path):        return result    with open(path) as f:        for line in f:            line = line.strip()            if not line or line.startswith(\"#\") or \"=\" not in line:                continue            key, _, val = line.partition(\"=\")            result[key.strip()] = val.strip()    return resultsecrets = load_secrets(SECRETS_FILE)# WEBUI_SECRET_KEY \u2014 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u0435\u043d \u0434\u043b\u044f \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b\u0445 \u0441\u0435\u0441\u0441\u0438\u0439if \"WEBUI_SECRET_KEY\" not in secrets:    print(f\"\u041e\u0448\u0438\u0431\u043a\u0430: \u0432 {SECRETS_FILE} \u043d\u0435\u0442 WEBUI_SECRET_KEY. \"          f\"\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0435 init_secrets.sh\", file=sys.stderr)    sys.exit(1)os.environ[\"WEBUI_SECRET_KEY\"] = secrets[\"WEBUI_SECRET_KEY\"]# LLAMA_API_KEY \u2014 \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a llama-serverllama_api_key = secrets.get(\"LLAMA_API_KEY\", \"sk-no-key-required\")os.environ[\"OPENAI_API_KEY\"] = llama_api_key# --- \u041e\u0444\u0444\u043b\u0430\u0439\u043d-\u0440\u0435\u0436\u0438\u043c \u0438 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043b\u0438\u0448\u043d\u0435\u0433\u043e ---os.environ[\"OFFLINE_MODE\"] = \"true\"os.environ[\"HF_HUB_OFFLINE\"] = \"1\"os.environ[\"RAG_EMBEDDING_MODEL_AUTO_UPDATE\"] = \"false\"os.environ[\"RAG_RERANKING_MODEL_AUTO_UPDATE\"] = \"false\"os.environ[\"RAG_EMBEDDING_ENGINE\"] = \"\"os.environ[\"RAG_EMBEDDING_MODEL\"] = \"\"os.environ[\"WHISPER_MODEL_AUTO_UPDATE\"] = \"false\"os.environ[\"AUDIO_STT_ENGINE\"] = \"\"os.environ[\"ENABLE_IMAGE_GENERATION\"] = \"false\"os.environ[\"ENABLE_COMMUNITY_FUNCTIONS\"] = \"false\"os.environ[\"USER_AGENT\"] = \"OpenWebUI-Offline\/1.0\"# --- Ollama off (\u043e\u0431\u043e\u0436\u0433\u043b\u0438\u0441\u044c) ---os.environ[\"ENABLE_OLLAMA_API\"] = \"false\"os.environ[\"OLLAMA_BASE_URL\"] = \"\"# --- \u0412\u0435\u0431-\u043f\u043e\u0438\u0441\u043a: \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c (DuckDuckGo \u0431\u0435\u0437 \u043a\u043b\u044e\u0447\u0430) ---os.environ[\"ENABLE_RAG_WEB_SEARCH\"] = \"true\"os.environ[\"ENABLE_WEB_SEARCH\"] = \"true\"os.environ[\"WEB_SEARCH_ENGINE\"] = \"duckduckgo\"# --- \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a llama-server ---os.environ[\"OPENAI_API_BASE_URL\"] = os.environ.get(    \"OPENAI_API_BASE_URL\", \"http:\/\/127.0.0.1:10000\/v1\")os.environ[\"BYPASS_MODEL_ACCESS_CONTROL\"] = \"True\"# --- \u0414\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 ---os.environ[\"DATA_DIR\"] = DATA_DIR# --- \u0417\u0430\u043f\u0443\u0441\u043a ---venv_bin = os.path.dirname(sys.executable)open_webui_cmd = os.path.join(venv_bin, \"open-webui\")if not os.path.exists(open_webui_cmd):    print(f\"\u041e\u0448\u0438\u0431\u043a\u0430: \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d {open_webui_cmd}. \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d \u043b\u0438 open-webui \u0432 venv?\",          file=sys.stderr)    sys.exit(1)webui_port = os.environ.get(\"WEBUI_PORT\", \"8080\")webui_host = os.environ.get(\"WEBUI_HOST\", \"0.0.0.0\")cmd = [open_webui_cmd, \"serve\", \"--host\", webui_host, \"--port\", webui_port]print(f\"[*] DATA_DIR:      {DATA_DIR}\")print(f\"[*] OPENAI_BASE:   {os.environ['OPENAI_API_BASE_URL']}\")print(f\"[*] Ollama:        \u043e\u0442\u043a\u043b\u044e\u0447\u0451\u043d\")print(f\"[*] Web search:    DuckDuckGo\")print(f\"[*] \u041a\u043e\u043c\u0430\u043d\u0434\u0430:       {' '.join(cmd)}\\n\")try:    subprocess.run(cmd, check=True)except KeyboardInterrupt:    print(\"\\n[*] Open WebUI \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d.\")except subprocess.CalledProcessError as e:    print(f\"[!] \u041e\u0448\u0438\u0431\u043a\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 Open WebUI: {e}\", file=sys.stderr)    sys.exit(1)    <\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<h4>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430<\/h4>\n<p><strong>1. <\/strong><code><strong>llama-server<\/strong><\/code><strong> \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442:<\/strong><\/p>\n<pre><code class=\"bash\">curl -sf http:\/\/127.0.0.1:10000\/health &amp;&amp; echo OK<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p><strong>2. \u041c\u043e\u0434\u0435\u043b\u0438 \u0432\u0438\u0434\u043d\u044b \u0432 API (\u0438, \u0437\u043d\u0430\u0447\u0438\u0442, \u0432 WebUI):<\/strong><\/p>\n<pre><code class=\"bash\">curl -s http:\/\/127.0.0.1:10000\/v1\/models | jq '.data[].id'<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0414\u043e\u043b\u0436\u0435\u043d \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0441\u0435\u0445 <code>.gguf<\/code> \u0438\u0437 <code>models\/<\/code>.<\/p>\n<p><strong>3. WebUI \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442:<\/strong><\/p>\n<pre><code class=\"bash\">curl -sf http:\/\/127.0.0.1:8080\/ &gt; \/dev\/null &amp;&amp; echo OK<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p><strong>4. \u041f\u0430\u043c\u044f\u0442\u044c \u043e\u0431\u043e\u0438\u0445 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432:<\/strong><\/p>\n<pre><code class=\"bash\">ps -o pid,comm,rss,%mem -C llama-server,python3<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p><code>llama-server<\/code> ~2\u20133 \u0413\u0411 \u0440\u0435\u0430\u043b\u044c\u043d\u043e (RSS \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u0438\u0437-\u0437\u0430 <code>mmap<\/code>), Python (WebUI) ~300\u2013500 \u041c\u0411.<\/p>\n<p><strong>5. \u041b\u043e\u0433\u0438 \u043f\u0440\u0438 \u043e\u0448\u0438\u0431\u043a\u0435:<\/strong><\/p>\n<pre><code class=\"bash\"># \u0415\u0441\u043b\u0438 run_webui.sh \u0443\u043f\u0430\u043b, \u043e\u043d \u043f\u043e\u043a\u0430\u0436\u0435\u0442 \u0445\u0432\u043e\u0441\u0442\u044b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438.# \u0420\u0443\u0447\u043d\u0430\u044f \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430:journalctl --user -u llama-server-* --since \"5 min ago\" 2&gt;\/dev\/null<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<h4>\u041f\u043e\u0434\u0432\u043e\u0434\u043d\u044b\u0435 \u043a\u0430\u043c\u043d\u0438<\/h4>\n<ol>\n<li>\n<p><code><strong>WEBUI_SECRET_KEY<\/strong><\/code><strong> \u0431\u0435\u0437 \u0444\u0430\u0439\u043b\u0430<\/strong> \u2014 \u0432\u0441\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u0440\u0430\u0437\u043b\u043e\u0433\u0438\u043d\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0435. \u0420\u0435\u0448\u0435\u043d\u0438\u0435: <code>.secrets<\/code> + <code>init_<\/code><a href=\"http:\/\/secrets.sh\" rel=\"noopener nofollow\"><code>secrets.sh<\/code><\/a> (\u0443\u0436\u0435 \u0441\u0434\u0435\u043b\u0430\u043d\u043e).<\/p>\n<\/li>\n<li>\n<p><strong>Ollama \u00ab\u0441\u0442\u0443\u0447\u0438\u0442\u0441\u044f\u00bb \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e<\/strong> \u2014 \u043e\u0448\u0438\u0431\u043a\u0438 \u0432 \u043b\u043e\u0433\u0430\u0445, \u0438\u043d\u043e\u0433\u0434\u0430 \u00ab\u0437\u0430\u043b\u0438\u043f\u0430\u043d\u0438\u0435\u00bb. \u0420\u0435\u0448\u0435\u043d\u0438\u0435: <code>ENABLE_OLLAMA_API=false<\/code> (\u0443\u0436\u0435 \u0441\u0434\u0435\u043b\u0430\u043d\u043e).<\/p>\n<\/li>\n<li>\n<p><strong>\u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f<\/strong> \u2014 \u0435\u0441\u043b\u0438 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c <code>ENABLE_SIGNUP=false<\/code> \u0434\u043e \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u0432\u043e\u0439\u0442\u0438 \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e. \u0420\u0435\u0448\u0435\u043d\u0438\u0435: \u043d\u0435 \u0437\u0430\u0434\u0430\u0432\u0430\u0442\u044c <code>ENABLE_SIGNUP<\/code> \u0432\u043e\u043e\u0431\u0449\u0435.<\/p>\n<\/li>\n<li>\n<p><strong>\u041f\u043e\u0440\u0442 8080 vs 8888<\/strong> \u2014 <code>run_<\/code><a href=\"http:\/\/webui.sh\" rel=\"noopener nofollow\"><code>webui.sh<\/code><\/a> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 <code>8080<\/code>, <code>run_sd_<\/code><a href=\"http:\/\/media.sh\" rel=\"noopener nofollow\"><code>media.sh<\/code><\/a> \u2014 <code>8888<\/code>. \u0415\u0441\u043b\u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043e\u0431\u0430 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e, \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442. \u041d\u043e <code>run_llama_<\/code><a href=\"http:\/\/mmap.sh\" rel=\"noopener nofollow\"><code>mmap.sh<\/code><\/a> <strong>\u0441\u0430\u043c \u043f\u043e \u0441\u0435\u0431\u0435<\/strong> (\u0431\u0435\u0437 <code>run_<\/code><a href=\"http:\/\/webui.sh\" rel=\"noopener nofollow\"><code>webui.sh<\/code><\/a>) \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 <code>8080<\/code> \u2014 \u0435\u0441\u043b\u0438 \u0432\u044b \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0435 \u0435\u0433\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0438 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0441 WebUI, \u0431\u0443\u0434\u0435\u0442 \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442. \u0420\u0435\u0448\u0435\u043d\u0438\u0435: <code>run_llama_<\/code><a href=\"http:\/\/mmap.sh\" rel=\"noopener nofollow\"><code>mmap.sh<\/code><\/a> \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u2014 \u043d\u0430 <code>8080<\/code>, \u0430 \u0441 WebUI \u2014 \u043d\u0430 <code>10000<\/code> (\u044d\u0442\u043e \u0443\u0436\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u043e \u0432 <code>run_<\/code><a href=\"http:\/\/webui.sh\" rel=\"noopener nofollow\"><code>webui.sh<\/code><\/a>). \u0415\u0441\u043b\u0438 \u0440\u0430\u043d\u0435\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u043b\u0438 \u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043b\u0438 <code>run_llama_<\/code><a href=\"http:\/\/mmap.sh\" rel=\"noopener nofollow\"><code>mmap.sh<\/code><\/a> \u043d\u0430 \u0440\u043e\u0434\u043d\u043e\u043c UI, \u0430 \u043f\u043e\u0442\u043e\u043c \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b\u0438 WebUI &#8212; \u043c\u043e\u0436\u0435\u0442 \u043d\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c\u0441\u044f \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 (\u043d\u0443\u0436\u043d\u043e \u043e\u0447\u0438\u0441\u0442\u0438\u0442\u044c \u043a\u044d\u0448 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430 \u0438 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u0431\u0434 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430 \u043d\u0430 \u044d\u0442\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435).<\/p>\n<\/li>\n<li>\n<p><code><strong>mmap<\/strong><\/code><strong> \u0438 <\/strong><code><strong>memory.pressure<\/strong><\/code> \u2014 \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 WebUI + llama \u043f\u043e\u0434 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u043e\u0439 \u0441\u043b\u0435\u0434\u0438\u0442\u0435 \u0437\u0430 <code>memory.current<\/code> \u0447\u0435\u0440\u0435\u0437 cgroup (\u043a\u0430\u043a \u0432 \u0447\u0430\u0441\u0442\u0438 2). \u0415\u0441\u043b\u0438 <code>MEM_MAX=10G<\/code> \u043c\u0430\u043b\u043e \u0434\u043b\u044f \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u2014 \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u0435 <code>CTX_SIZE<\/code> \u0438\u043b\u0438 \u043f\u043e\u0434\u043d\u0438\u043c\u0438\u0442\u0435 \u043b\u0438\u043c\u0438\u0442.<\/p>\n<\/li>\n<\/ol>\n<\/div>\n<p>\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/1099532\/\">https:\/\/habr.com\/ru\/articles\/1099532\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u0420\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e \u043f\u043e \u0441\u0431\u043e\u0440\u043a\u0435 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e AI-\u0441\u0442\u0435\u043a\u0430\u0427\u0430\u0441\u0442\u044c 5. Open WebUI \u043f\u043e\u0432\u0435\u0440\u0445 llama.cpp\u041d\u0430 \u044d\u0442\u043e\u043c \u0448\u0430\u0433\u0435 \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c Open WebUI \u2014 \u0432\u0435\u0431-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0441 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0435\u0439, \u0438\u0441\u0442\u043e\u0440\u0438\u0435\u0439 \u0447\u0430\u0442\u043e\u0432 \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u043e\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043c\u043e\u0434\u0435\u043b\u0435\u0439. \u042d\u0442\u043e \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u043b\u043e\u0439: llama-server \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u043e (\u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 127.0.0.1), \u0430 Open WebUI \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u00ab\u043f\u0430\u0440\u0430\u0434\u043d\u043e\u0439 \u0434\u0432\u0435\u0440\u044c\u044e\u00bb \u0434\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0438\u0437 LAN.\u0417\u0430\u0447\u0435\u043c \u043d\u0443\u0436\u0435\u043d Open WebUI\u0420\u043e\u0434\u043d\u043e\u0439 UI llama.cpp (Svelte) \u0445\u043e\u0440\u043e\u0448 \u0434\u043b\u044f \u043e\u0442\u043b\u0430\u0434\u043a\u0438, \u043d\u043e \u0443 \u043d\u0435\u0433\u043e \u043d\u0435\u0442:\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043c\u043e\u0434\u0435\u043b\u044f\u043c\u0438 \u2014 \u043d\u0435\u043b\u044c\u0437\u044f \u0437\u0430\u0434\u0430\u0442\u044c per-model \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u043f\u0440\u043e\u043c\u043f\u0442\u044b, \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0441\u044d\u043c\u043f\u043b\u0438\u043d\u0433\u0430, \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435.\u041c\u043d\u043e\u0433\u043e\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0440\u0435\u0436\u0438\u043c\u0430 \u2014 \u043e\u0434\u0438\u043d \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c = \u043e\u0434\u0438\u043d \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442.Open WebUI \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0432\u0441\u0451 \u044d\u0442\u043e, \u043e\u0441\u0442\u0430\u0432\u0430\u044f\u0441\u044c \u0442\u043e\u043d\u043a\u043e\u0439 \u043d\u0430\u0434\u0441\u0442\u0440\u043e\u0439\u043a\u043e\u0439 \u043d\u0430\u0434 llama-server. \u041e\u043d \u0445\u043e\u0434\u0438\u0442 \u043a \u043d\u0435\u043c\u0443 \u043f\u043e OpenAI-\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u043c\u0443 API (\/v1\/chat\/completions), \u0442\u0430\u043a \u0447\u0442\u043e llama.cpp \u0434\u0430\u0436\u0435 \u043d\u0435 \u0437\u043d\u0430\u0435\u0442, \u0447\u0442\u043e \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0434\u0440\u0443\u0433\u043e\u0439 \u043a\u043b\u0438\u0435\u043d\u0442.\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430LAN 0.0.0.0:8080 (Open WebUI) -&gt; Local 127.0.0.1:10000 llama-server\u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u044b:llama-server \u0441\u043b\u0443\u0448\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e 127.0.0.1:10000. \u0421\u043d\u0430\u0440\u0443\u0436\u0438 \u043a \u043d\u0435\u043c\u0443 \u043d\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f.Open WebUI \u0441\u043b\u0443\u0448\u0430\u0435\u0442 0.0.0.0:8080, \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0438\u0437 LAN, \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043b\u043e\u0433\u0438\u043d.\u0421\u0435\u043a\u0440\u0435\u0442\u044b (API-\u043a\u043b\u044e\u0447 llama + \u0441\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 WebUI) \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 .secrets (chmod 600), \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043e\u0434\u0438\u043d \u0440\u0430\u0437.\u041e\u0440\u043a\u0435\u0441\u0442\u0440\u0430\u0442\u043e\u0440 run_webui.sh \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u0442 \u043e\u0431\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430, \u0436\u0434\u0451\u0442 \u0433\u043e\u0442\u043e\u0432\u043d\u043e\u0441\u0442\u0438 llama-server, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 WebUI, \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u043e\u0431\u0430 \u043f\u043e Ctrl+C.\u0421\u0435\u043a\u0440\u0435\u0442\u044b: .secrets \u0438 init_secrets.sh\u041f\u0435\u0440\u0435\u0434 \u043f\u0435\u0440\u0432\u044b\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u043e\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c .secrets \u2014 \u0444\u0430\u0439\u043b \u0441 \u0434\u0432\u0443\u043c\u044f \u043a\u043b\u044e\u0447\u0430\u043c\u0438:\u041a\u043b\u044e\u0447\u0414\u043b\u044f \u0447\u0435\u0433\u043e\u041a\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442LLAMA_API_KEY\u0410\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043a llama-serverOpen WebUI (\u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442 \u0432 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0435 Authorization: Bearer &#8230;), \u0432\u043d\u0435\u0448\u043d\u0438\u0435 \u043a\u043b\u0438\u0435\u043d\u0442\u044bWEBUI_SECRET_KEY\u041f\u043e\u0434\u043f\u0438\u0441\u044c JWT-\u0442\u043e\u043a\u0435\u043d\u043e\u0432 \u0441\u0435\u0441\u0441\u0438\u0439 Open WebUI\u0421\u0430\u043c Open WebUI (\u0431\u0435\u0437 \u043d\u0435\u0433\u043e \u0432\u0441\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u0440\u0430\u0437\u043b\u043e\u0433\u0438\u043d\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0435)\u0412\u0430\u0436\u043d\u043e \u043f\u0440\u043e WEBUI_SECRET_KEY. \u0415\u0441\u043b\u0438 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0435 (secrets.token_hex(32) \u0432 Python), \u0442\u043e \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0435 WebUI \u0432\u0441\u0435 \u0441\u0435\u0441\u0441\u0438\u0438 \u0441\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u2014 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u0432\u044b\u043d\u0443\u0436\u0434\u0435\u043d\u044b \u043b\u043e\u0433\u0438\u043d\u0438\u0442\u044c\u0441\u044f \u0437\u0430\u043d\u043e\u0432\u043e. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043a\u043b\u044e\u0447 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0432 \u0444\u0430\u0439\u043b\u0435 \u0438 \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f. init_secrets.sh \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0444\u0430\u0439\u043b \u043e\u0434\u0438\u043d \u0440\u0430\u0437, \u043f\u0440\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043c\u0435\u043d\u044f\u0435\u0442.\u0424\u043e\u0440\u043c\u0430\u0442 .secrets \u2014 \u043f\u0440\u043e\u0441\u0442\u044b\u0435 KEY=VALUE, \u0447\u0438\u0442\u0430\u044e\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 source \u0432 bash \u0438 \u0447\u0435\u0440\u0435\u0437 open() \u0432 Python:# \u0421\u0435\u043a\u0440\u0435\u0442\u044b \u043f\u0440\u043e\u0435\u043a\u0442\u0430. \u041d\u0435 \u043a\u043e\u043c\u043c\u0438\u0442\u0438\u0442\u044c \u0432 git. chmod 600.LLAMA_API_KEY=&lt;48 hex-\u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432&gt;WEBUI_SECRET_KEY=&lt;64 hex-\u0441\u0438\u043c\u0432\u043e\u043b\u0430&gt;\u041f\u0440\u0430\u0432\u0430 600 \u2014 \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u043b\u0430\u0434\u0435\u043b\u0435\u0446 \u043c\u043e\u0436\u0435\u0442 \u0447\u0438\u0442\u0430\u0442\u044c. \u042d\u0442\u043e \u043a\u0440\u0438\u0442\u0438\u0447\u043d\u043e: \u043a\u043b\u044e\u0447\u0438 \u0434\u0430\u044e\u0442 \u043f\u043e\u043b\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0443.\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 Open WebUIOpen WebUI \u0441\u0442\u0430\u0432\u0438\u0442\u0441\u044f \u0432 \u0442\u043e\u0442 \u0436\u0435 venv, \u0447\u0442\u043e \u0438 \u0432\u0441\u0451 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 (venv\/). \u042d\u0442\u043e \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 wheelhouse (\u043e\u0434\u0438\u043d \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0430\u043a\u0435\u0442\u043e\u0432) \u0438 \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0432\u0442\u043e\u0440\u043e\u0439 Python-\u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440..\/venv\/bin\/pip install &#8212;upgrade pip.\/venv\/bin\/pip install torch &#8212;index-url https:\/\/download.pytorch.org\/whl\/cpu.\/venv\/bin\/pip install open-webuiCPU-\u0432\u0435\u0440\u0441\u0438\u044f torch \u0441\u0442\u0430\u0432\u0438\u0442\u0441\u044f \u0434\u043e open-webui, \u0438\u043d\u0430\u0447\u0435 pip \u043f\u0440\u0438\u0442\u044f\u043d\u0435\u0442 CUDA-\u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0441 nvidia-* \u043f\u0430\u043a\u0435\u0442\u0430\u043c\u0438 (\u0431\u043e\u043b\u0435\u0435 2 \u0413\u0411 \u043b\u0438\u0448\u043d\u0435\u0433\u043e).\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 Open WebUI: start_webui.py\u0421\u043a\u0440\u0438\u043f\u0442 \u0447\u0438\u0442\u0430\u0435\u0442 .secrets, \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 env-\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 open-webui serve. \u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438:\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a llama-serveros.environ[&#171;OPENAI_API_BASE_URL&#187;] = &#171;http:\/\/127.0.0.1:10000\/v1&#8243;os.environ[&#171;OPENAI_API_KEY&#187;] = llama_api_keyos.environ[&#171;BYPASS_MODEL_ACCESS_CONTROL&#187;] = &#171;True&#187;OPENAI_API_BASE_URL \u2014 \u0430\u0434\u0440\u0435\u0441 llama-server. \u041f\u043e\u0440\u0442 10000 \u2014 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 (\u0437\u0430\u0434\u0430\u043d \u0432 run_webui.sh \u0447\u0435\u0440\u0435\u0437 LLAMA_PORT), \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u043e\u0432\u0430\u0442\u044c \u0441 \u0440\u043e\u0434\u043d\u044b\u043c UI llama.cpp \u043d\u0430 8080.OPENAI_API_KEY \u2014 \u043a\u043b\u044e\u0447 \u0438\u0437 .secrets. Open WebUI \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442 \u0435\u0433\u043e \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u0435, llama-server \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442.BYPASS_MODEL_ACCESS_CONTROL \u2014 \u0432\u0441\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u0438\u0437 \u0440\u043e\u0443\u0442\u0435\u0440\u0430 \u0432\u0438\u0434\u043d\u044b \u0432\u0441\u0435\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c WebUI, \u0431\u0435\u0437 \u0440\u0443\u0447\u043d\u043e\u0433\u043e \u00ab\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u0440\u0430\u0432 \u043d\u0430 \u043c\u043e\u0434\u0435\u043b\u044c\u00bb.\u041e\u0444\u0444\u043b\u0430\u0439\u043d-\u0440\u0435\u0436\u0438\u043cos.environ[&#171;OFFLINE_MODE&#187;] = &#171;true&#187;os.environ[&#171;HF_HUB_OFFLINE&#187;] = &#171;1&#187;os.environ[&#171;RAG_EMBEDDING_MODEL_AUTO_UPDATE&#187;] = &#171;false&#187;os.environ[&#171;RAG_RERANKING_MODEL_AUTO_UPDATE&#187;] = &#171;false&#187;os.environ[&#171;RAG_EMBEDDING_ENGINE&#187;] = &#171;&#187;os.environ[&#171;RAG_EMBEDDING_MODEL&#187;] = &#171;&#187;os.environ[&#171;WHISPER_MODEL_AUTO_UPDATE&#187;] = &#171;false&#187;os.environ[&#171;AUDIO_STT_ENGINE&#187;] = &#171;&#187;OFFLINE_MODE=true \u2014 \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0439 \u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0441 Hugging Face.RAG_* \u2014 \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u0442 RAG-\u044d\u043c\u0431\u0435\u0434\u0434\u0438\u043d\u0433\u0438 (\u0438\u043d\u0430\u0447\u0435 \u043f\u0440\u0438 \u043f\u0435\u0440\u0432\u043e\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u0435 WebUI \u043f\u043e\u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u0441\u043a\u0430\u0447\u0430\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u044c \u044d\u043c\u0431\u0435\u0434\u0434\u0438\u043d\u0433\u043e\u0432 ~500 \u041c\u0411).AUDIO_STT_ENGINE=&#187;&#187; \u2014 \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u0442 Whisper (\u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u0435 \u0440\u0435\u0447\u0438), \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0442\u044f\u043d\u0443\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u044c.Ollama \u2014 \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u043cos.environ[&#171;ENABLE_OLLAMA_API&#187;] = &#171;false&#187;os.environ[&#171;OLLAMA_BASE_URL&#187;] = &#171;&#187;\u0417\u0430\u0447\u0435\u043c. Open WebUI \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0442\u044c Ollama \u043d\u0430 localhost:11434 \u0438 \u00ab\u043f\u043e\u0434\u0440\u0443\u0436\u0438\u0442\u044c\u0441\u044f\u00bb \u0441 \u043d\u0438\u043c. \u0415\u0441\u043b\u0438 Ollama \u043d\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0430, \u0432 \u043b\u043e\u0433\u0430\u0445 \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043e\u0448\u0438\u0431\u043a\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f, \u0430 \u0438\u043d\u043e\u0433\u0434\u0430 WebUI \u00ab\u0437\u0430\u043b\u0438\u043f\u0430\u0435\u0442\u00bb \u043d\u0430 \u043f\u043e\u043f\u044b\u0442\u043a\u0430\u0445 \u0434\u043e\u0441\u0442\u0443\u0447\u0430\u0442\u044c\u0441\u044f \u0438 \u043d\u0435 \u0432\u044b\u0434\u0430\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u0438\u0437 llama-cpp \u0441\u0435\u0440\u0432\u0435\u0440\u0430. \u041e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 ENABLE_OLLAMA_API=false \u0443\u0431\u0438\u0440\u0430\u0435\u0442 \u044d\u0442\u0443 \u0433\u043e\u043b\u043e\u0432\u043d\u0443\u044e \u0431\u043e\u043b\u044c (\u043c\u044b \u0443\u0436\u0435 \u043e\u0431\u043e\u0436\u0433\u043b\u0438\u0441\u044c \u043d\u0430 \u044d\u0442\u043e\u043c \u0432 \u0441\u0442\u0430\u0440\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435).\u0412\u0435\u0431-\u043f\u043e\u0438\u0441\u043a \u2014 \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043cos.environ[&#171;ENABLE_RAG_WEB_SEARCH&#187;] = &#171;true&#187;os.environ[&#171;ENABLE_WEB_SEARCH&#187;] = &#171;true&#187;os.environ[&#171;WEB_SEARCH_ENGINE&#187;] = &#171;duckduckgo&#187;DuckDuckGo \u2014 \u0431\u0435\u0437 API-\u043a\u043b\u044e\u0447\u0430, \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u00ab\u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438\u00bb, \u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442. \u041c\u043e\u0434\u0435\u043b\u044c \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043f\u043e\u0438\u0441\u043a\u0430 \u0434\u043b\u044f \u043e\u0442\u0432\u0435\u0442\u0430 (RAG-\u043f\u043e\u0438\u0441\u043a \u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435). \u0415\u0441\u043b\u0438 \u0441\u0435\u0442\u0438 \u043d\u0435\u0442 \u2014 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u043d\u043e \u043d\u0435 \u043b\u043e\u043c\u0430\u0435\u0442 \u0447\u0430\u0442.\u041f\u0440\u043e\u0447\u0438\u0435 \u043c\u0435\u043b\u043e\u0447\u0438os.environ[&#171;ENABLE_IMAGE_GENERATION&#187;] = &#171;false&#187;    # \u043c\u044b \u043d\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c sd-server \u043a WebUIos.environ[&#171;ENABLE_COMMUNITY_FUNCTIONS&#187;] = &#171;false&#187; # \u043d\u0435 \u0433\u0440\u0443\u0437\u0438\u043c \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0435 \u043f\u043b\u0430\u0433\u0438\u043d\u044bos.environ[&#171;USER_AGENT&#187;] = &#171;OpenWebUI-Offline\/1.0&#187; # \u0443\u0431\u0438\u0440\u0430\u0435\u0442 \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435 LangChainos.environ[&#171;DATA_DIR&#187;] = DATA_DIR                  # \u0434\u0430\u043d\u043d\u044b\u0435 \u0432\u043d\u0443\u0442\u0440\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f# os.environ[&#171;ENABLE_SIGNUP&#187;] = &#171;false&#187;  # \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u041d\u0415 \u0437\u0430\u0434\u0430\u0451\u043c\u041b\u043e\u0433\u0438\u043a\u0430 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e:ENABLE_SIGNUP \u043d\u0435 \u0437\u0430\u0434\u0430\u0451\u043c -&gt; \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u043e\u0442\u043a\u0440\u044b\u0442\u0430.\u041f\u0435\u0440\u0432\u044b\u0439 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0432\u0448\u0438\u0439\u0441\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0430\u0434\u043c\u0438\u043d\u043e\u043c.\u041f\u043e\u0441\u043b\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0430\u0434\u043c\u0438\u043d\u0430 Open WebUI \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044e.\u0427\u0442\u043e\u0431\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f: \u0430\u0434\u043c\u0438\u043d \u0437\u0430\u0445\u043e\u0434\u0438\u0442 \u0432 Admin -&gt; Users -&gt; \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044e \u043d\u0430 \u0432\u0440\u0435\u043c\u044f -&gt; \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0430\u043a\u043a\u0430\u0443\u043d\u0442 -&gt; \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u0431\u0440\u0430\u0442\u043d\u043e.\u0415\u0441\u043b\u0438 \u0436\u0451\u0441\u0442\u043a\u043e \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c ENABLE_SIGNUP=false \u0434\u043e \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u2014 \u0434\u0430\u0436\u0435 \u0430\u0434\u043c\u0438\u043d \u043d\u0435 \u0441\u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u0443\u0441\u0442\u044b\u043c.\u041e\u0440\u043a\u0435\u0441\u0442\u0440\u0430\u0442\u043e\u0440: run_webui.sh\u0421\u043a\u0440\u0438\u043f\u0442 \u0434\u0435\u043b\u0430\u0435\u0442 \u043f\u044f\u0442\u044c \u0432\u0435\u0449\u0435\u0439:\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u2014 venv, open-webui, .secrets, run_llama_mmap.sh, start_webui.py. \u0415\u0441\u043b\u0438 \u0447\u0435\u0433\u043e-\u0442\u043e \u043d\u0435\u0442 \u2014 \u0441\u043e\u0437\u0434\u0430\u0451\u0442\/\u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 (\u043f\u0435\u0440\u0432\u044b\u0439 \u0437\u0430\u043f\u0443\u0441\u043a).\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043f\u043e\u0440\u0442\u044b 10000 \u0438 8080 \u2014 \u0435\u0441\u043b\u0438 \u0437\u0430\u043d\u044f\u0442\u044b, \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439.\u041e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 IP (\u0447\u0435\u0440\u0435\u0437 nmcli), \u0435\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043e\u0442\u0432\u0435\u0442\u0438\u0442 1. \u041f\u043e\u043b\u0435\u0437\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u0430\u0434\u0440\u0435\u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043d\u0435 \u043c\u0435\u043d\u044f\u043b\u0441\u044f \u043f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0440\u043e\u0443\u0442\u0435\u0440\u0430.\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 llama-server \u0432 \u0444\u043e\u043d\u0435 \u043d\u0430 127.0.0.1:10000 \u0447\u0435\u0440\u0435\u0437 PORT=10000 HOST=127.0.0.1 .\/run_llama_mmap.sh. \u0416\u0434\u0451\u0442 \/health \u0434\u043e 5 \u043c\u0438\u043d\u0443\u0442.\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 Open WebUI \u043d\u0430 0.0.0.0:8080 \u0447\u0435\u0440\u0435\u0437 start_webui.py. \u0423\u0445\u043e\u0434\u0438\u0442 \u0432 wait.\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 Ctrl+C. trap cleanup EXIT INT TERM \u043b\u043e\u0432\u0438\u0442 \u0441\u0438\u0433\u043d\u0430\u043b \u0438:\u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 WebUI (SIGTERM, \u0436\u0434\u0451\u0442 10 \u0441, SIGKILL);\u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 llama-server (\u0448\u043b\u0451\u0442 SIGTERM \u0432 bash-\u043e\u0431\u0451\u0440\u0442\u043a\u0443 run_llama_mmap.sh, \u0435\u0451 trap \u0434\u0435\u043b\u0430\u0435\u0442 systemctl &#8212;user stop, \u0441\u0435\u0440\u0432\u0435\u0440 \u0443\u043c\u0438\u0440\u0430\u0435\u0442);\u043f\u0440\u0438 \u043e\u0448\u0438\u0431\u043a\u0435 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0445\u0432\u043e\u0441\u0442\u044b \u043b\u043e\u0433\u043e\u0432 \u043e\u0431\u043e\u0438\u0445 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432.\u041f\u0440\u043e \u043c\u043e\u0434\u0435\u043b\u044c. run_webui.sh \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u0435\u0440\u0432\u044b\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u2014 \u0438\u043c\u044f \u043c\u043e\u0434\u0435\u043b\u0438. \u0415\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c .\/run_webui.sh Qwen3.5-9B-Q4_K_M, \u043e\u043d\u043e \u0443\u0439\u0434\u0451\u0442 \u0432 run_llama_mmap.sh -m &#8230;, \u0438 \u0441\u0435\u0440\u0432\u0435\u0440 \u0441\u0442\u0430\u0440\u0442\u0443\u0435\u0442 \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u043e\u0434\u043d\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438. \u0415\u0441\u043b\u0438 \u043d\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u2014 run_llama_mmap.sh \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0441\u044f \u0432 router mode (\u0441\u043f\u0438\u0441\u043e\u043a \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u0432 \u0434\u0440\u043e\u043f\u0434\u0430\u0443\u043d\u0435 WebUI, \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043f\u043e \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044e).\u041f\u043e\u0447\u0435\u043c\u0443 router mode \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e: WebUI \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u0438 \u0431\u0435\u0437 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430. \u041f\u0435\u0440\u0432\u0430\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043c\u043e\u0434\u0435\u043b\u0438 \u043f\u0440\u0438 \u0432\u044b\u0431\u043e\u0440\u0435 \u2014 \u0434\u043e\u043b\u0433\u0430\u044f, \u043d\u043e \u0434\u0430\u043b\u044c\u0448\u0435 \u2014 \u043a\u043e\u043c\u0444\u043e\u0440\u0442\u043d\u043e. \u0415\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c \u0441\u0440\u0430\u0437\u0443 \u2014 \u043f\u0435\u0440\u0435\u0434\u0430\u0439\u0442\u0435 \u0435\u0451 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u043c, \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u043d\u0430.\u0417\u0430\u043f\u0443\u0441\u043a \u0438 \u043f\u0435\u0440\u0432\u044b\u0439 \u0432\u0445\u043e\u0434.\/run_webui.sh\u0412\u044b\u0432\u043e\u0434:[INFO]  \u0417\u0430\u043f\u0443\u0441\u043a llama-server \u043d\u0430 127.0.0.1:10000&#8230;[INFO]  llama-server \u0437\u0430\u043f\u0443\u0449\u0435\u043d (PID 12345)[INFO]  \u0416\u0434\u0443 \u0433\u043e\u0442\u043e\u0432\u043d\u043e\u0441\u0442\u0438 API (\u0434\u043e 5 \u043c\u0438\u043d, \u043d\u0430 HDD \u2014 \u0434\u043e\u043b\u0433\u043e)&#8230;[INFO]  llama-server \u0433\u043e\u0442\u043e\u0432.[INFO]  \u0417\u0430\u043f\u0443\u0441\u043a Open WebUI \u043d\u0430 0.0.0.0:8080&#8230;[INFO]  \u041e\u0442\u043a\u0440\u044b\u0442\u044c: http:\/\/127.0.0.1:8080[INFO]     \u0438\u043b\u0438:  http:\/\/192.168.1.100:8080\u041f\u0435\u0440\u0432\u044b\u0439 \u0432\u0445\u043e\u0434:\u041e\u0442\u043a\u0440\u043e\u0439\u0442\u0435 http:\/\/&lt;IP&gt;:8080 \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435.\u041d\u0430\u0436\u043c\u0438\u0442\u0435 \u00abSign up\u00bb \u2014 \u0441\u043e\u0437\u0434\u0430\u0439\u0442\u0435 \u0430\u043a\u043a\u0430\u0443\u043d\u0442. \u041f\u0435\u0440\u0432\u044b\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c = \u0430\u0434\u043c\u0438\u043d.\u041f\u043e\u0441\u043b\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u0430 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438.\u0412 \u0434\u0440\u043e\u043f\u0434\u0430\u0443\u043d\u0435 \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u2014 \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0441\u0435\u0445 .gguf \u0438\u0437 models\/. \u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043d\u0443\u0436\u043d\u0443\u044e.\u041f\u0438\u0448\u0438\u0442\u0435 \u0432 \u0447\u0430\u0442. \u0418\u0441\u0442\u043e\u0440\u0438\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438.\u0414\u043b\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f: \u0437\u0430\u0439\u0434\u0438\u0442\u0435 \u043a\u0430\u043a \u0430\u0434\u043c\u0438\u043d -&gt; Admin Panel -&gt; Users -&gt; \u043a\u043d\u043e\u043f\u043a\u0430 \u00abEnable Signup\u00bb -&gt; \u0441\u043e\u0437\u0434\u0430\u0439\u0442\u0435 \u0430\u043a\u043a\u0430\u0443\u043d\u0442 \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0438\u043b\u0438 \u0434\u0430\u0439\u0442\u0435 \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0443 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f -&gt; \u00abDisable Signup\u00bb.\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u0432 WebUI\u041e\u0434\u043d\u043e \u0438\u0437 \u0433\u043b\u0430\u0432\u043d\u044b\u0445 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432 Open WebUI \u2014 per-model \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0435\u0442 \u0432 \u0440\u043e\u0434\u043d\u043e\u043c UI llama.cpp:Admin Panel -&gt; Models \u2014 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0434\u0430\u0442\u044c: System Prompt \u2014 \u00ab\u0422\u044b \u2014 \u0430\u0441\u0441\u0438\u0441\u0442\u0435\u043d\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u043a\u0440\u0430\u0442\u043a\u043e\u00bb \u0438 \u0442.\u043f.Temperature, top_p, top_k, repeat_penalty \u2014 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0441\u044d\u043c\u043f\u043b\u0438\u043d\u0433\u0430.Function calling, vision, file upload \u2014 \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c\/\u0432\u044b\u043a\u043b\u044e\u0447\u0438\u0442\u044c.Default model \u2014 \u043a\u0430\u043a\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u0438 \u043d\u043e\u0432\u043e\u0433\u043e \u0447\u0430\u0442\u0430.\u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u00ab\u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0438 \u0437\u0430\u0431\u044b\u0442\u044c\u00bb: \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043b\u044f OxCoder-9B \u2014 temperature=0.2 (\u043a\u043e\u0434 \u0442\u043e\u0447\u043d\u0435\u0435), \u0434\u043b\u044f Gemma-4-E4B \u2014 temperature=0.9 (\u0420\u041f \u0436\u0438\u0432\u0435\u0435). \u0412 llama.cpp \u0442\u0430\u043a\u0438\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0431\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u0435.\u041a\u043e\u0434 init_secrets.sh#!\/usr\/bin\/env bash# \u0421\u043e\u0437\u0434\u0430\u0451\u0442 .secrets \u0441 LLAMA_API_KEY \u0438 WEBUI_SECRET_KEY, \u0435\u0441\u043b\u0438 \u0444\u0430\u0439\u043b\u0430 \u043d\u0435\u0442.# \u0418\u0434\u0435\u043c\u043f\u043e\u0442\u0435\u043d\u0442\u0435\u043d: \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u044b\u0439 \u0437\u0430\u043f\u0443\u0441\u043a \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043c\u0435\u043d\u044f\u0435\u0442.set -euo pipefailSCRIPT_DIR=&#187;$(cd &#171;$(dirname &#171;${BASH_SOURCE[0]}&#187;)&#187; &amp;&amp; pwd)&#187;SECRETS_FILE=&#187;$SCRIPT_DIR\/.secrets&#187;if [ -f &#171;$SECRETS_FILE&#187; ]; then    echo &#171;[*] $SECRETS_FILE \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442, \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043c\u0435\u043d\u044f\u044e.&#187;    exit 0ficommand -v openssl &gt;\/dev\/null || { echo &#171;[!] \u043d\u0443\u0436\u0435\u043d openssl&#187;; exit 1; }LLAMA_API_KEY=&#187;$(openssl rand -hex 24)&#187;WEBUI_SECRET_KEY=&#187;$(openssl rand -hex 32)&#187;umask 077cat &gt; &#171;$SECRETS_FILE&#187; &lt;&lt;EOF# \u0421\u0435\u043a\u0440\u0435\u0442\u044b \u043f\u0440\u043e\u0435\u043a\u0442\u0430. \u041d\u0435 \u043a\u043e\u043c\u043c\u0438\u0442\u0438\u0442\u044c \u0432 git. chmod 600.LLAMA_API_KEY=$LLAMA_API_KEYWEBUI_SECRET_KEY=$WEBUI_SECRET_KEYEOFchmod 600 &#171;$SECRETS_FILE&#187;echo &#171;[*] \u0421\u043e\u0437\u0434\u0430\u043d $SECRETS_FILE&#187;echo &#187;    LLAMA_API_KEY=${LLAMA_API_KEY:0:8}&#8230; (\u043f\u0435\u0440\u0432\u044b\u0435 8 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432)&#187;echo &#187;    WEBUI_SECRET_KEY=${WEBUI_SECRET_KEY:0:8}&#8230;&#187;\u041a\u043e\u0434 run_webui.sh#!\/usr\/bin\/env bash# \u0417\u0430\u043f\u0443\u0441\u043a llama-server (\u043f\u043e\u0440\u0442 10000) + Open WebUI (\u043f\u043e\u0440\u0442 8080).# \u041f\u0440\u0438 \u043f\u0435\u0440\u0432\u043e\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0435: \u0441\u043e\u0437\u0434\u0430\u0451\u0442 venv, \u0441\u0442\u0430\u0432\u0438\u0442 open-webui, \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 .secrets.## Usage: .\/run_webui.sh [model_name]#   model_name \u2014 \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e; \u0435\u0441\u043b\u0438 \u043d\u0435 \u0437\u0430\u0434\u0430\u043d, run_llama_mmap.sh \u0441\u043f\u0440\u043e\u0441\u0438\u0442 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u043e.## Env:#   LLAMA_PORT=10000   \u043f\u043e\u0440\u0442 llama-server (\u0442\u043e\u043b\u044c\u043a\u043e localhost)#  &#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-500322","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/500322","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=500322"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/500322\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=500322"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=500322"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=500322"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}