From 1e348eb8ca0592f94acd5b68263d9fb8fa0c7d93 Mon Sep 17 00:00:00 2001 From: hsiegeln <37154749+hsiegeln@users.noreply.github.com> Date: Mon, 13 Apr 2026 16:24:35 +0200 Subject: [PATCH] feat(installer): add argument parsing and config file handling --- installer/install.sh | 145 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 145 insertions(+) diff --git a/installer/install.sh b/installer/install.sh index e29bc20..9a10a11 100644 --- a/installer/install.sh +++ b/installer/install.sh @@ -142,3 +142,148 @@ prompt_yesno() { generate_password() { openssl rand -base64 24 | tr -d '/+=' | head -c 32 } + +# --- Argument parsing --- + +parse_args() { + while [ $# -gt 0 ]; do + case "$1" in + --silent) MODE="silent" ;; + --expert) MODE="expert" ;; + --config) CONFIG_FILE_PATH="$2"; shift ;; + --install-dir) INSTALL_DIR="$2"; shift ;; + --public-host) PUBLIC_HOST="$2"; shift ;; + --public-protocol) PUBLIC_PROTOCOL="$2"; shift ;; + --admin-user) ADMIN_USER="$2"; shift ;; + --admin-password) ADMIN_PASS="$2"; shift ;; + --tls-mode) TLS_MODE="$2"; shift ;; + --cert-file) CERT_FILE="$2"; shift ;; + --key-file) KEY_FILE="$2"; shift ;; + --ca-file) CA_FILE="$2"; shift ;; + --postgres-password) POSTGRES_PASSWORD="$2"; shift ;; + --clickhouse-password) CLICKHOUSE_PASSWORD="$2"; shift ;; + --http-port) HTTP_PORT="$2"; shift ;; + --https-port) HTTPS_PORT="$2"; shift ;; + --logto-console-port) LOGTO_CONSOLE_PORT="$2"; shift ;; + --logto-console-exposed) LOGTO_CONSOLE_EXPOSED="$2"; shift ;; + --vendor-enabled) VENDOR_ENABLED="$2"; shift ;; + --vendor-user) VENDOR_USER="$2"; shift ;; + --vendor-password) VENDOR_PASS="$2"; shift ;; + --monitoring-network) MONITORING_NETWORK="$2"; shift ;; + --version) VERSION="$2"; shift ;; + --compose-project) COMPOSE_PROJECT="$2"; shift ;; + --docker-socket) DOCKER_SOCKET="$2"; shift ;; + --node-tls-reject) NODE_TLS_REJECT="$2"; shift ;; + --reconfigure) RERUN_ACTION="reconfigure" ;; + --reinstall) RERUN_ACTION="reinstall" ;; + --confirm-destroy) CONFIRM_DESTROY=true ;; + --help|-h) show_help; exit 0 ;; + *) + log_error "Unknown option: $1" + echo " Run with --help for usage." + exit 1 + ;; + esac + shift + done +} + +show_help() { + echo "Usage: install.sh [OPTIONS]" + echo "" + echo "Modes:" + echo " (default) Interactive simple mode (6 questions)" + echo " --expert Interactive expert mode (all options)" + echo " --silent Non-interactive, use defaults + overrides" + echo "" + echo "Options:" + echo " --install-dir DIR Install directory (default: ./cameleer)" + echo " --public-host HOST Public hostname (default: auto-detect)" + echo " --admin-user USER Admin username (default: admin)" + echo " --admin-password PASS Admin password (default: generated)" + echo " --tls-mode MODE self-signed or custom (default: self-signed)" + echo " --cert-file PATH TLS certificate file" + echo " --key-file PATH TLS key file" + echo " --ca-file PATH CA bundle file" + echo " --monitoring-network NAME Docker network for Prometheus scraping" + echo " --version TAG Image version tag (default: latest)" + echo " --config FILE Load config from file" + echo " --help Show this help" + echo "" + echo "Expert options:" + echo " --postgres-password, --clickhouse-password, --http-port," + echo " --https-port, --logto-console-port, --logto-console-exposed," + echo " --vendor-enabled, --vendor-user, --vendor-password," + echo " --compose-project, --docker-socket, --node-tls-reject" + echo "" + echo "Re-run options:" + echo " --reconfigure Re-run interactive setup (preserve data)" + echo " --reinstall --confirm-destroy Fresh install (destroys data)" + echo "" + echo "Config precedence: CLI flags > env vars > config file > defaults" +} + +# --- Config file handling --- + +load_config_file() { + local file="$1" + [ ! -f "$file" ] && return + while IFS='=' read -r key value; do + case "$key" in + \#*|"") continue ;; + esac + key=$(echo "$key" | tr -d ' ') + value=$(echo "$value" | sed 's/^[ ]*//;s/[ ]*$//') + case "$key" in + install_dir) [ -z "$INSTALL_DIR" ] && INSTALL_DIR="$value" ;; + public_host) [ -z "$PUBLIC_HOST" ] && PUBLIC_HOST="$value" ;; + public_protocol) [ -z "$PUBLIC_PROTOCOL" ] && PUBLIC_PROTOCOL="$value" ;; + admin_user) [ -z "$ADMIN_USER" ] && ADMIN_USER="$value" ;; + admin_password) [ -z "$ADMIN_PASS" ] && ADMIN_PASS="$value" ;; + tls_mode) [ -z "$TLS_MODE" ] && TLS_MODE="$value" ;; + cert_file) [ -z "$CERT_FILE" ] && CERT_FILE="$value" ;; + key_file) [ -z "$KEY_FILE" ] && KEY_FILE="$value" ;; + ca_file) [ -z "$CA_FILE" ] && CA_FILE="$value" ;; + postgres_password) [ -z "$POSTGRES_PASSWORD" ] && POSTGRES_PASSWORD="$value" ;; + clickhouse_password) [ -z "$CLICKHOUSE_PASSWORD" ] && CLICKHOUSE_PASSWORD="$value" ;; + http_port) [ -z "$HTTP_PORT" ] && HTTP_PORT="$value" ;; + https_port) [ -z "$HTTPS_PORT" ] && HTTPS_PORT="$value" ;; + logto_console_port) [ -z "$LOGTO_CONSOLE_PORT" ] && LOGTO_CONSOLE_PORT="$value" ;; + logto_console_exposed) [ -z "$LOGTO_CONSOLE_EXPOSED" ] && LOGTO_CONSOLE_EXPOSED="$value" ;; + vendor_enabled) [ -z "$VENDOR_ENABLED" ] && VENDOR_ENABLED="$value" ;; + vendor_user) [ -z "$VENDOR_USER" ] && VENDOR_USER="$value" ;; + vendor_password) [ -z "$VENDOR_PASS" ] && VENDOR_PASS="$value" ;; + monitoring_network) [ -z "$MONITORING_NETWORK" ] && MONITORING_NETWORK="$value" ;; + version) [ -z "$VERSION" ] && VERSION="$value" ;; + compose_project) [ -z "$COMPOSE_PROJECT" ] && COMPOSE_PROJECT="$value" ;; + docker_socket) [ -z "$DOCKER_SOCKET" ] && DOCKER_SOCKET="$value" ;; + node_tls_reject) [ -z "$NODE_TLS_REJECT" ] && NODE_TLS_REJECT="$value" ;; + esac + done < "$file" +} + +load_env_overrides() { + [ -z "$INSTALL_DIR" ] && INSTALL_DIR="${CAMELEER_INSTALL_DIR:-}" + [ -z "$PUBLIC_HOST" ] && PUBLIC_HOST="$_ENV_PUBLIC_HOST" + [ -z "$PUBLIC_PROTOCOL" ] && PUBLIC_PROTOCOL="$_ENV_PUBLIC_PROTOCOL" + [ -z "$ADMIN_USER" ] && ADMIN_USER="${SAAS_ADMIN_USER:-}" + [ -z "$ADMIN_PASS" ] && ADMIN_PASS="${SAAS_ADMIN_PASS:-}" + [ -z "$TLS_MODE" ] && TLS_MODE="$_ENV_TLS_MODE" + [ -z "$CERT_FILE" ] && CERT_FILE="$_ENV_CERT_FILE" + [ -z "$KEY_FILE" ] && KEY_FILE="$_ENV_KEY_FILE" + [ -z "$CA_FILE" ] && CA_FILE="$_ENV_CA_FILE" + [ -z "$POSTGRES_PASSWORD" ] && POSTGRES_PASSWORD="$_ENV_POSTGRES_PASSWORD" + [ -z "$CLICKHOUSE_PASSWORD" ] && CLICKHOUSE_PASSWORD="$_ENV_CLICKHOUSE_PASSWORD" + [ -z "$HTTP_PORT" ] && HTTP_PORT="$_ENV_HTTP_PORT" + [ -z "$HTTPS_PORT" ] && HTTPS_PORT="$_ENV_HTTPS_PORT" + [ -z "$LOGTO_CONSOLE_PORT" ] && LOGTO_CONSOLE_PORT="$_ENV_LOGTO_CONSOLE_PORT" + [ -z "$LOGTO_CONSOLE_EXPOSED" ] && LOGTO_CONSOLE_EXPOSED="$_ENV_LOGTO_CONSOLE_EXPOSED" + [ -z "$VENDOR_ENABLED" ] && VENDOR_ENABLED="$_ENV_VENDOR_ENABLED" + [ -z "$VENDOR_USER" ] && VENDOR_USER="$_ENV_VENDOR_USER" + [ -z "$VENDOR_PASS" ] && VENDOR_PASS="$_ENV_VENDOR_PASS" + [ -z "$MONITORING_NETWORK" ] && MONITORING_NETWORK="$_ENV_MONITORING_NETWORK" + [ -z "$VERSION" ] && VERSION="${CAMELEER_VERSION:-}" + [ -z "$COMPOSE_PROJECT" ] && COMPOSE_PROJECT="$_ENV_COMPOSE_PROJECT" + [ -z "$DOCKER_SOCKET" ] && DOCKER_SOCKET="$_ENV_DOCKER_SOCKET" + [ -z "$NODE_TLS_REJECT" ] && NODE_TLS_REJECT="$_ENV_NODE_TLS_REJECT" +}