Easy Proxies is a sing-box based proxy pool manager.
It focuses on turning many upstream nodes into one stable local HTTP proxy entry, while still supporting per-node ports when needed.
- Supports
pool,multi-port, andhybridruntime modes. - Builds upstream outbounds for:
vmess,vless,trojan,ss/shadowsocks,hysteria2/hy2,socks5/socks,http/https. - Supports node sources:
- inline
nodes:inconfig.yaml nodes_file(one URI per line)subscriptions(Base64/plain text/Clash YAML parsing)
- inline
- Provides automatic health checks and node blacklist recovery.
- Provides Web dashboard + API for:
- node status/probe/export
- settings update (
external_ip,probe_target,skip_cert_verify) - config node CRUD + reload
- subscription status + manual refresh
- Adds configurable DNS resolver for outbound domain resolution (important for VMess nodes with domain hosts).
- Optional GeoIP labeling with auto-update and hot-reload (region/country metadata in dashboard, pool mode only).
cp config.example.yaml config.yaml
cp nodes.example nodes.txtEdit config.yaml and your node source (nodes.txt, subscriptions, or inline nodes).
Docker:
./start.sh
# or
docker compose up -dLocal:
go run ./cmd/easy_proxies -config config.yamlmode: pool
listener:
address: 0.0.0.0
port: 2323
username: user
password: pass
pool:
mode: sequential # sequential / random / balance
failure_threshold: 3
blacklist_duration: 24h
management:
enabled: true
listen: 0.0.0.0:9091
probe_target: http://cp.cloudflare.com/generate_204
password: ""
dns:
server: 223.5.5.5
port: 53
strategy: prefer_ipv4
nodes_file: nodes.txtdns controls domain resolution used by sing-box DNS client and VMess domain dialing:
dns:
server: 223.5.5.5
fallback_servers: # Fallback DNS servers (used when primary fails)
- 8.8.8.8
- 1.1.1.1
port: 53
strategy: prefer_ipv4Allowed strategy values:
as_isprefer_ipv4prefer_ipv6ipv4_onlyipv6_only
If you see logs like lookup <domain>: empty result, set a reachable resolver and an explicit strategy.
pool: one HTTP entry for all nodes.multi-port: one local HTTP port per node.hybrid: pool + multi-port together.
- If
subscriptionsis set:- subscription nodes are fetched and appended
nodes_fileis used as output path for fetched nodesnodes_fileloading is skipped at startup
- Inline
nodesalways participate when present.
Runtime builder supports:
vmessvlesstrojanss/shadowsockshysteria2/hy2socks5/sockshttp/https
Parser may recognize additional URI prefixes in subscription text (for compatibility), but unsupported schemes are skipped during build.
Main endpoints:
POST /api/authGET|PUT /api/settingsGET /api/nodesPOST /api/nodes/{tag}/probePOST /api/nodes/{tag}/releasePOST /api/nodes/probe-all(SSE)GET /api/exportGET|POST /api/subscription/status|refreshGET|POST|PUT|DELETE /api/nodes/config[...]POST /api/reload
When management.password is empty, API/UI auth is bypassed.
- Reload (
/api/reloador subscription refresh) interrupts active connections. - Settings API persists values to
config.yaml; some changes require reload to fully take effect. - Default normalization values (when omitted) are in
internal/config/config.go.
go test ./...