forked from templates/template-go-backend
Documetnation of proxy
This commit is contained in:
287
PROXY_SETUP.md
Normal file
287
PROXY_SETUP.md
Normal file
@@ -0,0 +1,287 @@
|
||||
# Настройка прокси для 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, ответ вернётся обратно.
|
||||
Reference in New Issue
Block a user