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 <noreply@anthropic.com>
145 lines
3.7 KiB
Bash
145 lines
3.7 KiB
Bash
#!/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
|
|
}
|