Files
gotosocial/openspec/changes/fix-trusted-proxies/design.md
T
estorozhenko c62b6efb92 fix(trusted-proxies): add 10.8.0.4/32 (vps02 WG) to GTS_TRUSTED_PROXIES
- docker-compose.yml: GTS_TRUSTED_PROXIES now 10.8.0.4/32,127.0.0.1/32,::1,172.30.0.1/16
- config.yaml: trusted-proxies sync (172.29.0.1/16 -> 172.30.0.1/16, actual docker gw)
- openspec: change fix-trusted-proxies (proposal/specs/design/tasks)
- verified: warning gone (0 matches), external IP 178.176.197.2 in logs, HTTP 200
2026-09-06 20:17:16 +00:00

69 lines
4.7 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.
## Context
- GoToSocial работает в Docker на bigbox (WG 10.8.0.2), конфиг — **только через env**
`GTS_*` (docker-образ не читает смонтированный config.yaml — падал «host must be set»)
- Реверс-прокси: Caddy на vps02 (87.242.100.206, host net) → WireGuard 10.8.0.0/24 →
bigbox 10.8.0.2:8082 → docker-NAT → контейнер gotosocial (сеть gotosocial_default,
шлюз 172.30.0.1, контейнер 172.30.0.2)
- Caddy передаёт `X-Forwarded-For` по умолчанию; в Caddyfile блока social.dedinit.ru
только `header_up Host` и `header_up X-Forwarded-Proto https` (лишнего XFF нет)
- Warning рекомендует `10.8.0.4/32` — это WG-адрес vps02 (peer в `sudo wg show` на bigbox)
- Текущие значения: `GTS_TRUSTED_PROXIES=127.0.0.1/32,::1,172.30.0.1/16`
(compose/config полностью синхронны)
- Restart сервисов — только извне (SSH sudo) — **НЕ применимо**: bigbox локальная,
docker compose доступен напрямую
## Goals / Non-Goals
**Goals:**
- Убрать предупреждение trusted-proxies (проверяется на главной странице)
- Rate limiting и федеризация используют реальный клиентский IP
- Синхронизировать compose (env) и config.yaml (reference)
**Non-Goals:**
- Не менять архитектуру проксирования (Caddy → WG → docker-NAT остаётся)
- Не добавлять лишние заголовки в Caddy (XFF передаётся по умолчанию, X-Real-IP не нужен)
- Не отключать rate limiting, не добавлять rate-limit exceptions
## Decisions
### D1: Добавить `10.8.0.4/32` в trusted-proxies
**Решение:** В `docker-compose.yml` env `GTS_TRUSTED_PROXIES` и в `config.yaml`
`trusted-proxies` добавить `10.8.0.4/32`, сохранив `127.0.0.1/32,::1,172.30.0.1/16`.
**Обоснование:** Предупреждение прямо указывает недостающий диапазон. 10.8.0.4 — это
WG-адрес vps02 (peer из `sudo wg show`, allowed-ips 10.8.0.4/32). Именно этот адрес
видит GtS как источник входящих соединений от Caddy (после docker-NAT source-адрес —
gateway 172.30.0.1, но GtS доверяет цепочке trusted proxies и берёт IP из XFF; чтобы
корректно определить реальный client IP, адрес прокси-хопа 10.8.0.4 должен быть в
списке доверия). Траст docker-gateway 172.30.0.1/16 тоже оставляем — он реальный
source-адрес в контейнере.
**Альтернативы:**
- Добавить только 10.8.0.4/32 без 172.30.0.1 — недостаточно: GtS всё равно видит
docker-gateway как source и не сможет довериться XFF от него.
- 10.8.0.0/24 целиком — избыточно: единственный прокси-хоп в этой сети — vps02.
### D2: Изменить только один файл-источник правды (compose) + синхронизировать config.yaml
**Решение:** Правим `docker-compose.yml` (рабочий) и `config.yaml` (reference) —
оба, одинаково.
**Обоснование:** Образ GtS читает только env. Но config.yaml хранится в git как
reference и документирует настройку; расхождение создавало бы ложное впечатление.
### D3: Пересоздание через docker compose, без ручного удаления контейнера
**Решение:** `docker compose up -d --force-recreate gotosocial` (env меняется → контейнер
пересоздаётся). Данные не теряются (volume ./data).
## Risks / Trade-offs
- **Перезапуск контейнера**: кратковременный даунтайм (секунды), инстанс поднимется сам
(restart: unless-stopped). Откат — вернуть старое значение env + recreate.
- **Неправильный IP в trusted-proxies**: если 10.8.0.4 не является фактическим source,
предупреждение останется (но поменяет SUGGESTED_IP_RANGE) — тогда добавить то, что
предложит GtS. Проверяется сразу после рестарта.