Skip to content

Repository files navigation

Руководство по созданию домашнего сервера с искусственным интеллектом

Актуальна на июль 2026 года. Поддерживать не планирую.

1. Описание проекта

Проект помогает создать домашний сервер для работы с искусственным интеллектом без подключения к интернету. Это нужно для защиты данных. Если у вас появится желание оставить подключение к интернету то вы спокойно можете это сделать.

Сервер состоит из связки контейнеров Docker (nginx > open-webui > llama-server):

  • Первая программа называется llama-server. Это мозг сервера. Она хранит умные модели и думает над ответами.
  • Вторая программа называется open-webui. Это красивый сайт, где люди могут писать вопросы и читать ответы.
  • Третья программа называется nginx. Это входная дверь. Она встречает посетителей и пропускает их к нужным программам.

2. Что нужно иметь до начала

  • Компьютер с видеокартой 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

3. Шаг первый: сборка чемодана на компьютере с интернетом

На этом шаге мы скачаем все нужные файлы и положим их на внешний диск.

  1. Скачайте папку проекта. Откройте терминал и введите команду:
git clone https://github.com/sulinivan/local-ai-server.git
  1. Скачайте инструмент для сохранения образов Docker.
git clone https://github.com/luckfu/docker_pull.git
cd docker_pull
python3 -m venv .env
source .env/bin/activate
pip install requests
  1. Сохраните три контейнера в виде архивов:
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
  1. Переложите полученные архивы в папку containers-tar нашего проекта.
  2. Скачайте мозги для нейросети (модели).
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/
  1. Скачайте вторую модель. Для нее нужен специальный пропуск (токен). Получите токен на сайте 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/
  1. Требуется установить 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 . В результате вы получите архив.

  1. Чтобы скачать и установить Docker вы можете воспользоваться унструкцией на официальном сайте: https://docs.docker.com/engine/install/rhel/#install-from-a-package в ней нет особо ничего сложного.
  2. Скопируйте всю папку проекта на внешний жесткий диск.

4. Шаг второй: установка на главный сервер

Повторюсь используйте GNU Midnight Commander!

Подключите внешний диск к серверу без интернета.

  1. Создайте рабочую папку и скопируйте туда все файлы.
mkdir /opt/local-ai-server

Скопируйте файлы с диска в эту папку. Затем перейдите в нее:

cd /opt/local-ai-server
  1. Установите Docker по официальной инструкции для системы RHEL.
  2. Включите автоматический запуск Docker и проверьте его работу.
systemctl enable --now docker
docker --version
docker compose version
  1. Загрузите сохраненные программы в 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
  1. Установите пакеты для видеокарты.
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
  1. Настройте правила Docker в /etc/docker/daemon.json. Удалите строку "default-runtime": "nvidia" или измените все содержимое на:
{
  "runtimes": {
    "nvidia": {
      "args": [],
      "path": "nvidia-container-runtime"
    }
  }
}

Перезапустите Docker:

systemctl restart docker

5. Шаг третий: настройка правил

Вам нужно изменить адрес 192.168.1.100 на адрес вашего сервера во всех файлах. Также можете заменить ai-server.local на свой домен.

  1. Главный файл запуска docker-compose.yml. Он описывает три наши программы.
  2. Файл настроек моделей presets.ini.
  3. Файл входной двери 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"
  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

6. Шаг четвертый: подключение редактора кода

На вашем рабочем компьютере откройте редактор 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. В процессе исследования вы точно разберетесь что в них и зачем.

Обоснование параметров docker-compose.yml

Раздел llama-server (Мозг)

  • 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. Программа подключается к внутренней закрытой сети.

Раздел open-webui (Сайт)

  • 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. Сайт подключается только к внутренней сети. У него нет прямого выхода наружу.

Раздел nginx (Входная дверь)

  • 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. Программа стоит на перекрестке. Она подключена и к внутренней сети, и к внешней сети.

Раздел networks (Сети)

  • public: driver: bridge. Это внешняя сеть. Она работает как обычный мост, соединяя сервер с домашней сетью.
  • backend: driver: bridge, internal: true. Это внутренняя сеть. Слово internal: true значит, что программы внутри этой сети не могут сами выходить в интернет. Они могут общаться только друг с другом. Это главная защита нашего проекта.

License

Документация

Этот проект распространяется под лицензией Creative Commons Attribution 4.0 (CC BY 4.0)https://creativecommons.org/licenses/by/4.0/. Разрешается копирование, редактирование и распространение при условии указания автора.

Программные компоненты

Все программные компоненты подчиняются собственным лицензиям. Актуальные условия проверьте в официальных репозиториях:

Примечание

Этот проект является руководством по конфигурации. Он не включает модификацию исходного кода упомянутых выше проектов.

About

Руководство по созданию домашнего сервера с искусственным интеллектом

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors