 Tomáš DvořákandDevin
|
3f066b3b1e
|
feat(nodes): SSH bootstrap + housekeeping — install script, bundled binaries, auto-prune (#50)
* feat(nodes): SSH bootstrap + housekeeping — install script, bundled binaries, auto-prune
- `containr nodes add <user@host>` mints an enroll token, SSHes once,
runs the install script remotely; --print emits the one-liner
- Public /api/agents/install.sh + /api/agents/download/{platform};
agent binaries built into the image under /agents
- Agent-side `prune` (bounded docker system prune, volumes opt-in)
and `system_df` commands
- node_agents.auto_prune + health sweep enqueues daily prune;
offline/online transitions notify admins
- CLI nodes update/prune/commands + MCP tools (prune confirm-gated)
- Usage page: install one-liner, per-node Prune + auto toggle
Generated with [Devin](https://devin.ai)
Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
* feat(nodes): node detail page — telemetry, containers, commands, controls
/nodes/:id (admin): cpu/mem sparklines from heartbeat history
(1h/24h/7d), containers on node, command history, inline rename,
auto-prune toggle, prune-now with volume opt-in, remove. Agent rows
on the Usage page link into it.
Generated with [Devin](https://devin.ai)
Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
* feat(nodes): mesh awareness + node detail page
- agent reports tailscale/netbird/zerotier/wireguard interface IPs at
register (authoritative — absent interfaces clear stored state)
- backend stores under node_agents.metadata.mesh, merged on re-register
- node detail page shows mesh addresses under the primary IP
Generated with [Devin](https://devin.ai)
Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
---------
Co-authored-by: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
|
2026-10-09 12:41:26 +02:00 |
|
Tomas Dvorak
|
e51b20b2d4
|
feat(cli): v2 — full API coverage, profiles, --json/--yes, containr up
Rewrite the CLI as a thin client over the authenticated API so agents
and scripts reach every resource the UI does (ROADMAP2 phase A2).
- shared Client with bearer auth, error-envelope decoding, and stable
exit codes: 0 ok / 1 error / 2 auth / 3 not-found / 4 validation /
5 unreachable
- named profiles in ~/.containr.yaml (current_profile + profiles.*);
resolution order --flag > env > profile > localhost default;
CONTAINR_TOKEN / CONTAINR_API_URL / CONTAINR_PROFILE env support
- --json prints raw API responses; --yes skips confirmations;
destructive commands refuse non-interactively without it
- auth login verifies the token against /user/profile before saving,
interactive prompt via term.ReadPassword
- commands for every resource: tokens, projects, services, deploy,
deployments (logs/rollback), logs --follow (SSE), exec, variables
(set/unset merge with secret masking preserved), databases
(backup/restore/download), cron, templates, nodes + agent tokens,
scaling, ha, security, gateway, admin, notifications
- containr up: git remote + branch → create-or-reuse service → deploy
Verified live: login/status/tokens/projects/services, up creating a
service + deployment, non-TTY confirmation refusal, scope-capped admin
rejection (exit 2), revoke.
Authored By: TDvorak <[email protected]>
|
2026-10-08 15:19:31 +02:00 |
|