Add restart confirmation from watchdog alerts

This commit is contained in:
2026-02-07 22:45:10 +03:00
parent 23fa70f15c
commit e3a1321d3f
2 changed files with 71 additions and 1 deletions

View File

@@ -150,3 +150,57 @@ async def logs_options(cb: CallbackQuery):
return return
await cb.answer("Bad request") await cb.answer("Bad request")
@dp.callback_query(F.data.startswith("wdrestart:"))
async def watchdog_restart_request(cb: CallbackQuery):
if cb.from_user.id != ADMIN_ID:
return
_, alias = cb.data.split(":", 1)
if alias not in DOCKER_MAP:
await cb.answer("Container not found")
return
kb = InlineKeyboardMarkup(
inline_keyboard=[[
InlineKeyboardButton(
text="✅ Confirm restart",
callback_data=f"wdconfirm:{alias}"
),
InlineKeyboardButton(
text="✖ Cancel",
callback_data="wdcancel"
),
]]
)
await cb.message.answer(
f"⚠️ Confirm restart `{alias}`?",
reply_markup=kb,
parse_mode="Markdown",
)
await cb.answer()
@dp.callback_query(F.data == "wdcancel")
async def watchdog_restart_cancel(cb: CallbackQuery):
await cb.answer("Cancelled")
@dp.callback_query(F.data.startswith("wdconfirm:"))
async def watchdog_restart_confirm(cb: CallbackQuery):
if cb.from_user.id != ADMIN_ID:
return
_, alias = cb.data.split(":", 1)
real = DOCKER_MAP.get(alias)
if not real:
await cb.answer("Container not found")
return
await cb.answer("Restarting…")
rc, out = await docker_cmd(["restart", real])
await cb.message.answer(
f"🔄 **{alias} restarted**\n```{out}```",
parse_mode="Markdown",
)

View File

@@ -1,6 +1,7 @@
import asyncio import asyncio
from datetime import datetime, timezone from datetime import datetime, timezone
from typing import Dict from typing import Dict
from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton
from services.runner import run_cmd from services.runner import run_cmd
@@ -109,6 +110,21 @@ async def docker_watchdog(container_map, notify, bot, chat_id):
state = "error" state = "error"
state = state.strip() state = state.strip()
if last.get(alias) != state: if last.get(alias) != state:
await notify(bot, chat_id, f"🐳 {alias}: {state}") if state != "running":
kb = InlineKeyboardMarkup(
inline_keyboard=[[
InlineKeyboardButton(
text="🔄 Restart",
callback_data=f"wdrestart:{alias}"
)
]]
)
await bot.send_message(
chat_id,
f"🐳 {alias}: {state}",
reply_markup=kb,
)
else:
await notify(bot, chat_id, f"🐳 {alias}: {state}")
last[alias] = state last[alias] = state
await asyncio.sleep(120) await asyncio.sleep(120)