Repository navigation
Features
github-actions[bot] edited this page Oct 18, 2026
·
7 revisions
Generated from
README.mdin the repository. Edit it there; this wiki is rebuilt on every change.
| Capability | What it does |
|---|---|
| Fleet dashboard | Availability (SLA) and fleet averages for CPU, memory, disk, temperature and load, plus a card per device category (for example Pi Nodes, Edge Gateways, Mini PCs) with its own SLA target. Click a category to scope the whole dashboard to it; administrators edit the categories |
| Live monitoring | A background collector checks every node every 30 seconds over one persistent SSH connection per node (one command reads /proc), so pages load instantly from its latest results. Per node: CPU, memory, disk, load, uptime, temperature, network, Docker and Node-RED, with history charts. The Auto refresh choice is saved on your account |
| Node Fleet | A card per node with live metrics, status, 32/64-bit badge, category, tags and last seen. Filter by category, environment, status (including "login failed") and architecture, or search |
| Node terminal | A terminal button on each card opens a real interactive SSH shell (xterm.js over a WebSocket, a real PTY on the node): colors, top, nano, tab completion, Ctrl+C, sudo. Closing the window ends the SSH session; it also closes after 30 minutes without input or when you sign out |
| Fleet terminal | One command to many nodes at once; each node's output streams in as it finishes. Offline and login-failed nodes are skipped with a notice. Working directory kept per session; sudo passwords go over stdin, never on a command line |
| Bulk actions | Select nodes (Select All respects the filters) to edit their login (username, password and/or port for all of them, each checked once) or delete them to the Recycle Bin |
| Recycle Bin | Deleted nodes keep their details. Restore one or all; importing a node with the same name brings it back with the new details and keeps its history; administrators can delete for good with a typed DELETE |
| Fix login | A node that rejects its login shows why on its card, with a one-click form to correct the username, password or port |
| Bulk onboarding | Import CSV, TXT or JSON (including a Pi Fleet Emulator export) with automatic column detection and a verify step; the SSH check of hundreds of new nodes runs in the background with a progress card |
| Stats export | Uptime, CPU, memory, disk, temperature, load, reboots and network traffic per node for the last 24 hours, week, month, quarter, semester or year; all categories or one; per hour, per day or per node. Built in the background with a progress bar, then downloaded as CSV for reports or a data lake |
| Long-term history | One sample per node per minute in every state (so uptime is measured, not guessed), rolled up hourly and kept for good |
| VPN status | Live Tailscale state of the server and every tailnet peer: status, OS, direct or relayed link, last seen, traffic. Filter by status, OS, link and last seen; sort any column |
| Remote desktop | One-click OpenRemoteGUI per node at https://<your domain>/remoteGUI/<node name>/, through EdgeShell with no IP or port shown and no VPN needed (keyboard and mouse only with a ticket from the Remote button), with detection and a guided install: safety checks first (OS, disk, network, desktop session, sudo), then git clone, cd, sudo bash install.sh, with live progress; fleet installs stop at the first failure |
| Node-RED access | Each node's Node-RED editor at https://<your domain>/nodered/<node name>/, behind EdgeShell's sign-in and roles (operators and administrators), with the node's address hidden and no VPN needed; every opening logged (ADR 0014) |
| File deployment | Upload files to many nodes at once, with per-node results and history. Files land only in ~/Downloads/edgeshell on each node, never elsewhere |
| Apps on the edge | Ship any service or app the same way: a folder with a manifest.json, esapp.py pack, upload, roll out. Each app gets one folder in /opt/edgeshell, its own systemd service and user, its own Python venv (nothing system-wide), versions side by side with an atomic switch, and goes back to the previous version by itself when a new one does not stay up. Canary nodes first, automatic stop, one-click rollback, cleanup that always keeps the newest 3 stable versions, exact full removal, and every package kept on the server for the audit (docs) |
| Log browser | Browse, fetch and download log files from any node |
| Fleet setup | Scan the fleet for Docker, Node-RED and OpenRemoteGUI; install on every node missing them |
| Background jobs | Long work (imports, installs, exports, login checks) runs in the background; a progress card follows you across pages, with a live step-by-step log |
| Public API | REST API with an OpenAPI document: data points (latest metrics, time series, fleet summary), an event feed with a cursor for alerts and triggers in other systems, node management, exports and (optionally) commands. Sign in with password plus 2FA, or give an integration its own service key with chosen permissions, lifetime and allowed addresses |
| Data lake | A second MariaDB replicates the hot database live and keeps every row for good: metrics, rollups, events, activity and account history. Exports and history queries read from it. An optional hot retention policy (off by default) keeps only the last week, month, quarter, semester or year on the hot database, and never deletes what the lake has not got |
| Architecture detection | 32-bit (ARMv7) and 64-bit (ARM64) detected automatically, shown as badges and filters |
| Field guide | An animated, full-screen tour inside the app for site technicians and operators, opened from the (i) button in the top bar on every page: report a fault, start and close a job, confirm a swapped SD card or board, replace a dead node, what each sign on a node card means. One short headline per scene, a phone that taps through the real screens, and it fits any screen from a phone to a desktop (docs) |
| Hardware lifecycle | Every check also reads each node's board serial, SD card or disk, network adapter and OS install, so a swapped SD card or board shows as Hardware changed ("SD card or disk replaced", "Board replaced") for an operator to confirm (with the reason) or reject as unexpected. A new node can be marked as the replacement of a broken one, which is retired with its history kept. Anyone can report an issue on a node (power supply, SD card, board...); operators resolve it. A fleet Hardware page shows faults per 100 nodes, time to fix, downtime and how long each kind of part lasts, with CSV, an API with a narrow report permission and signed webhooks (docs) |
| Capability | What it does |
|---|---|
| Two-factor auth | Mandatory for every account: authenticator app plus ten one-time backup codes, checked by privacyIDEA in its own isolated container (or the built-in verifier) |
| Role-based access |
monitor (read-only), operator (fleet control), administrator (users and platform), enforced on every route |
| Hardened login | Account lockout, per-IP rate limiting, forced password change, and login errors that never reveal which usernames exist |
| Account recovery | Users request a reset from an admin (which also resets their 2FA); admins use an emailed link or a backup code |
| Admin governance | At most 5 admins; the owner (primary admin) is permanent and has full control over every account; other admins manage only monitors and operators; nobody can change the owner |
| Sign-up approval | Anyone can request an account; an admin approves it with a role |
| Session control | One device at a time by default, up to 4 per user (set by an admin). Each device is listed by type and can be signed out; idle sessions ask "still there?" and sign out |
| Node login policy | After repeated rejected logins (or one Tailscale SSH browser-check refusal) EdgeShell stops logging in to that node, so it never repeats a rejected password (no guessing, no fail2ban bans on the nodes). The pause survives restarts; nodes resume by themselves when their SSH server changes or the tailnet policy is fixed, or with Retry paused logins |
| Safe SSH | Every SSH connection goes through one helper that always closes failed connections and names Tailscale SSH refusals; a CI test fails the build if code opens SSH any other way |
| Encrypted credentials | Node SSH passwords and API keys encrypted at rest (Fernet), with key rotation |
| CSRF everywhere | Every state-changing request, AJAX call and WebSocket (same-origin check) is protected |
| Fail-safe config | Production refuses to start without its secret keys |
| MQTT heartbeat | A second, VPN-independent signal per node: an agent sends encrypted, authenticated heartbeats and a signed last will over a public MQTT broker; SenseHive verifies them; node cards show heartbeat and LWT state, and uptime counts a node as up when SSH or a heartbeat says so (docs) |
| Audit trail | Administrators only: activity log of user actions (logins, terminals opened and closed, bulk changes, exports, paused and resumed logins) plus every service start, stop, crash and restart |
| Capability | What it does |
|---|---|
| Docker stack | One Compose file: EdgeShell, MariaDB, privacyIDEA, and nginx as the only public container, with free automatic HTTPS from Let's Encrypt (also for a bare IP address) |
| Host hardening | Script for fail2ban and a strict SSH policy on the server; EC2 guide for the whole setup |
| Multi-arch image |
devprincekumar/edgeshell for amd64 and arm64: x86 clouds, AWS Graviton, Ampere Altra, Raspberry Pi 4/5 |
| One-command install |
python3 run.py sets up MariaDB, Nginx, Let's Encrypt TLS, phpMyAdmin and systemd on Ubuntu/Debian. Re-run it to update |
| Self-healing | systemd auto-start on boot, crash restart and a health-check watchdog |
| Works on any screen | Phone menu, layouts from phone to desktop and from 67 to 200 percent zoom; a browser test checks every page at every size on every pull request |
| Sandbox | EdgeShell plus a 6-node emulated fleet and a full end-to-end suite in one command |
| Issue portal | Built-in support tickets with threaded replies and optional email via useSend |
| Database portability | SQLite (WAL) for development, MariaDB in production, PostgreSQL supported; one-command export and import |
| Quality gates | Required CI before every merge: lint, secret scan, Bandit, pip-audit and CodeQL, 330+ unit tests on three Python versions with a coverage floor, 550+ browser checks with 1500 nodes, a data lake test on real MariaDB, then image audit and end-to-end tests (including the API with real 2FA) on amd64 and arm64 |
Repository · Docker Hub · Report a security problem · MIT licence
Start
Deploy
- Deploy on AWS EC2
- Run on Any Cloud
- Configuration
- MQTT Heartbeat
- VPN and Network
- Database Migration
Use
How it is built
Project
Decision records