Як хостити Ollama на VPS безпечно
Налаштуйте LLM на VPS. Модель 7B потребує 8 GB RAM і видає 4-10 tokens/s на CPU. Налаштуйте доступ через 127.0.0.1:11434/v1, закривши порт 11434.
Що ви створюєте
Ви створюєте одну open-weight мовну модель, що працює на вашому власному сервері. Доступ до неї здійснюється через HTTP API та, за бажанням, через сторінку чату у браузері. Ollama завантажує модель, завантажує її в пам'ять і обробляє запити на http://127.0.0.1:11434. Встановлення виконується однією командою. Основні труднощі полягають в іншому: вибір моделі, яку ваш VPS зможе вмістити в RAM, та уникнення випадкового публічного доступу до неавтентифікованого сервера виведення для всього інтернету.
Спочатку два застереження. VPS лише з CPU працює з малими моделями повільно. В API повністю відсутня вбудована автентифікація. Обидва аспекти детально розглянуті нижче, оскільки саме на цих етапах виникають проблеми.
Реальні показники використання ресурсів у цифрах
Обсяг пам'яті, який займає модель, приблизно дорівнює її розміру на диску плюс близько 1 GB на роботу середовища виконання, а також додатковий обсяг для контекстного вікна. Моделі Ollama за замовчуванням використовують 4-бітне квантування (маркування Q4), що потребує приблизно 0.5 GB 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 — на CPU VPS модель або не поміститься, або працюватиме занадто повільно, що зробить її використання неможливим.
Тепер про швидкість, оскільки цей параметр часто недооцінюють. Швидкість виведення (inference) на CPU обмежена пропускною здатністю пам'яті, а не тактовою частотою; спільні vCPU VPS мають обмежену пропускну здатність. Очікуйте від 1 до 10+ токенів на секунду: модель 7-8B Q4 може видавати від 4 до 10 токенів на секунду, а модель 3B — від 10 до 25. GPU працює приблизно на порядок швидше. Ці цифри є приблизними — правильний підхід полягає у тестуванні власного обладнання, як показано в наступному кроці виконання. Довіряйте своєму eval rate, а не цифрам у статтях, включно з цією.
Практичний висновок: невеликі квантовані моделі на CPU дійсно корисні для створення чернеток, резюмування та класифікації, якщо вас влаштовує така швидкість. Для всього, що потребує більшої потужності або швидкості, плануйте використання GPU-інстансу.
Щоб порівняти конкретну модель з конкретним обладнанням, оцініть обсяг пам'яті тут:
Встановлення Ollama
Існує два чистих способи. Офіційний скрипт є найпростішим для чистого 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:3bpull завантажує шари моделі на диск (приблизно 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. У контейнері вони зберігаються у named volume 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, що з'єднує ваші інструменти з моделлю — залиште прив'язку на
127.0.0.1і дозвольте цій програмі звертатися доhttp://127.0.0.1:11434. Нічого не виставлено назовні, і додаткові налаштування не потрібні. - Використовуйте приватний тунель. Підключіть VPS до WireGuard VPN, який ви хостите самостійно, встановіть
OLLAMA_HOSTна адресу тунелю (наприклад,10.8.0.1, а не0.0.0.0), і дозвольте підключення лише VPN-пірам. Публічний інтернет не бачитиме нічого на порту 11434. - Використовуйте реверс-проксі з автентифікацією. Використовуйте nginx, Traefik або Caddy для термінації TLS та перевірки пароля або токена, а потім проксіюйте запити на
127.0.0.1:11434. Ollama залишається прив'язаною до localhost; проксі є єдиним сервісом, що слухає публічний порт. Це працює так само, як встановлення сертифіката Let's Encrypt на nginx перед будь-яким локальним сервісом.
Варіант із реверс-проксі — це саме те, що пропонує наступний крок з чат-інтерфейсом, до якого додано повноцінний логін.
Додавання чат-інтерфейсу за допомогою Open WebUI через TLS
Open WebUI — це самостійно керований чат-інтерфейс. Запустіть його в Docker і підключіть до локальної 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Прапор --network=host є критично важливим для Linux VPS. Він переносить контейнер у мережевий простір хоста. Завдяки цьому 127.0.0.1 всередині контейнера стає loopback-адресою хоста, і контейнер отримує доступ до Ollama за адресою 127.0.0.1:11434, навіть якщо Ollama не прослуховує інші інтерфейси. Метод із використанням bridge-мережі — --add-host=host.docker.internal:host-gateway з OLLAMA_BASE_URL=http://host.docker.internal:11434 — у цьому випадку не працює. Це ім'я вказує на шлюз Docker bridge, а сервіс, прив'язаний до 127.0.0.1 на хості, недоступний через bridge. У результаті Open WebUI видає помилку підключення до Ollama.
Особливістю host networking є те, що Open WebUI тепер прослуховує порт 8080 хоста на усіх інтерфейсах. Будь-яке відображення -p ігнорується, про що Docker виведе попередження. Тому закрийте 8080 на хості та у фаєрволі провайдера; єдиним публічним входом має бути TLS reverse proxy. Під час першого візиту Open WebUI запропонує створити обліковий запис адміністратора. Цей обліковий запис виконує роль рівня автентифікації, тому використовуйте надійний пароль.
Щоб отримати доступ до чату з ноутбука через HTTPS, встановіть TLS reverse proxy перед 127.0.0.1:8080. Якщо на сервері вже запущено кілька Docker-додатків, найкращим рішенням буде Traefik з автоматичним TLS для багатьох додатків: один блок label видає сертифікат і перенаправляє chat.example.com на Open WebUI. Правило з розділу безпеки залишається незмінним: проксі-сервер займає публічний порт і керує входом, тоді як Ollama залишається на localhost, а власний порт 8080 Open WebUI залишається під захистом фаєрвола.
Використання endpoint, сумісного з OpenAI, у вашому коді
Ollama підтримує підмножину OpenAI chat API на порту /v1. Більшість клієнтських бібліотек OpenAI працюватимуть після зміни двох параметрів: base URL та ключа (key).
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, що запущено на VPS у tmux. Це дозволяє виконувати дешеву та приватну підготовку чернеток без використання платних API, залишаючи складні обчислення (reasoning) хостинговій моделі.
Режими відмови та відповідні повідомлення
Процес завершено з помилкою "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, щоб перевірити, чи завантажена модель зараз.
Все працює дуже повільно. Десять токенів на секунду або менше, без жодних помилок. Це стандартна робота 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 і додайте автентифікацію. Вважайте, що будь-який запит на цій адресі під час її відкритості був зроблений сторонніми особами.
Backups and upgrades
Втрата даних мінімальна. Моделі можна завантажити повторно, тому варто резервувати лише том із даними Open WebUI (акаунти, історія чатів, налаштування) та створені вами systemd drop-in файли. Зробіть резервну копію тому за допомогою тимчасового контейнера:
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 instance.
Скільки RAM потрібно кожній моделі?
Приблизне правило для стандартних 4-bit квантованих моделей: близько 0.5 GB RAM на кожен мільярд параметрів для ваг, плюс приблизно 1 GB на накладні витрати та трохи більше на контекст. Отже, для моделі 3B потрібно близько 4 GB вільної пам'яті, для 7-8B — близько 8 GB, а для 14B — близько 16 GB. Перевірте доступний обсяг за допомогою free -h і залиште місце для операційної системи та інших процесів у системі.
Чи є API Ollama автентифікованим?
Ні. 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 на фаєрволі, щоб проксі був єдиним публічним входом. Адміністраторський акаунт Open WebUI забезпечує авторизацію; пароль встановлюється під час першого запуску.
Як викликати API з власного додатка?
Використовуйте сумісний з OpenAI endpoint за адресою http://127.0.0.1:11434/v1. Налаштуйте будь-який OpenAI SDK на цей базовий URL, передайте будь-який рядок як API key (він ігнорується) і встановіть model на назву завантаженої моделі. Існуючий код OpenAI зазвичай працює без змін, за винятком зміни базового URL та ключа.