feat(installer): add argument parsing and config file handling
This commit is contained in:
@@ -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"
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user