#!/bin/bash # Arrs Media Stack Management Script # Generated by Ansible - Customized for your VPS set -e COMPOSE_DIR="{{ docker_compose_dir }}" COMPOSE_FILE="$COMPOSE_DIR/docker-compose.yml" # Colors for output RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # Function to print colored output print_status() { echo -e "${GREEN}[INFO]${NC} $1" } print_warning() { echo -e "${YELLOW}[WARNING]${NC} $1" } print_error() { echo -e "${RED}[ERROR]${NC} $1" } print_header() { echo -e "${BLUE}=== $1 ===${NC}" } # Check if running as docker user check_user() { if [[ $EUID -ne $(id -u {{ docker_user }}) ]]; then print_error "This script must be run as the {{ docker_user }} user" exit 1 fi } # Change to compose directory cd_compose_dir() { if [[ ! -d "$COMPOSE_DIR" ]]; then print_error "Compose directory not found: $COMPOSE_DIR" exit 1 fi cd "$COMPOSE_DIR" } # Function to show usage usage() { echo "Usage: $0 {start|stop|restart|status|logs|update|backup|restore}" echo "" echo "Commands:" echo " start - Start all Arrs services" echo " stop - Stop all Arrs services" echo " restart - Restart all Arrs services" echo " status - Show status of all services" echo " logs - Show logs for all services" echo " update - Update all Docker images and restart services" echo " backup - Create backup of configurations" echo " restore - Restore configurations from backup" echo "" } # Start services start_services() { print_header "Starting Arrs Media Stack" cd_compose_dir docker-compose up -d print_status "All services started" show_status } # Stop services stop_services() { print_header "Stopping Arrs Media Stack" cd_compose_dir docker-compose down print_status "All services stopped" } # Restart services restart_services() { print_header "Restarting Arrs Media Stack" cd_compose_dir docker-compose restart print_status "All services restarted" show_status } # Show status show_status() { print_header "Arrs Media Stack Status" cd_compose_dir docker-compose ps echo "" print_status "Service URLs (via Tailscale):" echo " Sonarr: http://$(hostname -I | awk '{print $1}'):{{ ports.sonarr }}" echo " Radarr: http://$(hostname -I | awk '{print $1}'):{{ ports.radarr }}" echo " Lidarr: http://$(hostname -I | awk '{print $1}'):{{ ports.lidarr }}" echo " Bazarr: http://$(hostname -I | awk '{print $1}'):{{ ports.bazarr }}" echo " Prowlarr: http://$(hostname -I | awk '{print $1}'):{{ ports.prowlarr }}" } # Show logs show_logs() { print_header "Arrs Media Stack Logs" cd_compose_dir if [[ -n "$2" ]]; then docker-compose logs -f "$2" else docker-compose logs -f --tail=50 fi } # Update services update_services() { print_header "Updating Arrs Media Stack" cd_compose_dir print_status "Pulling latest images..." docker-compose pull print_status "Recreating containers..." docker-compose up -d --force-recreate print_status "Cleaning up old images..." docker image prune -f print_status "Update complete" show_status } # Backup configurations backup_configs() { print_header "Backing up Arrs Configurations" BACKUP_DIR="{{ backup_dir }}" BACKUP_FILE="$BACKUP_DIR/arrs-backup-$(date +%Y%m%d-%H%M%S).tar.gz" mkdir -p "$BACKUP_DIR" print_status "Creating backup: $BACKUP_FILE" tar -czf "$BACKUP_FILE" \ -C "{{ docker_root }}" \ sonarr radarr lidarr bazarr prowlarr compose print_status "Backup created successfully" ls -lh "$BACKUP_FILE" } # Restore configurations restore_configs() { print_header "Restoring Arrs Configurations" if [[ -z "$2" ]]; then print_error "Please specify backup file to restore" echo "Usage: $0 restore " exit 1 fi BACKUP_FILE="$2" if [[ ! -f "$BACKUP_FILE" ]]; then print_error "Backup file not found: $BACKUP_FILE" exit 1 fi print_warning "This will overwrite current configurations!" read -p "Are you sure? (y/N): " -n 1 -r echo if [[ ! $REPLY =~ ^[Yy]$ ]]; then print_status "Restore cancelled" exit 0 fi print_status "Stopping services..." stop_services print_status "Restoring from: $BACKUP_FILE" tar -xzf "$BACKUP_FILE" -C "{{ docker_root }}" print_status "Starting services..." start_services print_status "Restore complete" } # Main script logic check_user case "$1" in start) start_services ;; stop) stop_services ;; restart) restart_services ;; status) show_status ;; logs) show_logs "$@" ;; update) update_services ;; backup) backup_configs ;; restore) restore_configs "$@" ;; *) usage exit 1 ;; esac exit 0