SSD Nodes Learn
Руководства Matt ConnorАвтор: Matt Connor · Обновлено 2026-07-24

Как развернуть Ollama на VPS безопасно

Узнайте, как запустить LLM на VPS без открытия порта 11434. Расчет RAM для моделей 7B и производительность CPU при работе через API 127.0.0.1.

Что вы создаете

Вы развертываете одну языковую модель с открытыми весами на собственном сервере. Доступ к ней осуществляется через HTTP API и, по желанию, через веб-страницу в браузере. Ollama отвечает за загрузку модели, ее размещение в памяти и обработку запросов на http://127.0.0.1:11434. Установка выполняется одной командой. Основные сложности связаны с другими аспектами: необходимо выбрать модель, которая поместится в RAM вашего VPS, и не опубликовать случайно неавторизованный сервер вывода в открытый интернет.

Прежде всего, два важных предупреждения. VPS только с CPU будет медленно работать с небольшими моделями. В API полностью отсутствует встроенная аутентификация. Подробности приведены ниже, так как именно на этих этапах чаще всего возникают проблемы.

Реальные показатели объема памяти в цифрах

Объем памяти, занимаемый моделью, примерно равен размеру ее файла плюс около одного гигабайта на накладные расходы во время выполнения, плюс дополнительный объем для контекстного окна. Модели Ollama по умолчанию используют 4-битное квантование (маркировка Q4), что требует около полугигабайта RAM на каждый миллиард параметров. Расчет прост, и он определяет все требования.

Модель 3B, такая как llama3.2:3b, весит ~2 GB при загрузке и требует около 4 GB свободной RAM для работы. Модель 7B или 8B, такая как mistral:7b или llama3.1:8b, занимает ~5 GB на диске и требует около 8 GB RAM, но для комфортной работы необходимо 16 GB. Модели 13B или 14B требуют примерно 16 GB. Для моделей в диапазоне от 30B до 70B требуется сервер с большим объемом RAM или, что более реалистично, GPU — на VPS с CPU модель либо не поместится, либо будет отвечать слишком медленно, чтобы быть полезной.

Теперь о скорости, так как этот параметр часто недооценивают. Скорость инференса на CPU ограничена пропускной способностью памяти, а не тактовой частотой; у VPS с общим vCPU пропускная способность скромная. Ожидайте от 1 до 10+ токенов в секунду: модель 7-8B Q4 может выдавать от 4 до 10 токенов в секунду, модель 3B — от 10 до 25. GPU работает примерно на порядок быстрее. Это приблизительные цифры — правильный подход заключается в измерении производительности вашего собственного оборудования, как показано в шаге запуска ниже. Доверяйте своему eval rate, а не цифрам из статей, включая эту.

Практический вывод: небольшие квантованные модели на CPU действительно полезны для создания черновиков, суммаризации и классификации, если вас устраивает такая скорость. Для любых более крупных или быстрых задач закладывайте бюджет на инстанс с GPU.

Чтобы сопоставить конкретную модель с конкретным оборудованием, оцените объем занимаемой ею памяти здесь:

ToolLLM VRAM and model-size calculator

Установка Ollama

Существует два способа чистой установки. Официальный скрипт является наиболее простым для bare VPS:

curl -fsSL https://ollama.com/install.sh | sh

Этот процесс создает системного пользователя ollama, устанавливает бинарный файл в /usr/local/bin/ollama и регистрирует системную службу systemd под названием ollama.service. Служба запускается при загрузке системы и привязывает 127.0.0.1:11434. Проверьте работоспособность:

systemctl status ollama
ollama --version

Если вы уже используете Docker, используйте контейнер:

docker run -d --name ollama \
  -p 127.0.0.1:11434:11434 \
  -v ollama:/root/.ollama \
  --restart always \
  ollama/ollama

Обратите внимание на префикс 127.0.0.1: в пробросе портов. Он привязывает порт только к localhost. Использование -p 11434:11434 вместо этого открывает доступ ко всем интерфейсам; об этом предупреждает раздел по безопасности. Выберите один метод установки; не запускайте скрипт и контейнер одновременно, иначе два процесса будут конфликтовать за порт.

Загрузите и запустите свою первую модель

ollama pull llama3.2:3b
ollama run llama3.2:3b

pull загружает слои модели на диск (для этой модели объем составит около 2 GB). run загружает их в память и открывает командную строку >>>. Введите вопрос. Генерация первого токена может занять несколько секунд, пока веса загружаются с диска в RAM, после чего ответ будет выводиться потоком. Введите /bye, чтобы выйти из чата; Ollama продолжит работать в фоновом режиме.

Посмотрите, что загружено и как распределены ресурсы:

ollama ps

Столбец PROCESSOR показывает фактическое состояние. 100% CPU означает, что GPU не используется, что и является причиной низкой скорости. Измерьте реальную скорость с помощью флага verbose:

ollama run --verbose llama3.2:3b "Write two sentences about Linux."

Строка eval rate в конце вывода показывает количество токенов в секунду на вашем оборудовании. Используйте этот показатель для планирования нагрузки.

Где хранятся модели и какой объем диска требуется

Модели, установленные скриптом и запущенные как сервис, находятся в домашнем каталоге пользователя ollama:

sudo du -sh /usr/share/ollama/.ollama/models

При интерактивном запуске от имени вашего пользователя они находятся в ~/.ollama/models. В контейнере они хранятся в именованном томе ollama. Это важно, так как объем квантованных весов быстро растет: модель 3B занимает ~2 GB, 7-8B — ~5 GB, 14B — ~9 GB. Если загрузить четыре модели для сравнения, вы незаметно израсходуете 20 GB. Выбирайте объем диска исходя из количества моделей, которые планируете хранить постоянно. Остальные модели можно удалить с помощью ollama rm <model>.

Запуск в качестве управляемого сервиса

Установочный скрипт уже зарегистрировал ollama.service, поэтому сервис перезапускается при загрузке системы автоматически. Рекомендуется изменить время удержания модели в памяти, а на некоторых конфигурациях — bind address. Эти параметры следует внести в systemd drop-in файл, чтобы обновление Ollama не перезаписало их:

sudo systemctl edit ollama.service

Добавьте следующий блок под заголовком [Service], который отобразит редактор:

[Service]
Environment="OLLAMA_KEEP_ALIVE=30m"

Параметр OLLAMA_KEEP_ALIVE определяет время нахождения модели в памяти после последнего запроса (по умолчанию 5 минут). Увеличьте это значение на сервере с постоянными запросами, чтобы избежать повторной загрузки весов. На устройствах с ограниченными ресурсами установите значение 0, чтобы освобождать RAM сразу после завершения запроса. systemctl edit перезагружает unit-файлы; выполните перезапуск для применения изменений:

sudo systemctl restart ollama

Самый важный аспект безопасности

По умолчанию Ollama привязывается к 127.0.0.1:11434, поэтому доступ к ней имеют только процессы на самом VPS. Это правильное значение по умолчанию. Оставьте его.

API не имеет аутентификации. Совсем. В ней нет API-ключей, логинов, ограничений частоты запросов или списков разрешенных IP-адресов. Любой, кто имеет доступ к порту 11434, может запускать любые загруженные вами модели, загружать новые, удалять их и бесконечно нагружать ваш CPU или GPU на 100%. Сканеры, такие как Shodan, индексируют тысячи открытых экземпляров Ollama; открытый сервер находят и используют в течение нескольких часов.

Вот единственная ошибка, которую нельзя допускать: не устанавливайте OLLAMA_HOST=0.0.0.0 и не открывайте порт 11434 в вашем firewall. Это публикует сервер без аутентификации во всем интернете. Никакая конфигурация не сделает открытый порт 11434 на 0.0.0.0 безопасным, так как в Ollama нет параметров для настройки — аутентификация в ней просто отсутствует.

Существует три безопасных способа обращения к модели с другого устройства:

  • Используйте локальный доступ. Если единственным клиентом является другая программа на том же VPS — cron-скрипт, бот или MCP server bridging your tools to the model — оставьте привязку на 127.0.0.1 и настройте программу на вызов http://127.0.0.1:11434. Ничего не будет опубликовано, и дополнительные настройки не требуются.
  • Используйте приватный туннель. Подключите VPS к WireGuard VPN you host yourself, установите OLLAMA_HOST на адрес туннеля (например, 10.8.0.1, а не 0.0.0.0), и подключаться смогут только участники VPN. В публичном интернете порт 11434 останется закрытым.
  • Используйте обратный прокси с аутентификацией. Настройте завершение TLS и требуйте пароль или токен на уровне nginx, Traefik или Caddy, а затем проксируйте запросы на 127.0.0.1:11434. Ollama сохраняет привязку к localhost; прокси-сервер — это единственное, что слушает публичный порт. Это работает так же, как a Let's Encrypt certificate on nginx перед любым локальным сервисом.

Вариант с обратным прокси — это именно то, что предоставляет следующий за этим чат-интерфейс с полноценной системой входа.

Add a chat UI with Open WebUI, behind TLS

Open WebUI is a self-hosted chat interface. Run it in Docker and point it at the local Ollama:

docker run -d \
  --name open-webui \
  --network=host \
  -e OLLAMA_BASE_URL=http://127.0.0.1:11434 \
  -v open-webui:/app/backend/data \
  --restart always \
  ghcr.io/open-webui/open-webui:main

The --network=host flag is the important detail on a Linux VPS. It puts the container in the host's network namespace, so 127.0.0.1 inside the container is the host's own loopback and the container reaches Ollama at 127.0.0.1:11434 without Ollama listening on any other interface. The bridge-network recipe you will see elsewhere — --add-host=host.docker.internal:host-gateway with OLLAMA_BASE_URL=http://host.docker.internal:11434 — does not work here: that name resolves to the Docker bridge gateway, and a service bound to 127.0.0.1 on the host is not reachable across the bridge, so Open WebUI just sits there reporting it cannot connect to Ollama.

The trade-off of host networking is that Open WebUI now listens on the host's port 8080 on every interface; any -p mapping is discarded, and Docker prints a warning saying so. So close 8080 at both the host and provider firewall and let the TLS reverse proxy be the only public door. On the very first visit Open WebUI asks you to create an admin account — that account is your authentication layer, so choose a strong password.

To open the chat from your laptop over HTTPS, put a TLS reverse proxy in front of 127.0.0.1:8080. If you already route several Docker apps on the box, Traefik with automatic TLS across many apps is the cleanest fit: one label block issues the certificate and routes chat.example.com to Open WebUI. The rule from the security section still holds — the proxy owns the public port and the login, while Ollama stays on localhost and Open WebUI's own 8080 stays firewalled.

Использование эндпоинта, совместимого с OpenAI, из вашего кода

Ollama поддерживает подмножество API чата OpenAI на порту /v1. Большинство клиентских библиотек OpenAI будут работать после изменения двух параметров: base URL и фиктивного ключа.

from openai import OpenAI

client = OpenAI(base_url="http://127.0.0.1:11434/v1", api_key="ollama")

resp = client.chat.completions.create(
    model="llama3.2:3b",
    messages=[{"role": "user", "content": "Name three Linux distributions."}],
)
print(resp.choices[0].message.content)

Библиотека требует наличия api_key, но Ollama игнорирует этот параметр, поэтому можно использовать любую строку. model должен быть именем модели, которую вы уже загрузили; при использовании неизвестного имени возвращается ошибка model "x" not found, try pulling it first. При использовании curl принцип остается тем же:

curl http://127.0.0.1:11434/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{"model":"llama3.2:3b","messages":[{"role":"user","content":"Hello"}]}'

Этот метод также используется для подключения модели к инструментам агентов и редакторов. Если вы ведете разработку на этом сервере, локальная модель может обеспечивать работу скриптов и плагинов наряду с Claude Code, запущенным в tmux внутри VPS. Это позволяет выполнять черновую работу конфиденциально и бесплатно, не используя платный API, в то время как сложные логические задачи остаются на хостинговой модели.

Режимы сбоев и соответствующие сообщения об ошибках

Процесс завершен (Killed) во время генерации. Вы запускаете большую модель, и терминал выводит Killed, либо в логах сервера появляется llama runner process has terminated: signal: killed. Linux OOM killer завершил процесс, так как модели требуется больше RAM, чем доступно на устройстве. Подтвердите причину с помощью sudo dmesg | grep -i oom, где вы увидите строку вида Out of memory: Killed process ... (ollama). Решение заключается в использовании модели меньшего размера или с более сильным квантованием — например, llama3.2:3b вместо 13B — либо в добавлении swap. Наличие swap позволяет медленно завершить нагрузку, которая лишь незначительно превышает объем физической RAM, вместо мгновенного сбоя. Swap превращает мгновенный краш в медленный ответ; он не позволяет использовать модель 70B на 4 GB.

"Error: model requires more system memory". Ollama отказывается запускать модель и выводит Error: model requires more system memory (X GiB) than is available (Y GiB). Это вежливая форма вышеуказанного сбоя: Ollama провела расчеты и остановилась, чтобы не допустить срабатывания OOM killer. Она даже предоставляет вам два числа. Выберите модель, требования которой ниже объема вашей свободной RAM (проверьте с помощью free -h), уменьшите длину контекста или перейдите на более мощный VPS. Ни один флаг не поможет уместить модель — нехватка памяти является реальной проблемой.

Первый токен генерируется очень долго, затем всё работает нормально. При первом запуске модель ничего не выводит в течение 5–30 секунд, после чего начинается нормальный стриминг. Эта пауза вызвана загрузкой весов с диска в RAM; медленное хранилище усугубляет ситуацию. После загрузки модель остается в памяти в течение OLLAMA_KEEP_ALIVE, поэтому на второй запрос ответ приходит мгновенно. Увеличьте это значение, если задержки вам мешают, и используйте ollama ps, чтобы проверить, загружена ли модель в данный момент.

Всё работает просто медленно. Скорость составляет 10 токенов в секунду или меньше, при этом ошибки отсутствуют. Это стандартная работа CPU inference. Команда ollama ps показывает 100% CPU, что означает отсутствие GPU. Это не ошибка и никакие настройки это не исправят, так как ограничением является пропускная способность памяти, а не неправильная конфигурация. Используйте модель меньшего размера, смиритесь со скоростью или перейдите на инстанс с GPU — и измерьте реальную скорость с помощью --verbose, прежде чем делать выводы о неисправности.

Connection refused с другого устройства. При попытке подключения с вашего ноутбука вы получаете curl: (7) Failed to connect to <ip> port 11434: Connection refused. Это штатное поведение: Ollama привязывается только к localhost. Не пытайтесь «исправить» это через привязку к 0.0.0.0, так как это является ошибкой безопасности, описанной выше. Вместо этого подключайтесь к модели через VPN или через аутентифицирующий прокси-сервер.

Вы открыли порт 11434 для интернета. Если вы установили OLLAMA_HOST=0.0.0.0, открыли firewall и теперь видите загрузки моделей, которые вы не запускали, или видите 100% загрузку CPU неизвестными клиентами, значит, ваш сервис обнаружили и используют. Это основная ошибка, а не исключение. Перепривяжите сервис к 127.0.0.1 или к адресу VPN, закройте порт 11434 в firewall и настройте аутентификацию. Считайте, что любой запрос, поступивший по этому адресу, пока он был открыт, был выполнен посторонними лицами.

Резервное копирование и обновление

Потеря данных минимальна. Модели можно загрузить повторно, поэтому необходимо резервное копировать только volume с данными Open WebUI (учетные записи, история чатов, настройки) и созданные вами systemd drop-in файлы. Создайте резервную копию volume с помощью временного контейнера:

docker run --rm -v open-webui:/data -v "$PWD":/backup alpine \
  tar czf /backup/open-webui.tgz -C /data .

Обновите Ollama, повторно запустив установочный скрипт; обновите Open WebUI с помощью docker pull ghcr.io/open-webui/open-webui:main и последующего пересоздания контейнера. Не фиксируйте версии на длительный срок: качество моделей и среда выполнения быстро меняются. Рекомендуется изучать release notes и проводить повторные бенчмарки на вашем оборудовании, а не полагаться на показатели прошлого квартала.

FAQ

Можно ли запустить LLM на VPS только с CPU?

Да, но с ограничениями. Малые квантованные модели размером от 3B до 8B работают на CPU и подходят для написания черновиков, суммаризации и классификации. Скорость на общем vCPU составляет от единиц до нескольких десятков токенов в секунду. Модели размером от 13B и выше работают крайне медленно или не помещаются в RAM. Для высокой скорости или работы с большими моделями требуется инстанс с GPU.

Сколько RAM требуется каждой модели?

Приблизительное правило для стандартных 4-bit квантованных моделей: около 0.5 GB RAM на каждый миллиард параметров для весов, плюс примерно 1 GB на служебные данные и еще немного на контекст. Таким образом, модели 3B требуется около 4 GB свободного места, модели 7-8B — около 8 GB, а модели 14B — около 16 GB. Проверьте доступный объем памяти с помощью free -h и оставьте место для операционной системы и других процессов.

Требуется ли аутентификация в Ollama API?

Нет. В Ollama нет встроенной аутентификации, API-ключей или ограничений по количеству запросов. Любой, кто имеет доступ к порту 11434, имеет полный контроль над сервисом. Именно поэтому по умолчанию используется привязка к 127.0.0.1, и именно поэтому нельзя открывать порт 11434 для интернета на 0.0.0.0. Используйте локальный доступ, частный VPN или реверс-прокси с авторизацией.

Как добавить веб-интерфейс чата?

Запустите Open WebUI в Docker с флагом --network=host, чтобы он использовал loopback хоста и мог обращаться к Ollama по адресу http://127.0.0.1:11434. Затем установите TLS реверс-прокси перед портом 8080 для доступа с вашего ноутбука. Закройте порт 8080 на firewall, чтобы прокси был единственным точкой входа извне. Для входа используется учетная запись администратора Open WebUI; пароль задается при первом запуске.

Как вызвать API из своего приложения?

Используйте эндпоинт, совместимый с OpenAI, по адресу http://127.0.0.1:11434/v1. Укажите этот базовый URL в любом OpenAI SDK, передайте любую строку в качестве API-ключа (он будет проигнорирован) и установите model в значение загруженной вами модели. Существующий код для OpenAI обычно работает без изменений, за исключением базового URL и ключа.