#!/usr/bin/env bash # # CSVox PBX one-liner installer. # # Usage: # bash <(curl -fsSL csvox.sh) # # What this does: # 1. Detects the distro codename (trixie, noble) — fails on anything else. # 2. Adds packages.sury.org/php (Sury) — provides PHP 8.4. # 3. Adds repo.csvox.com — provides csvox-freeswitch + csvox-pbx. # 4. apt-get install csvox-pbx (which pulls csvox-freeswitch as a dep). # 5. Prints next-steps with the URL to open the in-app /setup wizard. # # Requirements: # - Debian 13 (trixie) or Ubuntu 24.04 (noble), amd64. # - root or sudo. # - Outbound HTTPS to packages.sury.org and repo.csvox.com. # # Idempotent: re-running won't error if the apt sources are already in place. # Re-running WILL upgrade csvox-pbx if a newer version is published. set -euo pipefail # ---------- pretty output ---------- NC='\033[0m' RED='\033[0;31m' GRN='\033[0;32m' YLW='\033[1;33m' BLU='\033[0;34m' info() { printf '%b==>%b %s\n' "$BLU" "$NC" "$*"; } ok() { printf '%bOK%b %s\n' "$GRN" "$NC" "$*"; } warn() { printf '%bWARN%b %s\n' "$YLW" "$NC" "$*" >&2; } die() { printf '%bFAIL%b %s\n' "$RED" "$NC" "$*" >&2; exit 1; } # ---------- preflight ---------- if [ "${EUID:-$(id -u)}" -ne 0 ]; then if command -v sudo >/dev/null 2>&1; then SUDO="sudo" else die "Run as root, or install sudo first." fi else SUDO="" fi # Tools we always need before doing anything else. $SUDO apt-get update -qq $SUDO DEBIAN_FRONTEND=noninteractive apt-get install --yes --no-install-recommends \ ca-certificates curl gnupg lsb-release CODENAME="$(lsb_release -sc)" case "$CODENAME" in trixie|noble) ok "Detected supported distro codename: $CODENAME" ;; *) die "Unsupported distro codename: $CODENAME (supported: trixie, noble)" ;; esac # ---------- PHP 8.4 source ---------- # Same maintainer (Ondrej Sury), different distribution path: # * Debian: packages.sury.org/php (codename-keyed) # * Ubuntu: ppa:ondrej/php (the launchpad PPA) # Sury's CDN deliberately returns HTTP 418 for Ubuntu codenames at # packages.sury.org/php to push Ubuntu users to the PPA, so we have # to branch here. case "$CODENAME" in trixie) if [ ! -f /etc/apt/sources.list.d/sury-php.list ]; then info "Adding packages.sury.org PHP repo (Debian)" $SUDO install -d -m 0755 /etc/apt/keyrings curl -fsSL https://packages.sury.org/php/apt.gpg \ | $SUDO gpg --dearmor -o /etc/apt/keyrings/sury-php.gpg echo "deb [signed-by=/etc/apt/keyrings/sury-php.gpg] https://packages.sury.org/php/ $CODENAME main" \ | $SUDO tee /etc/apt/sources.list.d/sury-php.list >/dev/null ok "Sury PHP repo configured" else ok "Sury PHP repo already configured" fi ;; noble) if ! grep -rq '^deb .*ondrej/php' /etc/apt/sources.list.d/ 2>/dev/null; then info "Adding ppa:ondrej/php (Ubuntu)" $SUDO DEBIAN_FRONTEND=noninteractive apt-get install --yes --no-install-recommends \ software-properties-common $SUDO add-apt-repository --yes ppa:ondrej/php ok "Ondrej PHP PPA configured" else ok "Ondrej PHP PPA already configured" fi ;; esac # ---------- repo.csvox.com ---------- if [ ! -f /etc/apt/sources.list.d/csvox.list ]; then info "Adding repo.csvox.com" $SUDO install -d -m 0755 /etc/apt/keyrings curl -fsSL https://repo.csvox.com/csvox-archive-keyring.gpg \ | $SUDO tee /etc/apt/keyrings/csvox-archive-keyring.gpg >/dev/null echo "deb [signed-by=/etc/apt/keyrings/csvox-archive-keyring.gpg] https://repo.csvox.com $CODENAME main" \ | $SUDO tee /etc/apt/sources.list.d/csvox.list >/dev/null ok "CSVox repo configured" else ok "CSVox repo already configured" fi # ---------- install ---------- info "Refreshing package lists..." $SUDO apt-get update -qq info "Installing csvox-pbx — this pulls csvox-freeswitch + ~30 deps," info "and runs the first-install postinst (database, .env, FS baseline)." $SUDO DEBIAN_FRONTEND=noninteractive apt-get install --yes csvox-pbx # ---------- next steps ---------- HOSTNAME_FQDN="$(hostname -f 2>/dev/null || hostname)" cat <