Мониторинг Docker + Телеграм
Больше скриптов и обсуждение в телеграм https://t.me/cryptuworker
1. Проверка установленной версии Python
Если где то в процессе будет спрашивать согласия, просто нажимаем 'y' и 'enter'.
Для начала, проверяем, какая версия Python установлена сервере:
python3 --version
Если версия ниже 3.11 (последняя), установливаем Python 3.11:
sudo apt install python3.11
2. Установка pip
Для установки pip выполнияем следующую команду:
apt install python3-pip
3. Установка необходимых библиотек
Установливаем необходимые библиотеки с помощью следующей команды:
python3 -m pip install python-dotenv pyTelegramBotAPI --break-system-packages
4. Создание файла с переменными окружения
Создаем файл `.env`, чтобы хранить переменные окружения:
nano .env
В открывшееся окно всставляем bot_token и chat_id:
TELEGRAM_BOT_TOKEN=your_telegram_bot_token TELEGRAM_CHAT_ID=your_telegram_chat_id
Далее сохранием файл, нажав по очереди: `Ctrl + O`, `Enter`, `Ctrl + X`.
5. Создание директории для скрипта
Создаем директорию для скрипта:
mkdir docker_monitor
6. Скопируйте скрипт в нужную директорию
Скопируем скрипт в директорию, например:
nano docker_monitor/docker_monitor.py
В открывшееся окно вставляем скрипт:
import os
import time
import subprocess
from datetime import datetime, timedelta
import telebot
import re
from dotenv import load_dotenv
load_dotenv()
TELEGRAM_BOT_TOKEN = os.getenv('TELEGRAM_BOT_TOKEN')
TELEGRAM_CHAT_ID = os.getenv('TELEGRAM_CHAT_ID')
CHECK_INTERVAL = 4 * 60 * 60
LOG_COMMAND = "docker logs --tail 1 {container_name}"
GET_CONTAINERS_COMMAND = "docker ps --format '{{.Names}}'"
bot = telebot.TeleBot(TELEGRAM_BOT_TOKEN)
def send_telegram_message(message):
for i in range(0, len(message), 3990):
bot.send_message(TELEGRAM_CHAT_ID, message[i:i + 3990])
time.sleep(1)
def remove_ansi_escape_sequences(text):
ansi_escape = re.compile(r'(?:\x1B[@-_][0-?]*[ -/]*[@-~])')
return ansi_escape.sub('', text)
def check_node(container_name):
try:
result = subprocess.run(LOG_COMMAND.format(container_name=container_name), shell=True, capture_output=True, text=True)
last_log_line = result.stdout.strip()
last_log_line = remove_ansi_escape_sequences(last_log_line)
log_time_str = last_log_line.split(' ')[0].strip('[]')
log_time = datetime.strptime(log_time_str, "%Y-%m-%dT%H:%M:%S.%fZ")
current_time = datetime.utcnow()
if current_time - log_time > timedelta(hours=4):
return False, last_log_line[:50]
if "Pinging master node" in last_log_line and "successful" in last_log_line:
return True, None
else:
return False, last_log_line[:50]
except Exception as e:
print(f"Ошибка при проверке контейнера {container_name}: {e}")
return False, str(e)[:50]
def get_container_names():
try:
result = subprocess.run(GET_CONTAINERS_COMMAND, shell=True, capture_output=True, text=True)
container_names = result.stdout.strip().splitlines()
return container_names
except Exception as e:
print(f"Ошибка при получении списка контейнеров: {e}")
return []
def monitor_nodes():
while True:
container_names = get_container_names()
if not container_names:
send_telegram_message("Не удалось получить список контейнеров.")
return
success_count = 0
failure_reports = []
for container in container_names:
is_successful, error_message = check_node(container)
if is_successful:
success_count += 1
else:
failure_reports.append(f"Контейнер {container} неуспешен: {error_message}")
report = f"Успешных нод: {success_count}/{len(container_names)}\n"
if failure_reports:
report += "\n".join(failure_reports)
send_telegram_message(report)
time.sleep(CHECK_INTERVAL)
if __name__ == "__main__":
monitor_nodes()Сохраняем файл, нажав по очереди: `Ctrl + O`, `Enter`, `Ctrl + X`.
7. Даем скрипту права на исполнение
Выдаем скрипту права на исполнение:
chmod +x docker_monitor/docker_monitor.py
8. Настройка автозапуска
Создаем файл сервиса для автозапуска:
sudo nano /etc/systemd/system/docker_monitor.service
В открывшееся окно вставьте следующее содержимое:
[Unit] Description=Monitoring Docker Nodes After=network.target docker.service Requires=docker.service [Service] WorkingDirectory=/root/docker_monitor ExecStart=/usr/bin/python3 /root/docker_monitor/docker_monitor.py Restart=always User=root [Install] WantedBy=multi-user.target
Далее сохраняем файл, нажав по очереди: `Ctrl + O`, `Enter`, `Ctrl + X`.
9. Запускаем и включаем сервис
sudo systemctl enable docker_monitor.service sudo systemctl start docker_monitor.service
Теперь скрипт включен как сервис и будет стартовать при перезагрузке сервера автоматически.
10. Запуск вручную для проверки
Запускаем скрипт вручную для проверки:
python3 docker_monitor/docker_monitor.py
Если все запустилось, то в телеграм придет сообщение со статусом контейнеров.