diff --git a/miscellaneous/bash/database_lag.sh b/miscellaneous/bash/database_lag.sh deleted file mode 100755 index d0295c2..0000000 --- a/miscellaneous/bash/database_lag.sh +++ /dev/null @@ -1,66 +0,0 @@ -#!/bin/bash - -# === CONFIG === -REPLICA_SERVER="" # <-- fill this in -SSH_USER="" # <-- fill this in -PG_USER="postgres" # usually postgres - -# === Connect and check SSH first === -echo "[*] Connecting to replica server $REPLICA_SERVER..." - -ssh -o BatchMode=yes -o ConnectTimeout=5 "$SSH_USER@$REPLICA_SERVER" "echo 2>&1" && SSH_OK=true || SSH_OK=false - -if [[ "$SSH_OK" == false ]]; then - echo "โŒ SSH connection failed! Could not reach $REPLICA_SERVER." - echo "๐Ÿ‘‰ Suggested Action: Check server DNS, IP, SSH service, firewall." - exit 2 -fi - -# === Run the Replication Check === -OUTPUT=$(ssh "doc@38.102.127.174" "sudo -u $PG_USER psql -Atc \"SELECT application_name, state, sync_state, write_lag, flush_lag, replay_lag FROM pg_stat_replication;\"") - -if [[ -z "$OUTPUT" ]]; then - echo "โŒ No replication data found!" - echo "๐Ÿ‘‰ Suggested Action: Check PostgreSQL service on both primary and replica. Verify replication setup." - exit 1 -fi - -# === Parse and Advise === -echo "" -echo "=== Replication Status ===" -echo "$OUTPUT" -echo "===========================" - -while IFS='|' read -r application_name state sync_state write_lag flush_lag replay_lag; do - echo "" - echo "๐Ÿ›  Replica: $application_name" - echo "๐Ÿ”น Connection State: $state" - echo "๐Ÿ”น Sync State: $sync_state" - echo "๐Ÿ”น Write Lag: $write_lag" - echo "๐Ÿ”น Flush Lag: $flush_lag" - echo "๐Ÿ”น Replay Lag: $replay_lag" - - if [[ "$state" == "streaming" && "$sync_state" == "sync" ]]; then - echo "โœ… Status: Healthy synchronous replication. No action needed." - elif [[ "$state" == "streaming" && "$sync_state" == "async" ]]; then - echo "โš ๏ธ Warning: Replica is asynchronous. Check if this is expected." - elif [[ "$state" == "catchup" ]]; then - echo "โš ๏ธ Warning: Replica is catching up. Monitor closely." - else - echo "โŒ Error: Unknown or broken state. Immediate action required." - fi - - if [[ "$write_lag" != "" && "$write_lag" != "0" ]]; then - echo "โš ๏ธ Write Lag Detected: $write_lag" - fi - if [[ "$flush_lag" != "" && "$flush_lag" != "0" ]]; then - echo "โš ๏ธ Flush Lag Detected: $flush_lag" - fi - if [[ "$replay_lag" != "" && "$replay_lag" != "0" ]]; then - echo "โš ๏ธ Replay Lag Detected: $replay_lag" - fi - -done <<< "$OUTPUT" - -echo "" -echo "[โœ“] Replica check complete." diff --git a/miscellaneous/bash/documentation/disk_mitigator.md b/miscellaneous/bash/documentation/disk_mitigator.md new file mode 100644 index 0000000..0398ac3 --- /dev/null +++ b/miscellaneous/bash/documentation/disk_mitigator.md @@ -0,0 +1,64 @@ +#!/bin/bash + +# === Prompt for Target === +read -p "Enter SSH username: " USERNAME +read -p "Enter server hostname (e.g. krang.internal): " HOSTNAME + +REMOTE="$USERNAME@$HOSTNAME" + +# === Alert Config (local alerts) === +TELEGRAM_BOT_TOKEN="8178867489:AAH0VjN7VnZSCIWasSz_y97iBLLjPJA751k" +TELEGRAM_CHAT_ID="1559582356" +MASTODON_INSTANCE="https://chatwithus.live" +MASTODON_TOKEN="rimxBLi-eaJAcwagkmoj6UoW7Lc473tQY0cOM041Euw" +TIMESTAMP=$(date "+%Y-%m-%d %H:%M:%S") + +# === Remote Disk Check + Cleanup Script === +REMOTE_SCRIPT=$(cat << 'EOF' +#!/bin/bash +THRESHOLD_PERCENT=15 +HOST=$(hostname) +ALERTED=false + +df -h --output=target,pcent | tail -n +2 | while read -r mount usage; do + percent=$(echo "$usage" | tr -d '%') + if [ "$percent" -ge $((100 - THRESHOLD_PERCENT)) ]; then + echo "[!] $HOST: Low space on $mount ($usage used). Running cleanup..." + + apt-get clean -y > /dev/null 2>&1 + journalctl --vacuum-time=3d > /dev/null 2>&1 + docker system prune -af --volumes > /dev/null 2>&1 + rm -rf /tmp/* /var/tmp/* + + echo "[โœ“] $HOST: Cleanup complete for $mount" + else + echo "[OK] $HOST: $mount has enough space ($usage used)" + fi +done +EOF +) + +# === Run Remote Script via SSH === +echo "[*] Connecting to $REMOTE..." +OUTPUT=$(ssh "$REMOTE" "$REMOTE_SCRIPT") + +# === Log and Notify === +echo "[$TIMESTAMP] === Remote Disk Check on $HOSTNAME ===" >> /var/log/disk_mitigator.log +echo "$OUTPUT" >> /var/log/disk_mitigator.log + +# Alert if low space was found +if echo "$OUTPUT" | grep -q "\[!\]"; then + MSG="โš ๏ธ Disk cleanup triggered on $HOSTNAME via Krang.\n\n$OUTPUT" + + # Send alerts + curl -s -X POST "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage" \ + -d chat_id="$TELEGRAM_CHAT_ID" \ + -d text="$MSG" > /dev/null + + curl -s -X POST "$MASTODON_INSTANCE/api/v1/statuses" \ + -H "Authorization: Bearer $MASTODON_TOKEN" \ + -d "status=$MSG" \ + -d "visibility=unlisted" > /dev/null +fi + +echo "[โœ“] Done. Output logged and alerts (if any) sent." diff --git a/miscellaneous/bash/documentation/venv-backup-script.md b/miscellaneous/bash/documentation/venv-backup-script.md new file mode 100644 index 0000000..b0cf830 --- /dev/null +++ b/miscellaneous/bash/documentation/venv-backup-script.md @@ -0,0 +1,169 @@ +# ๐Ÿ Python Virtual Environment Backup Script + +This Bash script automates the process of backing up Python virtual environments. It performs the following steps: + +1. Locates virtual environments in a specified root directory +2. Archives them into a compressed `.tar.gz` file +3. Transfers the backup to a remote server using `rsync` +4. Deletes local backups older than a specified retention period + +--- + +## ๐Ÿ“ฆ Features + +- Detects virtual environments by checking for `bin/activate` +- Compresses selected environments into a tarball +- Transfers the backup to a remote server via SSH +- Deletes backups older than a retention threshold +- Uses strict error handling to avoid silent failures + +--- + +## โš™๏ธ Configuration + +| Variable | Description | +|------------------|-------------------------------------------------------------------------| +| `VENV_ROOT` | Directory where virtual environments are stored | +| `BACKUP_DIR` | Local directory where the backup tarballs are saved | +| `RETENTION_DAYS` | Number of days to retain local backups | +| `REMOTE_USER` | SSH user for the remote backup server | +| `REMOTE_HOST` | Hostname or IP address of the remote server | +| `REMOTE_PATH` | Remote directory where backups will be copied via `rsync` | + +--- + +## ๐Ÿ“ Script Walkthrough + +### 1. Setup + +```bash +#!/usr/bin/env bash +set -euo pipefail +``` + +- Enables strict error handling to prevent unnoticed failures. + +--- + +### 2. Define Variables + +```bash +VENV_ROOT="/home/doc" +BACKUP_DIR="$VENV_ROOT/backups" +RETENTION_DAYS=7 + +REMOTE_USER="root" +REMOTE_HOST="thevault.bounceme.net" +REMOTE_PATH="/mnt/backup3/pythonvenvs" +``` + +--- + +### 3. Generate Timestamped Backup Filename + +```bash +DATE=$(date +'%F_%H-%M-%S') +BACKUP_FILE="$BACKUP_DIR/venvs_backup_$DATE.tar.gz" +``` + +--- + +### 4. Ensure Backup Directory Exists + +```bash +mkdir -p "$BACKUP_DIR" +``` + +--- + +### 5. Locate Virtual Environments + +```bash +mapfile -t VENV_DIRS < <( + find "$VENV_ROOT" -maxdepth 1 -type d \ + -exec test -f "{}/bin/activate" \; -print +) +``` + +If no environments are found, the script exits: + +```bash +if [ ${#VENV_DIRS[@]} -eq 0 ]; then + echo "โŒ No virtual environments found under $VENV_ROOT" + exit 1 +fi +``` + +--- + +### 6. Extract Environment Names and Archive + +```bash +VENV_NAMES=() +for path in "${VENV_DIRS[@]}"; do + VENV_NAMES+=( "$(basename "$path")" ) +done + +echo "๐Ÿ”„ Backing up virtual environments: ${VENV_NAMES[*]}" +tar czf "$BACKUP_FILE" -C "$VENV_ROOT" "${VENV_NAMES[@]}" +echo "โœ… Local backup saved to $BACKUP_FILE" +``` + +--- + +### 7. Sync Backup to Remote Server + +```bash +echo "๐Ÿ“ก Sending backup to ${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_PATH}/" +rsync -az --progress "$BACKUP_FILE" \ + "${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_PATH}/" +``` + +Check if sync was successful: + +```bash +if [ $? -ne 0 ]; then + echo "โŒ Remote sync failed!" + exit 1 +else + echo "โœ… Remote sync succeeded." +fi +``` + +--- + +### 8. Cleanup Old Backups + +```bash +echo "๐Ÿ—‘๏ธ Removing local backups older than $RETENTION_DAYS days..." +find "$BACKUP_DIR" -type f -name "venvs_backup_*.tar.gz" \ + -mtime +$RETENTION_DAYS -delete +echo "๐ŸŽ‰ Backup and cleanup complete." +``` + +--- + +## ๐Ÿงช Example Output + +```text +๐Ÿ”„ Backing up virtual environments: venv1 venv2 +โœ… Local backup saved to /home/doc/backups/venvs_backup_2025-05-01_02-00-00.tar.gz +๐Ÿ“ก Sending backup to root@thevault.bounceme.net:/mnt/backup3/pythonvenvs/ +โœ… Remote sync succeeded. +๐Ÿ—‘๏ธ Removing local backups older than 7 days... +๐ŸŽ‰ Backup and cleanup complete. +``` + +--- + +## ๐Ÿ›ก๏ธ Notes + +- Ensure SSH access is set up for passwordless login to the remote host. +- Confirm that `rsync` is installed on both the local and remote systems. +- Consider running this script via `cron` or `systemd` for automation. + +--- + +## ๐Ÿ–‹๏ธ Author + +Maintained by **Doc**. Custom backup tooling for Genesis Hosting infrastructure. diff --git a/miscellaneous/bash/backup.sh b/miscellaneous/bash/venv-backup-script.sh similarity index 100% rename from miscellaneous/bash/backup.sh rename to miscellaneous/bash/venv-backup-script.sh diff --git a/miscellaneous/dbcheck.log b/miscellaneous/dbcheck.log index 04954a1..dac9e89 100644 --- a/miscellaneous/dbcheck.log +++ b/miscellaneous/dbcheck.log @@ -1109,3 +1109,7 @@ paramiko.ssh_exception.SSHException: Error reading SSH protocol banner Failed to send Mastodon DM (attempt 1): {"error":"The access token is invalid"} Failed to send Mastodon DM (attempt 2): {"error":"The access token is invalid"} Failed to send Mastodon DM (attempt 3): {"error":"The access token is invalid"} +โœ… Genesis Radio Healthcheck 2025-05-01 05:30:17: All systems normal. +Failed to send Mastodon DM (attempt 1): {"error":"The access token is invalid"} +Failed to send Mastodon DM (attempt 2): {"error":"The access token is invalid"} +Failed to send Mastodon DM (attempt 3): {"error":"The access token is invalid"}