MAATRIX / Блог / Ollama: доступ по сети и через API

Ollama: доступ по сети и через API

Ollama: доступ по сети и через API

MAATRIX

Поставили Ollama на сервер, всё работает — а с телефона или с ноутбука в той же сети открыть её не получается, сколько адрес ни перебирай. Это не сбой и не блокировка хостинга: по умолчанию Ollama настроена отвечать только самому себе, то есть тому же компьютеру, на котором установлена. Разберём по шагам, как открыть доступ по сети, что при этом обязательно нужно защитить и как обращаться к Ollama напрямую через API — если вы подключаете её не к Open WebUI, а к собственному скрипту или приложению.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →

Почему Ollama не видна по сети: localhost, порт и переменная окружения простыми словами

Разберёмся с тремя словами, без которых дальше не обойтись.

Localhost (127.0.0.1) — специальный адрес, который на любом компьютере означает «этот же самый компьютер». Когда программа слушает только 127.0.0.1, она отвечает исключительно на запросы, отправленные с неё самой. Запрос с телефона до неё физически не доходит — не потому, что заблокирован, а потому, что 127.0.0.1 на телефоне указывает на сам телефон, а не на ваш сервер.

Порт — номер «двери» на одном и том же адресе. У сервера один IP-адрес, но на нём одновременно может работать много программ: сайт на порту 80, почта на порту 25, Ollama — на порту 11434. Обращаясь к http://ваш-сервер:11434, вы стучитесь именно в дверь Ollama.

Переменная окружения — настройка, которую программе передают снаружи, при запуске, а не прописывают внутри конфигурационных файлов. Похоже на записку, которую вы даёте программе перед стартом: «слушай вот этот адрес». У Ollama такая переменная называется OLLAMA_HOST, и именно она определяет, отвечает ли сервис только самому себе (127.0.0.1) или всем, кто до него достучится (0.0.0.0).

По умолчанию Ollama запускается с OLLAMA_HOST=127.0.0.1:11434 — отсюда и вопрос «как подключиться с телефона», который задают почти все, кто впервые ставит её на сервер вместо ноутбука.

Переменная OLLAMA_HOST=0.0.0.0: где её прописать в зависимости от способа установки

Способ прописать переменную зависит от того, как Ollama запущена — способов установки два основных, и путь для каждого свой.

Способ 1 — установка через официальный скрипт (curl -fsSL https://ollama.com/install.sh | sh). На Linux он ставит Ollama как службу systemd, то есть сервис, которым управляет операционная система и который сам поднимается после перезагрузки. Редактировать файл службы напрямую не стоит — обновление пакета его перезапишет. Правильный путь — создать override, отдельный файл с вашими правками поверх штатного:

sudo systemctl edit ollama

Команда откроет пустой редактор — впишите:

[Service]
Environment="OLLAMA_HOST=0.0.0.0"

Сохраните и закройте (Ctrl+O, Ctrl+X в nano). Файл сам ляжет в /etc/systemd/system/ollama.service.d/override.conf — трогать его руками не нужно, systemctl edit создаёт и находит его сам.

Способ 2 — Ollama запущена вручную командой ollama serve (например, в screen/tmux-сессии или как временный процесс). Тогда переменную можно указать прямо перед командой на один запуск:

OLLAMA_HOST=0.0.0.0 ollama serve

Или прописать постоянно в файл, который выполняется при каждом входе в систему — ~/.bashrc для bash или ~/.zshrc для zsh (посмотреть, какая оболочка у вас, можно командой echo $SHELL):

export OLLAMA_HOST=0.0.0.0

После правки файла выполните source ~/.bashrc (или перелогиньтесь), чтобы переменная подхватилась в текущей сессии.

Docker-контейнер. Здесь OLLAMA_HOST внутри контейнера обычно уже 0.0.0.0 — это нормально для контейнера, вопрос в том, на каких интерфейсах *хоста* публикуется порт. Флаг -p 11434:11434 в docker run публикует порт на все интерфейсы сервера, -p 127.0.0.1:11434:11434 — только на loopback хоста. Для доступа по сети нужен первый вариант; для доступа только с самого сервера (например, если Open WebUI работает в соседнем контейнере) правильнее и безопаснее второй.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Развернуть Ollama

Перезапуск и проверка: слушает ли порт нужный интерфейс

После правки для systemd-установки нужны две команды — сначала заставить systemd перечитать конфигурацию, потом перезапустить саму службу:

sudo systemctl daemon-reload
sudo systemctl restart ollama

Проверить результат — командой ss (show sockets), которая показывает, какие программы на каком адресе и порту слушают входящие соединения:

ss -tlnp | grep 11434

До правки вывод будет таким — обратите внимание на 127.0.0.1 в третьей колонке:

LISTEN 0 4096 127.0.0.1:11434 0.0.0.0:* users:(("ollama",pid=1043,fd=3))

После правки и перезапуска адрес должен смениться на 0.0.0.0 — это и означает «слушает на всех интерфейсах, доступен по сети»:

LISTEN 0 4096 0.0.0.0:11434 0.0.0.0:* users:(("ollama",pid=2201,fd=3))

Если после restart вывод не изменился — вероятная причина в том, что systemd не подхватил override: проверьте sudo systemctl cat ollama — в конце вывода должна появиться секция из вашего override.conf. Если её нет, daemon-reload не выполнился или файл сохранился не туда.

Подключение с телефона или другого компьютера в сети

Дальше нужен IP-адрес самого сервера в локальной сети (если это VPS — его публичный IP, если домашний сервер — адрес внутри вашего Wi-Fi). Узнать его на сервере:

hostname -I

Первый адрес из вывода — обычно тот, что нужен. С телефона или другого компьютера в той же сети проверка простая — открыть в браузере или выполнить:

curl http://192.168.1.50:11434

Ответ Ollama is running подтверждает, что порт открыт и доступен по сети. Дальше этот же адрес указываете в настройках клиента — например, в Open WebUI как OLLAMA_BASE_URL=http://192.168.1.50:11434, или в мобильном приложении-клиенте в поле адреса сервера. Если клиент так и не подключается, хотя curl с этого же устройства работает, — проверьте, что клиент не пытается достучаться до localhost вместо реального IP: это отдельная и очень частая причина, разобранная подробно в статье про Open WebUI, который не видит Ollama.

Важный нюанс для домашней сети: роутер с NAT сам по себе не пускает снаружи никого, даже если Ollama слушает 0.0.0.0 — доступ ограничен вашим Wi-Fi, пока вы отдельно не пробросите порт наружу. А вот на VPS или выделенном сервере с белым IP 0.0.0.0 означает буквально «весь интернет», а не «моя сеть» — и здесь без следующего шага открывать порт не стоит.

Безопасность: открытая без пароля Ollama — это чужой бесплатный сервер

У Ollama нет встроенной авторизации — ни логина, ни пароля, ни API-ключа. Это не недоработка, а осознанный выбор: разработчики оставили защиту периметра на усмотрение того, кто разворачивает сервис. Если порт 11434 открыт всему интернету без ограничений, посторонний может тремя-четырьмя curl-командами посмотреть список ваших моделей, запустить на них инференс за ваш счёт по электричеству и времени CPU/GPU или скачать через API новую модель, забив весь диск, — то есть получить бесплатный чужой сервер с вашим железом. Разбор рисков и полная многослойная защита — в отдельной статье как защитить локальную LLM от посторонних; здесь — минимально необходимый набор, без которого открывать порт наружу нельзя.

Вариант 1 — фаервол по списку разрешённых IP. Подходит, если известны конкретные адреса, которым нужен доступ (офис, статичный IP дома). Через UFW — Uncomplicated Firewall, стандартный фаервол на Ubuntu/Debian (подробная установка — в статье про UFW на Ubuntu 24.04):

sudo ufw allow from 198.51.100.20 to any port 11434 proto tcp
sudo ufw deny 11434/tcp

Первая строка разрешает конкретный адрес, вторая запрещает всем остальным — порядок важен, иначе более широкое правило может перекрыть точечное разрешение.

Вариант 2 — прокси с паролем. Нужен, если доступ должен быть у нескольких человек без статичных IP — например, у команды с Open WebUI на разных устройствах. Перед Ollama ставится Nginx, который берёт на себя то, чего у API нет: пароль и TLS. Полная настройка Nginx как реверс-прокси — в отдельной статье, здесь минимальный рабочий конфиг с Basic Auth:

sudo apt install apache2-utils
sudo htpasswd -c /etc/nginx/.htpasswd admin
server {
    listen 443 ssl;
    server_name llm.example.com;

    location / {
        auth_basic "Restricted";
        auth_basic_user_file /etc/nginx/.htpasswd;
        proxy_pass http://127.0.0.1:11434;
        proxy_set_header Host $host;
        proxy_read_timeout 600s;
    }
}

Обратите внимание: в этой схеме сама Ollama остаётся на 127.0.0.1 (не 0.0.0.0) — наружу торчит только Nginx, а к самой Ollama по сети напрямую никто, кроме сервера, не обращается. Это надёжнее, чем открывать 11434 напрямую и полагаться только на фаервол. Подробный разбор конфигурации, SSL и типичных ошибок — в статье про Nginx как реверс-прокси на VPS.

Честная оговорка: Basic Auth хорошо работает в браузере, но многие клиенты и SDK ожидают заголовок Authorization: Bearer <token>, а не логин с паролем, — для программного доступа нескольким приложениям с личными ключами это не всегда удобная схема, и здесь может понадобиться отдельный шлюз с полноценными API-ключами вместо простого прокси.

Прямой доступ к API: curl-запрос для своего скрипта или приложения

Если Ollama нужна не как модель внутри Open WebUI, а как движок для собственного скрипта, бота или сайта, обращаться к ней можно напрямую по HTTP — Open WebUI сам работает именно так, никакой магии внутри него нет.

Базовый запрос на генерацию текста — POST на /api/generate:

curl http://192.168.1.50:11434/api/generate -d '{
  "model": "llama3.1",
  "prompt": "Объясни, что такое порт, одним предложением",
  "stream": false
}'

-d передаёт тело запроса в формате JSON — им Ollama и общается с внешним миром. "stream": false просит вернуть весь ответ одним куском — так проще разобрать в простом скрипте. По умолчанию Ollama присылает ответ построчно, отдельным JSON-объектом на каждый кусок текста — удобно для чат-интерфейса, где ответ «печатается» на глазах, но требует чуть более сложного разбора на стороне клиента.

Ответ — тоже JSON, с полем response, где лежит текст ответа модели, и служебными полями вроде done и статистики по времени генерации. Для диалога в несколько реплик есть похожий эндпоинт /api/chat — принимает не строку prompt, а массив messages с ролями user/assistant, как в большинстве чат-API.

Короткий пример на Python, без сторонних библиотек для Ollama — только requests:

import requests

response = requests.post(
    "http://192.168.1.50:11434/api/generate",
    json={"model": "llama3.1", "prompt": "Привет!", "stream": False},
)
print(response.json()["response"])

Если API закрыт через Nginx с Basic Auth из раздела выше, в запрос нужно добавить логин и пароль — в curl это флаг -u admin:пароль, в Python — параметр auth=("admin", "пароль") у requests.post. Помните: сама Ollama по-прежнему не проверяет ничего — авторизацию делает прокси перед ней, и без него любой, кто знает адрес, обойдётся без пароля вовсе.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Развернуть Ollama

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →

Частые вопросы

Изменил OLLAMA_HOST, но порт всё равно слушает только 127.0.0.1 — что не так?

Чаще всего перепутан способ установки: правка .bashrc не подействует на systemd-службу, и наоборот. systemctl status ollama со статусом active подтверждает, что это служба; «unit not found» значит, что Ollama запущена вручную или через Docker.

Можно ли дать доступ только одному конкретному приложению, а не всей сети?

Да — фаервол с разрешением по IP этого устройства (вариант 1 из раздела про безопасность) или VPN вроде WireGuard, если устройство мобильное и IP меняется. Открывать 0.0.0.0 всем ради одного клиента не стоит.

Нужен ли VPN, чтобы обращаться к серверу из другого города?

Необязательно, но желательно при регулярном доступе. SSH-туннель (ssh -L 11434:127.0.0.1:11434 user@сервер) закрывает вопрос для одной сессии без правок на сервере, WireGuard удобнее для постоянного доступа нескольких устройств — тогда порт вообще не публикуется наружу.

API обрывается на длинных ответах через Nginx — почему?

Nginx по умолчанию отдаёт 504 Gateway Timeout на генерации дольше 60 секунд. Решение — proxy_read_timeout 600s в конфиге выше и proxy_buffering off.

Как проверить, что порт не сканирует кто-то посторонний прямо сейчас?

ollama ps показывает модели, загруженные в память в эту секунду — незнакомая модель значит, что инференс идёт прямо сейчас. Подробнее о признаках чужого доступа — в статье про защиту локальной LLM.

Нужны сами нейросети для контента?

Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.