Proxy Pool
Orinuno can route every outbound call that talks to Kodik through a rotating
proxy pool. The pool is stored in the kodik_proxy table and driven by
ProxyProviderService + ProxyWebClientService.
Enabling
Section titled “Enabling”orinuno: proxy: enabled: true rotation-strategy: round-robinProxies must exist as rows in kodik_proxy. A minimal manual seed:
INSERT INTO kodik_proxy (host, port, username, password, proxy_type, status)VALUES ('10.0.0.1', 8080, NULL, NULL, 'HTTP', 'ACTIVE');Rotation and fallback
Section titled “Rotation and fallback”ProxyProviderServicepicks the nextACTIVEproxy in round-robin order.- The proxy is applied to
WebClientvia anHttpClientwith Netty’sHttpClient.create().proxy(...). - On failure,
ProxyWebClientService.executeWithProxyFallback(...)retries the same request without a proxy and incrementsfail_count. - If
fail_countcrosses an internal threshold, the proxy is markedFAILEDand skipped from rotation until an operator flips it back toACTIVE.
What uses the pool
Section titled “What uses the pool”| Caller | Purpose |
|---|---|
KodikVideoDecoderService | Iframe fetch, player JS fetch, video-info POST |
HlsManifestService | m3u8 fetch |
PlaywrightVideoFetcher | Launches Chromium with proxy settings when enabled |
Kodik API (kodik-api.com) calls do not go through the proxy pool —
they use a dedicated WebClient with the user’s token, which Kodik expects
from a stable IP.
Operational notes
Section titled “Operational notes”- The pool is eventually consistent. A
FAILEDproxy stays failed until you manually reset it; a future automated recovery check is tracked in the backlog. - Proxy credentials are stored in plaintext in MySQL. Use network-level protection (private VPC, encrypted at rest) rather than relying on the application layer.