Актуальна на июль 2026 года. Поддерживать не планирую.
Проект помогает создать домашний сервер для работы с искусственным интеллектом без подключения к интернету. Это нужно для защиты данных. Если у вас появится желание оставить подключение к интернету то вы спокойно можете это сделать.
Сервер состоит из связки контейнеров Docker (nginx > open-webui > llama-server):
- Первая программа называется llama-server. Это мозг сервера. Она хранит умные модели и думает над ответами.
- Вторая программа называется open-webui. Это красивый сайт, где люди могут писать вопросы и читать ответы.
- Третья программа называется nginx. Это входная дверь. Она встречает посетителей и пропускает их к нужным программам.
- Компьютер с видеокартой NVIDIA и операционной системой Linux на базе RHEL. в моем случае это Rocky 10 с RTX3090 на 24gb, 500gb DDR4 и Intel(R) Xeon(R) CPU E5-2687W v4 @ 3.00GHz CPU @ 3.0GHz.
- Установленные драйверы для видеокарты NVIDIA.
- Второй компьютер, у которого есть интернет.
- Внешний жесткий диск для переноса файлов. Все команды на сервере нужно выполнять от имени главного пользователя (root) по одной!
Сервер соберите под свои нужды! Не обязательно иметь столбко оперативки - расчитайте по колличеству пользователей, но желательно не менее 32gb.
Так же для ужобства используйте GNU Midnight Commander или попросту mc
На этом шаге мы скачаем все нужные файлы и положим их на внешний диск.
- Скачайте папку проекта. Откройте терминал и введите команду:
git clone https://github.com/sulinivan/local-ai-server.git- Скачайте инструмент для сохранения образов Docker.
git clone https://github.com/luckfu/docker_pull.git
cd docker_pull
python3 -m venv .env
source .env/bin/activate
pip install requests- Сохраните три контейнера в виде архивов:
python3 docker_pull.py --platform linux/amd64 ghcr.io/open-webui/open-webui:cuda
python3 docker_pull.py --platform linux/amd64 ghcr.io/ggml-org/llama.cpp:full-cuda
python3 docker_pull.py --platform linux/amd64 ghcr.io/nginx:1.27-alpine- Переложите полученные архивы в папку containers-tar нашего проекта.
- Скачайте мозги для нейросети (модели).
cd ../models
python3 -m venv .env
source .env/bin/activate
pip install huggingface_hub
huggingface-cli download unsloth/Qwen3.5-9B-MTP-GGUF \
--include "Qwen3.5-9B-Q6_K.gguf" "mmproj-BF16.gguf" \
--local-dir ./Qwen3.5-9B-MTP/- Скачайте вторую модель. Для нее нужен специальный пропуск (токен). Получите токен на сайте https://huggingface.co/settings/tokens . Замените текст hf_твой_токен_здесь на ваш токен.
huggingface-cli download google/codegemma-2b-GGUF \
--include "codegemma-2b-f16.gguf" \
--token hf_твой_токен_здесь \
--local-dir ./codegemma-2b-f16/- Требуется установить NVIDIA Container Toolkit для работы видеокарты внутри контейнеров. Можно воспользоваться официальной инструкцией, если намерены оставить серверу доступ к интернету: https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html но в нашем случае она не подходит.
Для офлайн сервера.
Зайдите на страницу https://download-directory.github.io/ .
Скачайте всю папку репозитория NVIDIA Container Toolkit вставив:
https://github.com/NVIDIA/libnvidia-container/tree/gh-pages/stable/rpm/x86_64 .
В результате вы получите архив.
- Чтобы скачать и установить Docker вы можете воспользоваться унструкцией на официальном сайте:
https://docs.docker.com/engine/install/rhel/#install-from-a-packageв ней нет особо ничего сложного. - Скопируйте всю папку проекта на внешний жесткий диск.
Повторюсь используйте GNU Midnight Commander!
Подключите внешний диск к серверу без интернета.
- Создайте рабочую папку и скопируйте туда все файлы.
mkdir /opt/local-ai-serverСкопируйте файлы с диска в эту папку. Затем перейдите в нее:
cd /opt/local-ai-server- Установите Docker по официальной инструкции для системы RHEL.
- Включите автоматический запуск Docker и проверьте его работу.
systemctl enable --now docker
docker --version
docker compose version- Загрузите сохраненные программы в Docker.
Имена файлов могут немного отличаться.
Проверьте их командой
ls.
cd /opt/local-ai-server/containers-tar
docker load < open-webui_cuda.tar
docker load < llama.cpp_full-cuda.tar
docker load < nginx_1.27-alpine.tar- Установите пакеты для видеокарты.
cd /opt/local-ai-server
unzip 'NVIDIA libnvidia-container gh-pages stable-rpm_x86_64.zip' -d repo_libnvidia-container
mv local-ai-server.repo /etc/yum.repos.d/
dnf config-manager --enable repo_libnvidia-container
export NVIDIA_CONTAINER_TOOLKIT_VERSION=1.19.1-1
dnf install -y \
nvidia-container-toolkit-${NVIDIA_CONTAINER_TOOLKIT_VERSION} \
nvidia-container-toolkit-base-${NVIDIA_CONTAINER_TOOLKIT_VERSION} \
libnvidia-container-tools-${NVIDIA_CONTAINER_TOOLKIT_VERSION} \
libnvidia-container1-${NVIDIA_CONTAINER_TOOLKIT_VERSION}
nvidia-ctk runtime configure --runtime=docker
systemctl restart docker- Настройте правила Docker в
/etc/docker/daemon.json. Удалите строку"default-runtime": "nvidia"или измените все содержимое на:
{
"runtimes": {
"nvidia": {
"args": [],
"path": "nvidia-container-runtime"
}
}
}Перезапустите Docker:
systemctl restart dockerВам нужно изменить адрес 192.168.1.100 на адрес вашего сервера во всех файлах.
Также можете заменить ai-server.local на свой домен.
- Главный файл запуска
docker-compose.yml. Он описывает три наши программы. - Файл настроек моделей
presets.ini. - Файл входной двери
nginx.conf. В блоке stream указан прокси для LDAP. Замените адрес 192.168.1.200 на реальный IP адрес вашего LDAP сервера и проверьте его порт. Либо закомментируйте этот блок кода. Положите ваши SSL сертификаты в папку/opt/local-ai-server/data/nginx/certs. Они должны называтьсяfullchain.pemиprivkey.pem. Если у вас нет готовых сертификатов, создайте самоподписанные сами. Выполните команду из папки проекта:
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout ./data/nginx/certs/privkey.pem \
-out ./data/nginx/certs/fullchain.pem \
-subj "/CN=ai-server.local" \
-addext "subjectAltName=DNS:ai-server.local,DNS:localhost,IP:192.168.1.100,IP:127.0.0.1"- Запустите сервер.
docker compose up -dПроверьте, что все три программы работают:
docker compose psОстановить сервер можно командой:
docker compose downЕсли вам не хватает настроек ниже то вы можете воспользоваться официальными инструкциями по ссылкам:
https://github.com/paddymac83/llama.cpp/blob/master/docs/preset.md https://github.com/paddymac83/llama.cpp/blob/master/tools/server/README.md https://github.com/paddymac83/llama.cpp/blob/master/common/preset.cpp
https://github.com/open-webui/open-webui https://docs.openwebui.com/troubleshooting/ https://docs.openwebui.com/getting-started/ https://docs.openwebui.com/features
На вашем рабочем компьютере откройте редактор VSCode и установите плагин Continue. Откройте файл настроек плагина и вставьте этот текст:
name: Main Config
version: 2.0.0
schema: v1
models:
- name: Autodetect
provider: openai
apiBase: http://ai-server.local/api
requestOptions:
headers:
Authorization: Bearer default-key-change-me
model: AUTODETECT
- name: Autocomplete
provider: openai
apiBase: http://ai-server.local/api
useLegacyCompletionsEndpoint: false
requestOptions:
headers:
Authorization: Bearer default-key-change-me
model: codegemma-2b-f16
defaultCompletionOptions:
temperature: 0.9
roles:
- autocompleteПроверьте формат конфига. Для новых версий он должен быть именно yaml.
В строке Authorization: Bearer default-key-change-me замените только слова default-key-change-me на ваш личный ключ на тот API который выдается в личном кабинете Open-WebUI.
По аналогии этого конфига можно подключать и другие расширения, например: KiloCode или OpenCode.
Для быстрой настройки Open-WebUI приложил два json. В процессе исследования вы точно разберетесь что в них и зачем.
- image: ggml-org/llama.cpp:full-cuda. Мы берем готовую коробку с программой llama.cpp. Приставка full-cuda значит, что программа умеет использовать видеокарту для быстрых вычислений.
- restart: unless-stopped. Если программа упадет, система сама ее поднимет. Она не запустится снова только если мы сами ее остановим.
- ipc: host. Программа получает прямой доступ к памяти компьютера. Это нужно, чтобы разные части программы могли быстро обмениваться большими кусками памяти.
- runtime: nvidia. Мы говорим контейнеру использовать специальные инструменты видеокарты NVIDIA.
- environment HF_HUB_OFFLINE и TRANSFORMERS_OFFLINE. Мы строго запрещаем программе выходить в интернет за новыми файлами. Сервер должен работать только с тем, что уже скачано.
- environment NVIDIA_VISIBLE_DEVICES: all. Мы разрешаем программе видеть все видеокарты в компьютере.
- volumes ./models:/models:ro,Z. Мы даем программе папку с мозгами. Буквы ro значат, что программа может только читать эти файлы, но не может их случайно стереть. Буква Z нужна для правильной работы защиты SELinux.
- volumes ./presets.ini:/presets/presets.ini:ro,Z. Мы даем программе файл с настройками. Она тоже может его только читать.
- command. Мы передаем программе список команд при старте:
- --server и --host 0.0.0.0. Программа должна работать как сервер и слушать все сетевые интерфейсы.
- --port 8000. Программа будет ждать запросы на порту 8000.
- --api-key default-key-change-me. Мы ставим простой пароль для защиты.
- --models-dir /models. Мы указываем, где лежат мозги.
- --models-preset /presets/presets.ini. Мы указываем, где лежат настройки.
- --cache-ram -1. Мы разрешаем программе использовать всю свободную оперативную память для кеша. Это ускоряет работу.
- --cache-reuse 256. Мы разрешаем повторно использовать кусочки кеша размером 256 токенов. Это экономит время при длинных разговорах.
- --parallel 2. Мы разрешаем программе думать над двумя задачами одновременно.
- healthcheck. Система каждые 15 секунд проверяет, жива ли программа. Она отправляет скрытый запрос на адрес http://localhost:8000/models. Если программа не ответит за 10 секунд десять раз подряд, система поймет, что есть проблема. Параметр start_period дает программе 90 секунд на спокойный старт без лишних проверок.
- networks: backend. Программа подключается к внутренней закрытой сети.
- image: open-webui/open-webui:cuda. Мы берем коробку с веб-интерфейсом, который тоже умеет использовать видеокарту.
- restart: unless-stopped. Автоматический перезапуск при сбоях.
- ipc: host. Прямой доступ к памяти для ускорения работы.
- runtime: nvidia. Использование инструментов видеокарты.
- depends_on llama-server: condition: service_healthy. Сайт не запустится, пока мозг сервера не пройдет проверку здоровья. Это спасает от ошибок, когда сайт готов, а мозг еще спит.
- environment OPENAI_API_BASE_URL. Мы говорим сайту, где находится мозг. Он будет отправлять вопросы на адрес http://llama-server:8000/v1.
- environment OPENAI_API_KEY. Мы даем сайту тот же пароль, чтобы мозг его узнал.
- environment WEBUI_PROXY_ENABLED и WEBUI_PROXY_ALLOWED_ORIGINS. Мы разрешаем сайту принимать запросы только с конкретных адресов. Это защита от чужаков.
- environment OFFLINE_MODE и HF_HUB_OFFLINE. Строгий запрет на выход в интернет.
- environment NVIDIA_VISIBLE_DEVICES: all. Доступ ко всем видеокартам.
- volumes ./data/webui:/app/backend/data:Z. Мы даем сайту папку для сохранения историй переписок и настроек пользователей.
- networks: backend. Сайт подключается только к внутренней сети. У него нет прямого выхода наружу.
- image: nginx:1.27-alpine. Мы берем легкую и быструю коробку с программой nginx. Версия alpine значит, что внутри очень мало лишних файлов.
- restart: unless-stopped. Автоматический перезапуск.
- depends_on: open-webui. Дверь откроется только после того, как будет готов сайт.
- ports: 80:80 и 443:443. Мы прорубаем окна во внешний мир. Порт 80 для обычных запросов, порт 443 для защищенных запросов.
- volumes ./data/nginx/nginx.conf:/etc/nginx/nginx.conf:ro,Z. Мы даем программе главный файл с правилами маршрутизации.
- volumes ./data/nginx/certs:/etc/nginx/certs:ro,Z. Мы даем программе папку с секретными замками для шифрования трафика.
- networks: backend и public. Программа стоит на перекрестке. Она подключена и к внутренней сети, и к внешней сети.
- public: driver: bridge. Это внешняя сеть. Она работает как обычный мост, соединяя сервер с домашней сетью.
- backend: driver: bridge, internal: true. Это внутренняя сеть. Слово internal: true значит, что программы внутри этой сети не могут сами выходить в интернет. Они могут общаться только друг с другом. Это главная защита нашего проекта.
Этот проект распространяется под лицензией Creative Commons Attribution 4.0 (CC BY 4.0) — https://creativecommons.org/licenses/by/4.0/. Разрешается копирование, редактирование и распространение при условии указания автора.
Все программные компоненты подчиняются собственным лицензиям. Актуальные условия проверьте в официальных репозиториях:
- llama.cpp: https://github.com/ggml-org/llama.cpp
- open-webui: https://github.com/open-webui/open-webui
- Docker: https://github.com/docker
- NVIDIA Container Toolkit: https://github.com/NVIDIA/libnvidia-container/
Этот проект является руководством по конфигурации. Он не включает модификацию исходного кода упомянутых выше проектов.