[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"public-branding":3,"content-de-zero-downtime-deployments":8,"public-ads-config":999},{"siteName":4,"primaryColor":5,"accentColor":6,"faviconUrl":7,"logoUrl":7},"KiroCloud","#ffffff","#888888","",{"id":9,"title":10,"author":11,"body":12,"category":11,"description":984,"extension":985,"lastUpdated":11,"meta":986,"navigation":144,"order":987,"path":988,"readTime":11,"seo":989,"stem":997,"__hash__":998},"docs\u002Fdocs\u002Fde\u002Fzero-downtime-deployments.md","[object Object]",null,{"type":13,"value":14,"toc":977},"minimark",[15,20,34,46,49,54,57,78,80,84,95,754,756,760,771,779,784,787,970,973],[16,17,19],"h1",{"id":18},"zero-downtime-bot-deployments-blue-green-sharding-und-graceful-shutdown","Zero-Downtime Bot Deployments: Blue-Green Sharding und Graceful Shutdown",[21,22,23,24,28,29,33],"p",{},"Bei herkömmlichen Bot-Deployments wird der alte Prozess abrupt via ",[25,26,27],"code",{},"SIGKILL"," beendet, bevor die neue Version startet. Die Folge für Nutzer: Laufende Interaktionen brechen mit ",[30,31,32],"em",{},"\"Die Interaktion ist fehlgeschlagen\""," ab, Voice-Sessions werden getrennt und der Bot ist für 10 bis 30 Sekunden offline.",[21,35,36,37,41,42,45],{},"In großen Produktivumgebungen ist diese Downtime inakzeptabel. In diesem Leitfaden erklären wir, wie du ",[38,39,40],"strong",{},"unterbrechungsfreie Deployments (Zero-Downtime)"," mit ",[38,43,44],{},"Graceful Shutdown",", Signal-Trapping und Blue-Green Sharding implementierst.",[47,48],"hr",{},[50,51,53],"h2",{"id":52},"_1-das-problem-mit-abrupten-neustarts","1. Das Problem mit abrupten Neustarts",[21,55,56],{},"Wenn ein Node.js-Prozess unkontrolliert stoppt:",[58,59,60,68,71],"ol",{},[61,62,63,64,67],"li",{},"Werden offene WebSocket-Frames abgeschnitten, ohne dass Discord den ",[25,65,66],{},"Close Frame"," empfängt.",[61,69,70],{},"Schlagen asynchrone Datenbank-Transaktionen fehl, was zu inkonsistenten Daten führt.",[61,72,73,74,77],{},"Müssen nach dem Neustart alle Shards erneut den teuren ",[25,75,76],{},"IDENTIFY","-Handshake durchlaufen (Gefahr von Rate-Limits).",[47,79],{},[50,81,83],{"id":82},"_2-phase-1-graceful-shutdown-mit-sigterm-trapping","2. Phase 1: Graceful Shutdown mit SIGTERM Trapping",[21,85,86,87,90,91,94],{},"Ein robuster Bot fängt Betriebssystem-Signale (",[25,88,89],{},"SIGTERM"," und ",[25,92,93],{},"SIGINT",") ab und leert alle laufenden Aufgaben, bevor er sich beendet:",[96,97,101],"pre",{"className":98,"code":99,"language":100,"meta":7,"style":7},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { Client } from 'discord.js';\n\nlet isShuttingDown = false;\n\nexport function registerGracefulShutdown(client: Client, cleanupDb: () => Promise\u003Cvoid>) {\n  const shutdown = async (signal: string) => {\n    if (isShuttingDown) return;\n    isShuttingDown = true;\n\n    console.log(`[Shutdown] Signal ${signal} empfangen. Starte geordneten Shutdown...`);\n\n    \u002F\u002F 1. Status auf 'Wartung' setzen, damit Nutzer Bescheid wissen\n    try {\n      client.user?.setPresence({\n        status: 'dnd',\n        activities: [{ name: 'Aktualisierung läuft...' }],\n      });\n    } catch {}\n\n    \u002F\u002F 2. Keine neuen Slash Commands annehmen (5 Sekunden Schonfrist für laufende Commands)\n    console.log('[Shutdown] Warte 5 Sekunden auf Beendigung laufender Interaktionen...');\n    await new Promise((resolve) => setTimeout(resolve, 5000));\n\n    \u002F\u002F 3. Datenbank-Pools und Redis-Verbindungen sauber schließen\n    console.log('[Shutdown] Schließe Datenbank-Verbindungen...');\n    await cleanupDb();\n\n    \u002F\u002F 4. WebSocket-Verbindung zu Discord ordnungsgemäß abmelden (Code 1000: Normal Closure)\n    console.log('[Shutdown] Trenne Discord Gateway...');\n    client.destroy();\n\n    console.log('[Shutdown] Geordneter Shutdown erfolgreich abgeschlossen.');\n    process.exit(0);\n  };\n\n  process.on('SIGTERM', () => shutdown('SIGTERM'));\n  process.on('SIGINT', () => shutdown('SIGINT'));\n}\n","typescript",[25,102,103,139,146,165,170,225,258,278,291,296,333,338,345,353,375,393,426,436,448,453,459,481,521,526,532,554,566,571,577,599,614,619,641,661,667,672,711,748],{"__ignoreMap":7},[104,105,108,112,116,120,123,126,129,133,136],"span",{"class":106,"line":107},"line",1,[104,109,111],{"class":110},"s7zQu","import",[104,113,115],{"class":114},"sMK4o"," {",[104,117,119],{"class":118},"sTEyZ"," Client",[104,121,122],{"class":114}," }",[104,124,125],{"class":110}," from",[104,127,128],{"class":114}," '",[104,130,132],{"class":131},"sfazB","discord.js",[104,134,135],{"class":114},"'",[104,137,138],{"class":114},";\n",[104,140,142],{"class":106,"line":141},2,[104,143,145],{"emptyLinePlaceholder":144},true,"\n",[104,147,149,153,156,159,163],{"class":106,"line":148},3,[104,150,152],{"class":151},"spNyl","let",[104,154,155],{"class":118}," isShuttingDown ",[104,157,158],{"class":114},"=",[104,160,162],{"class":161},"sfNiH"," false",[104,164,138],{"class":114},[104,166,168],{"class":106,"line":167},4,[104,169,145],{"emptyLinePlaceholder":144},[104,171,173,176,179,183,186,190,193,196,199,202,204,207,210,213,216,219,222],{"class":106,"line":172},5,[104,174,175],{"class":110},"export",[104,177,178],{"class":151}," function",[104,180,182],{"class":181},"s2Zo4"," registerGracefulShutdown",[104,184,185],{"class":114},"(",[104,187,189],{"class":188},"sHdIc","client",[104,191,192],{"class":114},":",[104,194,119],{"class":195},"sBMFI",[104,197,198],{"class":114},",",[104,200,201],{"class":181}," cleanupDb",[104,203,192],{"class":114},[104,205,206],{"class":114}," ()",[104,208,209],{"class":151}," =>",[104,211,212],{"class":195}," Promise",[104,214,215],{"class":114},"\u003C",[104,217,218],{"class":195},"void",[104,220,221],{"class":114},">)",[104,223,224],{"class":114}," {\n",[104,226,228,231,234,237,240,243,246,248,251,254,256],{"class":106,"line":227},6,[104,229,230],{"class":151},"  const",[104,232,233],{"class":118}," shutdown",[104,235,236],{"class":114}," =",[104,238,239],{"class":151}," async",[104,241,242],{"class":114}," (",[104,244,245],{"class":188},"signal",[104,247,192],{"class":114},[104,249,250],{"class":195}," string",[104,252,253],{"class":114},")",[104,255,209],{"class":151},[104,257,224],{"class":114},[104,259,261,264,267,270,273,276],{"class":106,"line":260},7,[104,262,263],{"class":110},"    if",[104,265,242],{"class":266},"swJcz",[104,268,269],{"class":118},"isShuttingDown",[104,271,272],{"class":266},") ",[104,274,275],{"class":110},"return",[104,277,138],{"class":114},[104,279,281,284,286,289],{"class":106,"line":280},8,[104,282,283],{"class":118},"    isShuttingDown",[104,285,236],{"class":114},[104,287,288],{"class":161}," true",[104,290,138],{"class":114},[104,292,294],{"class":106,"line":293},9,[104,295,145],{"emptyLinePlaceholder":144},[104,297,299,302,305,308,310,313,316,319,321,324,327,329,331],{"class":106,"line":298},10,[104,300,301],{"class":118},"    console",[104,303,304],{"class":114},".",[104,306,307],{"class":181},"log",[104,309,185],{"class":266},[104,311,312],{"class":114},"`",[104,314,315],{"class":131},"[Shutdown] Signal ",[104,317,318],{"class":114},"${",[104,320,245],{"class":118},[104,322,323],{"class":114},"}",[104,325,326],{"class":131}," empfangen. Starte geordneten Shutdown...",[104,328,312],{"class":114},[104,330,253],{"class":266},[104,332,138],{"class":114},[104,334,336],{"class":106,"line":335},11,[104,337,145],{"emptyLinePlaceholder":144},[104,339,341],{"class":106,"line":340},12,[104,342,344],{"class":343},"sHwdD","    \u002F\u002F 1. Status auf 'Wartung' setzen, damit Nutzer Bescheid wissen\n",[104,346,348,351],{"class":106,"line":347},13,[104,349,350],{"class":110},"    try",[104,352,224],{"class":114},[104,354,356,359,361,364,367,370,372],{"class":106,"line":355},14,[104,357,358],{"class":118},"      client",[104,360,304],{"class":114},[104,362,363],{"class":118},"user",[104,365,366],{"class":114},"?.",[104,368,369],{"class":181},"setPresence",[104,371,185],{"class":266},[104,373,374],{"class":114},"{\n",[104,376,378,381,383,385,388,390],{"class":106,"line":377},15,[104,379,380],{"class":266},"        status",[104,382,192],{"class":114},[104,384,128],{"class":114},[104,386,387],{"class":131},"dnd",[104,389,135],{"class":114},[104,391,392],{"class":114},",\n",[104,394,396,399,401,404,407,410,412,414,417,419,421,424],{"class":106,"line":395},16,[104,397,398],{"class":266},"        activities",[104,400,192],{"class":114},[104,402,403],{"class":266}," [",[104,405,406],{"class":114},"{",[104,408,409],{"class":266}," name",[104,411,192],{"class":114},[104,413,128],{"class":114},[104,415,416],{"class":131},"Aktualisierung läuft...",[104,418,135],{"class":114},[104,420,122],{"class":114},[104,422,423],{"class":266},"]",[104,425,392],{"class":114},[104,427,429,432,434],{"class":106,"line":428},17,[104,430,431],{"class":114},"      }",[104,433,253],{"class":266},[104,435,138],{"class":114},[104,437,439,442,445],{"class":106,"line":438},18,[104,440,441],{"class":114},"    }",[104,443,444],{"class":110}," catch",[104,446,447],{"class":114}," {}\n",[104,449,451],{"class":106,"line":450},19,[104,452,145],{"emptyLinePlaceholder":144},[104,454,456],{"class":106,"line":455},20,[104,457,458],{"class":343},"    \u002F\u002F 2. Keine neuen Slash Commands annehmen (5 Sekunden Schonfrist für laufende Commands)\n",[104,460,462,464,466,468,470,472,475,477,479],{"class":106,"line":461},21,[104,463,301],{"class":118},[104,465,304],{"class":114},[104,467,307],{"class":181},[104,469,185],{"class":266},[104,471,135],{"class":114},[104,473,474],{"class":131},"[Shutdown] Warte 5 Sekunden auf Beendigung laufender Interaktionen...",[104,476,135],{"class":114},[104,478,253],{"class":266},[104,480,138],{"class":114},[104,482,484,487,490,492,494,496,499,501,503,506,508,510,512,516,519],{"class":106,"line":483},22,[104,485,486],{"class":110},"    await",[104,488,489],{"class":114}," new",[104,491,212],{"class":195},[104,493,185],{"class":266},[104,495,185],{"class":114},[104,497,498],{"class":188},"resolve",[104,500,253],{"class":114},[104,502,209],{"class":151},[104,504,505],{"class":181}," setTimeout",[104,507,185],{"class":266},[104,509,498],{"class":118},[104,511,198],{"class":114},[104,513,515],{"class":514},"sbssI"," 5000",[104,517,518],{"class":266},"))",[104,520,138],{"class":114},[104,522,524],{"class":106,"line":523},23,[104,525,145],{"emptyLinePlaceholder":144},[104,527,529],{"class":106,"line":528},24,[104,530,531],{"class":343},"    \u002F\u002F 3. Datenbank-Pools und Redis-Verbindungen sauber schließen\n",[104,533,535,537,539,541,543,545,548,550,552],{"class":106,"line":534},25,[104,536,301],{"class":118},[104,538,304],{"class":114},[104,540,307],{"class":181},[104,542,185],{"class":266},[104,544,135],{"class":114},[104,546,547],{"class":131},"[Shutdown] Schließe Datenbank-Verbindungen...",[104,549,135],{"class":114},[104,551,253],{"class":266},[104,553,138],{"class":114},[104,555,557,559,561,564],{"class":106,"line":556},26,[104,558,486],{"class":110},[104,560,201],{"class":181},[104,562,563],{"class":266},"()",[104,565,138],{"class":114},[104,567,569],{"class":106,"line":568},27,[104,570,145],{"emptyLinePlaceholder":144},[104,572,574],{"class":106,"line":573},28,[104,575,576],{"class":343},"    \u002F\u002F 4. WebSocket-Verbindung zu Discord ordnungsgemäß abmelden (Code 1000: Normal Closure)\n",[104,578,580,582,584,586,588,590,593,595,597],{"class":106,"line":579},29,[104,581,301],{"class":118},[104,583,304],{"class":114},[104,585,307],{"class":181},[104,587,185],{"class":266},[104,589,135],{"class":114},[104,591,592],{"class":131},"[Shutdown] Trenne Discord Gateway...",[104,594,135],{"class":114},[104,596,253],{"class":266},[104,598,138],{"class":114},[104,600,602,605,607,610,612],{"class":106,"line":601},30,[104,603,604],{"class":118},"    client",[104,606,304],{"class":114},[104,608,609],{"class":181},"destroy",[104,611,563],{"class":266},[104,613,138],{"class":114},[104,615,617],{"class":106,"line":616},31,[104,618,145],{"emptyLinePlaceholder":144},[104,620,622,624,626,628,630,632,635,637,639],{"class":106,"line":621},32,[104,623,301],{"class":118},[104,625,304],{"class":114},[104,627,307],{"class":181},[104,629,185],{"class":266},[104,631,135],{"class":114},[104,633,634],{"class":131},"[Shutdown] Geordneter Shutdown erfolgreich abgeschlossen.",[104,636,135],{"class":114},[104,638,253],{"class":266},[104,640,138],{"class":114},[104,642,644,647,649,652,654,657,659],{"class":106,"line":643},33,[104,645,646],{"class":118},"    process",[104,648,304],{"class":114},[104,650,651],{"class":181},"exit",[104,653,185],{"class":266},[104,655,656],{"class":514},"0",[104,658,253],{"class":266},[104,660,138],{"class":114},[104,662,664],{"class":106,"line":663},34,[104,665,666],{"class":114},"  };\n",[104,668,670],{"class":106,"line":669},35,[104,671,145],{"emptyLinePlaceholder":144},[104,673,675,678,680,683,685,687,689,691,693,695,697,699,701,703,705,707,709],{"class":106,"line":674},36,[104,676,677],{"class":118},"  process",[104,679,304],{"class":114},[104,681,682],{"class":181},"on",[104,684,185],{"class":266},[104,686,135],{"class":114},[104,688,89],{"class":131},[104,690,135],{"class":114},[104,692,198],{"class":114},[104,694,206],{"class":114},[104,696,209],{"class":151},[104,698,233],{"class":181},[104,700,185],{"class":266},[104,702,135],{"class":114},[104,704,89],{"class":131},[104,706,135],{"class":114},[104,708,518],{"class":266},[104,710,138],{"class":114},[104,712,714,716,718,720,722,724,726,728,730,732,734,736,738,740,742,744,746],{"class":106,"line":713},37,[104,715,677],{"class":118},[104,717,304],{"class":114},[104,719,682],{"class":181},[104,721,185],{"class":266},[104,723,135],{"class":114},[104,725,93],{"class":131},[104,727,135],{"class":114},[104,729,198],{"class":114},[104,731,206],{"class":114},[104,733,209],{"class":151},[104,735,233],{"class":181},[104,737,185],{"class":266},[104,739,135],{"class":114},[104,741,93],{"class":131},[104,743,135],{"class":114},[104,745,518],{"class":266},[104,747,138],{"class":114},[104,749,751],{"class":106,"line":750},38,[104,752,753],{"class":114},"}\n",[47,755],{},[50,757,759],{"id":758},"_3-phase-2-blue-green-shard-handoff","3. Phase 2: Blue-Green Shard Handoff",[21,761,762,763,766,767,770],{},"Um 0 Sekunden Ausfallzeit zu erreichen, starten wir die neue Version (",[38,764,765],{},"Green",") parallel zur alten Version (",[38,768,769],{},"Blue","):",[96,772,777],{"className":773,"code":775,"language":776},[774],"language-text","1. Normalbetrieb:\n   Discord Gateway ──► [Cluster Blue v1.0] (Aktiv)\n\n2. Deployment gestartet:\n   [Cluster Green v1.1] startet im Hintergrund, verbindet Shards & lädt Caches.\n\n3. Session-Übergabe:\n   Green signalisiert Betriebsbereitschaft.\n   Blue erhält SIGTERM, vollendet offene Befehle und beendet sich nach 10 Sekunden.\n\n4. Neuer Normalbetrieb:\n   Discord Gateway ──► [Cluster Green v1.1] (Aktiv)\n","text",[25,778,775],{"__ignoreMap":7},[780,781,783],"h3",{"id":782},"koordination-über-redis-locks","Koordination über Redis Locks:",[21,785,786],{},"Damit nicht zwei Bot-Instanzen gleichzeitig auf denselben Slash Command antworten (Doppel-Ausführung), nutzen wir atomare Redis-Locks:",[96,788,790],{"className":98,"code":789,"language":100,"meta":7,"style":7},"import Redis from 'ioredis';\n\nconst redis = new Redis();\n\nexport async function shouldHandleInteraction(interactionId: string): Promise\u003Cboolean> {\n  \u002F\u002F Setze Lock für 10 Sekunden. Nur die erste Instanz erhält 'OK'!\n  const lock = await redis.set(`interaction:${interactionId}`, 'locked', 'EX', 10, 'NX');\n  return lock === 'OK';\n}\n",[25,791,792,811,815,834,838,872,877,947,966],{"__ignoreMap":7},[104,793,794,796,799,802,804,807,809],{"class":106,"line":107},[104,795,111],{"class":110},[104,797,798],{"class":118}," Redis ",[104,800,801],{"class":110},"from",[104,803,128],{"class":114},[104,805,806],{"class":131},"ioredis",[104,808,135],{"class":114},[104,810,138],{"class":114},[104,812,813],{"class":106,"line":141},[104,814,145],{"emptyLinePlaceholder":144},[104,816,817,820,823,825,827,830,832],{"class":106,"line":148},[104,818,819],{"class":151},"const",[104,821,822],{"class":118}," redis ",[104,824,158],{"class":114},[104,826,489],{"class":114},[104,828,829],{"class":181}," Redis",[104,831,563],{"class":118},[104,833,138],{"class":114},[104,835,836],{"class":106,"line":167},[104,837,145],{"emptyLinePlaceholder":144},[104,839,840,842,844,846,849,851,854,856,858,860,862,864,867,870],{"class":106,"line":172},[104,841,175],{"class":110},[104,843,239],{"class":151},[104,845,178],{"class":151},[104,847,848],{"class":181}," shouldHandleInteraction",[104,850,185],{"class":114},[104,852,853],{"class":188},"interactionId",[104,855,192],{"class":114},[104,857,250],{"class":195},[104,859,770],{"class":114},[104,861,212],{"class":195},[104,863,215],{"class":114},[104,865,866],{"class":195},"boolean",[104,868,869],{"class":114},">",[104,871,224],{"class":114},[104,873,874],{"class":106,"line":227},[104,875,876],{"class":343},"  \u002F\u002F Setze Lock für 10 Sekunden. Nur die erste Instanz erhält 'OK'!\n",[104,878,879,881,884,886,889,892,894,897,899,901,904,906,908,911,913,915,918,920,922,924,927,929,931,934,936,938,941,943,945],{"class":106,"line":260},[104,880,230],{"class":151},[104,882,883],{"class":118}," lock",[104,885,236],{"class":114},[104,887,888],{"class":110}," await",[104,890,891],{"class":118}," redis",[104,893,304],{"class":114},[104,895,896],{"class":181},"set",[104,898,185],{"class":266},[104,900,312],{"class":114},[104,902,903],{"class":131},"interaction:",[104,905,318],{"class":114},[104,907,853],{"class":118},[104,909,910],{"class":114},"}`",[104,912,198],{"class":114},[104,914,128],{"class":114},[104,916,917],{"class":131},"locked",[104,919,135],{"class":114},[104,921,198],{"class":114},[104,923,128],{"class":114},[104,925,926],{"class":131},"EX",[104,928,135],{"class":114},[104,930,198],{"class":114},[104,932,933],{"class":514}," 10",[104,935,198],{"class":114},[104,937,128],{"class":114},[104,939,940],{"class":131},"NX",[104,942,135],{"class":114},[104,944,253],{"class":266},[104,946,138],{"class":114},[104,948,949,952,954,957,959,962,964],{"class":106,"line":280},[104,950,951],{"class":110},"  return",[104,953,883],{"class":118},[104,955,956],{"class":114}," ===",[104,958,128],{"class":114},[104,960,961],{"class":131},"OK",[104,963,135],{"class":114},[104,965,138],{"class":114},[104,967,968],{"class":106,"line":293},[104,969,753],{"class":114},[21,971,972],{},"Wenn sowohl Blue als auch Green das Event empfangen, antwortet nur die Version, die den Lock erhalten hat – Aktualisierungen erfolgen ohne Verbindungsunterbrechung oder Event-Verlust.",[974,975,976],"style",{},"html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":7,"searchDepth":141,"depth":141,"links":978},[979,980,981],{"id":52,"depth":141,"text":53},{"id":82,"depth":141,"text":83},{"id":758,"depth":141,"text":759,"children":982},[983],{"id":782,"depth":148,"text":783},"Bei herkömmlichen Bot-Deployments wird der alte Prozess abrupt via SIGKILL beendet, bevor die neue Version startet. Die Folge für Nutzer: Laufende Interaktionen brechen mit \"Die Interaktion ist fehlgeschlagen\" ab, Voice-Sessions werden getrennt und der Bot ist für 10 bis 30 Sekunden offline.","md",{},0,"\u002Fdocs\u002Fde\u002Fzero-downtime-deployments",{"title":990,"description":984},{"Zero-Downtime Bot Deployments":991,"description":992,"category":993,"order":141,"author":994,"readTime":995,"lastUpdated":996},"Blue-Green Sharding und Graceful Shutdown","Architekturleitfaden für unterbrechungsfreie Discord-Bot-Deployments. Session Handoff, SIGTERM Trapping und Blue-Green Sharding-Strategien.","architecture","Luca Lichtenwald","13 min","2026-10-09","docs\u002Fde\u002Fzero-downtime-deployments","NHQbxw6GrSJ99kOb3a6k7QV7Amp9Nl_NBDLYgPkKGws",{"enabled":144,"clientPubId":1000,"docsSlotId":7,"newsSlotId":7,"guidesSlotId":7,"dashboardSlotId":7,"docsEnabled":144,"newsEnabled":144,"guidesEnabled":144,"dashboardEnabled":144},"ca-pub-9454065621077312"]