Files
homelab-optimized/scripts
Gitea Mirror Bot febaf56ba4
Some checks failed
Documentation / Build Docusaurus (push) Has started running
Documentation / Deploy to GitHub Pages (push) Has been cancelled
Sanitized mirror from private repository - 2026-04-16 07:12:52 UTC
2026-04-16 07:12:52 +00:00
..

Homelab Automation Scripts

Dashboard UI: These scripts are visualized and controlled through the Homelab Dashboard at http://homelab.tail.vish.gg:3100. The dashboard API (dashboard/api/) reuses scripts/lib/ modules and reads automation databases/logs to display real-time status. Quick actions in the dashboard can pause/resume email organizers and trigger backups.

All scripts use the local Ollama LLM (qwen3:32b) on Olares at http://192.168.0.145:31434.

Shared Library (lib/)

Reusable modules extracted from existing scripts:

Module Purpose
lib/ollama.py Ollama client with retry, backoff, think-tag stripping
lib/notify.py ntfy push notifications + Proton Bridge SMTP email
lib/portainer.py Portainer API client (all 5 endpoints)
lib/prometheus.py PromQL instant and range queries
lib/gitea.py Gitea API client (commits, releases)

Automated Scripts (Cron)

Email Organizers

Script Account Schedule Description
gmail-organizer/gmail_organizer.py lzbellina92@gmail.com Every 30min LLM email classification + Gmail labels
gmail-organizer-dvish/gmail_organizer.py your-email@example.com Every 30min LLM email classification + Gmail labels
proton-organizer/proton_organizer.py admin@thevish.io Every 30min LLM email classification via Proton Bridge

Control all 3 with: scripts/gmail-organizer-ctl.sh [start|stop|status]

Monitoring

Script Schedule Description
backup-validator.py Daily 4am Validates /tmp/gmail-backup-daily.log, LLM summarizes, emails report
disk-predictor.py Sunday 9am Prometheus disk trends, linear regression, predicts when volumes fill
stack-restart.py Every 5min Detects unhealthy containers, LLM assesses restart safety, auto-restarts if safe

Data Mining

Script Schedule Description
config-drift.py Daily 7am Compares git compose files vs running containers via Portainer
receipt-tracker.py Daily 10am Extracts vendor/amount from receipt emails → data/expenses.csv
subscription-auditor.py 1st of month 9am Audits email subscriptions, flags dormant ones

Developer

Script Schedule Description
changelog-generator.py Monday 8am Summarizes git commits into docs/CHANGELOG.md
email-digest.py Daily 8am Aggregates all 3 organizer stats, emails digest to admin@thevish.io
pr-reviewer.py On PR (Gitea CI) AI code review posted as PR comment

Interactive Tools (CLI)

# Generate SSH commands from plain English
python3 scripts/ssh-planner.py "restart all media services on atlantis"
python3 scripts/ssh-planner.py "check disk space on NAS boxes" --execute

# Generate Ansible playbooks from descriptions
python3 scripts/ansible-generator.py "update all hosts and reboot if kernel changed"
python3 scripts/ansible-generator.py "install tailscale on seattle" --name tailscale-seattle

# Generate troubleshooting runbooks
python3 scripts/runbook-generator.py --service jellyfin-olares
python3 scripts/runbook-generator.py --all          # all services (burst: ~30 LLM calls)
python3 scripts/runbook-generator.py --all --force   # regenerate even if unchanged

Cron Setup

Add these to crontab (crontab -e). Email organizer crons are already installed.

# Monitoring
*/5 * * * * cd /home/homelab/organized/repos/homelab && python3 scripts/stack-restart.py >> /tmp/stack-restart.log 2>&1
0 4 * * * cd /home/homelab/organized/repos/homelab && python3 scripts/backup-validator.py >> /tmp/backup-validator.log 2>&1
0 9 * * 0 cd /home/homelab/organized/repos/homelab && python3 scripts/disk-predictor.py >> /tmp/disk-predictor.log 2>&1

# Data mining
0 7 * * * cd /home/homelab/organized/repos/homelab && python3 scripts/config-drift.py >> /tmp/config-drift.log 2>&1
0 10 * * * cd /home/homelab/organized/repos/homelab && python3 scripts/receipt-tracker.py >> /tmp/receipt-tracker.log 2>&1
0 9 1 * * cd /home/homelab/organized/repos/homelab && python3 scripts/subscription-auditor.py >> /tmp/subscription-auditor.log 2>&1

# Developer
0 8 * * 1 cd /home/homelab/organized/repos/homelab && python3 scripts/changelog-generator.py >> /tmp/changelog-generator.log 2>&1

Stack Restart Safety

stack-restart.py has multiple safety layers:

  • Blacklist: portainer, headscale, adguard, postgres, mariadb, mongodb, redis are never auto-restarted
  • LLM gate: Ollama must analyze logs and say "SAFE" before any restart
  • No LLM = no restart: if Ollama is down, it only sends alerts
  • Rate limit: max 2 restarts per container per hour
  • Grace period: container must be unhealthy for 5+ minutes before action
  • Dry-run: test with python3 scripts/stack-restart.py --dry-run

Ollama Usage

Category Calls/Day Notes
Email organizers (3) 0-15 Sender cache reduces calls over time
Monitoring (3) 1-3 stack-restart only fires on unhealthy
Data mining (3) 2-6 receipt-tracker scales with purchases
Developer (2) 0-1 changelog weekly, PR reviews on demand
Interactive (3) 0-5 only when you use them
Total ~5-15 Negligible for RTX 5090

Graceful Degradation

All automated scripts check ollama_available() before making LLM calls:

  • Monitoring scripts: send alerts with raw data (no LLM summary)
  • Data mining scripts: skip run, retry next schedule
  • Interactive tools: print error and exit

MCP Server Integration

The homelab MCP server (homelab-mcp/server.py) includes an ollama_query tool that lets Claude Code query the local LLM directly. This saves API tokens for homelab-specific questions.

Logs

All cron scripts log to /tmp/:

tail -f /tmp/stack-restart.log
tail -f /tmp/backup-validator.log
tail -f /tmp/disk-predictor.log
tail -f /tmp/config-drift.log
tail -f /tmp/receipt-tracker.log
tail -f /tmp/subscription-auditor.log
tail -f /tmp/changelog-generator.log
tail -f /tmp/email-digest.log