@lamalibre/create-lamaste 4.2.0 → 4.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (123) hide show
  1. package/package.json +2 -2
  2. package/scripts/lamaste-priv +205 -2
  3. package/src/index.js +4 -4
  4. package/src/lib/node-version.js +114 -0
  5. package/src/lib/relay-services.js +15 -1
  6. package/src/lib/service-config.js +113 -0
  7. package/src/tasks/gatekeeper.js +8 -3
  8. package/src/tasks/node.js +34 -75
  9. package/src/tasks/redeploy.js +36 -0
  10. package/vendor/docs/00-introduction/how-it-works.md +2 -2
  11. package/vendor/docs/00-introduction/quickstart.md +5 -5
  12. package/vendor/docs/00-introduction/what-is-lamaste.md +5 -5
  13. package/vendor/docs/01-concepts/authentication.md +6 -3
  14. package/vendor/docs/01-concepts/authorization.md +29 -17
  15. package/vendor/docs/01-concepts/certificates.md +3 -3
  16. package/vendor/docs/01-concepts/mtls.md +2 -2
  17. package/vendor/docs/01-concepts/nginx-reverse-proxy.md +8 -3
  18. package/vendor/docs/01-concepts/security-model.md +98 -34
  19. package/vendor/docs/01-concepts/tickets.md +2 -2
  20. package/vendor/docs/01-concepts/tunneling.md +4 -4
  21. package/vendor/docs/02-guides/agent-setup.md +34 -16
  22. package/vendor/docs/02-guides/certificate-management.md +2 -2
  23. package/vendor/docs/02-guides/cloud-provisioning.md +3 -3
  24. package/vendor/docs/02-guides/desktop-app-setup.md +10 -10
  25. package/vendor/docs/02-guides/installation.md +3 -3
  26. package/vendor/docs/02-guides/onboarding.md +2 -2
  27. package/vendor/docs/02-guides/standalone-plugin-with-tickets.md +2 -2
  28. package/vendor/docs/03-architecture/installer-flow.md +2 -2
  29. package/vendor/docs/03-architecture/installer.md +4 -4
  30. package/vendor/docs/03-architecture/management-flow.md +1 -1
  31. package/vendor/docs/03-architecture/nginx-configuration.md +91 -26
  32. package/vendor/docs/03-architecture/overview.md +8 -8
  33. package/vendor/docs/03-architecture/panel-client.md +6 -6
  34. package/vendor/docs/03-architecture/panel-server.md +2 -2
  35. package/vendor/docs/03-architecture/state-management.md +2 -2
  36. package/vendor/docs/03-architecture/system-overview.md +1 -1
  37. package/vendor/docs/04-api-reference/agent-hosted-plugins.md +407 -0
  38. package/vendor/docs/04-api-reference/app-host.md +360 -0
  39. package/vendor/docs/04-api-reference/audit-and-notifications.md +57 -0
  40. package/vendor/docs/04-api-reference/certificates.md +95 -38
  41. package/vendor/docs/04-api-reference/gatekeeper.md +5 -3
  42. package/vendor/docs/04-api-reference/lifecycle-hooks.md +333 -0
  43. package/vendor/docs/04-api-reference/onboarding.md +1 -1
  44. package/vendor/docs/04-api-reference/overview.md +137 -111
  45. package/vendor/docs/04-api-reference/registry-and-oidc.md +7 -3
  46. package/vendor/docs/04-api-reference/tunnels.md +15 -13
  47. package/vendor/docs/05-operations/backup-and-restore.md +1 -1
  48. package/vendor/docs/05-operations/uninstalling.md +1 -1
  49. package/vendor/docs/05-operations/upgrades.md +25 -20
  50. package/vendor/docs/06-reference/config-files.md +190 -97
  51. package/vendor/docs/06-reference/glossary.md +3 -3
  52. package/vendor/docs/06-reference/installer-flags.md +13 -13
  53. package/vendor/docs/06-reference/ports-and-services.md +1 -1
  54. package/vendor/docs/06-reference/troubleshooting.md +33 -8
  55. package/vendor/docs/_index.json +20 -0
  56. package/vendor/docs/gatekeeper-design.md +22 -19
  57. package/vendor/docs/identity-directory-design.md +57 -56
  58. package/vendor/docs/package.json +1 -1
  59. package/vendor/docs/todo/lib-cli-desktop-refactor.md +27 -27
  60. package/vendor/gatekeeper/dist/lib/types.d.ts +12 -0
  61. package/vendor/gatekeeper/dist/lib/types.d.ts.map +1 -1
  62. package/vendor/gatekeeper/dist/server/index.d.ts +2 -0
  63. package/vendor/gatekeeper/dist/server/index.d.ts.map +1 -1
  64. package/vendor/gatekeeper/dist/server/index.js +47 -8
  65. package/vendor/gatekeeper/dist/server/index.js.map +1 -1
  66. package/vendor/gatekeeper/dist/server/routes/authz.d.ts.map +1 -1
  67. package/vendor/gatekeeper/dist/server/routes/authz.js +233 -141
  68. package/vendor/gatekeeper/dist/server/routes/authz.js.map +1 -1
  69. package/vendor/gatekeeper/package.json +4 -3
  70. package/vendor/server/bin/lamaste-server.js +18 -1
  71. package/vendor/server/package.json +2 -2
  72. package/vendor/server/src/commands/audit.js +60 -0
  73. package/vendor/server/src/commands/plugins.js +963 -12
  74. package/vendor/server/src/commands/push-install.js +317 -0
  75. package/vendor/server/src/commands/registry-credential.js +2 -1
  76. package/vendor/server/src/commands/uninstall.js +28 -1
  77. package/vendor/server/src/ndjson.js +4 -2
  78. package/vendor/server/src/panel-api.js +32 -4
  79. package/vendor/server-ui/dist/assets/index-Bc5NCMSv.css +1 -0
  80. package/vendor/server-ui/dist/assets/index-DBp3cmaU.js +84 -0
  81. package/vendor/server-ui/dist/index.html +2 -2
  82. package/vendor/serverd/package.json +2 -2
  83. package/vendor/serverd/src/index.js +56 -4
  84. package/vendor/serverd/src/lib/actor.js +24 -0
  85. package/vendor/serverd/src/lib/agent-jobs.js +330 -0
  86. package/vendor/serverd/src/lib/app-error.js +10 -0
  87. package/vendor/serverd/src/lib/audit.js +145 -0
  88. package/vendor/serverd/src/lib/hook-effects.js +123 -0
  89. package/vendor/serverd/src/lib/hook-pipelines.js +902 -0
  90. package/vendor/serverd/src/lib/migrations/state/0006_plugin_agent.sql +4 -0
  91. package/vendor/serverd/src/lib/migrations/state/0007_audit_and_notifications.sql +29 -0
  92. package/vendor/serverd/src/lib/migrations/state/0008_plugin_hooks.sql +70 -0
  93. package/vendor/serverd/src/lib/migrations/state/0009_plugin_agent_half.sql +53 -0
  94. package/vendor/serverd/src/lib/migrations/state/0010_plugin_routes_and_retained_data.sql +47 -0
  95. package/vendor/serverd/src/lib/migrations/state/0011_agent_job_signature.sql +14 -0
  96. package/vendor/serverd/src/lib/mtls.js +89 -8
  97. package/vendor/serverd/src/lib/nginx.js +298 -44
  98. package/vendor/serverd/src/lib/notifications.js +107 -0
  99. package/vendor/serverd/src/lib/plugin-hooks.js +560 -0
  100. package/vendor/serverd/src/lib/plugin-hosting.js +688 -0
  101. package/vendor/serverd/src/lib/plugin-lifecycle.js +603 -0
  102. package/vendor/serverd/src/lib/plugin-operations.js +295 -0
  103. package/vendor/serverd/src/lib/plugin-packages.js +249 -0
  104. package/vendor/serverd/src/lib/plugins.js +298 -68
  105. package/vendor/serverd/src/lib/push-install.js +88 -2
  106. package/vendor/serverd/src/lib/relay-hooks.js +100 -0
  107. package/vendor/serverd/src/lib/relay-signing.js +43 -0
  108. package/vendor/serverd/src/lib/request-hooks.js +79 -0
  109. package/vendor/serverd/src/lib/retained-data.js +99 -0
  110. package/vendor/serverd/src/lib/trust-proxy.js +34 -0
  111. package/vendor/serverd/src/lib/tunnel-hooks.js +88 -0
  112. package/vendor/serverd/src/lib/vhost-reconcile.js +260 -0
  113. package/vendor/serverd/src/middleware/twofa-session.js +11 -1
  114. package/vendor/serverd/src/routes/agent-forwarder.js +37 -0
  115. package/vendor/serverd/src/routes/management/agent-panel-authz.js +97 -0
  116. package/vendor/serverd/src/routes/management/agents.js +262 -1
  117. package/vendor/serverd/src/routes/management/audit.js +81 -0
  118. package/vendor/serverd/src/routes/management/certs.js +1 -15
  119. package/vendor/serverd/src/routes/management/plugins.js +569 -54
  120. package/vendor/serverd/src/routes/management/tunnels.js +26 -0
  121. package/vendor/serverd/src/routes/management.js +4 -0
  122. package/vendor/server-ui/dist/assets/index-B5Wp8lu-.js +0 -257
  123. package/vendor/server-ui/dist/assets/index-BqWWFlTU.css +0 -1
@@ -274,117 +274,143 @@ There are two exceptions:
274
274
 
275
275
  ### Endpoint Summary
276
276
 
277
- | Method | Path | Group | Description |
278
- | ------ | --------------------------------------------------------- | ---------- | ---------------------------------------- |
279
- | GET | `/api/health` | Always | Health check |
280
- | GET | `/api/onboarding/status` | Always | Onboarding state |
281
- | POST | `/api/onboarding/domain` | Onboarding | Set domain and email |
282
- | POST | `/api/onboarding/verify-dns` | Onboarding | Verify DNS records |
283
- | POST | `/api/onboarding/provision` | Onboarding | Start provisioning |
284
- | WS | `/api/onboarding/provision/stream` | Onboarding | Provisioning progress |
285
- | GET | `/api/invite/:token` | Public | Get invitation details |
286
- | POST | `/api/invite/:token/accept` | Public | Accept invitation |
287
- | POST | `/api/enroll` | Public | Enroll agent with token (hardware-bound) |
288
- | GET | `/api/system/stats` | Management | System statistics |
289
- | POST | `/api/system/update` | Management | Trigger background server update |
290
- | POST | `/api/agents/plugins/report` | Management | Report agent plugin capabilities |
291
- | GET | `/api/agents/me/chisel-credential` | Management | The calling agent's Chisel credential |
292
- | POST | `/api/agents/me/chisel-credential/rotate` | Management | Rotate own Chisel credential (agent) |
293
- | GET | `/api/agents/me/registry-credential` | Management | One-hour registry token for the agent |
294
- | POST | `/api/agents/:label/chisel-credential/rotate` | Management | Rotate an agent's Chisel credential |
295
- | GET | `/api/tunnels/agent-config` | Management | One agent's tunnel configuration |
296
- | GET | `/api/tunnels` | Management | List tunnels |
297
- | POST | `/api/tunnels` | Management | Create tunnel |
298
- | PATCH | `/api/tunnels/:id` | Management | Move, access mode, body limit, enable |
299
- | DELETE | `/api/tunnels/:id` | Management | Delete tunnel |
300
- | GET | `/api/sites` | Management | List static sites |
301
- | POST | `/api/sites` | Management | Create static site |
302
- | DELETE | `/api/sites/:id` | Management | Delete static site |
303
- | PATCH | `/api/sites/:id` | Management | Update site settings |
304
- | POST | `/api/sites/:id/verify-dns` | Management | Verify site DNS |
305
- | GET | `/api/sites/:id/files` | Management | List site files |
306
- | POST | `/api/sites/:id/files` | Management | Upload site files |
307
- | DELETE | `/api/sites/:id/files` | Management | Delete site file |
308
- | GET | `/api/invitations` | Management | List invitations |
309
- | POST | `/api/invitations` | Management | Create invitation |
310
- | DELETE | `/api/invitations/:id` | Management | Revoke invitation |
311
- | GET | `/api/users` | Management | List users |
312
- | POST | `/api/users` | Management | Create user |
313
- | PUT | `/api/users/:username` | Management | Update user |
314
- | DELETE | `/api/users/:username` | Management | Delete user |
315
- | POST | `/api/users/:username/reset-totp` | Management | Reset TOTP secret |
316
- | GET | `/api/certs` | Management | List certificates |
317
- | GET | `/api/certs/auto-renew-status` | Management | Auto-renew timer status |
318
- | POST | `/api/certs/:domain/renew` | Management | Force-renew certificate |
319
- | POST | `/api/certs/mtls/rotate` | Management | Rotate mTLS cert |
320
- | GET | `/api/certs/mtls/download` | Management | Download client.p12 |
321
- | POST | `/api/certs/agent` | Management | Generate agent certificate |
322
- | GET | `/api/certs/agent` | Management | List agent certificates |
323
- | GET | `/api/certs/agent/:label/download` | Management | Download agent .p12 |
324
- | PATCH | `/api/certs/agent/:label/capabilities` | Management | Update agent capabilities |
325
- | PATCH | `/api/certs/agent/:label/allowed-sites` | Management | Update agent site access |
326
- | DELETE | `/api/certs/agent/:label` | Management | Revoke agent certificate |
327
- | POST | `/api/certs/agent/enroll` | Management | Generate enrollment token |
328
- | DELETE | `/api/certs/agent/enroll/:label` | Management | Revoke unused enrollment token |
329
- | POST | `/api/certs/agent/upgrade-cert` | Management | Upgrade agent cert to hardware-bound |
330
- | POST | `/api/certs/admin/upgrade-to-hardware-bound` | Management | Upgrade admin to hardware-bound |
331
- | GET | `/api/certs/admin/auth-mode` | Management | Get admin auth mode |
332
- | GET | `/api/settings/2fa` | Management | Get 2FA status |
333
- | POST | `/api/settings/2fa/setup` | Management | Generate TOTP secret |
334
- | POST | `/api/settings/2fa/confirm` | Management | Confirm initial code, enable 2FA |
335
- | POST | `/api/settings/2fa/verify` | Management | Verify code, issue session cookie |
336
- | POST | `/api/settings/2fa/disable` | Management | Disable 2FA |
337
- | GET | `/api/services` | Management | List service statuses |
338
- | POST | `/api/services/:name/:action` | Management | Control a service (start/stop/restart) |
339
- | WS | `/api/services/:name/logs` | Management | Stream service logs |
340
- | GET | `/api/plugins` | Management | List installed plugins |
341
- | GET | `/api/plugins/:name` | Management | Get plugin details |
342
- | POST | `/api/plugins/install` | Management | Install a plugin |
343
- | POST | `/api/plugins/:name/enable` | Management | Enable a plugin |
344
- | POST | `/api/plugins/:name/disable` | Management | Disable a plugin |
345
- | DELETE | `/api/plugins/:name` | Management | Uninstall a plugin |
346
- | GET | `/api/plugins/:name/oidc-clients` | Management | A plugin's OIDC clients (no secrets) |
347
- | POST | `/api/plugins/:name/oidc-clients/:clientId/rotate-secret` | Management | New secret for a confidential client |
348
- | GET | `/api/registry-credential` | Management | Registry credential summary |
349
- | PUT | `/api/registry-credential` | Management | Set the registry credential (verified) |
350
- | DELETE | `/api/registry-credential` | Management | Remove the registry credential |
351
- | GET | `/api/plugins/push-install/config` | Management | Get push install configuration |
352
- | PATCH | `/api/plugins/push-install/config` | Management | Update push install configuration |
353
- | GET | `/api/plugins/push-install/policies` | Management | List push install policies |
354
- | POST | `/api/plugins/push-install/policies` | Management | Create push install policy |
355
- | PATCH | `/api/plugins/push-install/policies/:id` | Management | Update push install policy |
356
- | DELETE | `/api/plugins/push-install/policies/:id` | Management | Delete push install policy |
357
- | POST | `/api/plugins/push-install/enable/:label` | Management | Enable push install for agent |
358
- | DELETE | `/api/plugins/push-install/enable/:label` | Management | Disable push install for agent |
359
- | GET | `/api/plugins/push-install/agent-status` | Management | Agent checks own push install status |
360
- | POST | `/api/plugins/push-install/:label` | Management | Send push install command to agent |
361
- | GET | `/api/plugins/push-install/sessions` | Management | List push install audit log |
362
- | POST | `/api/tickets/scopes` | Management | Register ticket scope |
363
- | GET | `/api/tickets/scopes` | Management | List scopes, instances, assignments |
364
- | DELETE | `/api/tickets/scopes/:name` | Management | Delete ticket scope |
365
- | POST | `/api/tickets/instances` | Management | Register instance |
366
- | DELETE | `/api/tickets/instances/:instanceId` | Management | Deregister instance |
367
- | POST | `/api/tickets/instances/:instanceId/heartbeat` | Management | Instance heartbeat |
368
- | POST | `/api/tickets/assignments` | Management | Assign agent to instance |
369
- | DELETE | `/api/tickets/assignments/:agentLabel/:instanceScope` | Management | Remove assignment |
370
- | GET | `/api/tickets/assignments` | Management | List assignments |
371
- | POST | `/api/tickets` | Management | Request ticket |
372
- | GET | `/api/tickets/inbox` | Management | Check ticket inbox |
373
- | POST | `/api/tickets/validate` | Management | Validate and consume ticket |
374
- | GET | `/api/tickets` | Management | List all tickets (admin) |
375
- | DELETE | `/api/tickets/:ticketId` | Management | Revoke ticket |
376
- | POST | `/api/tickets/sessions` | Management | Create session from ticket |
377
- | POST | `/api/tickets/sessions/:sessionId/heartbeat` | Management | Session heartbeat |
378
- | PATCH | `/api/tickets/sessions/:sessionId` | Management | Update session status |
379
- | DELETE | `/api/tickets/sessions/:sessionId` | Management | Kill session |
380
- | GET | `/api/tickets/sessions` | Management | List sessions |
381
- | POST | `/api/storage/servers` | Management | Register a storage server |
382
- | GET | `/api/storage/servers` | Management | List registered storage servers |
383
- | DELETE | `/api/storage/servers/:id` | Management | Remove a storage server |
384
- | POST | `/api/storage/bindings` | Management | Bind storage to plugin |
385
- | GET | `/api/storage/bindings` | Management | List all bindings |
386
- | GET | `/api/storage/bindings/:pluginName` | Management | Get binding for plugin |
387
- | DELETE | `/api/storage/bindings/:pluginName` | Management | Unbind storage from plugin |
277
+ | Method | Path | Group | Description |
278
+ | ------ | --------------------------------------------------------- | ---------- | ------------------------------------------ |
279
+ | GET | `/api/health` | Always | Health check |
280
+ | GET | `/api/onboarding/status` | Always | Onboarding state |
281
+ | POST | `/api/onboarding/domain` | Onboarding | Set domain and email |
282
+ | POST | `/api/onboarding/verify-dns` | Onboarding | Verify DNS records |
283
+ | POST | `/api/onboarding/provision` | Onboarding | Start provisioning |
284
+ | WS | `/api/onboarding/provision/stream` | Onboarding | Provisioning progress |
285
+ | GET | `/api/invite/:token` | Public | Get invitation details |
286
+ | POST | `/api/invite/:token/accept` | Public | Accept invitation |
287
+ | POST | `/api/enroll` | Public | Enroll agent with token (hardware-bound) |
288
+ | GET | `/api/system/stats` | Management | System statistics |
289
+ | POST | `/api/system/update` | Management | Trigger background server update |
290
+ | POST | `/api/agents/plugins/report` | Management | Report agent plugin capabilities |
291
+ | GET | `/api/agents/me/chisel-credential` | Management | The calling agent's Chisel credential |
292
+ | POST | `/api/agents/me/chisel-credential/rotate` | Management | Rotate own Chisel credential (agent) |
293
+ | GET | `/api/agents/me/registry-credential` | Management | One-hour registry token for the agent |
294
+ | GET | `/api/agents/me/relay-keys` | Management | Relay assertion keys, caller's relay label |
295
+ | GET | `/api/agents/me/plugin-config/:route` | Management | Hosting agent: its plugin's port, secret |
296
+ | POST | `/api/agents/me/plugin-config/:route/ack` | Management | Hosting agent holds the secret issued |
297
+ | POST | `/api/agents/me/jobs/:id/result` | Management | Report an agent job's result (agent) |
298
+ | PUT | `/api/agents/me/host-facts` | Management | Report the agent's host facts (agent) |
299
+ | GET | `/api/agent-panel/authz/:label` | Management | Agent-panel vhost `auth_request` (nginx) |
300
+ | POST | `/api/agents/:label/chisel-credential/rotate` | Management | Rotate an agent's Chisel credential |
301
+ | GET | `/api/tunnels/agent-config` | Management | One agent's tunnel configuration |
302
+ | GET | `/api/tunnels` | Management | List tunnels |
303
+ | POST | `/api/tunnels` | Management | Create tunnel |
304
+ | PATCH | `/api/tunnels/:id` | Management | Move, access mode, body limit, enable |
305
+ | DELETE | `/api/tunnels/:id` | Management | Delete tunnel |
306
+ | GET | `/api/sites` | Management | List static sites |
307
+ | POST | `/api/sites` | Management | Create static site |
308
+ | DELETE | `/api/sites/:id` | Management | Delete static site |
309
+ | PATCH | `/api/sites/:id` | Management | Update site settings |
310
+ | POST | `/api/sites/:id/verify-dns` | Management | Verify site DNS |
311
+ | GET | `/api/sites/:id/files` | Management | List site files |
312
+ | POST | `/api/sites/:id/files` | Management | Upload site files |
313
+ | DELETE | `/api/sites/:id/files` | Management | Delete site file |
314
+ | GET | `/api/invitations` | Management | List invitations |
315
+ | POST | `/api/invitations` | Management | Create invitation |
316
+ | DELETE | `/api/invitations/:id` | Management | Revoke invitation |
317
+ | GET | `/api/users` | Management | List users |
318
+ | POST | `/api/users` | Management | Create user |
319
+ | PUT | `/api/users/:username` | Management | Update user |
320
+ | DELETE | `/api/users/:username` | Management | Delete user |
321
+ | POST | `/api/users/:username/reset-totp` | Management | Reset TOTP secret |
322
+ | GET | `/api/certs` | Management | List certificates |
323
+ | GET | `/api/certs/auto-renew-status` | Management | Auto-renew timer status |
324
+ | POST | `/api/certs/:domain/renew` | Management | Force-renew certificate |
325
+ | POST | `/api/certs/mtls/rotate` | Management | Rotate mTLS cert |
326
+ | GET | `/api/certs/mtls/download` | Management | Download client.p12 |
327
+ | POST | `/api/certs/agent` | Management | Generate agent certificate |
328
+ | GET | `/api/certs/agent` | Management | List agent certificates |
329
+ | GET | `/api/certs/agent/:label/download` | Management | Download agent .p12 |
330
+ | PATCH | `/api/certs/agent/:label/capabilities` | Management | Update agent capabilities |
331
+ | PATCH | `/api/certs/agent/:label/allowed-sites` | Management | Update agent site access |
332
+ | DELETE | `/api/certs/agent/:label` | Management | Revoke agent certificate |
333
+ | POST | `/api/certs/agent/enroll` | Management | Generate enrollment token |
334
+ | DELETE | `/api/certs/agent/enroll/:label` | Management | Revoke unused enrollment token |
335
+ | POST | `/api/certs/agent/upgrade-cert` | Management | Upgrade agent cert to hardware-bound |
336
+ | POST | `/api/certs/admin/upgrade-to-hardware-bound` | Management | Upgrade admin to hardware-bound |
337
+ | GET | `/api/certs/admin/auth-mode` | Management | Get admin auth mode |
338
+ | GET | `/api/settings/2fa` | Management | Get 2FA status |
339
+ | POST | `/api/settings/2fa/setup` | Management | Generate TOTP secret |
340
+ | POST | `/api/settings/2fa/confirm` | Management | Confirm initial code, enable 2FA |
341
+ | POST | `/api/settings/2fa/verify` | Management | Verify code, issue session cookie |
342
+ | POST | `/api/settings/2fa/disable` | Management | Disable 2FA |
343
+ | GET | `/api/services` | Management | List service statuses |
344
+ | POST | `/api/services/:name/:action` | Management | Control a service (start/stop/restart) |
345
+ | WS | `/api/services/:name/logs` | Management | Stream service logs |
346
+ | GET | `/api/plugins` | Management | List installed plugins |
347
+ | GET | `/api/plugins/:name` | Management | Get plugin details |
348
+ | POST | `/api/plugins/install` | Management | Install a plugin |
349
+ | POST | `/api/plugins/:name/enable` | Management | Enable a plugin |
350
+ | POST | `/api/plugins/:name/disable` | Management | Disable a plugin |
351
+ | DELETE | `/api/plugins/:name` | Management | Uninstall a plugin |
352
+ | GET | `/api/plugins/:name/oidc-clients` | Management | A plugin's OIDC clients (no secrets) |
353
+ | POST | `/api/plugins/:name/oidc-clients/:clientId/rotate-secret` | Management | New secret for a confidential client |
354
+ | GET | `/api/plugins/:name/hosting` | Management | Which agent hosts the plugin, its health |
355
+ | POST | `/api/plugins/:name/hosting` | Management | Host the plugin on an agent (operation) |
356
+ | DELETE | `/api/plugins/:name/hosting` | Management | Remove the hosting (operation) |
357
+ | POST | `/api/plugins/:name/hosting/rotate-secret` | Management | New installation secret |
358
+ | GET | `/api/plugins/:name/hosting/eligibility` | Management | Which agents can host the plugin, and why |
359
+ | GET | `/api/plugins/:name/retained-data` | Management | Data agents keep of its agent half |
360
+ | DELETE | `/api/plugins/:name/retained-data` | Management | Purge it on an agent, or forget the record |
361
+ | GET | `/api/plugins/:name/hooks` | Management | Lifecycle hooks, what needs approval |
362
+ | POST | `/api/plugins/:name/hooks/approve` | Management | Approve with the approval digest |
363
+ | PUT | `/api/plugins/:name/hooks/auto-approve` | Management | Auto-approve what later versions bring |
364
+ | POST | `/api/plugins/:name/update` | Management | Update an agent-hosted plugin in place |
365
+ | DELETE | `/api/plugins/:name/update` | Management | Discard an update waiting for approval |
366
+ | GET | `/api/plugins/:name/operations` | Management | The plugin's recent operations |
367
+ | GET | `/api/plugins/:name/operations/:id` | Management | One operation and its steps |
368
+ | ANY | `/api/<route>`, `/api/<route>/*` | Management | Forwarded to the agent half's `/admin/*` |
369
+ | GET | `/api/audit` | Management | Audit log |
370
+ | GET | `/api/notifications` | Management | Panel notifications |
371
+ | POST | `/api/notifications/read` | Management | Mark notifications read |
372
+ | GET | `/api/registry-credential` | Management | Registry credential summary |
373
+ | PUT | `/api/registry-credential` | Management | Set the registry credential (verified) |
374
+ | DELETE | `/api/registry-credential` | Management | Remove the registry credential |
375
+ | GET | `/api/plugins/push-install/config` | Management | Get push install configuration |
376
+ | PATCH | `/api/plugins/push-install/config` | Management | Update push install configuration |
377
+ | GET | `/api/plugins/push-install/policies` | Management | List push install policies |
378
+ | POST | `/api/plugins/push-install/policies` | Management | Create push install policy |
379
+ | PATCH | `/api/plugins/push-install/policies/:id` | Management | Update push install policy |
380
+ | DELETE | `/api/plugins/push-install/policies/:id` | Management | Delete push install policy |
381
+ | POST | `/api/plugins/push-install/enable/:label` | Management | Enable push install for agent |
382
+ | DELETE | `/api/plugins/push-install/enable/:label` | Management | Disable push install for agent |
383
+ | GET | `/api/plugins/push-install/agent-status` | Management | Agent checks own push install status |
384
+ | POST | `/api/plugins/push-install/:label` | Management | Record a push-install command (legacy) |
385
+ | GET | `/api/plugins/push-install/sessions` | Management | List push install audit log |
386
+ | POST | `/api/tickets/scopes` | Management | Register ticket scope |
387
+ | GET | `/api/tickets/scopes` | Management | List scopes, instances, assignments |
388
+ | DELETE | `/api/tickets/scopes/:name` | Management | Delete ticket scope |
389
+ | POST | `/api/tickets/instances` | Management | Register instance |
390
+ | DELETE | `/api/tickets/instances/:instanceId` | Management | Deregister instance |
391
+ | POST | `/api/tickets/instances/:instanceId/heartbeat` | Management | Instance heartbeat |
392
+ | POST | `/api/tickets/assignments` | Management | Assign agent to instance |
393
+ | DELETE | `/api/tickets/assignments/:agentLabel/:instanceScope` | Management | Remove assignment |
394
+ | GET | `/api/tickets/assignments` | Management | List assignments |
395
+ | POST | `/api/tickets` | Management | Request ticket |
396
+ | GET | `/api/tickets/inbox` | Management | Check ticket inbox |
397
+ | POST | `/api/tickets/validate` | Management | Validate and consume ticket |
398
+ | GET | `/api/tickets` | Management | List all tickets (admin) |
399
+ | DELETE | `/api/tickets/:ticketId` | Management | Revoke ticket |
400
+ | POST | `/api/tickets/sessions` | Management | Create session from ticket |
401
+ | POST | `/api/tickets/sessions/:sessionId/heartbeat` | Management | Session heartbeat |
402
+ | PATCH | `/api/tickets/sessions/:sessionId` | Management | Update session status |
403
+ | DELETE | `/api/tickets/sessions/:sessionId` | Management | Kill session |
404
+ | GET | `/api/tickets/sessions` | Management | List sessions |
405
+ | POST | `/api/storage/servers` | Management | Register a storage server |
406
+ | GET | `/api/storage/servers` | Management | List registered storage servers |
407
+ | DELETE | `/api/storage/servers/:id` | Management | Remove a storage server |
408
+ | POST | `/api/storage/bindings` | Management | Bind storage to plugin |
409
+ | GET | `/api/storage/bindings` | Management | List all bindings |
410
+ | GET | `/api/storage/bindings/:pluginName` | Management | Get binding for plugin |
411
+ | DELETE | `/api/storage/bindings/:pluginName` | Management | Unbind storage from plugin |
412
+
413
+ `POST /api/plugins/push-install/:label` checks the push-install gates and records the command in the push-install log; nothing delivers it to the agent. What Lamaste does push to an agent — installing, updating and removing an agent half — runs as plugin operations under the same gates ([Agent-Hosted Plugins](agent-hosted-plugins.md#push-install-gates)). The agent-hosted plugin endpoints are described in [Agent-Hosted Plugins](agent-hosted-plugins.md), [Lifecycle Hooks](lifecycle-hooks.md) and [Audit Log and Notifications](audit-and-notifications.md).
388
414
 
389
415
  ### Agent Capabilities
390
416
 
@@ -53,7 +53,9 @@ What the panel writes for a public client: `public: true`, `token_endpoint_auth_
53
53
 
54
54
  ### Secrets of confidential clients
55
55
 
56
- The panel mints a 32-byte secret when a confidential client first appears (at install — the secret belongs to an installed plugin, enabled or not), stores the plaintext in `/etc/lamalibre/lamaste/oidc-clients.json` (0600) and writes only the digest into Authelia. The plaintext is shown exactly once: in the response of the `POST /api/plugins/install` (or `enable`) call that created it, as `oidcClients: [{ id, secret }]`, and again by `rotate-secret`. Uninstalling the plugin deletes the secret; disabling keeps it.
56
+ The panel mints a 32-byte secret when a confidential client first appears (at install — the secret belongs to an installed plugin, enabled or not), stores the plaintext in `/etc/lamalibre/lamaste/oidc-clients.json` (0600) and writes only the digest into Authelia. The plaintext is shown exactly once: in the response of the `POST /api/plugins/install` (or `enable`) call that created it, as `oidcClients: [{ id, secret }]` — or, when an update of an agent-hosted plugin adds the client, on the first read of the finished update operation ([Operations](lifecycle-hooks.md#operations)) — and again by `rotate-secret`. Uninstalling the plugin deletes the secret; disabling keeps it.
57
+
58
+ The panel's Plugins page — and the desktop app, which reuses it — shows the secrets an install, enable or update created in a dialog the administrator must acknowledge: each client id with its secret and a copy button, and the warning that it is shown once. The secrets go from the response to that dialog only: not into the page's query cache, the browser's storage or a log, and they are gone once acknowledged. An update started from the page is read as it ends. One started elsewhere — another panel, `lamaste-server`, or the page before a reload — is offered on the plugin's card (**Show the secrets**) instead of read unasked, so the CLI following its own update still prints them.
57
59
 
58
60
  ### Where the clients are served
59
61
 
@@ -82,10 +84,12 @@ An application that runs on its own agent, behind a Lamaste tunnel, still needs
82
84
  }
83
85
  ```
84
86
 
85
- It is installed like any plugin (`POST /api/plugins/install` runs `npm install --ignore-scripts` and reads `<package>/lamaste-plugin.json`), but Lamaste never imports the package — not the panel, and not an agent's plugin host if the package is installed there. Nothing is mounted under `/api/<name>/` (requests there answer `404`), no panel bundle is served, and no storage can be bound to it (`400`). A `panel` declaration is a manifest error (`400` on install). What takes effect is what the manifest declares: its `oidcClients` are written to Authelia on enable and removed on disable or uninstall, confidential-client secrets are minted and shown exactly as above, and its `capabilities` can be granted to agents. `GET /api/plugins` reports each plugin's `hosting`; a plugin installed before 4.2 is `"server"`.
87
+ It is installed like any plugin (`POST /api/plugins/install` runs `npm install --ignore-scripts` and reads `<package>/lamaste-plugin.json`), but Lamaste never imports the package — not the panel, and not an agent's plugin host if the package is installed there. Nothing is mounted under `/api/<name>/` (requests there answer `404`), no panel bundle is served, and no storage can be bound to it (`400`). A `panel` declaration on such an identity-only plugin is a manifest error (`400` on install). What takes effect is what the manifest declares: its `oidcClients` are written to Authelia on enable and removed on disable or uninstall, confidential-client secrets are minted and shown exactly as above, and its `capabilities` can be granted to agents. `GET /api/plugins` reports each plugin's `hosting`; a plugin installed before 4.2 is `"server"`.
86
88
 
87
89
  The application's own tunnel (`feria.<domain>`) is created by the administrator as for any app; Lamaste does not create it from the manifest.
88
90
 
91
+ An agent-hosted plugin whose manifest also has an `agent` block has an _agent half_ the panel connects to: it can be hosted on an agent, which gives it an internal plugin tunnel, an installation secret and a forwarded admin API, and it may declare panel pages. See [Agent-Hosted Plugins](agent-hosted-plugins.md).
92
+
89
93
  ## Plugin OIDC client endpoints
90
94
 
91
95
  ### `GET /api/plugins/:name/oidc-clients`
@@ -160,7 +164,7 @@ Admin only, 10 per minute. Verifies the whole chain against the registry, then s
160
164
  ```
161
165
 
162
166
  - `auth.kind: "token"` — a long-lived Feria token. The registry's `/-/whoami` must report the `admin` scope (the broker route requires it).
163
- - `auth.kind: "oidc"` — the panel's own service principal. The panel first makes sure Authelia carries the confidential client `lamaste-server` (grant `client_credentials`, `token_endpoint_auth_method: client_secret_basic`, scope `lamaste.registry` — defined under `identity_providers.oidc.scopes` —, audience = the registry URL without a trailing slash, RS256 JWT access tokens; secret in `oidc-clients.json`). It then obtains a JWT from Authelia's token endpoint (`grant_type=client_credentials&scope=lamaste.registry&audience=<registryUrl>`), posts it to `<registryUrl>/-/feria/login`, and checks that `/-/whoami` reports `admin`. If any step fails the client is removed again and the error says what is missing — typically that Feria's `auth.json` needs a `rules` issuer for `https://auth.<domain>` with audience `<registryUrl>` granting the `admin` scope when the `client_id` claim (or `sub`, which carries the same value) is `lamaste-server`.
167
+ - `auth.kind: "oidc"` — the panel's own service principal. The panel first makes sure Authelia carries the confidential client `lamaste-server` (grant `client_credentials`, `token_endpoint_auth_method: client_secret_basic`, scope `lamaste.registry` — defined under `identity_providers.oidc.scopes` —, audience = the registry URL without a trailing slash, RS256 JWT access tokens; secret in `oidc-clients.json`). It then obtains a JWT from Authelia's token endpoint (`grant_type=client_credentials&scope=lamaste.registry&audience=<registryUrl>`), posts it to `<registryUrl>/-/feria/login`, and checks that `/-/whoami` reports `admin`. If any step fails the client is removed again and the error says what is missing — typically that Feria's `auth.json` needs, on its `groups` issuer for `https://auth.<domain>` (audience `<registryUrl>`), a `workloads` rule granting the `admin` scope when the `client_id` claim (or `sub`, which carries the same value) is `lamaste-server`. Feria keys issuers by `iss` and the relay's users log in through the same Authelia, so the rule cannot be a second `rules` issuer; `workloads` needs Feria 0.3.2 or later.
164
168
 
165
169
  Response: as `GET`. Errors: `400` (no admin scope), `502` (registry or Authelia refused or unreachable), `503` (no domain yet).
166
170
 
@@ -53,19 +53,20 @@ curl -s --cert client.p12:password \
53
53
  }
54
54
  ```
55
55
 
56
- | Field | Type | Description |
57
- | --------------- | ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
58
- | `id` | `string` | UUID v4 identifier |
59
- | `subdomain` | `string` | The subdomain portion (e.g., `app`) |
60
- | `fqdn` | `string` | Fully qualified domain name (e.g., `app.example.com`) |
61
- | `port` | `number` | Port the carrying agent forwards; bound on `127.0.0.1` on both the server and the agent |
62
- | `description` | `string \| null` | Optional human-readable description |
63
- | `type` | `string` | `'app'` (default), `'panel'` (agent web panel), or `'plugin'` |
64
- | `accessMode` | `string` | `'restricted'` (default), `'authenticated'`, or `'public'` — absent on panel tunnels |
65
- | `agentLabel` | `string` | The agent that carries the tunnel. Absent only on an unassigned legacy tunnel (see below) |
66
- | `maxBodySizeMb` | `number` | Largest request body nginx accepts, in MiB. Absent on panel tunnels and on tunnels created before the setting existed, which keep nginx's built-in 1 MiB until a body limit is set on them |
67
- | `enabled` | `boolean` | Whether the tunnel is active (defaults to `true`) |
68
- | `createdAt` | `string` | ISO 8601 timestamp |
56
+ | Field | Type | Description |
57
+ | --------------- | ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
58
+ | `id` | `string` | UUID v4 identifier |
59
+ | `subdomain` | `string` | The subdomain portion (e.g., `app`) |
60
+ | `fqdn` | `string` | Fully qualified domain name (e.g., `app.example.com`) |
61
+ | `port` | `number` | Port the carrying agent forwards; bound on `127.0.0.1` on both the server and the agent |
62
+ | `description` | `string \| null` | Optional human-readable description |
63
+ | `type` | `string` | `'app'` (default), `'panel'` (agent web panel), or `'plugin'` |
64
+ | `accessMode` | `string` | `'restricted'` (default), `'authenticated'`, or `'public'` — absent on panel tunnels |
65
+ | `agentLabel` | `string` | The agent that carries the tunnel. Absent only on an unassigned legacy tunnel (see below) |
66
+ | `exposure` | `string` | `'internal'` on the internal tunnel of a hosted agent-hosted plugin: no `subdomain`, `fqdn` or `accessMode`, only the chisel grant on a relay-loopback port. Absent (public) on every other tunnel. See [Agent-Hosted Plugins](agent-hosted-plugins.md) |
67
+ | `maxBodySizeMb` | `number` | Largest request body nginx accepts, in MiB. Absent on panel tunnels and on tunnels created before the setting existed, which keep nginx's built-in 1 MiB until a body limit is set on them |
68
+ | `enabled` | `boolean` | Whether the tunnel is active (defaults to `true`) |
69
+ | `createdAt` | `string` | ISO 8601 timestamp |
69
70
 
70
71
  ---
71
72
 
@@ -370,6 +371,7 @@ Revoking an agent's certificate releases its tunnels: its app and plugin tunnels
370
371
  - Minimum: 1024 (no privileged ports)
371
372
  - Maximum: 65535
372
373
  - Must not be a reserved port: `3100` (panel server), `9090` (Chisel server), `9091` (Authelia), `9292` (IP-based panel listener), `9294` (Gatekeeper)
374
+ - Must not be in `21000`–`21999`, the range Lamaste assigns to the internal tunnels of hosted agent-hosted plugins (a tunnel created before 4.3 on such a port keeps it)
373
375
  - Must be unique across all tunnels — Chisel binds the same port on the server and on the agent
374
376
 
375
377
  A tunnel's vhost proxies to `127.0.0.1:<port>` on the relay, so a tunnel on one of Lamaste's own ports would publish that internal service on the internet. For the panel ports that would be an administrator takeover, not a leak: the panel trusts the client-certificate headers nginx sets. The reserved ports are rejected by the request schema, again inside the tunnel workflow, and never granted in the Chisel authfile.
@@ -197,7 +197,7 @@ sudo chown lamaste-authelia:lamaste-authelia /etc/authelia/db.sqlite3* /etc/auth
197
197
  sudo chmod 600 /etc/authelia/db.sqlite3* /etc/authelia/notifications.txt
198
198
  ```
199
199
 
200
- A backup taken on a version before the privilege boundary holds root-owned Authelia files and older unit files. After restoring one, re-run `npx @lamalibre/create-lamaste@4.2.0 --yes`: the redeploy rewrites the `chisel` and `authelia` units and converts the ownership of `/etc/authelia`, the Chisel key and the PKI directory (see [Upgrades](upgrades.md)).
200
+ A backup taken on a version before the privilege boundary holds root-owned Authelia files and older unit files. After restoring one, re-run `npx @lamalibre/create-lamaste@4.3.0 --yes`: the redeploy rewrites the `chisel` and `authelia` units and converts the ownership of `/etc/authelia`, the Chisel key and the PKI directory (see [Upgrades](upgrades.md)).
201
201
 
202
202
  The panel re-applies the authfile's group and mode itself on every start, so a Chisel that fails to read it before the panel is up is started again by the panel's reconciliation.
203
203
 
@@ -29,7 +29,7 @@ It stops and disables the panel, gatekeeper, Chisel and Authelia; removes their
29
29
  The manual guide is also available from the CLI:
30
30
 
31
31
  ```bash
32
- npx @lamalibre/create-lamaste@4.2.0 --uninstall
32
+ npx @lamalibre/create-lamaste@4.3.0 --uninstall
33
33
  ```
34
34
 
35
35
  This prints the same steps listed below.
@@ -18,18 +18,22 @@ Always follow these steps before upgrading any component:
18
18
  2. **Note what is currently working** — check the dashboard, verify services are active
19
19
  3. **Plan for a brief outage** — most upgrades require a service restart (seconds, not minutes)
20
20
 
21
- ### Upgrade Order: Agents First
21
+ ### Upgrade Order: Server First
22
22
 
23
- When a release changes both sides, upgrade every **agent before the server**. Agents from before this version reject the new shape of the relay's Chisel arguments; a current agent works against an older server and keeps its Chisel credential until the server offers rotation.
23
+ Upgrade the **server before the agents**. Since 4.3 an agent's daemon (`lamaste-agentd`) accepts a request from the relay only with a signed relay assertion, which a 4.3 server sends and an older one does not: a 4.3 agent behind an older server refuses its agent-panel and plugin-tunnel requests (401) until the server is upgraded. An older agent keeps working behind a 4.3 server, which still sends the headers older daemons read.
24
24
 
25
- On each agent machine:
25
+ Coming from 3.x, upgrade the **agents first**, as 4.0 required: agents from before 4.0 reject the 4.0 server's Chisel arguments and lose their tunnels, while a 4.3 agent behind a 3.x server keeps its tunnels and only its agent panel answers 401 until the server is upgraded.
26
+
27
+ On each agent machine, after the server:
26
28
 
27
29
  ```bash
28
- npm install -g @lamalibre/lamaste-agent@4.2.0
30
+ sudo npm install -g @lamalibre/lamaste-agent@4.3.0
29
31
  lamaste-agent update
30
32
  ```
31
33
 
32
- `update` applies the panel's configuration, restarts the tunnel client, and installs the sync timer (which applies later tunnel changes within 30 seconds). An agent originally set up with `npx` must be installed globally first — the sync timer runs the installed program. On its first sync after the upgrade an agent from before this version rotates its Chisel credential once, because older versions exposed it in process arguments and 0644 unit files. The Desktop App updates the agents it manages.
34
+ `update` applies the panel's configuration, restarts the tunnel client, and installs the sync timer (which applies later tunnel changes within 30 seconds). An agent originally set up with `npx` must be installed globally first — the sync timer runs the installed program. On Linux it also rewrites the agent panel's user unit so the panel starts at boot. An agent from before 4.0 rotates its Chisel credential once on its first sync, because older versions exposed it in process arguments and 0644 unit files. The Desktop App updates the agents it manages.
35
+
36
+ A machine that hosts app plugins' agent halves needs the root-owned install shown above and its app host helper enabled once with `sudo lamaste-agent apphost enable` (see [App host](../04-api-reference/app-host.md)); after replacing the server's relay signing key, run `sudo lamaste-agent apphost pin` there.
33
37
 
34
38
  ### Updating Lamaste (Panel Server and Client)
35
39
 
@@ -58,8 +62,9 @@ The `@latest` tag ensures you get the newest published version. The `--yes` flag
58
62
  - It rewrites `panel.json` (merged, as a fresh file renamed into place — root never writes through a path the `lamaste` user controls)
59
63
  - It installs the pinned Chisel and Authelia releases if they are not already installed (a newer Authelia is kept), writes their systemd units, creates the `lamaste-chisel` group and the `lamaste-authelia` account, and sets the ownership described in [Configuration Files](../06-reference/config-files.md#file-permissions-table): `/var/www/lamaste` becomes `lamaste:www-data`, `/etc/authelia` `lamaste:lamaste-authelia`, the Chisel key `lamaste:lamaste-chisel 0640`, and the PKI directory `lamaste`'s. A running Authelia is stopped while its files change hands and started again afterwards
60
64
  - It generates the OpenID Connect issuer key `/etc/authelia/oidc-issuer.pem` (0600, `lamaste-authelia`) if it is missing, and the Authelia unit it writes enables the `template` configuration filter. A 4.0 server updating to 4.1 therefore has the key before the new panel starts; plugin OIDC clients and the `--oidc` registry credential need it
65
+ - It upgrades Node.js from NodeSource when the installed version is older than 22.13 — the plugin hook runner's sandbox uses Node's stable permission model — and writes the hook runner's units (`lamalibre-lamaste-hooks@.socket`, `lamalibre-lamaste-hooks@.service`; see [Lifecycle hooks](../04-api-reference/lifecycle-hooks.md))
61
66
  - It rewrites the panel's systemd unit and the sudoers rules (checked with `visudo -c` before they replace the old file), installs the root-owned programs in `/usr/local/sbin/` (`lamaste-priv`, `lamaste-certbot`, `lamaste-cert-info`) and removes the retired `lamaste-sign-csr` and `lamaste-pki-rename`, and installs the port-80 redirect site
62
- - It restarts Chisel if its binary or unit changed, starts the gatekeeper if it was running, and restarts `lamalibre-lamaste-serverd`, whose startup reconciliation rewrites Chisel's authfile
67
+ - It restarts Chisel if its binary or unit changed, starts the gatekeeper if it was running, and restarts `lamalibre-lamaste-serverd`, whose startup reconciliation rewrites Chisel's authfile. The first start of a 4.3 panel also creates the relay signing key (`/etc/lamalibre/lamaste/relay-signing-key.json`, 0600) and rewrites existing tunnel, static site and auth portal vhosts; check its log for `Left tunnel vhosts as they are`, `Left site vhosts as they are` and `Failed to rewrite … vhost` (see the [4.3.0 upgrade notes](https://github.com/lamalibre/lamaste/blob/main/CHANGELOG.md))
63
68
 
64
69
  The panel's **Update** action (`POST /api/system/update`) runs the same redeploy: it asks `sudo lamaste-priv self-update <version>` to start `create-lamaste@<version> --yes` in a transient systemd unit (see [System API](../04-api-reference/system.md)).
65
70
 
@@ -79,7 +84,7 @@ exit
79
84
 
80
85
  ### Updating Chisel
81
86
 
82
- Chisel is the tunnel server binary at `/usr/local/bin/chisel`. Lamaste pins it: server and agents run Chisel 1.12.0 (`CHISEL_RELEASE` in `@lamalibre/lamaste@4.2.0`), downloaded from the fixed release URL and verified against a pinned SHA-256 before it is unpacked. **Do not replace the binary by hand.** On the server, `create-lamaste` installs it (as root) and replaces a binary that reports any other version; the panel cannot install binaries, and only logs an error at startup when the installed Chisel is not the pinned release (it then restarts Chisel on every authfile change). Each agent's sync replaces its own copy.
87
+ Chisel is the tunnel server binary at `/usr/local/bin/chisel`. Lamaste pins it: server and agents run Chisel 1.12.0 (`CHISEL_RELEASE` in `@lamalibre/lamaste@4.3.0`), downloaded from the fixed release URL and verified against a pinned SHA-256 before it is unpacked. **Do not replace the binary by hand.** On the server, `create-lamaste` installs it (as root) and replaces a binary that reports any other version; the panel cannot install binaries, and only logs an error at startup when the installed Chisel is not the pinned release (it then restarts Chisel on every authfile change). Each agent's sync replaces its own copy.
83
88
 
84
89
  A new Chisel version therefore arrives with a Lamaste release that changes the pin: re-run the installer, which installs it and restarts Chisel. To check what is running:
85
90
 
@@ -93,7 +98,7 @@ Tunnel clients reconnect on their own after the brief interruption (they retry a
93
98
 
94
99
  ### Updating Authelia
95
100
 
96
- Authelia is the authentication server binary at `/usr/local/bin/authelia`. Lamaste pins it too: Authelia 4.39.28 (`AUTHELIA_RELEASE` in `@lamalibre/lamaste@4.2.0`), downloaded by `create-lamaste` from its fixed release URL and verified against a pinned SHA-256 per architecture. A new Authelia version arrives with a Lamaste release that changes the pin — re-run the installer. It stops Authelia while it replaces the binary and starts it again.
101
+ Authelia is the authentication server binary at `/usr/local/bin/authelia`. Lamaste pins it too: Authelia 4.39.28 (`AUTHELIA_RELEASE` in `@lamalibre/lamaste@4.3.0`), downloaded by `create-lamaste` from its fixed release URL and verified against a pinned SHA-256 per architecture. A new Authelia version arrives with a Lamaste release that changes the pin — re-run the installer. It stops Authelia while it replaces the binary and starts it again.
97
102
 
98
103
  An installed Authelia **newer** than the pin is kept, never downgraded: its database may already use a schema the pinned release cannot read, and Authelia refuses to start on a database newer than itself. If you install a newer release by hand, stop the service, replace the binary as root with a `root:root 0755` file, and start it again; check the [Authelia changelog](https://github.com/authelia/authelia/blob/master/CHANGELOG.md) first, since the configuration format may change between versions.
99
104
 
@@ -232,7 +237,7 @@ The panel server, CLI, client, docs and gatekeeper are always redeployed (files
232
237
 
233
238
  ### Version Pinning
234
239
 
235
- Chisel and Authelia are pinned by version and SHA-256 in `packages/core/lib/src/constants.ts` (`CHISEL_RELEASE`, `AUTHELIA_RELEASE`); changing a pin means updating the version and every digest there. The downloads are verified by `downloadVerifiedChisel` / `downloadVerifiedAuthelia` (exported from `@lamalibre/lamaste@4.2.0`) before anything is unpacked; the server installer uses them in `packages/provisioners/server/src/lib/binaries.js`. The configuration the panel writes needs Authelia 4.38 or later.
240
+ Chisel and Authelia are pinned by version and SHA-256 in `packages/core/lib/src/constants.ts` (`CHISEL_RELEASE`, `AUTHELIA_RELEASE`); changing a pin means updating the version and every digest there. The downloads are verified by `downloadVerifiedChisel` / `downloadVerifiedAuthelia` (exported from `@lamalibre/lamaste@4.3.0`) before anything is unpacked; the server installer uses them in `packages/provisioners/server/src/lib/binaries.js`. The configuration the panel writes needs Authelia 4.38 or later.
236
241
 
237
242
  ### Automated Updates
238
243
 
@@ -249,17 +254,17 @@ sudo dpkg-reconfigure -plow unattended-upgrades
249
254
 
250
255
  ## Quick Reference
251
256
 
252
- | Component | Location | Update Method |
253
- | ------------ | ------------------------------------------- | ------------------------------------------------------ |
254
- | Panel server | `/opt/lamalibre/lamaste/lamaste-serverd/` | Re-run `npx @lamalibre/create-lamaste@latest` |
255
- | Panel client | `/opt/lamalibre/lamaste/lamaste-server-ui/` | Re-run `npx @lamalibre/create-lamaste@latest` |
256
- | Chisel | `/usr/local/bin/chisel` | Pinned; installed by `create-lamaste` |
257
- | Agents | `npm install -g @lamalibre/lamaste-agent@4.2.0` | Upgrade before the server, then `lamaste-agent update` |
258
- | Authelia | `/usr/local/bin/authelia` | Pinned; installed by `create-lamaste` (newer is kept) |
259
- | nginx | System package | `sudo apt-get update && sudo apt-get upgrade` |
260
- | certbot | System package | `sudo apt-get update && sudo apt-get upgrade` |
261
- | Node.js | System package | Managed by installer (NodeSource repo) |
262
- | Ubuntu | System packages | `sudo apt-get update && sudo apt-get upgrade` |
257
+ | Component | Location | Update Method |
258
+ | ------------ | ---------------------------------------------- | ----------------------------------------------------- |
259
+ | Panel server | `/opt/lamalibre/lamaste/lamaste-serverd/` | Re-run `npx @lamalibre/create-lamaste@latest` |
260
+ | Panel client | `/opt/lamalibre/lamaste/lamaste-server-ui/` | Re-run `npx @lamalibre/create-lamaste@latest` |
261
+ | Chisel | `/usr/local/bin/chisel` | Pinned; installed by `create-lamaste` |
262
+ | Agents | `sudo npm install -g @lamalibre/lamaste-agent@4.3.0` | Upgrade after the server, then `lamaste-agent update` |
263
+ | Authelia | `/usr/local/bin/authelia` | Pinned; installed by `create-lamaste` (newer is kept) |
264
+ | nginx | System package | `sudo apt-get update && sudo apt-get upgrade` |
265
+ | certbot | System package | `sudo apt-get update && sudo apt-get upgrade` |
266
+ | Node.js | System package | Managed by installer (NodeSource repo) |
267
+ | Ubuntu | System packages | `sudo apt-get update && sudo apt-get upgrade` |
263
268
 
264
269
  | Post-Upgrade Check | Command |
265
270
  | -------------------- | ----------------------------------------------------------------------- |