#!/bin/sh # Do not modify this file. You will lose the ability to install and auto-update! # Install: curl -sSL https://trbp.nl/install.sh | sh # Environment: testing # Exit immediately if a command exits with a non-zero status set -e # Disable exit on undefined variable set +u DATE=$(date +"%Y%m%d-%H%M%S") TURBOPANEL_ENV='testing' INSTALL_DIR='/opt/turbopanel' CDN='https://testing.trbp.nl' install_docker() { case $OS_TYPE in ubuntu | debian | raspbian) apt-get update -y >/dev/null apt-get install -y ca-certificates curl >/dev/null install -m 0755 -d /etc/apt/keyrings curl -fsSL https://get.docker.com | sh ;; centos | fedora | rhel | rocky | almalinux) dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo >/dev/null 2>&1 || true dnf install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin >/dev/null ;; arch) pacman -Sy docker docker-compose --noconfirm >/dev/null ;; alpine) apk add docker docker-cli-compose >/dev/null ;; amzn) dnf install docker -y >/dev/null ;; *) curl -fsSL https://get.docker.com | sh ;; esac } start_docker() { if command -v systemctl >/dev/null 2>&1; then systemctl enable docker >/dev/null 2>&1 || true systemctl start docker >/dev/null 2>&1 || true else service docker start >/dev/null 2>&1 || true fi } get_server_ip() { SERVER_IP=$(curl -4s --max-time 5 https://ifconfig.io 2>/dev/null || hostname -I 2>/dev/null | awk '{print $1}' || echo "unknown") } # Root Check if [ "$(id -u)" -ne 0 ]; then printf "\033[31m%s\033[0m\n" "Please run as root or with sudo" >&2 exit 1 fi # Welcome printf "\033[36m%s\033[0m\n" "==========================================" printf "\033[36m%s\033[0m\n" " TurboPanel Self-Hosted Installer" printf "\033[36m%s\033[0m\n" " Environment: $TURBOPANEL_ENV" printf '%s\n' " Date: $DATE" printf "\033[36m%s\033[0m\n" "==========================================" # Step 1/6: OS Detection UNAME_OS=$(uname -s) case $UNAME_OS in Linux) OS_TYPE=$(. /etc/os-release 2>/dev/null && printf "%s" "$ID" || printf "unknown") case $OS_TYPE in manjaro | manjaro-arm) OS_TYPE='arch' ;; endeavouros | cachyos) OS_TYPE='arch' ;; pop) OS_TYPE='ubuntu' ;; linuxmint | zorin) OS_TYPE='ubuntu' ;; fedora-asahi-remix) OS_TYPE='fedora' ;; esac OS_VERSION=$(. /etc/os-release 2>/dev/null && printf "%s" "$VERSION_ID" || printf "unknown") ;; *) printf "\033[31m%s\033[0m\n" "This installer only supports Linux." >&2 exit 1 ;; esac case $OS_TYPE in ubuntu) ;; debian) ;; raspbian) ;; centos) ;; fedora) ;; rhel) ;; rocky) ;; almalinux) ;; arch) ;; alpine) ;; amzn) ;; *) printf "\033[31m%s\033[0m\n" "Unsupported distribution: $OS_TYPE" >&2 exit 1 ;; esac printf '%s\n' "Detected: $OS_TYPE $OS_VERSION" # Step 2/6: Disk Space Check TOTAL_SPACE_GB=$(df -k -P '/' 2>/dev/null | awk 'NR==2 {print int($2/1048576)}' || echo 0) AVAILABLE_SPACE_GB=$(df -k -P '/' 2>/dev/null | awk 'NR==2 {print int($4/1048576)}' || echo 0) printf '%s\n' "Available: $AVAILABLE_SPACE_GB GB / Required: 25 GB" if [ "$AVAILABLE_SPACE_GB" -lt 25 ]; then printf "\033[33m%s\033[0m\n" "Low disk space. Installation may fail." >&2 sleep 5 fi # Step 3/6: Docker Installation DOCKER_BIN=$(command -v 'docker' 2>/dev/null || true) DOCKER_BIN=$(command -v 'docker' 2>/dev/null || true) printf "\033[32m%s\033[0m\n" "Docker is ready." if [ -z "$DOCKER_BIN" ]; then printf "\033[31m%s\033[0m\n" "Docker installation failed." >&2 exit 1 fi # Step 4/6: Downloading Compose Files mkdir -p "$INSTALL_DIR" cd "$INSTALL_DIR" curl -fsSL "$CDN/docker-compose.yml" -o docker-compose.yml curl -fsSL "$CDN/docker-compose.${TURBOPANEL_ENV}.yml" -o "docker-compose.${TURBOPANEL_ENV}.yml" printf "\033[32m%s\033[0m\n" "Compose files downloaded." if [ ! -f .env ]; then curl -fsSL "$CDN/.env.example" -o .env fi # Step 5/6: Starting TurboPanel printf "\033[33m%s\033[0m\n" "Pulling image..." docker compose -f docker-compose.yml -f "docker-compose.${TURBOPANEL_ENV}.yml" pull docker compose -f docker-compose.yml -f "docker-compose.${TURBOPANEL_ENV}.yml" up -d printf "\033[32m%s\033[0m\n" "Containers started." # Step 6/6: Health Check HEALTH_WAITED='0' HEALTH_WAIT='60' HEALTH='unknown' while [ "$HEALTH_WAITED" -lt "$HEALTH_WAIT" ]; do HEALTH=$(docker inspect --format='{{.State.Health.Status}}' turbopanel 2>/dev/null || echo "unknown") sleep 2 HEALTH_WAITED=$((HEALTH_WAITED + 2)) if [ "$HEALTH" = "healthy" ]; then printf "\033[32m%s\033[0m\n" "TurboPanel is healthy!" break fi done if [ "$HEALTH" != "healthy" ]; then printf "\033[31m%s\033[0m\n" "Health check failed. Check logs: docker logs turbopanel" >&2 exit 1 fi get_server_ip printf '%s\n' "" printf "\033[32m%s\033[0m\n" "==========================================" printf "\033[32m%s\033[0m\n" " TurboPanel installed successfully!" printf "\033[32m%s\033[0m\n" " Access: http://$SERVER_IP:18282" printf "\033[32m%s\033[0m\n" "==========================================" printf "\033[33m%s\033[0m\n" "WARNING: Back up /opt/turbopanel/.env to a safe location."