Пошаговый справочник по развёртыванию локального LLM-сервера: от статического IP до веб-интерфейса
Чтобы сервер всегда имел один и тот же адрес в локальной сети 192.168.12.x
ip a
Ищите интерфейс со статусом UP и MAC-адресом. В VMware это обычно ens33, в VirtualBox — enp0s3, на реальном железе — eno1, enp3s0 и т.п.
ls /etc/netplan/
sudo cat /etc/netplan/*.yaml
sudo nano /etc/netplan/50-cloud-init.yaml
Привести к виду (заменить ens33 на своё имя):
network:
version: 2
ethernets:
ens33:
addresses:
- "192.168.12.33/24"
routes:
- to: "default"
via: "192.168.12.1"
nameservers:
addresses: [8.8.8.8, 1.1.1.1]
| Строка | Значение |
|---|---|
192.168.12.33/24 | IP-адрес + маска (/24 = 255.255.255.0) |
via: 192.168.12.1 | Шлюз (роутер). Обязательно IP, не маска! |
nameservers | DNS-серверы для доступа в интернет |
Типичная ошибка: указать в via маску 255.255.255.0 вместо адреса шлюза. Тогда система скажет Network is unreachable.
sudo netplan apply
ip a # должен быть 192.168.12.33/24
ip route # строка default via 192.168.12.1
Управлять сервером с другого компьютера
sudo apt update
sudo apt install -y openssh-server
sudo systemctl enable --now ssh
systemctl status ssh --no-pager
С другого ПК в сети 192.168.12.x:
ssh @192.168.12.33
Ubuntu Server ставится на LVM-раздел, который по умолчанию занимает не весь диск
df -h # текущий размер корня
sudo vgdisplay # ищем Free PE / Size
Если Free PE / Size больше нуля — свободное место есть, можно расширять.
sudo lvdisplay # точное имя тома
sudo lvextend -l +100%FREE /dev/ubuntu-vg/ubuntu-lv
sudo resize2fs /dev/ubuntu-vg/ubuntu-lv # для ext4
Если корень на xfs — команда sudo xfs_growfs /.
Значит, сам виртуальный диск меньше физического. Тогда:
sudo apt install -y cloud-guest-utils
sudo growpart /dev/sda 3 # номер раздела уточнить в lsblk
sudo pvresize /dev/sda3
sudo lvextend -l +100%FREE /dev/ubuntu-vg/ubuntu-lv
sudo resize2fs /dev/ubuntu-vg/ubuntu-lv
df -h /
Удобный консольный файловый менеджер (две панели, как в Norton Commander)
sudo apt install -y mc
mc
Управление: F3 — просмотр, F4 — редактирование, F10 — выход.
Нужен для запуска Open WebUI в контейнере
curl -fsSL https://get.docker.com | sudo sh
sudo usermod -aG docker $USER
newgrp docker
docker --version
Движок для запуска локальных LLM
curl -fsSL https://ollama.com/install.sh | sh
newgrp ollama
systemctl status ollama --no-pager
Нужно для связи с Docker-контейнером.
sudo mkdir -p /etc/systemd/system/ollama.service.d
sudo nano /etc/systemd/system/ollama.service.d/override.conf
Содержимое файла:
[Service]
Environment="OLLAMA_HOST=0.0.0.0:11434"
sudo systemctl daemon-reload
sudo systemctl restart ollama
ss -tlnp | grep 11434 # должно быть 0.0.0.0:11434
ollama pull llama3.1:8b
ollama list
ollama run llama3.1:8b # выход: /bye
Общаться с моделью из браузера, в том числе с других ПК
docker pull ghcr.io/open-webui/open-webui:main
Если рвётся соединение — попробовать зеркало:
docker pull ghcr.1ms.run/open-webui/open-webui:main
docker run -d -p 3000:8080 \
--add-host=host.docker.internal:host-gateway \
-v open-webui:/app/backend/data \
--name open-webui \
--restart always \
ghcr.io/open-webui/open-webui:main
| Параметр | Значение |
|---|---|
-d | Запуск в фоне |
-p 3000:8080 | Порт 3000 на хосте → 8080 в контейнере |
--add-host=host.docker.internal:host-gateway | Доступ контейнера к хосту (где Ollama) |
-v open-webui:/app/backend/data | Постоянное хранилище данных |
--name open-webui | Имя контейнера |
--restart always | Автозапуск при загрузке системы |
docker ps # строка с open-webui, статус Up
docker exec -it open-webui curl -s http://host.docker.internal:11434/api/tags
С любого ПК в сети 192.168.12.x:
http://192.168.12.33:3000
Первый зарегистрированный пользователь становится администратором.
| Симптом | Что проверить |
|---|---|
| Нет сети | ip a, ip route, cat /etc/netplan/*.yaml |
Network is unreachable | Шлюз в via должен быть IP, не маска |
apt update падает | DNS (cat /etc/resolv.conf), связь (curl -I http://archive.ubuntu.com) |
| Контейнер не видит Ollama | ss -tlnp | grep 11434 → должно быть 0.0.0.0 |
| Модель не появилась в UI | docker restart open-webui, обновить страницу |
| Диск заполнен | df -h, sudo vgdisplay |
| Медленные ответы | CPU-режим; GPU даст 10–50× ускорения |
1. ip a → узнать имя интерфейса
2. sudo nano /etc/netplan/50-cloud-init.yaml → прописать IP/шлюз/DNS
3. sudo netplan apply → применить
4. ip a && ip route → проверить
5. sudo apt update && sudo apt install -y openssh-server mc
6. sudo systemctl enable --now ssh
7. sudo vgdisplay → проверить Free PE
8. sudo lvextend -l +100%FREE /dev/ubuntu-vg/ubuntu-lv
9. sudo resize2fs /dev/ubuntu-vg/ubuntu-lv
10. curl -fsSL https://get.docker.com | sudo sh
11. sudo usermod -aG docker $USER && newgrp docker
12. curl -fsSL https://ollama.com/install.sh | sh
13. newgrp ollama
14. sudo mkdir -p /etc/systemd/system/ollama.service.d
15. sudo nano /etc/systemd/system/ollama.service.d/override.conf
→ [Service] Environment="OLLAMA_HOST=0.0.0.0:11434"
16. sudo systemctl daemon-reload && sudo systemctl restart ollama
17. ollama pull llama3.1:8b
18. docker pull ghcr.io/open-webui/open-webui:main
19. docker run -d -p 3000:8080 --add-host=host.docker.internal:host-gateway \
-v open-webui:/app/backend/data --name open-webui --restart always \
ghcr.io/open-webui/open-webui:main
20. Браузер: http://192.168.12.33:3000
eno1, enp3s0). Узнать: ip a.ollama ps покажет 100% GPU.llama3.1:70b, qwen2.5:32b и т.п.--restart always) поднимутся сами после перезагрузки.open-webui. Посмотреть: docker volume inspect open-webui.docker pull ghcr.io/open-webui/open-webui:main
docker stop open-webui && docker rm open-webui
# затем снова docker run с теми же параметрами