#!/usr/bin/env bash set -Eeuo pipefail RELEASE_URL="${LABPANEL_RELEASE_URL:-https://updates.locinode.xyz/labpanel/latest/labpanel.tar.gz}" INSTALL_DIR="${LABPANEL_INSTALL_DIR:-/opt/labpanel}" DOMAIN="${LABPANEL_DOMAIN:-panel.locinode.xyz}" log(){ printf '\033[1;32m[LabPanel]\033[0m %s\n' "$*"; } fail(){ printf '\033[1;31m[LabPanel]\033[0m %s\n' "$*" >&2; exit 1; } [[ ${EUID:-$(id -u)} -eq 0 ]] || fail "Run this installer with sudo or as root." [[ -r /etc/os-release ]] || fail "A supported Debian or Ubuntu system is required." . /etc/os-release case "${ID:-}" in debian|ubuntu) ;; *) fail "Supported systems: Debian and Ubuntu." ;; esac export DEBIAN_FRONTEND=noninteractive log "Installing required system packages" apt-get update -qq apt-get install -y -qq ca-certificates curl gnupg openssl tar >/dev/null install_docker(){ log "Installing Docker Engine" install -m 0755 -d /etc/apt/keyrings curl -fsSL "https://download.docker.com/linux/${ID}/gpg" -o /etc/apt/keyrings/docker.asc chmod a+r /etc/apt/keyrings/docker.asc local codename="${VERSION_CODENAME:-}" [[ -n "$codename" ]] || codename="$(. /etc/os-release && echo "$VERSION_CODENAME")" echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/${ID} ${codename} stable" > /etc/apt/sources.list.d/docker.list apt-get update -qq apt-get install -y -qq docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin >/dev/null systemctl enable --now docker } command -v docker >/dev/null 2>&1 || install_docker docker compose version >/dev/null 2>&1 || fail "Docker Compose v2 is required." work="$(mktemp -d)" trap 'rm -rf "$work"' EXIT log "Downloading and verifying the LabPanel release" curl -fsSL "$RELEASE_URL" -o "$work/labpanel.tar.gz" curl -fsSL "${RELEASE_URL}.sha256" -o "$work/labpanel.tar.gz.sha256" expected="$(awk '{print $1}' "$work/labpanel.tar.gz.sha256")" actual="$(sha256sum "$work/labpanel.tar.gz" | awk '{print $1}')" [[ -n "$expected" && "$expected" == "$actual" ]] || fail "Release checksum verification failed." mkdir -p "$INSTALL_DIR" "$INSTALL_DIR/data" /var/lib/labpanel-agent/edge/sites tar -xzf "$work/labpanel.tar.gz" -C "$INSTALL_DIR" --strip-components=1 cd "$INSTALL_DIR" cp deploy/Caddyfile deploy/Caddyfile.active if [[ "${LABPANEL_OFFICIAL_DISTRIBUTION:-false}" == "true" || -f .official-distribution ]]; then touch .official-distribution cat deploy/Caddyfile.distribution >> deploy/Caddyfile.active fi chown -R 10001:10001 data if [[ ! -f .env ]]; then umask 077 cat > .env </dev/null 2>&1; then break; fi sleep 2 done curl -fsS http://127.0.0.1:8080/api/health >/dev/null || fail "LabPanel did not become healthy. Run: cd $INSTALL_DIR && docker compose logs" install -m 0755 deploy/labpanel-cli /usr/local/bin/labpanel if command -v ufw >/dev/null 2>&1 && ufw status | grep -qi 'Status: active'; then ufw allow 80/tcp >/dev/null || true ufw allow 443/tcp >/dev/null || true fi log "Installation complete" printf '\n Open: https://%s\n Setup: create the owner account in your browser\n Status: labpanel status\n Logs: labpanel logs\n\n' "$DOMAIN"