← back to Cncp Failure Collector

install-kamatera.sh

89 lines

#!/usr/bin/env bash
# install-kamatera.sh — install/upgrade the cross-platform failure-collector on Kamatera.
#
# Run on Kamatera as root:
#   curl -fsSL http://100.65.187.120:3333/static/cncp-collector-kamatera.tar.gz | tar xz -C /root/Projects/
#   bash /root/Projects/cncp-failure-collector/install-kamatera.sh
#
# Or scp the tarball then extract + invoke.
#
# What it does (idempotent):
#   1. npm install (only if node_modules missing or package.json changed)
#   2. Writes /root/Projects/cncp-failure-collector/ecosystem.kamatera.config.js
#      with CNCP_URL pointed at Mac2's tailnet IP + host=kamatera + Linux log paths
#   3. pm2 start (or restart) cncp-failure-collector
#   4. pm2 save
#
# CONFIG (override via env before invoking):
#   MAC2_TAILSCALE_IP   default 100.65.187.120
#   POLL_INTERVAL_MS    default 30000
#   LINUX_LOG_PATHS     default /var/log/nginx/error.log,/var/log/syslog

set -euo pipefail

PROJECT_DIR="/root/Projects/cncp-failure-collector"
MAC2_IP="${MAC2_TAILSCALE_IP:-100.65.187.120}"
POLL="${POLL_INTERVAL_MS:-30000}"
LINUX_PATHS="${LINUX_LOG_PATHS:-/var/log/nginx/error.log,/var/log/syslog}"

echo "[install-kamatera] dir=$PROJECT_DIR mac2=$MAC2_IP poll=$POLL"
cd "$PROJECT_DIR"

# 1. Dependency check — collector has no runtime deps beyond Node 18+ fetch, so npm install is no-op
#    unless package.json adds something later. Run it anyway (idempotent).
if [ -f package.json ] && [ ! -d node_modules ]; then
  echo "[install-kamatera] npm install"
  npm install --no-audit --no-fund --silent || true
fi

# 2. Kamatera-specific ecosystem (don't clobber the Mac2 one).
cat > ecosystem.kamatera.config.js <<EOF
// Kamatera variant — auto-generated by install-kamatera.sh. Re-run the installer to update.
module.exports = {
  apps: [{
    name: 'cncp-failure-collector',
    script: 'index.js',
    cwd: __dirname,
    instances: 1,
    exec_mode: 'fork',
    autorestart: true,
    watch: false,
    max_restarts: 10,
    min_uptime: '30s',
    restart_delay: 5000,
    exp_backoff_restart_delay: 2000,
    max_memory_restart: '200M',
    env: {
      NODE_ENV: 'production',
      CNCP_URL: 'http://${MAC2_IP}:3333',
      COLLECTOR_HOST: 'kamatera',
      LINUX_LOG_PATHS: '${LINUX_PATHS}',
      POLL_INTERVAL_MS: '${POLL}',
      CLASSIFIER_ENABLED: '1'
    }
  }]
};
EOF

# 3. Pre-flight: verify Mac2 CNCP is reachable BEFORE starting pm2. Fail loudly if not.
echo "[install-kamatera] probing http://${MAC2_IP}:3333/api/failures?status=triage"
if ! curl -fsS --max-time 5 "http://${MAC2_IP}:3333/api/failures?status=triage" >/dev/null; then
  echo "[install-kamatera] ERROR: Mac2 CNCP unreachable at http://${MAC2_IP}:3333"
  echo "[install-kamatera] Check Tailscale connection + that CNCP is up on Mac2."
  exit 1
fi
echo "[install-kamatera] CNCP reachable."

# 4. pm2 install/restart
if pm2 describe cncp-failure-collector >/dev/null 2>&1; then
  echo "[install-kamatera] restarting existing pm2 app"
  pm2 restart cncp-failure-collector --update-env
else
  echo "[install-kamatera] starting fresh pm2 app"
  pm2 start ecosystem.kamatera.config.js
fi

pm2 save

echo "[install-kamatera] done. Tail logs with: pm2 logs cncp-failure-collector --lines 50"