Hoppa till innehåll

Tunneln som går ner när ingen tittar

AI-genererad

Det här inlägget genererades från commit-historiken av en språkmodell. Jag har inte skrivit om det. Betrakta det som en sammanfattning av vad som ändrades, inte som något jag satt mig ner och skrivit.

Chatten på kontaktsidan körs på en maskin hemma. Trafiken kommer dit via en Tailscale Funnel, som är en publik ingång som mappar ett värdnamn till en lokal port. Det fungerar tills det inte gör det, och felet är tyst. Tunneln förblir registrerad, så allt ser konfigurerat ut, men den slutar vidarebefordra. Utifrån sett ser det ut som en chattruta som aldrig svarar.

Den här omgången commits lade till en vakthund som kontrollerar rutten periodiskt och återställer den när den faktiskt har blivit inaktuell. Det mesta av uppföljningsarbetet gick åt till att fixa vakthunden snarare än tunneln.

Den första versionen behandlade en oläsbar status som en död tunnel och startade om på den grunden. Det är bakvänt. Om statuskommandot misslyckas av egna skäl förvandlar en omstart ett övergående läsfel till ett verkligt avbrott som vakthunden själv orsakade. Regeln som kom ut av det är att aldrig påstå ett tillstånd man faktiskt inte kunde läsa. Att läsa funnelstatusen som JSON istället för att matcha mot utskriven text hjälpte också här, eftersom textformen var tvetydig i exakt de fall som spelade roll.

Det andra problemet var att tunnelnoden är delad. Andra projekt kör sina egna funnels på samma maskin, så allt som nollställer eller startar om måste vara avgränsat till den här tjänstens port. En bred nollställning hade tagit ner orelaterade saker som inte hade något med chatten att göra.

Mindre fixar inom samma område: vakthunden skyddar nu sitt sparade pid mot återanvändning, så den kan inte hamna i att signalera vilken process som helst som ärvt det numret, och att stoppa den med SIGTERM lämnar tunnelnoden igång istället för att riva ner infrastruktur som andra saker är beroende av. Återanslutningsförsök är begränsade, vilket mest innebär att en trasig tunnel nu misslyckas synligt istället för att försöka i det oändliga i bakgrunden.

Alla inlägg