#!/usr/bin/env bash set -euo pipefail CAMELEER_INSTALLER_VERSION="1.0.0" CAMELEER_DEFAULT_VERSION="latest" REGISTRY="gitea.siegeln.net/cameleer" # --- Colors --- RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' BOLD='\033[1m' NC='\033[0m' # --- Defaults --- DEFAULT_INSTALL_DIR="./cameleer" DEFAULT_PUBLIC_PROTOCOL="https" DEFAULT_ADMIN_USER="admin" DEFAULT_TLS_MODE="self-signed" DEFAULT_HTTP_PORT="80" DEFAULT_HTTPS_PORT="443" DEFAULT_LOGTO_CONSOLE_PORT="3002" DEFAULT_LOGTO_CONSOLE_EXPOSED="true" DEFAULT_VENDOR_ENABLED="false" DEFAULT_VENDOR_USER="vendor" DEFAULT_COMPOSE_PROJECT="cameleer-saas" DEFAULT_DOCKER_SOCKET="/var/run/docker.sock" # --- Config values (set by args/env/config/prompts) --- # Save environment values before initialization (CLI args override these) _ENV_PUBLIC_HOST="${PUBLIC_HOST:-}" _ENV_PUBLIC_PROTOCOL="${PUBLIC_PROTOCOL:-}" _ENV_POSTGRES_PASSWORD="${POSTGRES_PASSWORD:-}" _ENV_CLICKHOUSE_PASSWORD="${CLICKHOUSE_PASSWORD:-}" _ENV_TLS_MODE="${TLS_MODE:-}" _ENV_CERT_FILE="${CERT_FILE:-}" _ENV_KEY_FILE="${KEY_FILE:-}" _ENV_CA_FILE="${CA_FILE:-}" _ENV_HTTP_PORT="${HTTP_PORT:-}" _ENV_HTTPS_PORT="${HTTPS_PORT:-}" _ENV_LOGTO_CONSOLE_PORT="${LOGTO_CONSOLE_PORT:-}" _ENV_LOGTO_CONSOLE_EXPOSED="${LOGTO_CONSOLE_EXPOSED:-}" _ENV_VENDOR_ENABLED="${VENDOR_ENABLED:-}" _ENV_VENDOR_USER="${VENDOR_USER:-}" _ENV_VENDOR_PASS="${VENDOR_PASS:-}" _ENV_MONITORING_NETWORK="${MONITORING_NETWORK:-}" _ENV_COMPOSE_PROJECT="${COMPOSE_PROJECT:-}" _ENV_DOCKER_SOCKET="${DOCKER_SOCKET:-}" _ENV_NODE_TLS_REJECT="${NODE_TLS_REJECT:-}" INSTALL_DIR="" PUBLIC_HOST="" PUBLIC_PROTOCOL="" ADMIN_USER="" ADMIN_PASS="" TLS_MODE="" CERT_FILE="" KEY_FILE="" CA_FILE="" POSTGRES_PASSWORD="" CLICKHOUSE_PASSWORD="" HTTP_PORT="" HTTPS_PORT="" LOGTO_CONSOLE_PORT="" LOGTO_CONSOLE_EXPOSED="" VENDOR_ENABLED="" VENDOR_USER="" VENDOR_PASS="" MONITORING_NETWORK="" VERSION="" COMPOSE_PROJECT="" DOCKER_SOCKET="" NODE_TLS_REJECT="" # --- State --- MODE="" # simple, expert, silent IS_RERUN=false RERUN_ACTION="" # upgrade, reconfigure, reinstall CONFIRM_DESTROY=false CONFIG_FILE_PATH="" # --- Utility functions --- log_info() { echo -e "${GREEN}[INFO]${NC} $1"; } log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; } log_error() { echo -e "${RED}[ERROR]${NC} $1"; } log_success() { echo -e "${GREEN}[OK]${NC} $1"; } print_banner() { echo -e "${BOLD}" echo " ____ _ " echo " / ___|__ _ _ __ ___ ___ | | ___ ___ _ __ " echo "| | / _\` | '_ \` _ \\ / _ \\| |/ _ \\/ _ \\ '__|" echo "| |__| (_| | | | | | | __/| | __/ __/ | " echo " \\____\\__,_|_| |_| |_|\\___||_|\\___|\\___||_| " echo "" echo " SaaS Platform Installer v${CAMELEER_INSTALLER_VERSION}" echo -e "${NC}" } prompt() { local var_name="$1" prompt_text="$2" default="${3:-}" local input if [ -n "$default" ]; then read -rp " $prompt_text [$default]: " input eval "$var_name=\"\${input:-$default}\"" else read -rp " $prompt_text: " input eval "$var_name=\"\$input\"" fi } prompt_password() { local var_name="$1" prompt_text="$2" default="${3:-}" local input if [ -n "$default" ]; then read -rsp " $prompt_text [${default:+********}]: " input echo eval "$var_name=\"\${input:-$default}\"" else read -rsp " $prompt_text: " input echo eval "$var_name=\"\$input\"" fi } prompt_yesno() { local prompt_text="$1" default="${2:-n}" local input if [ "$default" = "y" ]; then read -rp " $prompt_text [Y/n]: " input case "${input:-y}" in [nN]|[nN][oO]) return 1 ;; *) return 0 ;; esac else read -rp " $prompt_text [y/N]: " input case "${input:-n}" in [yY]|[yY][eE][sS]) return 0 ;; *) return 1 ;; esac fi } generate_password() { openssl rand -base64 24 | tr -d '/+=' | head -c 32 }