#!/bin/bash # # server-report.sh - denni report stavu serveru na Telegram. # Obsahuje: uptime, load, RAM, disk, teplota CPU, Docker kontejnery, # Docker update log, zalohy, sitovy traffic. # # Spust jednou rucne: bash server-report.sh # Spust automaticky: systemd timer server-report.timer (kazdy den 09:30) # # Konfigurace: /home/mates/.telegram.conf # set -euo pipefail # === KONFIGURACE === USER_NAME="mates" WORK_DIR="/home/$USER_NAME" CONFIG_FILE="$WORK_DIR/.telegram.conf" DOCKER_ROOT="$WORK_DIR/docker" DOCKER_UPDATE_LOG="$WORK_DIR/skripty/update-docker-script/docker-update.log" DOCKER_BACKUP_DIR="$WORK_DIR/zalohy/docker" HOST=$(hostname) INTERFACE="eth0" # nastav podle sveho serveru # Prahy pro upozorneni DISK_WARN=80 DISK_CRIT=90 TEMP_WARN=70 TEMP_CRIT=80 # === TELEGRAM KONFIGURACE === if [[ -f "$CONFIG_FILE" ]]; then # shellcheck disable=SC1090 source "$CONFIG_FILE" fi TELEGRAM_BOT_TOKEN="${TELEGRAM_BOT_TOKEN:-}" TELEGRAM_CHAT_ID="${TELEGRAM_CHAT_ID:-}" send_msg() { local TEXT="$1" if [[ -z "$TELEGRAM_BOT_TOKEN" || -z "$TELEGRAM_CHAT_ID" ]]; then echo "Telegram neni nakonfigurovan, preskakuji" return 0 fi curl -s -X POST "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage" \ -d chat_id="${TELEGRAM_CHAT_ID}" \ -d text="$TEXT" \ -d parse_mode="Markdown" \ --max-time 10 \ --retry 3 > /dev/null || echo "⚠️ Telegram chyba" } # === SYSTEMOVE STATISTIKY === UPTIME=$(uptime -p | sed 's/^up //') LOAD=$(awk '{print $1" "$2" "$3}' /proc/loadavg) RAM_USED=$(free -h | awk '/^Mem:/ {print $3}') RAM_TOTAL=$(free -h | awk '/^Mem:/ {print $2}') DISK_USED_HUMAN=$(df -h / | awk 'NR==2 {print $3}') DISK_TOTAL_HUMAN=$(df -h / | awk 'NR==2 {print $2}') DISK_PERCENT_RAW=$(df -P / | awk 'NR==2 {print $5}' | tr -d '%') # CPU teplota (pokud je k dispozici) TEMP_RAW="" if [[ -f /sys/class/thermal/thermal_zone0/temp ]]; then TEMP_RAW=$(cat /sys/class/thermal/thermal_zone0/temp 2>/dev/null || echo "") fi TEMP_HUMAN="" if [[ -n "$TEMP_RAW" && "$TEMP_RAW" -gt 0 ]]; then TEMP_C=$((TEMP_RAW / 1000)) TEMP_HUMAN="🌡️ CPU: ${TEMP_C}°C\n" fi # Docker kontejnery CONTAINERS_RUNNING=$(docker ps -q 2>/dev/null | wc -l | tr -d ' ') CONTAINERS_TOTAL=$(docker ps -aq 2>/dev/null | wc -l | tr -d ' ') CONTAINERS_STOPPED=$((CONTAINERS_TOTAL - CONTAINERS_RUNNING)) # Sitovy traffic (pokud je dostupny) NETWORK_RX=$(cat /sys/class/net/$INTERFACE/statistics/rx_bytes 2>/dev/null || echo "0") NETWORK_TX=$(cat /sys/class/net/$INTERFACE/statistics/tx_bytes 2>/dev/null || echo "0") NETWORK_RX_HUMAN=$(awk "BEGIN {printf \"%.2f GB\", $NETWORK_RX/1073741824}") NETWORK_TX_HUMAN=$(awk "BEGIN {printf \"%.2f GB\", $NETWORK_TX/1073741824}") # Posledni Docker update a zaloha LAST_UPDATE="zatim neprobehla" if [[ -f "$DOCKER_UPDATE_LOG" ]]; then LAST_UPDATE=$(grep -E "=== (docker-update|update.sh) (spusten|dokoncen)" "$DOCKER_UPDATE_LOG" | tail -1 | awk '{print $1, $2}') fi LAST_BACKUP="zatim neprobehla" if [[ -d "$DOCKER_BACKUP_DIR" ]]; then LAST_BACKUP=$(ls -t "$DOCKER_BACKUP_DIR"/*/ 2>/dev/null | head -1 | xargs -I {} basename {} 2>/dev/null || echo "neni") fi # === SESTAVENI REPORTU === ALERTS="" if [[ $DISK_PERCENT_RAW -ge $DISK_CRIT ]]; then ALERTS="${ALERTS}🚨 *DISK KRITICKY: ${DISK_PERCENT_RAW}%*\n" elif [[ $DISK_PERCENT_RAW -ge $DISK_WARN ]]; then ALERTS="${ALERTS}⚠️ *DISK: ${DISK_PERCENT_RAW}%*\n" fi if [[ -n "$TEMP_RAW" && "$TEMP_RAW" -gt 0 ]]; then TEMP_C=$((TEMP_RAW / 1000)) if [[ $TEMP_C -ge $TEMP_CRIT ]]; then ALERTS="${ALERTS}🚨 *CPU KRITICKY: ${TEMP_C}°C*\n" elif [[ $TEMP_C -ge $TEMP_WARN ]]; then ALERTS="${ALERTS}⚠️ *CPU: ${TEMP_C}°C*\n" fi fi # === ODESLANI === REPORT="${ALERTS}📊 *[$HOST]* Denni report ⏱️ Uptime: \`$UPTIME\` 📈 Load: \`$LOAD\` 🧠 RAM: $RAM_USED / $RAM_TOTAL 💾 Disk: $DISK_USED_HUMAN / $DISK_TOTAL_HUMAN (${DISK_PERCENT_RAW}%) ${TEMP_HUMAN}🌐 Sit ($INTERFACE): RX: $NETWORK_RX_HUMAN | TX: $NETWORK_TX_HUMAN 🐳 Docker: Bezi: $CONTAINERS_RUNNING | Celkem: $CONTAINERS_TOTAL Stopped: $CONTAINERS_STOPPED 📅 Posledni Docker update: \`$LAST_UPDATE\` 💾 Posledni zaloha: \`$LAST_BACKUP\`" send_msg "$REPORT" exit 0