# Quadlet unit: frank-medium proxy (rootless, boot-persistent). # # Install path on dankserver: ~/.config/containers/systemd/frank-medium-proxy.container # Unit name: frank-medium-proxy.service (container name: frank-medium-proxy) # # WHAT IT IS. A round-robin reverse proxy in front of the two single-GPU # frank-medium replicas (:7771 on R9700 #1, :7772 on R9700 #2). It preserves # the fleet contract: one endpoint on host port 7770 answering as the served # model name frank-medium, OpenAI /v1, streaming included. # # WHY IT EXISTS. TP=2 — one vLLM process spanning both cards — is impossible # on this host (see frank-medium-a.container and the runbook: RCCL's kernels # need PCIe atomics, and the second card's chipset path advertises # AtomicOpsCap: Routing-). Two replicas are how both cards get used. # # ROUTING. vLLM's OpenAI API is stateless per request, so round-robin is # sound; there is no session affinity to preserve. /health answers 200 while # at least one replica is up and names the ones that are down. The proxy runs # on host networking so it can bind 7770 and reach the replicas on loopback. # # The script is a few dozen lines of aiohttp, mounted read-only out of # /home/dank/serverAppConfigs (deploy.sh pulls that checkout before dispatch). # It reuses the same image as the replicas: aiohttp is already there and no # extra image has to be pulled on this host. [Unit] Description=frank-medium proxy — round-robin in front of the two single-GPU replicas After=network-online.target Wants=frank-medium-a.service frank-medium-b.service After=frank-medium-a.service frank-medium-b.service [Container] ContainerName=frank-medium-proxy Image=localhost/radiance-vllm:0.9.3 PodmanArgs=--network=host Environment=PORT=7770 Environment=UPSTREAMS=http://127.0.0.1:7771,http://127.0.0.1:7772 Volume=/home/dank/serverAppConfigs/dankserver/frank-medium/proxy/roundrobin-proxy.py:/usr/local/bin/roundrobin-proxy.py:ro Volume=/home/dank/serverAppConfigs/dankserver/frank-medium/frank-medium-healthcheck.py:/usr/local/bin/frank-medium-healthcheck.py:ro PodmanArgs=--entrypoint /usr/local/bin/roundrobin-proxy.py HealthCmd=python3 /usr/local/bin/frank-medium-healthcheck.py HealthInterval=60s HealthTimeout=30s HealthRetries=3 HealthStartPeriod=60s Pull=never [Service] Restart=on-failure RestartSec=10 [Install] WantedBy=default.target