forked from templates/template-go-backend
288 lines
10 KiB
Markdown
288 lines
10 KiB
Markdown
# Настройка прокси для Ollama
|
||
|
||
---
|
||
|
||
## Зачем нужен прокси
|
||
|
||
Без прокси Ollama приходится открывать в сеть напрямую (`OLLAMA_HOST=0.0.0.0`). Это значит, что любой человек в сети может отправлять запросы в Ollama без ограничений — нет ни логирования, ни контроля доступа.
|
||
|
||
Прокси встаёт между клиентами и Ollama:
|
||
- Ollama остаётся на `localhost` — снаружи к ней не достучаться
|
||
- Все запросы идут через прокси — видно кто, что и когда запросил
|
||
- В будущем можно добавить авторизацию по API-ключам и rate limiting
|
||
|
||
---
|
||
|
||
## Архитектура
|
||
|
||
```
|
||
Codex (ноутбук)
|
||
↓ HTTP-запрос
|
||
http://<IP_СЕРВЕРА>:8080/v1
|
||
↓
|
||
Go Proxy (сервер, порт 8080) ← единственная точка входа снаружи
|
||
↓ пересылает запрос как есть
|
||
Ollama (сервер, localhost:11434) ← недоступна снаружи
|
||
```
|
||
|
||
---
|
||
|
||
## Настройка сервера
|
||
|
||
### 1. Установить Go
|
||
|
||
Go нужен для сборки прокси из исходного кода. После сборки Go можно удалить — прокси работает как самостоятельный бинарник.
|
||
|
||
```bash
|
||
# Скачиваем архив с Go
|
||
wget https://go.dev/dl/go1.24.4.linux-amd64.tar.gz
|
||
|
||
# Распаковываем в /usr/local (стандартное место для Go)
|
||
sudo tar -C /usr/local -xzf go1.24.4.linux-amd64.tar.gz
|
||
|
||
# Добавляем Go в PATH, чтобы команда go была доступна
|
||
echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc
|
||
|
||
# Применяем изменения в текущей сессии (без перезахода в терминал)
|
||
source ~/.bashrc
|
||
|
||
# Проверяем что Go установлен
|
||
go version
|
||
```
|
||
|
||
---
|
||
|
||
### 2. Скопировать проект и собрать
|
||
|
||
```bash
|
||
# Переходим в папку проекта (если копировали через scp или git clone)
|
||
cd ~/Proxy_for_codex
|
||
|
||
# Скачиваем зависимости проекта (внешние библиотеки)
|
||
go mod download
|
||
|
||
# Собираем бинарник — файл "service", который можно запускать без Go
|
||
go build -o service ./src
|
||
```
|
||
|
||
После этого в папке появится файл `service` — это и есть наш прокси.
|
||
|
||
---
|
||
|
||
### 3. Настроить Ollama
|
||
|
||
Если раньше у Ollama стояло `OLLAMA_HOST=0.0.0.0` (чтобы она была доступна по сети), то теперь это нужно **убрать**. Прокси сам принимает внешние подключения и пересылает их в Ollama.
|
||
|
||
```bash
|
||
# Открываем override-конфиг Ollama
|
||
sudo systemctl edit ollama
|
||
```
|
||
|
||
Вставляем между комментариями:
|
||
|
||
```ini
|
||
[Service]
|
||
Environment="OLLAMA_KEEP_ALIVE=30m"
|
||
Environment="OLLAMA_NUM_PARALLEL=2"
|
||
```
|
||
|
||
- `OLLAMA_KEEP_ALIVE=30m` — модель остаётся в памяти 30 минут после последнего запроса. Без этого Ollama выгружает модель сразу, и каждый новый запрос ждёт повторной загрузки (15-30 секунд).
|
||
- `OLLAMA_NUM_PARALLEL=2` — Ollama обрабатывает до 2 запросов одновременно. Если работают 2 человека — оба получают ответ параллельно, не ждут друг друга.
|
||
|
||
> **Важно:** строки `OLLAMA_HOST=0.0.0.0` здесь быть **НЕ должно**. Если она есть — удалите. Ollama будет слушать только localhost, а наружу смотрит прокси.
|
||
|
||
Применяем изменения:
|
||
|
||
```bash
|
||
# Перечитываем конфигурацию systemd (без этого изменения не подхватятся)
|
||
sudo systemctl daemon-reload
|
||
|
||
# Перезапускаем Ollama с новыми настройками
|
||
sudo systemctl restart ollama
|
||
```
|
||
|
||
---
|
||
|
||
### 4. Создать systemd-сервис для прокси
|
||
|
||
systemd — это менеджер служб в Linux. Если создать сервис, то:
|
||
- прокси запустится автоматически при включении сервера
|
||
- если прокси упадёт — systemd перезапустит его сам
|
||
- не нужно держать открытый терминал
|
||
|
||
```bash
|
||
# Создаём файл сервиса
|
||
sudo nano /etc/systemd/system/ollama-proxy.service
|
||
```
|
||
|
||
Вставляем:
|
||
|
||
```ini
|
||
[Unit]
|
||
Description=Ollama Proxy
|
||
# After — запускать прокси только ПОСЛЕ того, как Ollama стартовала
|
||
After=ollama.service
|
||
# Wants — при старте прокси systemd попытается запустить Ollama, если она не запущена
|
||
Wants=ollama.service
|
||
|
||
[Service]
|
||
# Путь к собранному бинарнику
|
||
ExecStart=/home/<user>/Proxy_for_codex/service
|
||
|
||
# LISTEN_ADDR=:8080 — прокси слушает порт 8080 на всех интерфейсах (доступен из сети)
|
||
Environment=LISTEN_ADDR=:8080
|
||
|
||
# OLLAMA_BACKEND — куда прокси пересылает запросы (локальная Ollama)
|
||
Environment=OLLAMA_BACKEND=http://localhost:11434
|
||
|
||
# Рабочая директория — нужна чтобы прокси мог найти .env файл (если есть)
|
||
WorkingDirectory=/home/<user>/Proxy_for_codex
|
||
|
||
# Запускать от имени обычного пользователя, не от root (безопаснее)
|
||
User=<user>
|
||
|
||
# Если прокси упадёт — перезапустить автоматически
|
||
Restart=always
|
||
|
||
# Ждать 5 секунд перед перезапуском (чтобы не спамить перезапусками при проблеме)
|
||
RestartSec=5
|
||
|
||
[Install]
|
||
# Запускать прокси при каждом включении сервера
|
||
WantedBy=multi-user.target
|
||
```
|
||
|
||
> **Замените `<user>`** на имя пользователя на сервере (то, что показывает команда `whoami`).
|
||
|
||
---
|
||
|
||
### 5. Запустить прокси
|
||
|
||
```bash
|
||
# Перечитываем конфигурацию systemd (чтобы он узнал о новом сервисе)
|
||
sudo systemctl daemon-reload
|
||
|
||
# Включаем автозапуск при включении сервера
|
||
sudo systemctl enable ollama-proxy
|
||
|
||
# Запускаем прокси прямо сейчас
|
||
sudo systemctl start ollama-proxy
|
||
```
|
||
|
||
---
|
||
|
||
### 6. Проверить что всё работает
|
||
|
||
```bash
|
||
# Проверяем статус — должно быть "active (running)"
|
||
sudo systemctl status ollama-proxy
|
||
|
||
# Проверяем что прокси отвечает — должен вернуть список моделей
|
||
curl http://localhost:8080/api/tags
|
||
```
|
||
|
||
Если `curl` вернул JSON со списком моделей — прокси работает и Ollama доступна через него.
|
||
|
||
---
|
||
|
||
### 7. Файрвол (если включен)
|
||
|
||
Файрвол — это защита, которая блокирует входящие подключения к серверу. На Ubuntu он называется `ufw`. Если он включен и порт 8080 не открыт — ноутбуки не смогут достучаться до прокси.
|
||
|
||
Проверяем:
|
||
|
||
```bash
|
||
sudo ufw status
|
||
```
|
||
|
||
- Если в ответе `Status: inactive` — файрвол выключен, **ничего делать не нужно**, все порты и так открыты.
|
||
- Если `Status: active` — нужно открыть порт:
|
||
|
||
```bash
|
||
# Разрешаем входящие подключения на порт 8080
|
||
sudo ufw allow 8080/tcp
|
||
```
|
||
|
||
---
|
||
|
||
### 8. Логирование
|
||
|
||
Прокси логирует каждый запрос. При запуске:
|
||
|
||
```
|
||
INFO Прокси запущен addr=:8080 backend=http://localhost:11434
|
||
```
|
||
|
||
При каждом запросе от клиента:
|
||
|
||
```
|
||
INFO запрос method=POST path=/v1/chat/completions status=200 duration=1.234s
|
||
INFO запрос method=GET path=/v1/models status=200 duration=12ms
|
||
```
|
||
|
||
Смотреть логи в реальном времени:
|
||
|
||
```bash
|
||
# -u ollama-proxy — показать логи только нашего сервиса
|
||
# -f — следить за новыми записями (как tail -f)
|
||
sudo journalctl -u ollama-proxy -f
|
||
```
|
||
|
||
Посмотреть последние 50 строк:
|
||
|
||
```bash
|
||
sudo journalctl -u ollama-proxy -n 50
|
||
```
|
||
|
||
---
|
||
|
||
## Настройка клиента (ноутбук)
|
||
|
||
На ноутбуке не нужно ничего устанавливать и запускать — только изменить конфиг Codex, чтобы он отправлял запросы на прокси вместо локальной Ollama.
|
||
|
||
Открываем конфиг Codex:
|
||
|
||
**Linux:**
|
||
|
||
```bash
|
||
nano ~/.codex/config.toml
|
||
```
|
||
|
||
**Windows:** файл находится в:
|
||
|
||
```
|
||
C:\Users\<user>\.codex\config.toml
|
||
```
|
||
|
||
Пишем:
|
||
|
||
```toml
|
||
# Модель по умолчанию — будет использоваться при запуске codex без параметров
|
||
model = "qwen3:0.6b"
|
||
|
||
# Имя провайдера — ссылка на секцию [model_providers.ollama_proxy] ниже
|
||
model_provider = "ollama_proxy"
|
||
|
||
[model_providers.ollama_proxy]
|
||
name = "Ollama (через прокси)"
|
||
|
||
# Адрес прокси на сервере. /v1 на конце обязателен —
|
||
# Codex использует OpenAI-совместимый формат API, где все пути начинаются с /v1
|
||
base_url = "http://<IP_СЕРВЕРА>:8080/v1"
|
||
|
||
# Формат общения с API
|
||
wire_api = "responses"
|
||
```
|
||
|
||
> **Замените `<IP_СЕРВЕРА>`** на реальный IP сервера (например `10.111.111.40`).
|
||
|
||
---
|
||
|
||
## Запуск
|
||
|
||
```bash
|
||
codex
|
||
```
|
||
|
||
Готово. Codex отправит запросы на прокси, прокси перешлёт в Ollama, ответ вернётся обратно.
|