7.9 KiB
Запуск Telemt API Gateway (Docker)
Оглавление:
- Назначение
- Требования
- Минимальная конфигурация
- Переменные окружения
- Сборка образа
- Запуск через Docker CLI
- Запуск через Docker Compose
- Проверка
- Обновление и CI/CD
- Устранение неполадок
Назначение
Шлюз — это один HTTP‑вход для нескольких экземпляров Telemt Control API:
- Белый список IP (CIDR): кто может обращаться к шлюзу (кроме
GET /health, см. ниже). - Маршрутизация по alias: клиент вызывает
GET /api/{alias}/health, шлюз проксирует на{base_url}/v1/healthу соответствующего сервера. - Метрики Prometheus:
GET /metrics(под тем же правилом whitelist, что и API). - Доверенные прокси: если прямой TCP‑peer входит в
trusted_proxies, для проверки whitelist берётся первый адрес изX-Forwarded-ForилиX-Real-IP.
Эндпоинты и контракт ответов бэкенда описаны в API.md.
Требования
- Установленные Docker и при необходимости Docker Compose v2.
- Для локальной сборки из исходников: Go 1.22+ (опционально, если не используете только готовый образ из registry).
Минимальная конфигурация
Скопируйте config.example.yaml в свой config.yaml и отредактируйте.
Минимальный рабочий фрагмент для разработки (без проверки IP):
listen: ":8080"
allow_all: true
servers:
- alias: main_srv
base_url: http://127.0.0.1:9091
Минимальный фрагмент для продакшена (только перечисленные сети/хосты):
listen: ":8080"
allow_all: false
whitelist_cidrs:
- "203.0.113.10/32"
- "10.0.0.0/8"
servers:
- alias: main_srv
base_url: http://telemt-internal:9091
Правила:
- При
allow_all: falseи пустомwhitelist_cidrsдоступ будет закрыт для всех (кромеGET /health). GET /healthна шлюзе не проверяется по whitelist — так проще настроить DockerHEALTHCHECKи оркестраторы.- Поле
path_prefixпо умолчанию равно/v1(префикс Telemt Control API).
Опционально для бэкенда с включённым auth_header в Telemt задайте в конфиге имя переменной окружения, значение которой будет отправлено как заголовок Authorization на этот upstream:
servers:
- alias: main_srv
base_url: http://telemt:9091
authorization_env: TELEMT_API_AUTH
Значение должно точно совпадать с настроенным в Telemt auth_header (см. API.md).
Переменные окружения
| Переменная | Описание |
|---|---|
CONFIG_PATH |
Путь к YAML внутри контейнера. По умолчанию: /etc/telemt-gateway/config.yaml. |
TELEMT_API_AUTH |
Пример: секрет для authorization_env в конфиге (имя может быть любым). |
Сборка образа
В каталоге репозитория:
docker build -t telemt-api-gateway:local .
Запуск через Docker CLI
Пример для PowerShell (подставьте путь к своему config.yaml):
docker run -d --name telemt-gateway `
-p 8080:8080 `
-v "C:\path\to\config.yaml:/etc/telemt-gateway/config.yaml:ro" `
-e CONFIG_PATH=/etc/telemt-gateway/config.yaml `
telemt-api-gateway:local
Проверка:
Invoke-WebRequest -Uri http://127.0.0.1:8080/health -UseBasicParsing
Invoke-WebRequest -Uri http://127.0.0.1:8080/api/main_srv/health -UseBasicParsing
Второй запрос проксируется на {base_url}/v1/health для alias main_srv.
Остановка и удаление:
docker stop telemt-gateway
docker rm telemt-gateway
Запуск через Docker Compose
В репозитории есть docker-compose.yml и пример config.compose.yaml с allow_all: true и base_url: http://host.docker.internal:9091 (Telemt на хосте).
docker compose up -d --build
docker compose logs -f gateway
docker compose down
На старых Linux‑хостах, где нет host.docker.internal, замените base_url на IP хоста или добавьте сервис Telemt в тот же docker-compose и укажите его DNS‑имя.
Проверка
| Сценарий | Ожидание |
|---|---|
GET /health |
200, JSON {"status":"ok"} |
| Разрешённый IP, корректный alias | ответ бэкенда (например 200 для /v1/health) |
| IP не в whitelist | 403, JSON с code: forbidden |
| Неизвестный alias | 404, JSON с code: not_found |
| Бэкенд недоступен | 502, JSON с code: bad_gateway |
GET /metrics |
текст метрик Prometheus (при разрешённом IP) |
Обновление и CI/CD
-
Образ: пересоберите тег или подтяните новый из registry, затем
docker compose up -d --buildилиdocker stop/docker run ...с тем же volume конфига. -
Конфиг: отредактируйте файл на хосте и перезапустите контейнер (шлюз не перечитывает конфиг на лету).
-
Gitea Actions: workflow .gitea/workflows/docker.yaml выполняет
go testи собирает Docker‑образ. Для пуша в registry задайте secrets:REGISTRY_IMAGE— полное имя образа без тега, напримерgit.example.com/owner/telemt-api-gatewayREGISTRY_URL— хост registry, напримерgit.example.comREGISTRY_USER/REGISTRY_PASSWORD
Если secrets не заданы, образ только собирается в runner без push.
Устранение неполадок
403 forbiddenс хоста приallow_all: false: добавьте CIDR клиента вwhitelist_cidrs. Запросы из контейнера к самому себе идут с127.0.0.1— при необходимости добавьте127.0.0.1/32.- За reverse proxy: укажите CIDR прокси в
trusted_proxies, иначе whitelist видит IP прокси, а не клиента. 502 bad_gateway: проверьтеbase_url, DNS в Docker‑сети и то, что Telemt слушает API ([server.api].enabled=trueи корректныйlisten).- Сборка Go без Docker: выполните
go mod tidy && go test ./...в корне репозитория.