feat(installer): add prerequisite checks and auto-detection

This commit is contained in:
hsiegeln
2026-04-13 16:24:55 +02:00
parent 1e348eb8ca
commit 4debee966a

View File

@@ -287,3 +287,91 @@ load_env_overrides() {
[ -z "$DOCKER_SOCKET" ] && DOCKER_SOCKET="$_ENV_DOCKER_SOCKET"
[ -z "$NODE_TLS_REJECT" ] && NODE_TLS_REJECT="$_ENV_NODE_TLS_REJECT"
}
# --- Prerequisites ---
check_prerequisites() {
log_info "Checking prerequisites..."
local errors=0
if ! command -v docker >/dev/null 2>&1; then
log_error "Docker is not installed."
echo " Install Docker Engine: https://docs.docker.com/engine/install/"
errors=$((errors + 1))
else
local docker_version
docker_version=$(docker version --format '{{.Server.Version}}' 2>/dev/null || echo "unknown")
log_info "Docker version: $docker_version"
fi
if ! docker compose version >/dev/null 2>&1; then
log_error "Docker Compose v2 is not available."
echo " 'docker compose' subcommand required (not standalone docker-compose)."
errors=$((errors + 1))
else
local compose_version
compose_version=$(docker compose version --short 2>/dev/null || echo "unknown")
log_info "Docker Compose version: $compose_version"
fi
if ! command -v openssl >/dev/null 2>&1; then
log_error "OpenSSL is not installed (needed for password generation)."
errors=$((errors + 1))
fi
local socket="${DOCKER_SOCKET:-$DEFAULT_DOCKER_SOCKET}"
if [ ! -S "$socket" ]; then
log_warn "Docker socket not found at $socket"
fi
check_port_available "${HTTP_PORT:-$DEFAULT_HTTP_PORT}" "HTTP"
check_port_available "${HTTPS_PORT:-$DEFAULT_HTTPS_PORT}" "HTTPS"
check_port_available "${LOGTO_CONSOLE_PORT:-$DEFAULT_LOGTO_CONSOLE_PORT}" "Logto Console"
if [ $errors -gt 0 ]; then
log_error "$errors prerequisite(s) not met. Please install missing dependencies and retry."
exit 1
fi
log_success "All prerequisites met."
}
check_port_available() {
local port="$1" name="$2"
if command -v ss >/dev/null 2>&1; then
if ss -tlnp 2>/dev/null | grep -q ":${port} "; then
log_warn "Port $port ($name) is already in use."
fi
elif command -v netstat >/dev/null 2>&1; then
if netstat -tlnp 2>/dev/null | grep -q ":${port} "; then
log_warn "Port $port ($name) is already in use."
fi
fi
}
# --- Auto-detection ---
auto_detect() {
if [ -z "$PUBLIC_HOST" ]; then
PUBLIC_HOST=$(hostname -f 2>/dev/null || hostname 2>/dev/null || echo "localhost")
local primary_ip
primary_ip=$(ip route get 1.1.1.1 2>/dev/null | awk '{print $7; exit}' || true)
if [ -n "$primary_ip" ]; then
local rdns
rdns=$(dig +short -x "$primary_ip" 2>/dev/null | sed 's/\.$//' || true)
[ -n "$rdns" ] && PUBLIC_HOST="$rdns"
fi
fi
if [ -z "$DOCKER_SOCKET" ]; then
DOCKER_SOCKET="$DEFAULT_DOCKER_SOCKET"
fi
}
detect_existing_install() {
local dir="${INSTALL_DIR:-$DEFAULT_INSTALL_DIR}"
if [ -f "$dir/cameleer.conf" ]; then
IS_RERUN=true
INSTALL_DIR="$dir"
load_config_file "$dir/cameleer.conf"
fi
}