# Как подключить ИИ к домашнему серверу: пошаговое руководство по self-hosted сервисам

> AI Release · @ai_release1 · https://ai-release.org/guides/kak-podklyuchit-ii-k-domashnemu-serveru-poshagovoe-ruko.html

Этот гайд — про то, как превратить домашний компьютер в персональный ИИ-сервис, который отвечает круглосуточно, работает в вашей локальной сети и не отправляет чужие данные наружу. Подойдёт для мини-ПК, старого ноутбука или NAS с Linux (Ubuntu или Debian LTS): железо уже есть, останется поставить движок для локального запуска моделей и открыть к нему доступ. Если позже окажется, что своё железо не тянет сложные запросы, часть задач можно увести в облако через API — об этом есть отдельный [гайд по работе с облачной моделью через API](https://ai-release.org/guides/kak-ispolzovat-gpt-6-1-sol-cherez-api-polnoe-rukovodstv.html?utm_source=tg&utm_medium=channel&utm_campaign=guide_inline&utm_content=guide_to_guide).

## Требования и подготовка
![Иллюстрация к разделу «Требования и подготовка»](https://ai-release.org/guides/img/kak-podklyuchit-ii-k-domashnemu-serveru-poshagovoe-ruko-ru-1.jpg)


- Домашний сервер: мини-ПК, старый ноутбук или NAS. ОС — Linux (Ubuntu/Debian LTS). Подойдёт и Windows с WSL2 («Linux внутри Windows»), но примеры ниже — для Linux.
- Оперативная память: минимум 8 ГБ. Чем больше ОЗУ и видеопамяти, тем крупнее модель вы сможете запустить.
- Пользователь с правами sudo — административными правами для установки пакетов и создания сервисных пользователей.
- Свободное место на диске под файлы модели.
- Постоянный локальный адрес сервера, например `192.168.1.50`: закрепите его в роутере, иначе после перезагрузки адрес изменится и клиенты отвалятся.
- Свободный порт, пример — `8080`. Порт — «дверь», через которую клиенты стучатся в сервис.
- Токен доступа (API-ключ) — длинная случайная строка, по которой сервис понимает, что запрос пришёл от вас, а не от соседа по Wi-Fi.
- Клиент: браузер на компьютере, терминал с `curl` или приложение на телефоне.

## Пошаговая инструкция
![Иллюстрация к разделу «Пошаговая инструкция»](https://ai-release.org/guides/img/kak-podklyuchit-ii-k-domashnemu-serveru-poshagovoe-ruko-ru-2.jpg)


1. Проверьте ресурсы сервера. Выполните:

```bash
free -h      # сколько оперативной памяти
nproc        # сколько ядер у процессора
df -h /      # сколько свободного места на диске
```

**Пример:** `free -h` покажет строку вида `Mem: 15Gi total, 12Gi free`. Ожидаемый результат: вы точно знаете объём памяти и место на диске — по ним выбираете размер модели. Почему это важно: слишком крупная модель просто не загрузится.

2. Создайте отдельного пользователя и каталог для сервиса.

```bash
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`:

```yaml
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 изнутри сервера:

```bash
curl http://127.0.0.1:8080/v1/models
```

Ожидаемый результат: JSON-ответ со списком моделей. Если пришла ошибка — проблема внутри сервиса, сеть тут ни при чём.

6. Откройте доступ в локальной сети. Замените привязку порта на `"8080:8080"` в docker-compose.yml и разрешите доступ только своей подсети:

```bash
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](https://ai-release.org/guides/kak-skachivat-i-ustanavlivat-ii-prilozheniya-na-android.html?utm_source=tg&utm_medium=channel&utm_campaign=guide_inline&utm_content=guide_to_guide).

8. Расширьте возможности через MCP. MCP — открытый протокол, по которому модель вызывает внешние инструменты: календарь, файлы, поиск. Первый сервер подключается за один вечер: [MCP: что это и как подключить первый MCP-сервер](https://ai-release.org/guides/mcp-chto-eto-i-kak-podklyuchit-server.html?utm_source=tg&utm_medium=channel&utm_campaign=guide_inline&utm_content=guide_to_guide). Ожидаемый результат: в интерфейсе клиента появляется список доступных инструментов.

9. Прогоните финальный чек-лист:

- [ ] сервис отвечает на `http://127.0.0.1:8080/v1/models`;
- [ ] сервис отвечает с другого устройства по адресу `192.168.1.50:8080`;
- [ ] запрос без токена отклоняется;
- [ ] после `sudo reboot` сервис поднимается сам;
- [ ] порт `8080` не проброшен на роутере в интернет;
- [ ] логи не содержат ошибок вида `Killed` или `out of memory`.

## Возможные проблемы и решения
![Иллюстрация к разделу «Возможные проблемы и решения»](https://ai-release.org/guides/img/kak-podklyuchit-ii-k-domashnemu-serveru-poshagovoe-ruko-ru-3.jpg)


**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` и повторите перезагрузку. Ожидаемый результат: сервис поднимается без вашего участия.

## FAQ

**Нужна ли видеокарта?**
Не обязательно — модель запустится и на процессоре, просто отвечать будет медленнее. Ориентируйтесь на объём памяти: чем её больше, тем крупнее модель вы потянете.

**Смогу ли я пользоваться сервисом с телефона?**
Да, если телефон в той же Wi-Fi сети. Откройте в браузере `http://192.168.1.50:8080` или поставьте приложение-клиент и укажите в нём тот же адрес и токен.

**Безопасно ли открывать порт 8080 в интернет?**
Нет. Оставьте доступ только внутри домашней сети или поднимайте VPN-туннель. Публичный порт без токена — это открытый доступ к вашему железу для любого сканера.

**Можно ли совместить локальную модель и облачную?**
Да. Простые задачи отдавайте домашнему сервису, а тяжёлые — облачной модели через API, подключив её как второго провайдера в том же клиенте: клиент умеет хранить несколько профилей с разными базовыми URL и ключами.
