Projekt3 min läsning

Vår egen Discord-bot: från långsam polling till husets assistent

Det började med en bot som skulle svara snabbare än n8n:s minutkoll. I dag loggar den arbetstid, svarar på kommandon, påminner med knappar och larmar när något i hemlabbet krånglar – allt från ett och samma ställe.

Bakgrunden
I vårt homelab kör vi automationer i n8n som pratar med vår Discord-server, bland annat en som loggar Sofias arbetstid när hon skriver in den i en kanal. Problemet var att n8n bara kollade Discord var 60:e sekund. Skrev Sofia "08.00–16.00" kunde det ta nästan en minut innan hon fick veta att tiden var sparad. Dessutom pratade systemet med Discord på tre olika sätt: en schemalagd koll, en inbyggd Discord-nod i n8n och några råa webhook-länkar.

Lösningen
Vi byggde en egen Discord-bot från grunden, ett Node.js-program som körs som en container på vår Unraid-server. I stället för att fråga Discord med jämna mellanrum håller boten en ständigt öppen anslutning, samma teknik som "riktiga" Discord-bottar använder, och reagerar direkt när något skrivs. Den blev också den enda vägen ut till Discord: allt som n8n vill säga går via boten.

Vad boten gör i dag
Den har vuxit en hel del sedan starten:

  • Arbetstid: Sofia kan skriva sin tid i kanalen eller i ett privat meddelande till boten och får bekräftelse direkt. En felskriven tid rättas genom att redigera meddelandet.

  • Påminnelser med knappar: saknas dagens tid klockan 21 kommer ett privat meddelande med knapparna "Samma som igår", "Annan tid" och "Ledig idag". Ett klick räcker. Saknas den fortfarande klockan 22 kommer en påminnelse till.

  • Kommandon: /vecka och /månad visar arbetstiderna, /kalender visar familjens kalender, /mat dagens lunchmeny och /status hur hemlabbet mår. /hjälp fungerar även när allt annat ligger nere.

  • Rapporter: en AI-skriven morgonrapport varje dag, en veckosammanfattning på måndagar och en månadssammanfattning den första varje månad.

  • Larm: när en server eller tjänst krånglar kommer en färgad ruta i vår serverkanal. Rutan ändras när läget ändras och blir grön när det är löst, i stället för att kanalen fylls av nya meddelanden. Knapparna "Jag tittar på det" och "Tysta påminnelser i 24 timmar" gör att man kan svara på larmet direkt.

Tål att saker går ner
Ett hemlabb startas om ibland, så boten är byggd för det. Ett litet 📨 på ett meddelande betyder att det har kommit fram, och ett ⚠️ att det inte gjort det ännu. Skrivs något medan boten eller n8n är nere läser boten ikapp när allt är uppe igen och skickar det som missats, i rätt ordning. Den klarar sig utan databas: reaktionerna på meddelandena är dess enda minne.

Lärdomar på vägen
Det blev några praktiska lärdomar: att hitta en ledig port, att flytta containern från kommandoraden till en riktig mall i Unraids gränssnitt så att inställningar går att ändra utan terminal, och ett missöde där vi råkade radera bildfilen tillsammans med den gamla containern och fick bygga om den. I dag byggs boten automatiskt när koden ändras, och nya kommandon kräver oftast bara en rad i inställningarna och ett flöde i n8n, ingen ny kod. Den har fått ett eget namn och kör med nilssons.nu:s ikon i Docker-listan – en liten detalj, men den känns som vår.

Byggdagbok

Steg 1 · 11 september 2026

Boten tas i drift

Första versionen i drift som en container på Unraid. Boten lyssnar på #sofia-jobb med en ständigt öppen anslutning och skickar meddelandena vidare till n8n direkt, i stället för att n8n frågar Discord en gång i minuten. Samtidigt blev den enda vägen ut för morgonrapporten, veckosammanfattningen och bekräftelserna av arbetstid.

Steg 2 · 11 september 2026

Lade till en säkerhetsventil kl 21:00

Varje kväll kl 21:00 kollar n8n om dagens arbetstid är registrerad. Saknas den skickar boten ett privat meddelande till Sofia som påminner om att fylla i den. Boten fick för det kunna skicka direktmeddelanden, inte bara skriva i kanaler.

Steg 3 · 11 september 2026

Bytte containern till en GUI-hanterad Unraid-mall

Containern skapades först från kommandoraden, men flyttades samma dag till en riktig mall i Unraids gränssnitt, så att inställningarna går att ändra utan terminal. Den fick också ett nytt namn och nilssons.nu:s ikon. Under bytet råkade bildfilen raderas tillsammans med den gamla containern, och den fick byggas om innan den nya kunde startas.

Steg 4 · 1 oktober 2026

Koden till GitHub och automatiskt bygge

Källkoden flyttade till ett eget repo på GitHub, där boten numera byggs automatiskt vid varje ändring och hämtas av Unraids automatiska uppdateringar – inget byggs längre för hand på servern. Samtidigt uppgraderades den till Node 24, kör som vanlig användare i stället för administratör och har en inbyggd hälsokontroll som syns direkt i Unraid.

Steg 5 · 1 oktober 2026

Säkrare och mer robust

En genomgång av koden: boten och n8n kräver nu en delad nyckel åt båda hållen, så att ingen annan kan skicka meddelanden i botens namn eller lägga in falska arbetstider. Svarar inte n8n försöker boten igen, långa meddelanden delas upp automatiskt, @everyone och rollpingar blockeras alltid, och hälsokontrollen visar om boten faktiskt är ansluten till Discord. Automatiska tester körs vid varje bygge.

Steg 6 · 2 oktober 2026

All Discord-trafik och alla serverlarm via boten

De sista flödena som postade i Discord på egen hand – kalenderlarmet och DNS-bevakningen – går nu via boten. Vid flytten visade det sig att deras gamla Discord-länkar redan hade slutat fungera utan att någon märkt det. Samtidigt började boten skicka serverlarm: när övervakningen av hemlabbet inte svarar, när ett n8n-flöde misslyckas och aviseringar från Proxmox. Två larmvägar har medvetet egna länkar, så att de fungerar även om servern som kör boten ligger nere.

Steg 7 · 24 oktober 2026 Nytt

Privata meddelanden, kvitton och efterkörning

Sofia kan nu skicka sin arbetstid i ett privat meddelande till boten, och bekräftelsen kommer där hon skrev. Ett 📨 på meddelandet visar att det har kommit fram och ett ⚠️ att det inte gjort det, med larm i serverkanalen. Skrivs något medan boten eller n8n är nere läser boten ikapp efteråt och skickar det som missats. Samma dag kom säkerhetsuppdateringar av bibliotek boten bygger på och en uppgradering till Express 5.

Steg 8 · 24 oktober 2026 Nytt

Rättade tider och larm som uppdateras

Redigeras ett meddelande med en arbetstid skickas den nya tiden vidare och ersätter den gamla. Larmen blev färgade rutor som ändras när läget ändras och blir gröna när problemet är löst, i stället för att kanalen fylls av nya meddelanden.

Steg 9 · 24 oktober 2026 Nytt

Kommandon i Discord

Boten fick kommandon: /vecka och /månad visar arbetstiderna, /tid registrerar en tid för en dag som glömts, /kalender visar familjens kalender, /mat dagens lunchmeny och /status hur hemlabbet mår. /hjälp svarar direkt från boten och fungerar även när n8n ligger nere. Nya kommandon kräver oftast ingen ny kod, bara en rad i inställningarna och ett flöde i n8n.

Steg 10 · 24 oktober 2026 Nytt

Knappar i påminnelser och larm

Påminnelsen om arbetstid fick knapparna "Samma som igår", "Annan tid" och "Ledig idag", och saknas tiden fortfarande kl 22 kommer en påminnelse till. Larmen fick knapparna "Jag tittar på det" och "Tysta påminnelser i 24 timmar". Dessutom postas en sammanfattning av förra månadens arbetstider den första varje månad.

0 kommentarer

Inga kommentarer ännu – bli först att skriva något!

Skriv en kommentar

Visas inte. Du får ett mejl när kommentaren publiceras.