#!/usr/bin/env bash set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PKG_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" # version root PROJECT_NAME="argus-sys" log() { echo -e "\033[0;34m[INSTALL]\033[0m $*"; } err() { echo -e "\033[0;31m[ERROR ]\033[0m $*" >&2; } require() { command -v "$1" >/dev/null 2>&1 || { err "missing command: $1"; exit 1; }; } require docker if docker compose version >/dev/null 2>&1; then COMPOSE=(docker compose); else require docker-compose; COMPOSE=(docker-compose); fi ENV_FILE="$PKG_ROOT/compose/.env" ENV_TEMPLATE="$PKG_ROOT/compose/.env.example" find_free_port() { local prefer="$1"; local start=${2:-20000}; local max=${3:-65000}; if ! ss -ltnH 2>/dev/null | awk -v pat=":"$prefer"$" '$4 ~ pat{f=1} END{exit f?0:1}'; then echo "$prefer"; return; fi for ((p=start; p<=max; p++)); do if ! ss -ltnH 2>/dev/null | awk -v pat=":"$p"$" '$4 ~ pat{f=1} END{exit f?0:1}'; then echo "$p"; return; fi done return 1 } prepare_env() { if [[ -f "$ENV_FILE" ]]; then log ".env exists, keep as-is"; return; fi [[ -f "$ENV_TEMPLATE" ]] || { err "missing $ENV_TEMPLATE"; exit 1; } cp "$ENV_TEMPLATE" "$ENV_FILE" # auto-assign ports if busy for key in MASTER_PORT ES_HTTP_PORT KIBANA_PORT NODE_A_PORT NODE_B_PORT PROMETHEUS_PORT GRAFANA_PORT ALERTMANAGER_PORT \ WEB_PROXY_PORT_8080 WEB_PROXY_PORT_8081 WEB_PROXY_PORT_8082 WEB_PROXY_PORT_8083 WEB_PROXY_PORT_8084 WEB_PROXY_PORT_8085 \ FTP_PORT FTP_DATA_PORT; do val=$(grep -E "^${key}=" "$ENV_FILE" | tail -1 | cut -d= -f2) new=$(find_free_port "$val") || true if [[ -n "${new:-}" && "$new" != "$val" ]]; then sed -i "s/^${key}=.*/${key}=${new}/" "$ENV_FILE" log "port ${key} busy -> ${new}" fi done } load_images() { local tar="$PKG_ROOT/images/all-images.tar.gz" [[ -f "$tar" ]] || { err "missing images tar: $tar"; exit 1; } log "loading images from $(basename "$tar") (may take minutes)" gunzip -c "$tar" | docker load >/dev/null } bring_up() { log "starting services via compose" (cd "$PKG_ROOT/compose" && "${COMPOSE[@]}" -p "$PROJECT_NAME" up -d) } selfcheck() { log "running selfcheck" bash "$PKG_ROOT/scripts/server-selfcheck.sh" || { err "selfcheck failed"; exit 1; } } main() { prepare_env load_images bring_up selfcheck log "install completed. See logs in $PKG_ROOT/logs/" } main "$@"