Kompletne odstraneno: - Emoji (smajliky, symboly, boxes, arrows) z README - Emoji ze skriptu (sipky, symboly) - Emoji z docker-compose (adresare) Nahrano za: - Textove alternativy (sipky -> '->', boxes -> '+', atd.) - ASCII pouze kde to slo Ciste vsechny 7 repo (overeno Python skriptem).
133 lines
4.0 KiB
Bash
133 lines
4.0 KiB
Bash
#!/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
|