openspec: archive fix-trusted-proxies, merge trusted-proxies spec

This commit is contained in:
estorozhenko
2026-09-06 20:19:41 +00:00
parent c62b6efb92
commit aa1814a9eb
5 changed files with 2 additions and 164 deletions
@@ -0,0 +1,43 @@
# gotosocial/trusted-proxies Specification
## Purpose
Обеспечить корректную работу rate-limiting и федеризации GoToSocial за реверс-прокси:
инстанс должен доверять реальному адресу прокси и брать клиентский IP из
`X-Forwarded-For` / `X-Real-IP`, а не видеть все запросы с одного адреса.
## Requirements
### Requirement: Trusted-proxies включает реальный адрес реверс-прокси
- **MUST**: В `docker-compose.yml` (env `GTS_TRUSTED_PROXIES`) и `config.yaml`
(`trusted-proxies`) включены:
- `10.8.0.4/32` — WireGuard-адрес vps02 (Caddy, реверс-прокси)
- `127.0.0.1/32` и `::1` — локальные адреса
- `172.30.0.1/16` — шлюз docker-сети gotosocial
- **MUST**: Рабочим конфигом является env в docker-compose.yml (`GTS_*`);
`config.yaml` — reference и держится синхронным
- **SHOULD**: Предупреждение о trusted-proxies на главной странице инстанса отсутствует
#### Scenario: Предупреждение исчезло
- **GIVEN** инстанс запущен с обновлённым `GTS_TRUSTED_PROXIES`
- **WHEN** открыть главную страницу `https://social.dedinit.ru/`
- **THEN** на странице нет текста «Warning! It looks like trusted-proxies is not set correctly»
#### Scenario: Конфиг синхронизирован
- **GIVEN** обновлён docker-compose.yml
- **WHEN** выполнить `docker compose config | grep TRUSTED`
- **THEN** в выводе присутствуют `10.8.0.4/32`, `127.0.0.1/32`, `::1`, `172.30.0.1/16`
### Requirement: Rate limiting использует реальный клиентский IP
- **MUST**: После настройки GtS определяет IP клиента из заголовков прокси, а не из
source-адреса docker-gateway
- **SHOULD**: Все внешние запросы к инстансу логируются с реальным IP клиента
#### Scenario: Логи содержат реальный клиентский IP
- **GIVEN** инстанс пересоздан с новой конфигурацией
- **WHEN** `docker compose logs gotosocial --since 5m | grep -i 'GET /' | tail -5`
- **THEN** записи содержат IP клиента, отличный от `172.30.x.x` (для внешних запросов)