Files

6.7 KiB

JARVIS System Reference Card

Access

Server Location

JARVIS runs on PVE1 VM 211 at 10.48.200.211 (migrated from DO 2026-06-18).

  • SSH: sshpass -p 'Joker1974!!!' ssh -o StrictHostKeyChecking=no root@10.48.200.211
  • Stack: nginx / PHP 8.3 / MariaDB / Redis / Arc Reactor
  • Web root: /var/www/jarvis/
  • Traffic routed via NPM (10.48.200.200) → VM 211

File Structure (on VM 211 at /var/www/jarvis/)

public_html/
  index.html          — main Iron Man HUD (all UI)
  api.php             — API router
  admin/index.php     — admin portal (single PHP+JS file)
  agent/              — agent installers
api/
  config.php          — all credentials/constants (gitignored)
  lib/db.php          — JarvisDB class (query/execute/single/insert)
  lib/kb_engine.php   — KBEngine intent matching
  endpoints/
    agent.php         — agent registration/heartbeat/metrics/commands
    chat.php          — 4-tier chat: KB→action intents→Ollama→Groq→Claude
    network.php       — network device list + scan endpoint
    netscan.php       — push endpoint for PVE1 nmap results (no auth needed)
    do_server.php     — reads /proc directly (no SSH loopback)
    stats_cache.php   — every 5min cron: Proxmox cluster API, HA, weather, news
    facts_collector.php — every 3min cron: system stats, site health
    system.php        — local system metrics
    alerts.php        — alert CRUD + auto-generate
    news.php          — serves api_cache['news'] + custom kb_facts(category='custom_news')
deploy/
  reactor.py          — Arc Reactor source (copy to /opt/jarvis-arc/reactor.py + restart)

Arc Reactor (AI Routing Daemon)

  • Daemon: /opt/jarvis-arc/reactor.py (Python, port 7474), service: jarvis-arc
  • Deploy: copy deploy/reactor.py/opt/jarvis-arc/reactor.py + systemctl restart jarvis-arc
  • Vision with actual screenshot → Claude claude-opus-4-8-20251101
  • Guardian/SITREP/Vision text-only → Groq llama-3.3-70b-versatile
  • Email drafting / research → Claude

Agent System

  • Registration key: f846a9aaf7ce9a61742c63c87c4186052a71d2a580c65518
  • Install one-liner (Linux): curl -sk https://jarvis.orbishosting.com/install-agent.sh | bash -s <hostname> <linux|proxmox>
  • Agent config: /etc/jarvis-agent/config.json (key: jarvis_url) — runtime state at /var/lib/jarvis-agent/state.json
  • If agent gets 401 "Invalid agent key": state.json has stale key — overwrite with correct agent_id + api_key from DB
  • Heartbeat: every 10s | Metrics: every 30s

Currently Online Agents

agent_id hostname IP type
jarvis-do_orbis.or jarvis-do 165.22.1.228 linux
claude_pve pve1 10.48.200.90 proxmox
pve2_pve2 pve2 10.48.200.91 proxmox
networkbackup_NetworkB networkbackup 10.48.200.99 linux
homeassistant_ha homeassistant 10.48.200.97 homeassistant
homebridge_b57cbaea homebridge 10.48.200.18 linux
novacpx_e3b07264 novacpx 10.48.200.110 linux
jellyfin_7e386833 jellyfin 10.48.200.33 linux
MediaStack_2c00b1b8 mediastack 10.48.200.35 linux
fortigate_gw fortigate 10.48.200.1 linux
yealink_t48s yealink 10.48.200.43 linux

Network Scanning

  • PVE1 cron: */3 * * * * /usr/local/bin/jarvis-netscan.sh
  • Script runs nmap, parses output, POSTs JSON to https://jarvis.orbishosting.com/api/netscan with X-Registration-Key header
  • Scan Now button queues shell command to PVE1 agent (picks up within 10s)

Chat Architecture

Tier 0:   HA entity control (fuzzy match → call HA API)
Tier 0.5: Network device management
Tier 0.7: Planner intents (add task, my tasks, schedule, daily briefing)
Tier 1:   KB intent engine (response type → instant reply)
Tier 1b:  Action intents (network_scan → DB data + queue PVE1 scan)
Tier 2:   Ollama llama3.2 at http://10.48.200.210:11434 (5s timeout)
Tier 3:   Groq compound-beta-mini (cloud, fast)
Tier 4:   Claude API fallback
  • Groq model name: compound-beta-mini (NOT groq/compound-beta-mini)
  • HA_URL = http://orbisne.fortiddns.com:8123

DB Key Tables

registered_agents     agent_id, hostname, agent_type, ip_address, api_key, status, last_seen, version
agent_metrics         agent_id, metric_type, metric_data(JSON), recorded_at
  -- Extract: JSON_EXTRACT(metric_data,'$.cpu_percent'), JSON_EXTRACT(metric_data,'$.memory.percent')
  -- NO cpu_pct/mem_pct columns — always use JSON_EXTRACT
agent_commands        agent_id, command_type, command_data(JSON), status(pending/delivered)
network_devices       ip, mac, hostname, alias, device_type, status, last_seen
alerts                alert_type, title, message, severity, resolved
kb_facts              category, fact_key, fact_value
kb_intents            intent_name, pattern(regex), response_template, action_type, priority, active
api_cache             cache_key(proxmox/news/weather/ha_entities), data(JSON), updated_at
tasks                 title, notes, category, priority, status, due_date, due_time, completed_at
appointments          title, description, category, start_at, end_at, location, all_day, reminder_min
ha_entities           real-time HA entity states (updated by HA custom component)

Proxmox API

  • stats_cache.php uses cluster API at orbisne.fortiddns.com:8006
  • Returns all VMs from both PVE1 and PVE2 via /cluster/resources?type=vm
  • Token: root@pam!jarvis=c45b5feb-f9a9-445d-a626-14fbb959f78b

Cron Jobs (on VM 211)

*/3 * * * *  php /var/www/jarvis/api/endpoints/facts_collector.php
*/5 * * * *  php /var/www/jarvis/api/endpoints/stats_cache.php
0 7 * * *    /usr/local/bin/jarvis-backup.sh

Cron on PVE1:

*/3 * * * *  /usr/local/bin/jarvis-netscan.sh

Backups

  • Script: /usr/local/bin/jarvis-backup.sh
  • Output: /var/backups/jarvis/jarvis_backup_YYYY-MM-DD_HH-MM-SS.tar.gz
  • Daily at 7am UTC (2am CDT), 7-day retention
  • Downloadable from admin portal → BACKUPS tab

API Auth

  • Main JARVIS API: session token via X-Session-Token header (or PHP session)
  • Agent endpoints: X-Agent-Key header (per-agent key from registered_agents.api_key)
  • Netscan endpoint: X-Registration-Key header (shared registration key)
  • Admin portal: separate PHP session (session_name('jarvis_admin'))
  • Cloudflare passes real client IP in CF-Connecting-IP header