← 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"