Files
image-gateway/docs/dev-guide.md
S.Gromov 0751c4b469 feat: добавить Image Gateway с кешем Souin
- добавлена сборка Caddy с Souin, Otter и NutsDB

- добавлена конфигурация dev, prod и test Docker Compose

- настроено кеширование через Otter L1 и NutsDB L2

- добавлены e2e-тесты Bun для кеша, restart и purge

- добавлена документация по запуску, API кеша и тестам
2026-05-04 12:18:37 +03:00

129 lines
3.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Руководство разработчика
## Требования
- Docker
- Docker Compose
## Режимы запуска
### Development (`docker-compose.dev.yml`)
Bridge-сеть, проброс портов:
- `8888` — Caddy (изображения)
- `2019` — Caddy Admin API (Souin purge)
```bash
docker compose -f docker-compose.dev.yml up -d --build
docker compose -f docker-compose.dev.yml down
docker compose -f docker-compose.dev.yml logs -f caddy
docker compose -f docker-compose.dev.yml logs -f imgproxy
```
### Production (`docker-compose.yml`)
Bridge-сеть, порт `80` (или `443` с HTTPS). Порт 2019 **не пробрасывается** — доступен только внутри Docker сети.
```bash
docker compose up -d --build
```
## Конфигурация
Все настройки через `.env` файл (см. `.env.example`).
### imgproxy
| Переменная | Описание | По умолчанию |
|---|---|---|
| `IMGPROXY_KEY` | Hex-ключ для подписи URL (пусто = unsigned) | — |
| `IMGPROXY_SALT` | Hex-соль для подписи URL | — |
| `IMGPROXY_WORKERS` | Количество воркеров обработки | `2` |
| `IMGPROXY_MAX_SRC_RESOLUTION` | Макс. разрешение исходника (MP) | `20` |
| `IMGPROXY_ALLOWED_SOURCES` | Whitelist доменов (через запятую) | — |
| `IMGPROXY_DOWNLOAD_TIMEOUT` | Таймаут загрузки исходника (сек) | `30` |
### Caddy
| Переменная | Описание | По умолчанию |
|---|---|---|
| `CADDY_PORT` | Порт Caddy | `8888` (dev) / `80` (prod) |
| `DOMAIN` | Домен для HTTPS (пусто = localhost, prod only) | — |
### Сеть (опционально)
| Переменная | Описание |
|---|---|
| `HTTP_PROXY` | HTTP-прокси для imgproxy |
| `HTTPS_PROXY` | HTTPS-прокси для imgproxy |
| `NO_PROXY` | Исключения прокси |
### Генерация ключей подписи
```bash
openssl rand -hex 32 # KEY
openssl rand -hex 32 # SALT
```
## HTTPS (production)
Укажите домен в `.env`:
```env
DOMAIN=images.example.com
```
Caddy автоматически получит Let's Encrypt сертификат.
## Интеграция с внешними сервисами
Next.js или другой сервис внутри Docker сети ходит к Caddy Admin API для purge:
```
http://caddy:2019/souin-api/souin/ — GET список ключей
http://caddy:2019/souin-api/souin/flush — PURGE полный сброс
http://caddy:2019/souin-api/souin/{regex} — PURGE по regex
```
Для добавления Next.js в сеть — подключить контейнер к сети `gateway`:
```yaml
services:
app:
# ...
networks:
- gateway
networks:
gateway:
external: true
name: image-gateway_gateway
```
## Корпоративная сеть
```env
HTTP_PROXY=http://proxy.company.com:8080
HTTPS_PROXY=http://proxy.company.com:8080
NO_PROXY=localhost,127.0.0.1,.company.com
```
`GODEBUG=http2client=0` уже задан в compose — отключает HTTP/2 в Go, решает проблемы с Cloudflare через прокси.
## Мониторинг
### Cache-Status заголовок
```
Cache-Status: Souin; hit; ttl=31535999; detail=DEFAULT # из кеша
Cache-Status: Souin; fwd=uri-miss; stored; key=GET-... # закешировано
Cache-Status: Souin; fwd=uri-miss; detail=UNCACHEABLE-... # не закешировано
```
### Логи
```bash
docker compose -f docker-compose.dev.yml logs -f caddy # Caddy + Souin
docker compose -f docker-compose.dev.yml logs -f imgproxy # imgproxy
```