all repos — rastro @ 6738696441c3bf8d4382193143952f0e7cdac6c5

BitTorrent tracker!

docs/architecture.md (view raw)

 1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
# Arquitetura

## Visão geral

Aplicação self-hosted de processo único que:

1. importa trackers públicos de fontes externas;
2. normaliza e protege destinos;
3. sonda HTTP(S) e UDP;
4. persiste histórico em SQLite;
5. expõe HTML, TXT e JSON.

Não é um tracker BitTorrent, não indexa torrents e não aceita magnets.

## Processo único e Uvicorn

O site, a API e o APScheduler rodam no **mesmo processo**. O Uvicorn deve ser
iniciado com **um único worker**. Múltiplos workers duplicariam jobs de importação
e probe. Essa limitação é intencional na versão `0.1.0`.

Locks em memória impedem sobreposição do mesmo job dentro do processo.

## Stack

- Python 3.13, FastAPI, Jinja2, SQLAlchemy 2 async, Alembic, aiosqlite
- SQLite com WAL
- httpx, dnspython, APScheduler, orjson, pydantic-settings
- Docker de um único serviço; reverse proxy TLS fica fora (Nginx/CloudPanel)

## Persistência

Identidade histórica do tracker é preservada mesmo quando a URL some de uma
origem. A limpeza automática remove apenas `probe_results` expirados
(`RAW_RESULT_RETENTION_DAYS`).

Datas no banco: UTC. API: ISO 8601. UI: apresentação humana com fuso indicado.

## Segurança de rede

Endereços ingeridos são não confiáveis. Destinos loopback, privados, link-local,
multicast, reservados e metadata são rejeitados. IPs do DNS são revalidados antes
da conexão (mitigação de rebinding). Respostas têm limite de bytes e timeout.
Não há endpoint público para testar URL arbitrária.

## Configuração

Nome, descrição, versão, URL pública e repositório vêm de variáveis de ambiente
(`APP_NAME`, etc.). O nome do produto não deve ser espalhado como literal no
código de domínio.

## Degradação segura

- Sem IPv6 no host: `ENABLE_IPV6=auto` marca IPv6 como não testado
- Sem banco GeoIP: ASN/país ficam desconhecidos
- Sem rede na primeira subida: site sobe vazio e registra o motivo

## Extensões futuras (não implementadas)

Contas, admin, submit público, probes distribuídos, PostgreSQL, filas, mapa,
notificações, protocolos WS/I2P/Yggdrasil.