#!/usr/bin/env bash set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" REPO_ROOT="$(cd "$ROOT/../../.." && pwd)" ENV_FILE="$ROOT/.env"; [[ -f "$ENV_FILE" ]] || cp "$ROOT/.env.example" "$ENV_FILE" # Load build user (UID/GID) from repo config to match container runtime users if [[ -f "$REPO_ROOT/scripts/common/build_user.sh" ]]; then # shellcheck disable=SC1091 source "$REPO_ROOT/scripts/common/build_user.sh" 2>/dev/null || true if declare -f load_build_user >/dev/null 2>&1; then load_build_user fi fi # Capture resolved UID/GID from build_user before sourcing .env uid_resolved="${ARGUS_BUILD_UID:-2133}" gid_resolved="${ARGUS_BUILD_GID:-2015}" echo "[BOOT] resolved build user: UID=${uid_resolved} GID=${gid_resolved} (from scripts/common/build_user.sh or env)" # After resolving UID/GID, load .env for other settings; then we will overwrite UID/GID entries set -a; source "$ENV_FILE"; set +a echo "[BOOT] checking Docker Swarm" if ! docker info 2>/dev/null | grep -q "Swarm: active"; then echo "[BOOT] initializing swarm (single-node)" docker swarm init >/dev/null 2>&1 || true fi NET_NAME=argus-sys-net if docker network inspect "$NET_NAME" >/dev/null 2>&1; then echo "[BOOT] overlay network exists: $NET_NAME" else echo "[BOOT] creating overlay network: $NET_NAME" docker network create -d overlay --attachable "$NET_NAME" fi echo "[BOOT] preparing private directories (server/nodes)" # Server-side dirs (align with sys/tests 01_bootstrap.sh) mkdir -p \ "$ROOT/private-server/argus/etc" \ "$ROOT/private-server/argus/master" \ "$ROOT/private-server/argus/metric/prometheus" \ "$ROOT/private-server/argus/metric/prometheus/data" \ "$ROOT/private-server/argus/metric/prometheus/rules" \ "$ROOT/private-server/argus/metric/prometheus/targets" \ "$ROOT/private-server/argus/alert/alertmanager" \ "$ROOT/private-server/argus/metric/ftp/share" \ "$ROOT/private-server/argus/metric/grafana/data" \ "$ROOT/private-server/argus/metric/grafana/logs" \ "$ROOT/private-server/argus/metric/grafana/plugins" \ "$ROOT/private-server/argus/metric/grafana/provisioning/datasources" \ "$ROOT/private-server/argus/metric/grafana/provisioning/dashboards" \ "$ROOT/private-server/argus/metric/grafana/data/sessions" \ "$ROOT/private-server/argus/metric/grafana/data/dashboards" \ "$ROOT/private-server/argus/metric/grafana/config" \ "$ROOT/private-server/argus/agent" \ "$ROOT/private-server/argus/log/elasticsearch" \ "$ROOT/private-server/argus/log/kibana" mkdir -p "$ROOT/private-nodes/argus/agent" uid="$uid_resolved"; gid="$gid_resolved" echo "[BOOT] chown -R ${uid}:${gid} for server core dirs (best-effort)" chown -R "$uid":"$gid" \ "$ROOT/private-server/argus/log/elasticsearch" \ "$ROOT/private-server/argus/log/kibana" \ "$ROOT/private-server/argus/metric/grafana" \ "$ROOT/private-server/argus/metric/prometheus" \ "$ROOT/private-server/argus/alert" \ "$ROOT/private-server/argus/agent" \ "$ROOT/private-server/argus/etc" 2>/dev/null || true chmod -R g+w "$ROOT/private-server/argus/alert" "$ROOT/private-server/argus/etc" 2>/dev/null || true # ensure .env carries the resolved UID/GID for compose env interpolation if grep -q '^ARGUS_BUILD_UID=' "$ENV_FILE"; then sed -i "s/^ARGUS_BUILD_UID=.*/ARGUS_BUILD_UID=${uid}/" "$ENV_FILE" else echo "ARGUS_BUILD_UID=${uid}" >> "$ENV_FILE" fi if grep -q '^ARGUS_BUILD_GID=' "$ENV_FILE"; then sed -i "s/^ARGUS_BUILD_GID=.*/ARGUS_BUILD_GID=${gid}/" "$ENV_FILE" else echo "ARGUS_BUILD_GID=${gid}" >> "$ENV_FILE" fi echo "[BOOT] done"