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

4.7 KiB
Raw Blame History

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. Проверяется сразу после рестарта.