#!/usr/bin/env bash set -euo pipefail # Make server deployment package (versioned, per-image tars, full compose, docs, skeleton) ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" TEMPL_DIR="$ROOT_DIR/deployment_new/templates/server" ART_ROOT="$ROOT_DIR/deployment_new/artifact/server" # Use deployment_new local common helpers COMMON_SH="$ROOT_DIR/deployment_new/build/common.sh" . "$COMMON_SH" usage(){ cat </ and server_YYYYMMDD.tar.gz EOF } VERSION="" while [[ $# -gt 0 ]]; do case "$1" in --version) VERSION="$2"; shift 2;; -h|--help) usage; exit 0;; *) err "unknown arg: $1"; usage; exit 1;; esac done if [[ -z "$VERSION" ]]; then VERSION="$(today_version)"; fi require_cmd docker tar gzip awk sed IMAGES=( argus-bind9 argus-master argus-elasticsearch argus-kibana argus-metric-ftp argus-metric-prometheus argus-metric-grafana argus-alertmanager argus-web-frontend argus-web-proxy ) STAGE="$(mktemp -d)"; trap 'rm -rf "$STAGE"' EXIT PKG_DIR="$ART_ROOT/$VERSION" mkdir -p "$PKG_DIR" "$STAGE/images" "$STAGE/compose" "$STAGE/docs" "$STAGE/scripts" "$STAGE/private/argus" # 1) Save per-image tars with version tag log "Tagging and saving images (version=$VERSION)" for repo in "${IMAGES[@]}"; do if ! docker image inspect "$repo:latest" >/dev/null 2>&1 && ! docker image inspect "$repo:$VERSION" >/dev/null 2>&1; then err "missing image: $repo (need :latest or :$VERSION)"; exit 1; fi if docker image inspect "$repo:$VERSION" >/dev/null 2>&1; then tag="$repo:$VERSION" else docker tag "$repo:latest" "$repo:$VERSION" tag="$repo:$VERSION" fi out_tar="$STAGE/images/${repo//\//-}-$VERSION.tar" docker save -o "$out_tar" "$tag" gzip -f "$out_tar" done # 2) Compose + env template cp "$TEMPL_DIR/compose/docker-compose.yml" "$STAGE/compose/docker-compose.yml" ENV_EX="$STAGE/compose/.env.example" cat >"$ENV_EX" <>"$ENV_EX" <<'EOF' # Host ports for server compose MASTER_PORT=32300 ES_HTTP_PORT=9200 KIBANA_PORT=5601 PROMETHEUS_PORT=9090 GRAFANA_PORT=3000 ALERTMANAGER_PORT=9093 WEB_PROXY_PORT_8080=8080 WEB_PROXY_PORT_8081=8081 WEB_PROXY_PORT_8082=8082 WEB_PROXY_PORT_8083=8083 WEB_PROXY_PORT_8084=8084 WEB_PROXY_PORT_8085=8085 # Overlay network name ARGUS_OVERLAY_NET=argus-sys-net # FTP defaults FTP_USER=ftpuser FTP_PASSWORD=NASPlab1234! # UID/GID for volume ownership ARGUS_BUILD_UID=2133 ARGUS_BUILD_GID=2015 # Compose project name (isolation from other stacks on same host) COMPOSE_PROJECT_NAME=argus-server EOF # 3) Docs (from deployment_new templates) DOCS_SRC="$TEMPL_DIR/docs" if [[ -d "$DOCS_SRC" ]]; then rsync -a "$DOCS_SRC/" "$STAGE/docs/" >/dev/null 2>&1 || cp -r "$DOCS_SRC/." "$STAGE/docs/" fi # 6) Scripts (from deployment_new templates) SCRIPTS_SRC="$TEMPL_DIR/scripts" if [[ -d "$SCRIPTS_SRC" ]]; then rsync -a "$SCRIPTS_SRC/" "$STAGE/scripts/" >/dev/null 2>&1 || cp -r "$SCRIPTS_SRC/." "$STAGE/scripts/" find "$STAGE/scripts" -type f -name '*.sh' -exec chmod +x {} + 2>/dev/null || true fi # 4) Private skeleton (minimum) mkdir -p \ "$STAGE/private/argus/etc" \ "$STAGE/private/argus/master" \ "$STAGE/private/argus/metric/prometheus" \ "$STAGE/private/argus/metric/prometheus/data" \ "$STAGE/private/argus/metric/prometheus/rules" \ "$STAGE/private/argus/metric/prometheus/targets" \ "$STAGE/private/argus/metric/grafana" \ "$STAGE/private/argus/metric/grafana/data" \ "$STAGE/private/argus/metric/grafana/logs" \ "$STAGE/private/argus/metric/grafana/plugins" \ "$STAGE/private/argus/metric/grafana/provisioning/datasources" \ "$STAGE/private/argus/metric/grafana/provisioning/dashboards" \ "$STAGE/private/argus/metric/grafana/data/sessions" \ "$STAGE/private/argus/metric/grafana/data/dashboards" \ "$STAGE/private/argus/metric/grafana/config" \ "$STAGE/private/argus/metric/ftp" \ "$STAGE/private/argus/alert/alertmanager" \ "$STAGE/private/argus/log/elasticsearch" \ "$STAGE/private/argus/log/kibana" # 7) Manifest & checksums gen_manifest "$STAGE" "$STAGE/manifest.txt" checksum_dir "$STAGE" "$STAGE/checksums.txt" # 8) Move to artifact dir and pack mkdir -p "$PKG_DIR" rsync -a "$STAGE/" "$PKG_DIR/" >/dev/null 2>&1 || cp -r "$STAGE/." "$PKG_DIR/" OUT_TAR_DIR="$(dirname "$PKG_DIR")" OUT_TAR="$OUT_TAR_DIR/server_${VERSION}.tar.gz" log "Creating tarball: $OUT_TAR" (cd "$PKG_DIR/.." && tar -czf "$OUT_TAR" "$(basename "$PKG_DIR")") log "Server package ready: $PKG_DIR" echo "$OUT_TAR"