{"id":12,"date":"2026-01-12T19:00:00","date_gmt":"2026-01-12T18:00:00","guid":{"rendered":"https:\/\/airex.se\/blogg\/kallstart-efter-stromavbrott\/"},"modified":"2026-08-02T15:44:16","modified_gmt":"2026-08-02T13:44:16","slug":"kallstart-efter-stromavbrott","status":"publish","type":"post","link":"https:\/\/airex.se\/blogg\/kallstart-efter-stromavbrott\/","title":{"rendered":"Kallstarten som avsl\u00f6jade vad som bara fanns i minnet"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Str\u00f6mmen l\u00e5g nere i sjutton timmar. N\u00e4r den kom tillbaka startade servrarna som de skulle, hypervisorerna hittade sin lagring, och de flesta tj\u00e4nster kom upp av sig sj\u00e4lva.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Tv\u00e5 gjorde det inte. Och det de hade gemensamt var att de hade fungerat perfekt \u00e4nda till sekunden innan \u2014 av fel anledning.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Fel ett: modulen som aldrig fanns p\u00e5 disk<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Inventariesystemet v\u00e4grade starta:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Unable to import plugin &lt;namn&gt;: Module not found<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Pluginet det g\u00e4llde var samma synk mot \u00f6vervakningen som jag skrev om <a href=\"https:\/\/airex.se\/blogg\/netbox-zabbix-ordning-och-reda\/\">i december<\/a>. Det stod i konfigurationen. Det hade fungerat i veckor. Men det var installerat <em>in i en k\u00f6rande container<\/em>, inte in i den avbild containern skapas ur.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">S\u00e5 l\u00e4nge containern levde fanns modulen. I samma \u00f6gonblick den \u00e5terskapades var den borta, och kvar fanns bara konfigurationsraden som pekade p\u00e5 n\u00e5got som inte l\u00e4ngre existerade. Tj\u00e4nsten startade inte alls, vilket i sammanhanget \u00e4r r\u00e4tt beteende: en halvkonfigurerad inventariedatabas \u00e4r v\u00e4rre \u00e4n ingen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Fel tv\u00e5: beroendet som ingen skrivit ner<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Chattservern startade om i en loop:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Failed to ping DB\u2026 lookup postgres: server misbehaving<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Databasen den beh\u00f6vde hade inte startat. Inte krashat \u2014 bara inte startat, eftersom ingenting sa \u00e5t den att g\u00f6ra det vid uppstart. I dagligt bruk m\u00e4rktes det aldrig: databasen hade rullat i m\u00e5nader, och applikationen hittade den alltid.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ett beroende som aldrig testas \u00e4r ett beroende man inte vet att man har.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Den frestande fixen, och den r\u00e4tta<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Den snabba v\u00e4gen var uppenbar: installera modulen i containern igen, starta databasen f\u00f6r hand, och g\u00e5 och l\u00e4gga sig. Tjugo minuter, allt gr\u00f6nt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Det hade ocks\u00e5 garanterat att samma kv\u00e4ll upprepas vid n\u00e4sta str\u00f6mavbrott \u2014 och den h\u00e4r g\u00e5ngen med mig \u00e4nnu s\u00e4krare p\u00e5 att det &#8221;brukar fungera&#8221;.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">S\u00e5 i st\u00e4llet bakades pluginet in i en egen avbild byggd ovanp\u00e5 den officiella, och byggsteget lades i versionshanteringen tillsammans med resten. Nu kan containern kastas och \u00e5terskapas hur m\u00e5nga g\u00e5nger som helst utan att n\u00e5got g\u00e5r f\u00f6rlorat.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En liten sak v\u00e4rd att n\u00e4mna f\u00f6r den som g\u00f6r detsamma: basavbilden hade f\u00e5tt <code>pip<\/code> borttaget f\u00f6r att spara utrymme, s\u00e5 bygget m\u00e5ste f\u00f6rst l\u00e4gga tillbaka pakethanteraren innan pluginet kunde installeras. Det \u00e4r ett tecken i tiden \u2014 avbilder blir avsiktligt avskalade, och d\u00e5 flyttas jobbet till den som bygger ovanp\u00e5.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Vad ett str\u00f6mavbrott egentligen \u00e4r<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Det \u00e4r ett oplanerat test av n\u00e5got man annars aldrig testar: att milj\u00f6n g\u00e5r att \u00e5terskapa fr\u00e5n det som faktiskt \u00e4r nedskrivet.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">L\u00e5ng drifttid k\u00e4nns som ett kvalitetsm\u00e5tt. Det \u00e4r det inte. L\u00e5ng drifttid betyder bara att ingen har kontrollerat p\u00e5 l\u00e4nge. Varje manuell \u00e5tg\u00e4rd som gjorts i en k\u00f6rande process \u2014 ett installerat paket, en \u00e4ndrad fil, en tj\u00e4nst som startats f\u00f6r hand \u2014 lever kvar i minnet och ser ut som konfiguration, \u00e4nda tills str\u00f6mmen g\u00e5r.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Det g\u00e4ller i h\u00f6gsta grad n\u00e4r arbetet utf\u00f6rs av agenter. Jag l\u00e4t en agent g\u00e5 igenom \u00e5terst\u00e4llningen, och den var snabb och metodisk. Men en agent som f\u00e5r uppgiften &#8221;f\u00e5 ig\u00e5ng tj\u00e4nsten&#8221; kommer att f\u00e5 ig\u00e5ng tj\u00e4nsten \u2014 p\u00e5 det snabbaste s\u00e4ttet, i den k\u00f6rande containern, precis som en tr\u00f6tt m\u00e4nniska klockan halv tolv. Skillnaden mellan en \u00e5tg\u00e4rd och en l\u00f6sning \u00e4r inget den kan avg\u00f6ra \u00e5t mig. Det \u00e4r hela mitt jobb i den relationen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">S\u00e5 vet du att det funkar<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Starta om saker med flit, medan du \u00e4r utvilad och har tid.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Kasta containern, \u00e5terskapa den.<\/strong> Inte &#8221;starta om&#8221; \u2014 ta bort och bygg upp igen. Kommer tj\u00e4nsten tillbaka med all funktionalitet intakt, d\u00e5 finns den p\u00e5 riktigt.<\/li>\n<li><strong>Starta om hela v\u00e4rden<\/strong> och kontrollera vad som <em>inte<\/em> kom upp av sig sj\u00e4lvt. Den listan \u00e4r din verkliga dokumentation \u00f6ver odeklarerade beroenden.<\/li>\n<li><strong>L\u00e4s loggarna efter\u00e5t<\/strong>, inte bara statusikonerna. N\u00e5got kan ha startat i tredje f\u00f6rs\u00f6ket och se friskt ut nu.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Vad jag tar med mig<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Det som bara finns i en k\u00f6rande process \u00e4r inte konfiguration. Det \u00e4r tur.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Och den obekv\u00e4ma insikten: str\u00f6mavbrottet gjorde mig en tj\u00e4nst. Tv\u00e5 fel som legat och v\u00e4ntat i veckor visade sig samtidigt, p\u00e5 en s\u00f6ndag, i st\u00e4llet f\u00f6r var f\u00f6r sig vid ett s\u00e4mre tillf\u00e4lle. Ett system som aldrig startas om samlar p\u00e5 sig s\u00e5dana h\u00e4r skulder tyst, och r\u00e4ntan tas ut vid det tillf\u00e4lle du minst av allt hade valt sj\u00e4lv.<\/p>\n\n","protected":false},"excerpt":{"rendered":"<p>Sjutton timmar utan str\u00f6m blev ett oplanerat test av n\u00e5got jag annars aldrig testar: att milj\u00f6n g\u00e5r att \u00e5terskapa ur det som faktiskt \u00e4r nedskrivet. Tv\u00e5 tj\u00e4nster klarade inte provet.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2],"tags":[],"class_list":["post-12","post","type-post","status-publish","format-standard","hentry","category-drift"],"_links":{"self":[{"href":"https:\/\/airex.se\/blogg\/wp-json\/wp\/v2\/posts\/12","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/airex.se\/blogg\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/airex.se\/blogg\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/airex.se\/blogg\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/airex.se\/blogg\/wp-json\/wp\/v2\/comments?post=12"}],"version-history":[{"count":1,"href":"https:\/\/airex.se\/blogg\/wp-json\/wp\/v2\/posts\/12\/revisions"}],"predecessor-version":[{"id":16,"href":"https:\/\/airex.se\/blogg\/wp-json\/wp\/v2\/posts\/12\/revisions\/16"}],"wp:attachment":[{"href":"https:\/\/airex.se\/blogg\/wp-json\/wp\/v2\/media?parent=12"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/airex.se\/blogg\/wp-json\/wp\/v2\/categories?post=12"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/airex.se\/blogg\/wp-json\/wp\/v2\/tags?post=12"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}