Commit Graph

434 Commits

Author SHA1 Message Date
Anso dd043cd4b1 chore(main): release 0.19.3 (#269) 2026-03-29 23:32:43 -04:00
Anso f9b86e6f53 fix(docker): install Docker CLI v29.3.1 from static binaries to resolve CVEs (#268)
Alpine 3.23 ships docker-cli 29.1.3 which contains unpatched vulnerabilities:
- CVE-2026-33186 (Critical): gRPC-Go authorization bypass
- CVE-2026-34040 (High): Moby AuthZ plugin bypass
- CVE-2026-33747 (High): BuildKit path traversal via frontend
- CVE-2026-33748 (High): BuildKit path traversal via git URL

Replace apk-based docker-cli and docker-cli-compose with official static
binaries (Docker CLI v29.3.1 + Compose v2.40.3) pinned via build args.
2026-03-29 23:28:55 -04:00
Anso 8eff3fe876 docs: refresh screenshots (#267) 2026-03-29 22:41:01 -04:00
Anso 0eb12b137a chore(main): release 0.19.2 (#266) 2026-03-29 22:38:16 -04:00
Anso 59fd528535 fix: remediate Dependabot and Docker Scout security vulnerabilities (#265)
- Upgrade Docker base image from node:20-alpine to node:22-alpine
  (Node 22.22.2, Alpine 3.23.3) to resolve 31 CVEs flagged by Docker Scout
- Add apk upgrade to runtime stage for latest Alpine security patches
- Force dompurify to 3.3.3 via npm overrides to fix two XSS advisories
  (transitive dep of monaco-editor pinned at 3.2.7)
2026-03-29 22:31:19 -04:00
Anso c0b53e469a ci: fix screenshot PR auto-merge on private repos (#264)
gh pr merge --auto requires branch protection with required status
checks. This repo has no branch protection, so GitHub rejects --auto
with "clean status" error. Remove --auto to merge immediately.
2026-03-29 21:52:56 -04:00
Anso e8c87fdc05 docs: refresh screenshots (#263) 2026-03-29 21:51:18 -04:00
Anso e9e0df8998 chore(main): release 0.19.1 (#262) 2026-03-29 21:39:11 -04:00
Anso 116f15dae9 fix(stacks): resolve permission denied error on stack deletion (#261)
* fix(stacks): resolve permission denied error when deleting stacks with root-owned files

When Docker Compose creates files as root inside a stack directory, the
non-root Sencho process cannot remove them. This adds a Docker-based
fallback: if fsPromises.rm fails with EACCES/EPERM, Sencho spawns a
short-lived Alpine container to clean up the root-owned files.

Also enhances docker compose down with --volumes --remove-orphans to let
Docker clean up its own resources before filesystem deletion.

* docs: clarify that pre-existing root-owned stacks can be deleted

* fix(stacks): include Docker stderr in fallback deletion error message

Fixes CI lint failure: 'stderr' was assigned but never read in
forceDeleteViaDocker(). Now surfaces Docker stderr output in the error
message when the fallback cleanup fails.
2026-03-29 21:32:05 -04:00
Anso f760ea6563 docs: refresh screenshots (#260) 2026-03-29 20:26:22 -04:00
Anso f73e9f4db6 chore(main): release 0.19.0 (#259) 2026-03-29 20:23:39 -04:00
Anso d586ce393a feat(audit-log): add configurable retention, export, Auditor role, and enhanced filtering (#258)
- Configurable retention: audit_retention_days setting (1-365 days, default 90)
  replaces hardcoded 90-day retention, exposed in Settings > Data Retention
- Export: one-click CSV/JSON export of filtered audit data via new
  GET /api/audit-log/export endpoint (capped at 10,000 entries)
- Auditor role: read-only role with system:audit permission for viewing
  and exporting audit logs without admin privileges (Admiral tier)
- Enhanced filtering: full-text search across summaries/paths/usernames,
  date range picker, and expandable row details showing request path,
  IP address, node ID, and entry ID
2026-03-29 20:18:51 -04:00
Anso f4428a394c refactor: use nautical icons for Skipper and Admiral tiers (#257)
* refactor: use nautical icons for Skipper and Admiral tiers

Replace Crown/Users with Compass (Skipper) and ShipWheel (Admiral)
across TierBadge, ProGate, AdmiralGate, and SettingsModal upgrade cards.

* feat(sso): add Admiral tier badge next to SSO Authentication title
2026-03-29 19:09:21 -04:00
Anso c328b7f49a refactor: rename Personal Pro to Skipper and Team Pro to Admiral (#256)
Align paid tier names with Sencho's nautical identity. Internal variant
values ('personal'/'team') remain unchanged in code, database, and
Lemon Squeezy integration — only user-facing display names updated.

- Backend: requireTeamPro → requireAdmiral, TEAM_PRO_REQUIRED → ADMIRAL_REQUIRED
- Frontend: TeamProGate.tsx → AdmiralGate.tsx, TierBadge labels updated
- Website: PricingSection tier names and nautical descriptions
- Docs: all 11 affected pages renamed, nautical footnote added to licensing
2026-03-29 18:00:29 -04:00
Anso 7838d6c32a docs: refresh screenshots (#255) 2026-03-29 17:10:22 -04:00
Anso b6e5a0f196 chore(main): release 0.18.0 (#254) 2026-03-29 17:07:28 -04:00
Anso 8380fbad4b feat(rbac): add Deployer & Node Admin roles with scoped permissions (Team Pro) (#253)
* feat(rbac): add Deployer & Node Admin roles with scoped permissions (Team Pro)

Add intermediate RBAC roles gated to Team Pro tier:
- Deployer: can deploy/restart/stop/start stacks but cannot edit compose files, delete stacks, or access system settings
- Node Admin: full stack and node management within scope, no system settings access
- Scoped permissions: assign roles per-stack or per-node for fine-grained access control
- Permission engine with checkPermission/requirePermission guards replacing requireAdmin on stack/node routes
- Frontend can() function with /api/permissions/me endpoint for client-side permission checks
- User management UI updated with 4-role selector and scoped permission editor
- Documentation updated with permission matrix, scoped permission docs, and screenshots

* fix(rbac): remove unused RoleAssignment import to fix lint error
2026-03-29 17:02:56 -04:00
Anso 37701d5281 docs: refresh screenshots (#245) 2026-03-29 18:50:54 +00:00
Anso b396bf3d95 chore(main): release 0.17.0 (#241) 2026-03-29 14:46:00 -04:00
Anso 244c83a0c3 feat(registries): add private registry credential management (Team Pro) (#240)
Add centralized credential storage for private Docker registries with
support for Docker Hub, GHCR, AWS ECR, and self-hosted registries.

- New `registries` table with AES-256-GCM encrypted secrets
- RegistryService with CRUD, test connectivity, Docker config generation
- 5 API endpoints gated by requireTeamPro + requireAdmin
- ComposeService injects credentials via temp DOCKER_CONFIG on deploy/pull
- ImageUpdateService passes stored credentials for private registry checks
- AWS ECR just-in-time token refresh via @aws-sdk/client-ecr
- RegistriesSection UI in Settings Hub with type-aware form
- Documentation with screenshots
2026-03-29 12:56:30 -04:00
Anso 362b4a43d0 docs: refresh screenshots (#239) 2026-03-29 07:17:18 +00:00
Anso 92147974cd chore(main): release 0.16.0 (#238) 2026-03-29 03:12:08 -04:00
Anso b7e7ee8f55 feat(ui): redesign top bar with three-zone navigation layout (#237)
Replace flat row of 10 individual buttons with a structured three-zone
layout: node context pill (left), animated navigation group (center),
and utility actions (right). Uses the Highlight component from
animate-ui for a spring-animated sliding indicator between nav items.

Responsive: icon+text labels at xl, icons-only at md, sheet drawer
for mobile. Navigation is data-driven via a permission-aware array
that conditionally includes admin and Team Pro items.
2026-03-29 03:04:31 -04:00
Anso 40c09cce23 docs: refresh screenshots (#236) 2026-03-29 05:33:10 +00:00
Anso cfccab1f93 chore(main): release 0.15.1 (#235) 2026-03-29 01:28:09 -04:00
Anso 330eec4bff fix(scheduled-ops): audit log text, run attribution, prune targets, and pagination (#234)
- Fix "Run Now" audit log showing "Created scheduled task" instead of "Triggered scheduled task" by adding wildcard-based route matching with specificity sorting
- Add triggered_by column to track whether runs were started by the scheduler or manually via Run Now
- Add configurable prune targets (containers, images, networks, volumes) with checkbox UI
- Add pagination to execution history with offset-based navigation
- Document Run Now behavior on disabled tasks and add screenshots
2026-03-29 01:01:45 -04:00
Anso e756620e29 docs: refresh screenshots (#233) 2026-03-29 04:05:40 +00:00
Anso 428898dbc3 chore(main): release 0.15.0 (#232) 2026-03-29 00:00:43 -04:00
Anso 31e1795af0 feat(scheduled-ops): add scheduled operations for Team Pro users (#231)
Adds the ability to schedule recurring Docker operations (stack restarts,
fleet snapshots, system prunes) via cron expressions with full execution
history logging. Includes Run Now for on-demand execution.
2026-03-28 23:56:37 -04:00
Anso 89c4a9cb77 docs: refresh screenshots (#230) 2026-03-29 02:19:35 +00:00
Anso fb6d7b45e7 chore(main): release 0.14.2 (#229) 2026-03-28 22:17:40 -04:00
Anso 5b607de227 fix(api-tokens): harden scope enforcement and block sensitive endpoints (#228)
* fix(api-tokens): harden scope enforcement and add expiration support

- Fix deploy-only allowlist to match actual routes (deploy, down, restart,
  stop, start, update) instead of non-existent /up, /pull, /compose/* paths
- Block API tokens from auth-sensitive routes (password change, node token
  generation) that bypass scope enforcement middleware
- Add WebSocket scope enforcement: read-only/deploy-only tokens can only
  access logs and notifications, not host console or container exec
- Prevent API token self-replication: tokens cannot create, list, or revoke
  other tokens regardless of scope
- Map deploy-only tokens to admin role so they pass requireAdmin on deploy
  routes (scope middleware still restricts which endpoints they can reach)
- Add optional token expiration (30, 60, 90, 365 days or no expiry)
- Add token name length validation (max 100 characters)
- Surface fetchTokens errors in frontend instead of swallowing silently
- Fix docs: correct deploy-only scope description and GitHub Actions example

* fix(api-tokens): block all sensitive management endpoints from API tokens

User management, SSO configuration, node management, license management,
and console access are now human-session-only. Add comprehensive unit
tests for scope enforcement, blocked endpoints, expiration, and revocation.

* fix(api-tokens): fix TS18048 possibly-undefined in test
2026-03-28 22:14:22 -04:00
Anso 26c74f2aad docs: refresh screenshots (#227) 2026-03-28 21:29:56 +00:00
Anso 9bf6e10d8b chore(main): release 0.14.1 (#225) 2026-03-28 17:25:17 -04:00
Anso 133ea0e9ab docs: refresh screenshots (#226) 2026-03-28 21:19:49 +00:00
Anso 954994cdc0 fix(api-tokens): harden scope enforcement and add expiration support (#224)
- Fix deploy-only allowlist to match actual routes (deploy, down, restart,
  stop, start, update) instead of non-existent /up, /pull, /compose/* paths
- Block API tokens from auth-sensitive routes (password change, node token
  generation) that bypass scope enforcement middleware
- Add WebSocket scope enforcement: read-only/deploy-only tokens can only
  access logs and notifications, not host console or container exec
- Prevent API token self-replication: tokens cannot create, list, or revoke
  other tokens regardless of scope
- Map deploy-only tokens to admin role so they pass requireAdmin on deploy
  routes (scope middleware still restricts which endpoints they can reach)
- Add optional token expiration (30, 60, 90, 365 days or no expiry)
- Add token name length validation (max 100 characters)
- Surface fetchTokens errors in frontend instead of swallowing silently
- Fix docs: correct deploy-only scope description and GitHub Actions example
2026-03-28 17:15:05 -04:00
Anso 88cd1fe571 docs: refresh screenshots (#223) 2026-03-28 19:49:42 +00:00
Anso 84dc102411 chore(main): release 0.14.0 (#221) 2026-03-28 15:44:27 -04:00
Anso 618647ffc2 docs: refresh screenshots (#222) 2026-03-28 19:42:51 +00:00
Anso 8d8118c963 feat(api-tokens): add scoped API tokens for CI/CD automation (Team Pro) (#220)
Add long-lived API tokens with three permission scopes (read-only,
deploy-only, full-admin) for CI/CD pipelines, scripts, and automation.

- Database: api_tokens table with SHA-256 hashed storage
- Auth: extend middleware to authenticate Bearer API tokens
- Scope enforcement: middleware restricts actions per token scope
- API: CRUD endpoints gated behind Team Pro + admin
- UI: ApiTokensSection in Settings Hub with create/revoke/copy flows
- Docs: new api-tokens.mdx with usage examples and screenshots
2026-03-28 15:37:54 -04:00
Anso e2da1bf43d docs: refresh screenshots (#219) 2026-03-28 08:42:47 +00:00
Anso 0dfd0d52e0 chore(main): release 0.13.2 (#217) 2026-03-28 04:37:54 -04:00
Anso 7294d9c6ba docs: refresh screenshots (#218) 2026-03-28 08:27:58 +00:00
Anso f99abe907d fix(license): default 14-day trial to Personal Pro instead of Team Pro (#216)
Trial users now get Personal Pro features only. Team Pro features
(SSO, audit log, unlimited accounts) require a Team Pro license.
2026-03-28 04:23:28 -04:00
Anso f53d00180f docs: refresh screenshots (#215) 2026-03-28 08:01:42 +00:00
Anso 018293fd47 chore(main): release 0.13.1 (#214) 2026-03-28 03:59:59 -04:00
Anso 8d48b0abff fix: gate SSO and Audit behind Team Pro license tier (#213)
SSO settings tab and content were visible to Personal Pro users despite
being a Team Pro-only feature. Added TeamProGate component that checks
both isPro and variant === 'team', and hid the SSO nav button for
non-Team Pro users. Audit was already correctly gated in EditorLayout.
2026-03-28 03:56:42 -04:00
Anso a9865f705b docs: refresh screenshots (#212) 2026-03-28 07:40:55 +00:00
Anso 4c7ec9297d chore(main): release 0.13.0 (#210) 2026-03-28 03:36:07 -04:00
Anso 5fecc5f2e7 docs: refresh screenshots (#211) 2026-03-28 07:34:44 +00:00