From f136502a35b99c7fd8f9a44cd95501632b73d755 Mon Sep 17 00:00:00 2001 From: hsiegeln <37154749+hsiegeln@users.noreply.github.com> Date: Mon, 13 Apr 2026 16:22:21 +0200 Subject: [PATCH] feat(installer): scaffold install.sh with constants and utilities Creates the installer skeleton (Phase 2, Task 8) with version/registry constants, color codes, default values, _ENV_* variable capture pattern, config/state variable declarations, and utility functions (log_*, print_banner, prompt, prompt_password, prompt_yesno, generate_password). Co-Authored-By: Claude Sonnet 4.6 --- installer/install.sh | 144 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 144 insertions(+) create mode 100644 installer/install.sh diff --git a/installer/install.sh b/installer/install.sh new file mode 100644 index 0000000..e29bc20 --- /dev/null +++ b/installer/install.sh @@ -0,0 +1,144 @@ +#!/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 +}