#!/usr/bin/env bash set -euo pipefail # ============================================================================= # setup/unraid.sh — Install prerequisites on Unraid (runs via SSH from MacBook) # ============================================================================= SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" # shellcheck source=../lib/common.sh # shellcheck disable=SC1091 source "${SCRIPT_DIR}/../lib/common.sh" load_env require_vars UNRAID_IP UNRAID_SSH_USER UNRAID_GITEA_DATA_PATH log_info "=== Unraid Setup ===" # -------------------------------------------------------------------------- # OS check — Unraid must be Linux (Docker, static binaries, x86_64) # -------------------------------------------------------------------------- log_info "Verifying Unraid OS..." require_remote_os "UNRAID" "Linux" "Unraid must be a Linux machine — check UNRAID_IP in .env" # -------------------------------------------------------------------------- # Manifest — track what we install for rollback/cleanup # -------------------------------------------------------------------------- manifest_init "unraid" # -------------------------------------------------------------------------- # SSH connectivity # -------------------------------------------------------------------------- log_info "Testing SSH to Unraid..." if ! ssh_check UNRAID; then log_error "Cannot SSH to Unraid at $UNRAID_IP as $UNRAID_SSH_USER" exit 1 fi log_success "SSH to Unraid OK" # -------------------------------------------------------------------------- # Docker (pre-installed on Unraid — DO NOT attempt to install) # -------------------------------------------------------------------------- if ssh_exec UNRAID "docker --version" &>/dev/null; then log_success "Docker found on Unraid" else log_error "Docker not found on Unraid." log_error "Enable Docker via Unraid's Settings > Docker page." log_error "This script does not install Docker on Unraid." exit 1 fi # -------------------------------------------------------------------------- # docker-compose (try plugin first, then standalone) # -------------------------------------------------------------------------- if ssh_exec UNRAID "docker compose version" &>/dev/null; then log_success "docker compose (plugin) found on Unraid" elif ssh_exec UNRAID "docker-compose --version" &>/dev/null; then log_success "docker-compose (standalone) found on Unraid" else log_info "Installing docker-compose standalone binary on Unraid..." COMPOSE_VERSION="v2.29.1" ssh_exec UNRAID "curl -SL https://github.com/docker/compose/releases/download/${COMPOSE_VERSION}/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose && chmod +x /usr/local/bin/docker-compose" manifest_record "unraid" "static_bin" "/usr/local/bin/docker-compose" if ssh_exec UNRAID "docker-compose --version" &>/dev/null; then log_success "docker-compose installed on Unraid" else log_error "Failed to install docker-compose on Unraid" exit 1 fi fi # -------------------------------------------------------------------------- # jq (install via static binary — Unraid has no package manager) # -------------------------------------------------------------------------- if ssh_exec UNRAID "jq --version" &>/dev/null; then log_success "jq found on Unraid" else log_info "Installing jq static binary on Unraid..." JQ_VERSION="1.7.1" ssh_exec UNRAID "curl -SL https://github.com/jqlang/jq/releases/download/jq-${JQ_VERSION}/jq-linux-amd64 -o /usr/local/bin/jq && chmod +x /usr/local/bin/jq" manifest_record "unraid" "static_bin" "/usr/local/bin/jq" if ssh_exec UNRAID "jq --version" &>/dev/null; then log_success "jq installed on Unraid" else log_error "Failed to install jq on Unraid" exit 1 fi fi # -------------------------------------------------------------------------- # unzip (needed by backup/restore scripts) # -------------------------------------------------------------------------- if ssh_exec UNRAID "unzip -v" &>/dev/null; then log_success "unzip found on Unraid" else log_info "Installing unzip static binary on Unraid..." ssh_exec UNRAID "curl -SL https://busybox.net/downloads/binaries/1.35.0-x86_64-linux-musl/busybox -o /tmp/busybox_unzip && chmod +x /tmp/busybox_unzip && cp /tmp/busybox_unzip /usr/local/bin/unzip && rm /tmp/busybox_unzip" manifest_record "unraid" "static_bin" "/usr/local/bin/unzip" if ssh_exec UNRAID "unzip -v" &>/dev/null; then log_success "unzip installed on Unraid" else log_warn "Failed to install unzip on Unraid — backup/restore may not work" fi fi # -------------------------------------------------------------------------- # Minimum version checks for remote tools # -------------------------------------------------------------------------- log_info "Checking minimum versions on Unraid..." check_remote_min_version "UNRAID" "docker" "docker --version" "20.0" check_remote_min_version "UNRAID" "docker-compose" "docker compose version 2>/dev/null || docker-compose --version" "2.0" check_remote_min_version "UNRAID" "jq" "jq --version" "1.6" # -------------------------------------------------------------------------- # Data path # -------------------------------------------------------------------------- log_info "Verifying data path: $UNRAID_GITEA_DATA_PATH" if ssh_exec UNRAID "mkdir -p '$UNRAID_GITEA_DATA_PATH' && touch '$UNRAID_GITEA_DATA_PATH/.write-test' && rm '$UNRAID_GITEA_DATA_PATH/.write-test'"; then log_success "Data path exists and is writable" else log_error "Cannot write to $UNRAID_GITEA_DATA_PATH on Unraid" exit 1 fi # -------------------------------------------------------------------------- # Summary # -------------------------------------------------------------------------- log_success "All Unraid prerequisites satisfied"