feat: named proxy pools with per-listener assignment
Add proxy_pools: top-level config (dict of name -> pool config) so
listeners can draw from different proxy sources. Each pool has
independent sources, health testing, state persistence, and refresh
cycles.
- PoolSourceConfig gains mitm: bool|None for API ?mitm=0/1 filtering
- ListenerConfig gains pool_name for named pool assignment
- ProxyPool gains name param with prefixed log messages and
per-name state file derivation (pool-{name}.json)
- server.py replaces single proxy_pool with proxy_pools dict,
validates listener pool references at startup, per-listener closure
- API /pool merges all pools (with pool field on multi-pool entries),
/status and /config expose per-pool summaries
- Backward compat: singular proxy_pool: registers as "default"
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -43,17 +43,25 @@ cp config/example.yaml config/s5p.yaml # create live config (gitignored)
|
||||
```yaml
|
||||
listeners:
|
||||
- listen: 0.0.0.0:1080
|
||||
pool: clean # named pool assignment
|
||||
chain:
|
||||
- socks5://127.0.0.1:9050
|
||||
- pool # Tor + 2 pool hops
|
||||
- pool # Tor + 2 clean hops
|
||||
- pool
|
||||
- listen: 0.0.0.0:1081
|
||||
pool: clean
|
||||
chain:
|
||||
- socks5://127.0.0.1:9050
|
||||
- pool # Tor + 1 pool hop
|
||||
- pool # Tor + 1 clean hop
|
||||
- listen: 0.0.0.0:1082
|
||||
chain:
|
||||
- socks5://127.0.0.1:9050 # Tor only
|
||||
- listen: 0.0.0.0:1083
|
||||
pool: mitm # MITM-capable proxies
|
||||
chain:
|
||||
- socks5://127.0.0.1:9050
|
||||
- pool
|
||||
- pool
|
||||
```
|
||||
|
||||
## Multi-Tor Round-Robin (config)
|
||||
@@ -74,26 +82,39 @@ pool_size: 8 # pre-warmed TCP conns to first hop (0 = off)
|
||||
pool_max_idle: 30 # evict idle pooled conns (seconds)
|
||||
```
|
||||
|
||||
## Proxy Pool (config)
|
||||
## Named Proxy Pools (config)
|
||||
|
||||
```yaml
|
||||
proxy_pool:
|
||||
sources:
|
||||
- url: http://10.200.1.250:8081/proxies
|
||||
proto: socks5
|
||||
limit: 1000
|
||||
- file: /etc/s5p/proxies.txt
|
||||
refresh: 300 # re-fetch interval
|
||||
test_interval: 120 # health test cycle
|
||||
test_targets: # TLS handshake targets (round-robin)
|
||||
- www.google.com
|
||||
- www.cloudflare.com
|
||||
- www.amazon.com
|
||||
test_concurrency: 25 # max parallel tests (auto-scales to ~10% of pool)
|
||||
max_fails: 3 # evict after N fails
|
||||
report_url: "" # POST dead proxies (optional)
|
||||
proxy_pools:
|
||||
clean:
|
||||
sources:
|
||||
- url: http://10.200.1.250:8081/proxies/all
|
||||
mitm: false # adds ?mitm=0
|
||||
state_file: /data/pool-clean.json
|
||||
refresh: 300
|
||||
test_interval: 120
|
||||
max_fails: 3
|
||||
mitm:
|
||||
sources:
|
||||
- url: http://10.200.1.250:8081/proxies/all
|
||||
mitm: true # adds ?mitm=1
|
||||
state_file: /data/pool-mitm.json
|
||||
refresh: 300
|
||||
test_interval: 120
|
||||
max_fails: 3
|
||||
```
|
||||
|
||||
Singular `proxy_pool:` still works (becomes pool "default").
|
||||
|
||||
## Source Filters (proxy_pool sources)
|
||||
|
||||
| Filter | Values | Query param |
|
||||
|--------|--------|-------------|
|
||||
| `proto` | socks5/socks4/http | `?proto=...` |
|
||||
| `country` | ISO alpha-2 | `?country=...` |
|
||||
| `limit` | integer | `?limit=...` |
|
||||
| `mitm` | true/false | `?mitm=1` / `?mitm=0` |
|
||||
|
||||
## Tor Control Port (config)
|
||||
|
||||
```yaml
|
||||
|
||||
Reference in New Issue
Block a user