Skip to content

Maintenance Scripts

HomelabARR CE includes various maintenance scripts to keep your system running smoothly and efficiently.

Docker Maintenance

Docker System Cleanup

scripts/docker/dockerprune.sh

Purpose: Clean up unused Docker resources to free disk space

# Run Docker cleanup
sudo ./scripts/docker/dockerprune.sh

What it cleans: - Stopped containers - Unused networks - Dangling images - Build cache - Unused volumes (with confirmation)

Output example:

Deleted Containers:
af1234567890
bc2345678901

Deleted Networks:
network1
network2

Total reclaimed space: 2.5GB

Safety features: - Confirms before removing volumes - Preserves running containers - Maintains active networks - Shows space reclaimed

Manual Docker Cleanup

# Remove stopped containers
docker container prune -f

# Remove unused images
docker image prune -a -f

# Remove unused networks
docker network prune -f

# Remove unused volumes (CAUTION!)
docker volume prune -f

# Complete system cleanup
docker system prune -a --volumes -f

Disk Space Management

Disk Cleanup Script

scripts/disk_cleanup.sh

Purpose: Free up disk space by cleaning various system areas

# Run disk cleanup
sudo ./scripts/disk_cleanup.sh

Cleanup areas: - Package manager cache (apt/yum) - Log files older than 30 days - Temporary files - Docker resources - Old kernels (Ubuntu/Debian) - Trash/recycle bin

Before cleanup check:

# Check disk usage before cleanup
df -h
du -sh /opt/appdata/*
du -sh /var/log/*

Safe cleanup commands:

# Clean package cache
sudo apt clean
sudo apt autoremove

# Clean log files (older than 30 days)
sudo find /var/log -name "*.log" -type f -mtime +30 -delete
sudo journalctl --vacuum-time=30d

# Clean temporary files
sudo rm -rf /tmp/*
sudo rm -rf /var/tmp/*

Application Data Maintenance

Application Data Cleanup

Plex Maintenance Scripts

scripts/plex/plex-empty-trash.sh

Purpose: Empty Plex Media Server trash to free space

# Empty Plex trash
sudo ./scripts/plex/plex-empty-trash.sh

What it does: - Connects to Plex API - Empties trash for all libraries - Reports space freed - Logs cleanup activity

scripts/plex/plex-optimize-db.sh

Purpose: Optimize Plex database for better performance

# Optimize Plex database
sudo ./scripts/plex/plex-optimize-db.sh

Database optimization: - Vacuum SQLite databases - Reindex database tables - Check database integrity - Backup database before optimization

Manual Plex maintenance:

# Stop Plex
docker stop plex

# Backup database
cp /opt/appdata/plex/Library/Application\ Support/Plex\ Media\ Server/Plug-in\ Support/Databases/com.plexapp.plugins.library.db /opt/appdata/plex/backup/

# Optimize database
sqlite3 /opt/appdata/plex/Library/Application\ Support/Plex\ Media\ Server/Plug-in\ Support/Databases/com.plexapp.plugins.library.db "VACUUM;"

# Start Plex
docker start plex

Application Log Management

Log Rotation

# Configure log rotation for containers
sudo tee /etc/logrotate.d/docker > /dev/null <<EOF
/var/lib/docker/containers/*/*.log {
    rotate 7
    daily
    compress
    size=1M
    missingok
    delaycompress
    copytruncate
}
EOF

Manual Log Cleanup

# View container log sizes
sudo du -sh /var/lib/docker/containers/*/*-json.log | sort -h

# Truncate large log files
sudo truncate -s 0 /var/lib/docker/containers/*/×-json.log

# Clean application logs
sudo find /opt/appdata/*/logs -name "*.log" -type f -mtime +30 -delete

System Updates

Container Updates

Update All Containers

#!/bin/bash
# Update all HomelabARR containers

echo "Updating all containers..."

# Pull latest images
cd /opt/homelabarr
find apps/ -name "*.yml" -exec docker compose -f {} pull \;

# Restart containers with new images
find apps/ -name "*.yml" -exec docker compose -f {} up -d \;

# Clean up old images
docker image prune -f

echo "Container update complete!"

Update Specific Application

#!/bin/bash
# Update specific application

APP_PATH="$1"
if [ -z "$APP_PATH" ]; then
    echo "Usage: $0 <app-path>"
    echo "Example: $0 apps/mediaserver/plex.yml"
    exit 1
fi

echo "Updating $APP_PATH..."
docker compose -f "$APP_PATH" pull
docker compose -f "$APP_PATH" up -d
echo "Update complete!"

System Updates

OS Update Script

#!/bin/bash
# System update script

echo "Starting system update..."

# Update package lists
sudo apt update

# Show available updates
sudo apt list --upgradable

# Perform updates
sudo apt upgrade -y

# Clean up
sudo apt autoremove -y
sudo apt autoclean

# Update Docker if needed
curl -fsSL https://get.docker.com | sh

echo "System update complete!"

Backup Maintenance

Automated Backup Script

scripts/backup/auto-backup.sh

#!/bin/bash
# Automated backup script

BACKUP_DIR="/mnt/backup"
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="homelabarr_backup_$DATE.tar.gz"

echo "Starting backup at $(date)"

# Create backup directory
mkdir -p "$BACKUP_DIR"

# Stop containers for consistent backup
echo "Stopping containers..."
docker stop $(docker ps -q)

# Create backup
echo "Creating backup..."
tar -czf "$BACKUP_DIR/$BACKUP_FILE" \
    -C /opt appdata \
    -C /opt/homelabarr .

# Start containers
echo "Starting containers..."
docker start $(docker ps -aq)

# Verify backup
if [ -f "$BACKUP_DIR/$BACKUP_FILE" ]; then
    echo "Backup completed: $BACKUP_DIR/$BACKUP_FILE"
    echo "Backup size: $(du -h $BACKUP_DIR/$BACKUP_FILE | cut -f1)"
else
    echo "Backup failed!"
    exit 1
fi

# Clean old backups (keep last 7)
find "$BACKUP_DIR" -name "homelabarr_backup_*.tar.gz" -type f -mtime +7 -delete

echo "Backup maintenance complete at $(date)"

Performance Monitoring

System Health Check

scripts/health-check.sh

#!/bin/bash
# System health check script

echo "=== HomelabARR System Health Check ==="
echo "Date: $(date)"
echo

# Disk space
echo "--- Disk Usage ---"
df -h | grep -E '(Filesystem|/dev/)'
echo

# Memory usage
echo "--- Memory Usage ---"
free -h
echo

# Docker status
echo "--- Docker Status ---"
sudo systemctl status docker --no-pager -l
echo

# Container status
echo "--- Container Status ---"
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
echo

# Failed containers
echo "--- Failed Containers ---"
FAILED=$(docker ps -a --filter "status=exited" --filter "status=dead" --format "{{.Names}}")
if [ -n "$FAILED" ]; then
    echo "$FAILED"
else
    echo "No failed containers"
fi
echo

# Network connectivity
echo "--- Network Connectivity ---"
ping -c 1 google.com > /dev/null && echo "Internet: OK" || echo "Internet: FAILED"
ping -c 1 8.8.8.8 > /dev/null && echo "DNS: OK" || echo "DNS: FAILED"
echo

# Load average
echo "--- System Load ---"
uptime
echo

echo "=== Health Check Complete ==="

Automated Maintenance

Cron Job Setup

Daily Maintenance

# Add to crontab: crontab -e

# Daily cleanup at 2 AM
0 2 * * * /opt/homelabarr/scripts/docker/dockerprune.sh >> /var/log/homelabarr-maintenance.log 2>&1

# Weekly disk cleanup on Sunday at 3 AM
0 3 * * 0 /opt/homelabarr/scripts/disk_cleanup.sh >> /var/log/homelabarr-maintenance.log 2>&1

# Weekly backup on Sunday at 4 AM
0 4 * * 0 /opt/homelabarr/scripts/backup/auto-backup.sh >> /var/log/homelabarr-backup.log 2>&1

# Daily health check at 6 AM
0 6 * * * /opt/homelabarr/scripts/health-check.sh >> /var/log/homelabarr-health.log 2>&1

Systemd Timer (Alternative)

# Create systemd service
sudo tee /etc/systemd/system/homelabarr-maintenance.service > /dev/null <<EOF
[Unit]
Description=HomelabARR Maintenance
After=docker.service

[Service]
Type=oneshot
ExecStart=/opt/homelabarr/scripts/docker/dockerprune.sh
User=root
EOF

# Create systemd timer
sudo tee /etc/systemd/system/homelabarr-maintenance.timer > /dev/null <<EOF
[Unit]
Description=Run HomelabARR maintenance daily
Requires=homelabarr-maintenance.service

[Timer]
OnCalendar=daily
Persistent=true

[Install]
WantedBy=timers.target
EOF

# Enable and start timer
sudo systemctl enable homelabarr-maintenance.timer
sudo systemctl start homelabarr-maintenance.timer

Maintenance Best Practices

Regular Schedule

  • Daily: Docker cleanup, log rotation
  • Weekly: System updates, full backup
  • Monthly: Database optimization, security updates
  • Quarterly: Major version updates, security audit

Monitoring

  • Check disk space regularly
  • Monitor container health
  • Review application logs
  • Verify backup integrity

Safety

  • Always backup before major changes
  • Test maintenance scripts in development
  • Keep multiple backup copies
  • Document any custom modifications

Regular maintenance ensures optimal performance and reliability of your HomelabARR CE deployment.