Files
Homelab/setup.sh

205 lines
6.7 KiB
Bash
Executable File

#!/bin/bash
# ===========================================
# Docker Media Stack Setup Script
# ===========================================
set -e # Exit on any error
echo "🚀 Setting up Docker Media & Utility Stack..."
# 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"
}
# Check if Docker and Docker Compose are installed
check_dependencies() {
print_status "Checking dependencies..."
if ! command -v docker &> /dev/null; then
print_error "Docker is not installed. Please install Docker first."
exit 1
fi
if ! command -v docker compose &> /dev/null; then
print_error "Docker Compose is not installed. Please install Docker Compose first."
exit 1
fi
print_status "Dependencies check passed ✓"
}
# Create necessary directories
create_directories() {
print_status "Creating directory structure..."
# Main data directories
sudo mkdir -p /data/{movies,tv,music,torrents}
# Docker config directories
mkdir -p ../docker-local/{Arrs/{Sonarr,Radarr,Lidarr,Bazarr,Prowlarr,Jellyfin,Jellyseerr}/config,speedtest-tracker/{data,db},rustdesk/data,gramps,syncthing,obsidian/{vaults,config}}
# Application specific directories
mkdir -p {qBittorrent,Homepage,filebrowser,maloja,scrobble,stirling/latest,paperless,gramps,racknerd-converter}/config
mkdir -p {Homepage/config/{images,icons},filebrowser/data,maloja/{data,logs},stirling/latest/{data,config,logs},paperless/{data,media,export,consume},racknerd-converter/{data,logs}}
print_status "Directories created ✓"
}
# Set proper permissions
set_permissions() {
print_status "Setting permissions..."
# Get current user ID and group ID
CURRENT_UID=$(id -u)
CURRENT_GID=$(id -g)
# Set ownership for data directories
if [ -d "/data" ]; then
sudo chown -R $CURRENT_UID:$CURRENT_GID /data
fi
# Set ownership for config directories
if [ -d "../docker-local" ]; then
chown -R $CURRENT_UID:$CURRENT_GID ../docker-local
fi
# Set ownership for local directories
chown -R $CURRENT_UID:$CURRENT_GID .
print_status "Permissions set ✓"
}
# Validate environment file
validate_environment() {
print_status "Validating environment configuration..."
if [ ! -f ".env" ]; then
print_error ".env file not found. Please ensure it exists."
exit 1
fi
# Check for required variables
required_vars=("TZ" "PUID" "PGID" "DOMAIN" "DATA_ROOT")
for var in "${required_vars[@]}"; do
if ! grep -q "^${var}=" .env; then
print_error "Required environment variable $var not found in .env"
exit 1
fi
done
print_status "Environment validation passed ✓"
}
# Pull latest images
pull_images() {
print_status "Pulling latest Docker images..."
docker compose pull
print_status "Images pulled ✓"
}
# Start services
start_services() {
print_status "Starting services..."
# Create networks first
docker network create arr_network --subnet=172.20.0.0/16 2>/dev/null || true
docker network create database_network --subnet=172.21.0.0/16 2>/dev/null || true
# Start all services
docker compose up -d
print_status "Services started ✓"
}
# Display service URLs
show_services() {
echo
print_status "🎉 Setup complete! Your services are available at:"
echo
echo -e "${BLUE}📊 Dashboard & Management:${NC}"
echo " • Homepage (Dashboard): http://localhost:7575"
echo " • FileBrowser: http://localhost:6633"
echo
echo -e "${BLUE}🎬 Media Services:${NC}"
echo " • Jellyfin (Media Server): http://localhost:8096"
echo " • Jellyseerr (Requests): http://localhost:5055"
echo " • Sonarr (TV Shows): http://localhost:8989"
echo " • Radarr (Movies): http://localhost:7878"
echo " • Lidarr (Music): http://localhost:8686"
echo " • Bazarr (Subtitles): http://localhost:6767"
echo " • Prowlarr (Indexers): http://localhost:9696"
echo " • qBittorrent: http://localhost:7070"
echo
echo -e "${BLUE}📄 Document Management:${NC}"
echo " • Paperless NGX: http://localhost:8100"
echo " • Paperless AI: http://localhost:3040"
echo " • Stirling PDF: http://localhost:8090"
echo
echo -e "${BLUE}🛠️ Utilities:${NC}"
echo " • Speedtest Tracker: http://localhost:8180"
echo " • Syncthing: http://localhost:8384"
echo " • Obsidian Remote: http://localhost:8181"
echo " • Gramps (Genealogy): http://localhost:5511"
echo
echo -e "${BLUE}🎵 Music Services:${NC}"
echo " • Multi-Scrobbler: http://localhost:9078"
echo " • Maloja: http://localhost:42010"
echo
echo -e "${BLUE}🖥️ Server Monitoring:${NC}"
echo " • RackNerd API: http://localhost:5000"
echo
print_warning "Some services may take a few minutes to fully initialize."
echo
echo -e "${GREEN}💡 Useful commands:${NC}"
echo " • View status: docker compose ps"
echo " • View logs: docker compose logs [service]"
echo " • Stop all: docker compose down"
echo " • Update services: docker compose pull && docker compose up -d"
}
# Main execution
main() {
echo -e "${BLUE}"
echo "╔══════════════════════════════════════════════════╗"
echo "║ Docker Media Stack Setup ║"
echo "║ ║"
echo "║ This script will set up your complete ║"
echo "║ media and utility stack with Docker Compose ║"
echo "╚══════════════════════════════════════════════════╝"
echo -e "${NC}"
check_dependencies
validate_environment
create_directories
set_permissions
pull_images
start_services
show_services
echo
print_status "🎯 Setup completed successfully!"
print_warning "Remember to configure your services through their web interfaces."
echo
}
# Run main function
main "$@"