Этот гайд — про то, как превратить домашний компьютер в персональный ИИ-сервис, который отвечает круглосуточно, работает в вашей локальной сети и не отправляет чужие данные наружу. Подойдёт для мини-ПК, старого ноутбука или NAS с Linux (Ubuntu или Debian LTS): железо уже есть, останется поставить движок для локального запуска моделей и открыть к нему доступ. Если позже окажется, что своё железо не тянет сложные запросы, часть задач можно увести в облако через API — об этом есть отдельный гайд по работе с облачной моделью через API.


1. Проверьте ресурсы сервера. Выполните:
free -h # сколько оперативной памяти
nproc # сколько ядер у процессора
df -h / # сколько свободного места на диске
Пример:`free -h` покажет строку вида `Mem: 15Gi total, 12Gi free`. Ожидаемый результат: вы точно знаете объём памяти и место на диске — по ним выбираете размер модели. Почему это важно: слишком крупная модель просто не загрузится.
2. Создайте отдельного пользователя и каталог для сервиса.
sudo adduser ai
sudo mkdir -p /opt/ai-server/models
sudo chown -R ai:ai /opt/ai-server
Ожидаемый результат: команда `ls -l /opt` показывает каталог `ai-server` с владельцем `ai`. Почему так: если сервис когда-нибудь взломают, он не получит доступ ко всей системе, а только к своей папке.
3. Запустите движок локальной модели в контейнере. Контейнер — «коробка» с готовым приложением и его зависимостями. Создайте файл `/opt/ai-server/docker-compose.yml`:
services:
ai-server:
image: <образ-вашего-движка>
restart: unless-stopped
ports:
- "127.0.0.1:8080:8080" # пока слушаем только сам сервер
volumes:
- ./models:/models # сюда кладём файлы моделей
environment:
- API_TOKEN=<ваш-длинный-токен>
Запустите: `docker compose up -d`. Ожидаемый результат: `docker compose ps` показывает статус `running`. Строка `restart: unless-stopped` означает, что сервис поднимется сам после перезагрузки.
4. Положите файл модели в `/opt/ai-server/models` и укажите его движку (в конфиге или флагом запуска). **Пример:** путь `/models/имя-модели`. Ожидаемый результат: в логах `docker compose logs -f` появляется сообщение о том, что модель загружена и сервис слушает порт.
5. Проверьте API изнутри сервера:
curl http://127.0.0.1:8080/v1/models
Ожидаемый результат: JSON-ответ со списком моделей. Если пришла ошибка — проблема внутри сервиса, сеть тут ни при чём.
6. Откройте доступ в локальной сети. Замените привязку порта на `"8080:8080"` в docker-compose.yml и разрешите доступ только своей подсети:
sudo ufw allow from 192.168.1.0/24 to any port 8080
docker compose up -d
Ожидаемый результат: с ноутбука команда `curl http://192.168.1.50:8080/v1/models` возвращает тот же JSON. Почему так: `0.0.0.0` слушает все интерфейсы, а правило `ufw` пускает только домашние адреса.
7. Подключите клиент. В браузере откройте `http://192.168.1.50:8080`. В стороннем чат-клиенте в поле «базовый URL» впишите тот же адрес, а в поле «ключ» — ваш токен. Ожидаемый результат: на тестовый вопрос приходит ответ. Для телефона поставьте подходящее приложение-клиент — как это делается, описано в гайде по установке ИИ-приложений на Android через RuStore.
8. Расширьте возможности через MCP. MCP — открытый протокол, по которому модель вызывает внешние инструменты: календарь, файлы, поиск. Первый сервер подключается за один вечер: MCP: что это и как подключить первый MCP-сервер. Ожидаемый результат: в интерфейсе клиента появляется список доступных инструментов.
9. Прогоните финальный чек-лист:

1. Ошибка вида `curl: (7) Failed to connect ... Connection refused`.Симптом: с самого сервера всё работает по `127.0.0.1`, а с ноутбука — нет. Причина: сервис слушает только локальный интерфейс. Решение: в docker-compose.yml поменяйте `"127.0.0.1:8080:8080"` на `"8080:8080"`, перезапустите `docker compose up -d`, затем проверьте `sudo ufw status` — правило для подсети `192.168.1.0/24` должно быть активно.
2. Контейнер запускается и сразу падает, в логах `Killed` или `out of memory`.Симптом: `docker compose ps` показывает статус `exited`. Причина: модели не хватило оперативной памяти. Решение: возьмите модель меньшего размера или более экономный вариант, закройте лишние сервисы (`htop` покажет, кто ест память), при необходимости добавьте swap-файл. Проверяйте по шагу 1, сколько памяти реально свободно.
3. После перезагрузки сервис не отвечает.Симптом: до `sudo reboot` всё работало, после — `Connection refused`. Причина: контейнер запущен вручную и без политики перезапуска. Решение: убедитесь, что в docker-compose.yml есть строка `restart: unless-stopped`, выполните `docker compose up -d` и повторите перезагрузку. Ожидаемый результат: сервис поднимается без вашего участия.
Нужна ли видеокарта?
Не обязательно — модель запустится и на процессоре, просто отвечать будет медленнее. Ориентируйтесь на объём памяти: чем её больше, тем крупнее модель вы потянете.
Смогу ли я пользоваться сервисом с телефона?
Да, если телефон в той же Wi-Fi сети. Откройте в браузере `http://192.168.1.50:8080` или поставьте приложение-клиент и укажите в нём тот же адрес и токен.
Безопасно ли открывать порт 8080 в интернет?
Нет. Оставьте доступ только внутри домашней сети или поднимайте VPN-туннель. Публичный порт без токена — это открытый доступ к вашему железу для любого сканера.
Можно ли совместить локальную модель и облачную?
Да. Простые задачи отдавайте домашнему сервису, а тяжёлые — облачной модели через API, подключив её как второго провайдера в том же клиенте: клиент умеет хранить несколько профилей с разными базовыми URL и ключами.