Jeg satt nylig opp Caddy som reverse proxy på OPNsense for etpar domener. Det var flere grunner til dette, men hovedsaklig ville jeg bort fra to servere for å betjene port-forwarding og TLS-sertifikater, samt at serveren jeg hadde kjørende for dette kjørte en gammel versjon av FreeBSD.
Nå er jeg veldig glad i FreeBSD for servertjenester. Jeg har nesten utelukkende brukt FreeBSD de siste 20+ årene og har egentlig aldri hatt problemer med det som jeg ikke har vært årsaken til selv. Problemet mitt med FreeBSD nå er at mange av bibliotekene som kreves av ting jeg kjører, blir skrevet om til Rust. Siden jeg ikke er programmerer vet jeg ikke om dette er en bra eller dårlig ting, men jeg har hørt mye bra om Rust uten å forstå hvorfor det er bra. Uansett, Rust er en svær mastodont og krever etter hva jeg har obserert, over 36GB diskplass for å kompileres. "Hvordan kom du frem til 36GB?" Det var det jeg hadde ledig på en server, og den gikk tom for plass mens Rust ble kompilert. Derfor "over 36GB". Jeg har ingen interesse av å specce en server med 100+GB diskplass bare for å kompilere Rust som build-dep for ting.
Det skal sies at jeg var litt lei av manuelt mikkmakk med NGINX-configfiler og TLS-sertifikater.
Siden jeg har brukt OPNsense for business and pleasure siden 2016 og det har dukket opp en Caddy-plugin i nyere tid, OG Caddy blir drevet av svart magi og sånt, så fant jeg ut at jeg kunne teste dette og se hvordan det gikk.
Jeg fulgte instruksjonene på https://docs.opnsense.org/manual/how-tos/caddy.html#how-to-install og hadde ingen problemer. Forskjellen på Caddy og NGINX er at man må definere en "handler" for hvert domene man skal proxye. Det er mulig jeg tar feil og at man kan definere én handler for en haug domener, men siden jeg hadde tatt ned masse domener som var i prod for å få dette til å funke, hadde jeg litt tidspress på å få det til å funke.
Og det gikk kjempefint, bortsett fra at Yacht, Docker-manageren jeg har på en server, ikke lenger fungerte som den hadde etter å ha blitt plassert bak Caddy.
Grunnen til dette er at Yacht bruker websockets og krever at proxy-headerne Connection og Upgrade blir satt. Caddy håndterer som regel dette helt nydelig på egenhånd - jeg har en Uptime Kuma-container kjørende på samme server som Yacht, og UK hadde ingen problemer med funksjonalitet etter å ha blitt slengt bak Caddy.
Uansett, løsningen var så enkel som å definere to headers i Caddy-oppsettet i OPNsense. Først "Connection" med verdi "Upgrade":
Og deretter "Upgrade" med verdi "websocket":
Disse ble så assignet til handleren for domenet Yacht bor på (blurret for sikkerhet og sånne ting):
Klikk "Save" og BOOM - funket med en gang. Trengte ikke starte Caddy på nytt engang. I like it.
Ytelsesmessig merker jeg ikke noen egentlig forskjell. OPNsense/Caddy kjører på samme virtuelle hardware som FreeBSD/PF/NGINX gjorde. OPNsense er basert på FreeBSD/PF, så i praksis har jeg bare byttet ut NGINX med Caddy og CLI-administrasjon med GUI-administrasjon. Jeg har dog blitt kvitt ukentlig kompilering av pakker som må oppgraderes, problematikk rundt Rust, diskplass og annet jall. Når det kommer oppdatering til OPNsense oppgraderer jeg med binary packages, og det tar 5 minutter.
Good times.