Files
timmy-config/infra/matrix/host-readiness-check.sh
Ezra 2009ac75b2 feat(matrix): scaffold validator + Hermes client spec
- Add validate-scaffold.py: automated acceptance proof for #183
- Add HERMES_MATRIX_CLIENT_SPEC.md: end-to-end agent integration spec for #166

Refs #183, #166
2026-04-05 19:03:31 +00:00

125 lines
3.2 KiB
Bash
Executable File

#!/usr/bin/env bash
# host-readiness-check.sh — Validate target host before Matrix/Conduit deployment
# Usage: ./host-readiness-check.sh [DOMAIN]
# Issue: #166 / #183
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
DOMAIN="${1:-${MATRIX_DOMAIN:-}}"
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'
PASS=0
FAIL=0
WARN=0
pass() { echo -e "${GREEN}[PASS]${NC} $*"; ((PASS++)); }
fail() { echo -e "${RED}[FAIL]${NC} $*"; ((FAIL++)); }
warn() { echo -e "${YELLOW}[WARN]${NC} $*"; ((WARN++)); }
log() { echo -e "\n==> $*"; }
log "Matrix/Conduit Host Readiness Check"
log "===================================="
# === Domain check ===
if [[ -z "$DOMAIN" ]]; then
fail "DOMAIN not specified. Usage: ./host-readiness-check.sh matrix.timmytime.net"
exit 1
else
pass "Domain specified: $DOMAIN"
fi
# === Docker ===
log "Checking Docker..."
if command -v docker &>/dev/null; then
DOCKER_VER=$(docker --version)
pass "Docker installed: $DOCKER_VER"
else
fail "Docker not installed"
fi
if docker compose version &>/dev/null || docker-compose --version &>/dev/null; then
pass "Docker Compose available"
else
fail "Docker Compose not available"
fi
if docker info &>/dev/null; then
pass "Docker daemon is running"
else
fail "Docker daemon is not running or user lacks permissions"
fi
# === Ports ===
log "Checking ports..."
for port in 80 443 8448; do
if ss -tln | grep -q ":$port "; then
warn "Port $port is already in use (may conflict)"
else
pass "Port $port is available"
fi
done
# === DNS Resolution ===
log "Checking DNS..."
RESOLVED_IP=$(dig +short "$DOMAIN" || true)
if [[ -n "$RESOLVED_IP" ]]; then
HOST_IP=$(curl -s ifconfig.me || true)
if [[ "$RESOLVED_IP" == "$HOST_IP" ]]; then
pass "DNS A record resolves to this host ($HOST_IP)"
else
warn "DNS A record resolves to $RESOLVED_IP (this host is $HOST_IP)"
fi
else
fail "DNS A record for $DOMAIN not found"
fi
# === Disk Space ===
log "Checking disk space..."
AVAILABLE_GB=$(df -BG "$SCRIPT_DIR" | awk 'NR==2 {gsub(/G/,""); print $4}')
if [[ "$AVAILABLE_GB" -ge 20 ]]; then
pass "Disk space: ${AVAILABLE_GB}GB available"
else
warn "Disk space: ${AVAILABLE_GB}GB available (recommended: 20GB+)"
fi
# === Memory ===
log "Checking memory..."
MEM_GB=$(free -g | awk '/^Mem:/ {print $2}')
if [[ "$MEM_GB" -ge 2 ]]; then
pass "Memory: ${MEM_GB}GB"
else
warn "Memory: ${MEM_GB}GB (recommended: 2GB+)"
fi
# === Reverse proxy detection ===
log "Checking reverse proxy..."
if command -v caddy &>/dev/null; then
pass "Caddy installed"
elif command -v nginx &>/dev/null; then
pass "Nginx installed"
elif ss -tln | grep -q ":80 " || ss -tln | grep -q ":443 "; then
warn "No Caddy/Nginx found, but something is bound to 80/443"
else
warn "No reverse proxy detected (Caddy or Nginx recommended)"
fi
# === Summary ===
log "===================================="
echo -e "Results: ${GREEN}$PASS passed${NC}, ${YELLOW}$WARN warnings${NC}, ${RED}$FAIL failures${NC}"
if [[ $FAIL -gt 0 ]]; then
echo ""
echo "Host is NOT ready for deployment. Fix failures above, then re-run."
exit 1
else
echo ""
echo "Host looks ready. Next step: ./deploy-matrix.sh $DOMAIN"
exit 0
fi