#!/usr/bin/env bash set -euo pipefail ######################################## # Seby's Calagopus Panel Updater ######################################## ######################################## # Styling ######################################## BOLD="\033[1m" GREEN="\033[32m" YELLOW="\033[33m" RED="\033[31m" BLUE="\033[34m" RESET="\033[0m" section() { printf "\n${BLUE}${BOLD}==> %s${RESET}\n" "$*"; } say() { printf "${GREEN}✔ %s${RESET}\n" "$*"; } warn() { printf "${YELLOW}⚠ %s${RESET}\n" "$*"; } err() { printf "${RED}✖ %s${RESET}\n" "$*"; } have() { command -v "$1" >/dev/null 2>&1; } ######################################## # Prompt helper (curl | bash safe) ######################################## TTY="/dev/tty" prompt() { local msg="$1" local out printf "${BOLD}%s${RESET}" "$msg" >"$TTY" IFS= read -r out <"$TTY" printf "%s" "$out" } confirm_default_no() { local msg="$1" local ans ans="$(prompt "$msg [y/N]: ")" [[ "${ans,,}" == "y" || "${ans,,}" == "yes" ]] } ######################################## # Config ######################################## APP_DIR="calagopus" ######################################## # Header ######################################## clear cat << "EOF" ____ _ / ___|__ _| | __ _ __ _ ___ _ __ _ _ ___ | | / _` | |/ _` |/ _` |/ _ \| '_ \| | | / __| | |__| (_| | | (_| | (_| | (_) | |_) | |_| \__ \ \____\__,_|_|\__,_|\__, |\___/| .__/ \__,_|___/ |___/ |_| Calagopus Panel Updater | v1.1 EOF ######################################## # Checks ######################################## section "Pre-flight Checks" if ! have docker; then err "Docker is not installed. Aborting." exit 1 fi say "Docker detected: $(docker --version)" if ! docker compose version >/dev/null 2>&1; then err "Docker Compose plugin not found. Aborting." exit 1 fi say "Docker Compose detected: $(docker compose version --short 2>/dev/null || docker compose version)" if [[ ! -d "$APP_DIR" ]]; then err "Directory '${APP_DIR}' not found in $(pwd). Aborting." exit 1 fi say "Found ${APP_DIR}/" cd "$APP_DIR" if [[ ! -f "docker-compose.yml" && ! -f "compose.yaml" && ! -f "compose.yml" ]]; then err "No docker-compose file found in ${APP_DIR}/. Aborting." exit 1 fi ######################################## # Update ######################################## section "Stopping Panel" docker compose down say "Stopped" section "Pulling Latest Images" docker compose pull say "Images updated" section "Starting Panel" docker compose up -d say "The panel is back up" ######################################## # Cleanup ######################################## section "Cleanup" if confirm_default_no "Remove old/unused Docker images, containers, and cache?"; then docker image prune -af docker container prune -f docker builder prune -af say "Old Docker cache cleared" else warn "Skipping cleanup" fi section "Done" say "Calagopus Panel update complete."