#!/usr/bin/env bash set -euo pipefail # ============================================================================= # setup/fedora.sh — Install prerequisites on Fedora (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 FEDORA_IP FEDORA_SSH_USER FEDORA_GITEA_DATA_PATH log_info "=== Fedora Setup ===" # -------------------------------------------------------------------------- # OS check — must be Linux with dnf (RPM-based distro like Fedora/RHEL/CentOS) # This script uses `dnf` for all package installs. Running it against a # Debian/Ubuntu/Arch host would fail with confusing errors. # -------------------------------------------------------------------------- log_info "Verifying Fedora OS..." require_remote_os "FEDORA" "Linux" "Fedora target must be a Linux machine — check FEDORA_IP in .env" require_remote_pkg_manager "FEDORA" "dnf" "Fedora target must have dnf (RPM-based distro) — this script won't work on Debian/Ubuntu" # -------------------------------------------------------------------------- # Manifest — track what we install for rollback/cleanup # -------------------------------------------------------------------------- manifest_init "fedora" # -------------------------------------------------------------------------- # SSH connectivity # -------------------------------------------------------------------------- log_info "Testing SSH to Fedora..." if ! ssh_check FEDORA; then log_error "Cannot SSH to Fedora at $FEDORA_IP as $FEDORA_SSH_USER" exit 1 fi log_success "SSH to Fedora OK" # -------------------------------------------------------------------------- # Docker CE # -------------------------------------------------------------------------- if ssh_exec FEDORA "docker --version" &>/dev/null; then log_success "Docker found on Fedora" else log_info "Installing Docker CE on Fedora..." ssh_exec FEDORA "sudo dnf -y install dnf-plugins-core" manifest_record "fedora" "dnf_pkg" "dnf-plugins-core" ssh_exec FEDORA "sudo dnf config-manager --add-repo https://download.docker.com/linux/fedora/docker-ce.repo" ssh_exec FEDORA "sudo dnf -y install docker-ce docker-ce-cli containerd.io docker-compose-plugin" manifest_record "fedora" "dnf_pkg" "docker-ce" manifest_record "fedora" "dnf_pkg" "docker-ce-cli" manifest_record "fedora" "dnf_pkg" "containerd.io" manifest_record "fedora" "dnf_pkg" "docker-compose-plugin" ssh_exec FEDORA "sudo systemctl enable --now docker" manifest_record "fedora" "systemd_svc" "docker" # Add user to docker group ssh_exec FEDORA "sudo usermod -aG docker $FEDORA_SSH_USER" manifest_record "fedora" "docker_group" "$FEDORA_SSH_USER" log_warn "User $FEDORA_SSH_USER added to docker group. You may need to re-login for this to take effect." if ssh_exec FEDORA "docker --version" &>/dev/null; then log_success "Docker CE installed on Fedora" else log_error "Failed to install Docker on Fedora" exit 1 fi fi # -------------------------------------------------------------------------- # docker compose plugin # -------------------------------------------------------------------------- if ssh_exec FEDORA "docker compose version" &>/dev/null; then log_success "docker compose (plugin) found on Fedora" else log_error "docker compose plugin not found. It should have been installed with docker-ce." exit 1 fi # -------------------------------------------------------------------------- # jq # -------------------------------------------------------------------------- if ssh_exec FEDORA "jq --version" &>/dev/null; then log_success "jq found on Fedora" else log_info "Installing jq on Fedora..." ssh_exec FEDORA "sudo dnf -y install jq" manifest_record "fedora" "dnf_pkg" "jq" if ssh_exec FEDORA "jq --version" &>/dev/null; then log_success "jq installed on Fedora" else log_error "Failed to install jq on Fedora" exit 1 fi fi # -------------------------------------------------------------------------- # unzip (needed by backup/restore scripts) # -------------------------------------------------------------------------- if ssh_exec FEDORA "unzip -v" &>/dev/null; then log_success "unzip found on Fedora" else log_info "Installing unzip on Fedora..." ssh_exec FEDORA "sudo dnf -y install unzip" manifest_record "fedora" "dnf_pkg" "unzip" if ssh_exec FEDORA "unzip -v" &>/dev/null; then log_success "unzip installed on Fedora" else log_warn "Failed to install unzip on Fedora — backup/restore may not work" fi fi # -------------------------------------------------------------------------- # Minimum version checks for remote tools # -------------------------------------------------------------------------- log_info "Checking minimum versions on Fedora..." check_remote_min_version "FEDORA" "docker" "docker --version" "20.0" check_remote_min_version "FEDORA" "docker-compose" "docker compose version" "2.0" check_remote_min_version "FEDORA" "jq" "jq --version" "1.6" # -------------------------------------------------------------------------- # Verify Docker works without sudo # -------------------------------------------------------------------------- log_info "Testing Docker without sudo..." if ssh_exec FEDORA "docker run --rm hello-world" &>/dev/null; then log_success "Docker runs without sudo" else log_warn "Docker requires sudo or group membership hasn't taken effect." log_warn "Log out and back in to Fedora, then re-run this script." fi # -------------------------------------------------------------------------- # Data path # -------------------------------------------------------------------------- log_info "Verifying data path: $FEDORA_GITEA_DATA_PATH" if ssh_exec FEDORA "mkdir -p '$FEDORA_GITEA_DATA_PATH' && touch '$FEDORA_GITEA_DATA_PATH/.write-test' && rm '$FEDORA_GITEA_DATA_PATH/.write-test'"; then log_success "Data path exists and is writable" else log_error "Cannot write to $FEDORA_GITEA_DATA_PATH on Fedora" exit 1 fi # -------------------------------------------------------------------------- # Summary # -------------------------------------------------------------------------- log_success "All Fedora prerequisites satisfied"