@lamalibre/create-lamaste 4.0.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 (270) hide show
  1. package/LICENSE.md +118 -0
  2. package/README.md +114 -0
  3. package/bin/create-lamaste.js +15 -0
  4. package/package.json +54 -0
  5. package/scripts/bundle-vendor.js +110 -0
  6. package/scripts/lamaste-cert-info +62 -0
  7. package/scripts/lamaste-certbot +96 -0
  8. package/scripts/lamaste-priv +693 -0
  9. package/src/index.js +646 -0
  10. package/src/lib/accounts.js +86 -0
  11. package/src/lib/binaries.js +137 -0
  12. package/src/lib/cert-help-page.js +160 -0
  13. package/src/lib/env.js +132 -0
  14. package/src/lib/http-redirect.js +38 -0
  15. package/src/lib/ownership.js +231 -0
  16. package/src/lib/relay-services.js +103 -0
  17. package/src/lib/secrets.js +19 -0
  18. package/src/lib/service-config.js +311 -0
  19. package/src/lib/summary.js +131 -0
  20. package/src/lib/wrappers.js +63 -0
  21. package/src/tasks/gatekeeper.js +233 -0
  22. package/src/tasks/harden.js +293 -0
  23. package/src/tasks/mtls.js +193 -0
  24. package/src/tasks/nginx.js +265 -0
  25. package/src/tasks/node.js +110 -0
  26. package/src/tasks/panel.js +408 -0
  27. package/src/tasks/redeploy.js +438 -0
  28. package/vendor/docs/00-introduction/how-it-works.md +447 -0
  29. package/vendor/docs/00-introduction/quickstart.md +472 -0
  30. package/vendor/docs/00-introduction/what-is-lamaste.md +112 -0
  31. package/vendor/docs/01-concepts/authentication.md +464 -0
  32. package/vendor/docs/01-concepts/authorization.md +242 -0
  33. package/vendor/docs/01-concepts/certificates.md +452 -0
  34. package/vendor/docs/01-concepts/dns-and-domains.md +343 -0
  35. package/vendor/docs/01-concepts/mtls.md +490 -0
  36. package/vendor/docs/01-concepts/nginx-reverse-proxy.md +540 -0
  37. package/vendor/docs/01-concepts/security-model.md +600 -0
  38. package/vendor/docs/01-concepts/tickets.md +414 -0
  39. package/vendor/docs/01-concepts/tunneling.md +367 -0
  40. package/vendor/docs/02-guides/agent-setup.md +194 -0
  41. package/vendor/docs/02-guides/certificate-management.md +341 -0
  42. package/vendor/docs/02-guides/cloud-provisioning.md +406 -0
  43. package/vendor/docs/02-guides/desktop-app-setup.md +226 -0
  44. package/vendor/docs/02-guides/disaster-recovery.md +464 -0
  45. package/vendor/docs/02-guides/first-tunnel.md +230 -0
  46. package/vendor/docs/02-guides/installation.md +393 -0
  47. package/vendor/docs/02-guides/managing-users.md +255 -0
  48. package/vendor/docs/02-guides/onboarding.md +244 -0
  49. package/vendor/docs/02-guides/standalone-plugin-with-tickets.md +375 -0
  50. package/vendor/docs/02-guides/static-sites.md +364 -0
  51. package/vendor/docs/03-architecture/e2e-three-vm-sequences.md +457 -0
  52. package/vendor/docs/03-architecture/installer-flow.md +151 -0
  53. package/vendor/docs/03-architecture/installer.md +445 -0
  54. package/vendor/docs/03-architecture/management-flow.md +288 -0
  55. package/vendor/docs/03-architecture/nginx-configuration.md +830 -0
  56. package/vendor/docs/03-architecture/onboarding-flow.md +164 -0
  57. package/vendor/docs/03-architecture/overview.md +541 -0
  58. package/vendor/docs/03-architecture/panel-client.md +416 -0
  59. package/vendor/docs/03-architecture/panel-server.md +695 -0
  60. package/vendor/docs/03-architecture/state-management.md +529 -0
  61. package/vendor/docs/03-architecture/system-overview.md +167 -0
  62. package/vendor/docs/04-api-reference/certificates.md +1141 -0
  63. package/vendor/docs/04-api-reference/gatekeeper.md +592 -0
  64. package/vendor/docs/04-api-reference/onboarding.md +473 -0
  65. package/vendor/docs/04-api-reference/overview.md +404 -0
  66. package/vendor/docs/04-api-reference/services.md +267 -0
  67. package/vendor/docs/04-api-reference/settings.md +343 -0
  68. package/vendor/docs/04-api-reference/sites.md +716 -0
  69. package/vendor/docs/04-api-reference/system.md +268 -0
  70. package/vendor/docs/04-api-reference/tickets.md +618 -0
  71. package/vendor/docs/04-api-reference/tunnels.md +417 -0
  72. package/vendor/docs/04-api-reference/users.md +333 -0
  73. package/vendor/docs/05-operations/backup-and-restore.md +342 -0
  74. package/vendor/docs/05-operations/monitoring.md +285 -0
  75. package/vendor/docs/05-operations/uninstalling.md +344 -0
  76. package/vendor/docs/05-operations/upgrades.md +270 -0
  77. package/vendor/docs/06-reference/config-files.md +1080 -0
  78. package/vendor/docs/06-reference/glossary.md +528 -0
  79. package/vendor/docs/06-reference/installer-flags.md +260 -0
  80. package/vendor/docs/06-reference/ports-and-services.md +244 -0
  81. package/vendor/docs/06-reference/troubleshooting.md +665 -0
  82. package/vendor/docs/_index.json +233 -0
  83. package/vendor/docs/gatekeeper-design.md +953 -0
  84. package/vendor/docs/package.json +15 -0
  85. package/vendor/docs/todo/lib-cli-desktop-refactor.md +641 -0
  86. package/vendor/gatekeeper/dist/boot.d.ts +1 -0
  87. package/vendor/gatekeeper/dist/boot.d.ts.map +1 -0
  88. package/vendor/gatekeeper/dist/boot.js +17 -0
  89. package/vendor/gatekeeper/dist/boot.js.map +1 -0
  90. package/vendor/gatekeeper/dist/cli/commands/access.d.ts +2 -0
  91. package/vendor/gatekeeper/dist/cli/commands/access.d.ts.map +1 -0
  92. package/vendor/gatekeeper/dist/cli/commands/access.js +33 -0
  93. package/vendor/gatekeeper/dist/cli/commands/access.js.map +1 -0
  94. package/vendor/gatekeeper/dist/cli/commands/grants.d.ts +2 -0
  95. package/vendor/gatekeeper/dist/cli/commands/grants.d.ts.map +1 -0
  96. package/vendor/gatekeeper/dist/cli/commands/grants.js +110 -0
  97. package/vendor/gatekeeper/dist/cli/commands/grants.js.map +1 -0
  98. package/vendor/gatekeeper/dist/cli/commands/groups.d.ts +2 -0
  99. package/vendor/gatekeeper/dist/cli/commands/groups.d.ts.map +1 -0
  100. package/vendor/gatekeeper/dist/cli/commands/groups.js +98 -0
  101. package/vendor/gatekeeper/dist/cli/commands/groups.js.map +1 -0
  102. package/vendor/gatekeeper/dist/cli/index.d.ts +3 -0
  103. package/vendor/gatekeeper/dist/cli/index.d.ts.map +1 -0
  104. package/vendor/gatekeeper/dist/cli/index.js +45 -0
  105. package/vendor/gatekeeper/dist/cli/index.js.map +1 -0
  106. package/vendor/gatekeeper/dist/index.d.ts +9 -0
  107. package/vendor/gatekeeper/dist/index.d.ts.map +1 -0
  108. package/vendor/gatekeeper/dist/index.js +13 -0
  109. package/vendor/gatekeeper/dist/index.js.map +1 -0
  110. package/vendor/gatekeeper/dist/lib/authz.d.ts +16 -0
  111. package/vendor/gatekeeper/dist/lib/authz.d.ts.map +1 -0
  112. package/vendor/gatekeeper/dist/lib/authz.js +42 -0
  113. package/vendor/gatekeeper/dist/lib/authz.js.map +1 -0
  114. package/vendor/gatekeeper/dist/lib/cache-bust.d.ts +15 -0
  115. package/vendor/gatekeeper/dist/lib/cache-bust.d.ts.map +1 -0
  116. package/vendor/gatekeeper/dist/lib/cache-bust.js +19 -0
  117. package/vendor/gatekeeper/dist/lib/cache-bust.js.map +1 -0
  118. package/vendor/gatekeeper/dist/lib/constants.d.ts +82 -0
  119. package/vendor/gatekeeper/dist/lib/constants.d.ts.map +1 -0
  120. package/vendor/gatekeeper/dist/lib/constants.js +79 -0
  121. package/vendor/gatekeeper/dist/lib/constants.js.map +1 -0
  122. package/vendor/gatekeeper/dist/lib/grants.d.ts +32 -0
  123. package/vendor/gatekeeper/dist/lib/grants.d.ts.map +1 -0
  124. package/vendor/gatekeeper/dist/lib/grants.js +314 -0
  125. package/vendor/gatekeeper/dist/lib/grants.js.map +1 -0
  126. package/vendor/gatekeeper/dist/lib/groups.d.ts +10 -0
  127. package/vendor/gatekeeper/dist/lib/groups.d.ts.map +1 -0
  128. package/vendor/gatekeeper/dist/lib/groups.js +247 -0
  129. package/vendor/gatekeeper/dist/lib/groups.js.map +1 -0
  130. package/vendor/gatekeeper/dist/lib/migration.d.ts +17 -0
  131. package/vendor/gatekeeper/dist/lib/migration.d.ts.map +1 -0
  132. package/vendor/gatekeeper/dist/lib/migration.js +79 -0
  133. package/vendor/gatekeeper/dist/lib/migration.js.map +1 -0
  134. package/vendor/gatekeeper/dist/lib/migrations/gatekeeper/0001_groups.sql +7 -0
  135. package/vendor/gatekeeper/dist/lib/migrations/gatekeeper/0002_access_grants.sql +14 -0
  136. package/vendor/gatekeeper/dist/lib/migrations/gatekeeper/0003_access_request_log.sql +9 -0
  137. package/vendor/gatekeeper/dist/lib/migrations/migrations/gatekeeper/0001_groups.sql +7 -0
  138. package/vendor/gatekeeper/dist/lib/migrations/migrations/gatekeeper/0002_access_grants.sql +14 -0
  139. package/vendor/gatekeeper/dist/lib/migrations/migrations/gatekeeper/0003_access_request_log.sql +9 -0
  140. package/vendor/gatekeeper/dist/lib/state-db.d.ts +16 -0
  141. package/vendor/gatekeeper/dist/lib/state-db.d.ts.map +1 -0
  142. package/vendor/gatekeeper/dist/lib/state-db.js +154 -0
  143. package/vendor/gatekeeper/dist/lib/state-db.js.map +1 -0
  144. package/vendor/gatekeeper/dist/lib/templates.d.ts +21 -0
  145. package/vendor/gatekeeper/dist/lib/templates.d.ts.map +1 -0
  146. package/vendor/gatekeeper/dist/lib/templates.js +151 -0
  147. package/vendor/gatekeeper/dist/lib/templates.js.map +1 -0
  148. package/vendor/gatekeeper/dist/lib/types.d.ts +178 -0
  149. package/vendor/gatekeeper/dist/lib/types.d.ts.map +1 -0
  150. package/vendor/gatekeeper/dist/lib/types.js +2 -0
  151. package/vendor/gatekeeper/dist/lib/types.js.map +1 -0
  152. package/vendor/gatekeeper/dist/server/index.d.ts +15 -0
  153. package/vendor/gatekeeper/dist/server/index.d.ts.map +1 -0
  154. package/vendor/gatekeeper/dist/server/index.js +251 -0
  155. package/vendor/gatekeeper/dist/server/index.js.map +1 -0
  156. package/vendor/gatekeeper/dist/server/routes/access-request.d.ts +7 -0
  157. package/vendor/gatekeeper/dist/server/routes/access-request.d.ts.map +1 -0
  158. package/vendor/gatekeeper/dist/server/routes/access-request.js +17 -0
  159. package/vendor/gatekeeper/dist/server/routes/access-request.js.map +1 -0
  160. package/vendor/gatekeeper/dist/server/routes/authz.d.ts +3 -0
  161. package/vendor/gatekeeper/dist/server/routes/authz.d.ts.map +1 -0
  162. package/vendor/gatekeeper/dist/server/routes/authz.js +279 -0
  163. package/vendor/gatekeeper/dist/server/routes/authz.js.map +1 -0
  164. package/vendor/gatekeeper/dist/server/routes/diagnostic.d.ts +13 -0
  165. package/vendor/gatekeeper/dist/server/routes/diagnostic.d.ts.map +1 -0
  166. package/vendor/gatekeeper/dist/server/routes/diagnostic.js +249 -0
  167. package/vendor/gatekeeper/dist/server/routes/diagnostic.js.map +1 -0
  168. package/vendor/gatekeeper/dist/server/routes/grants.d.ts +3 -0
  169. package/vendor/gatekeeper/dist/server/routes/grants.d.ts.map +1 -0
  170. package/vendor/gatekeeper/dist/server/routes/grants.js +112 -0
  171. package/vendor/gatekeeper/dist/server/routes/grants.js.map +1 -0
  172. package/vendor/gatekeeper/dist/server/routes/groups.d.ts +3 -0
  173. package/vendor/gatekeeper/dist/server/routes/groups.d.ts.map +1 -0
  174. package/vendor/gatekeeper/dist/server/routes/groups.js +139 -0
  175. package/vendor/gatekeeper/dist/server/routes/groups.js.map +1 -0
  176. package/vendor/gatekeeper/package.json +49 -0
  177. package/vendor/server/bin/lamaste-server.js +204 -0
  178. package/vendor/server/package.json +31 -0
  179. package/vendor/server/src/commands/certs.js +224 -0
  180. package/vendor/server/src/commands/chisel.js +132 -0
  181. package/vendor/server/src/commands/logs.js +49 -0
  182. package/vendor/server/src/commands/plugins.js +321 -0
  183. package/vendor/server/src/commands/reset-admin.js +478 -0
  184. package/vendor/server/src/commands/restart.js +94 -0
  185. package/vendor/server/src/commands/sites.js +257 -0
  186. package/vendor/server/src/commands/status.js +158 -0
  187. package/vendor/server/src/commands/tunnels.js +365 -0
  188. package/vendor/server/src/commands/uninstall.js +326 -0
  189. package/vendor/server/src/config.js +38 -0
  190. package/vendor/server/src/exec.js +26 -0
  191. package/vendor/server/src/logger.js +39 -0
  192. package/vendor/server/src/ndjson.js +56 -0
  193. package/vendor/server/src/panel-api.js +85 -0
  194. package/vendor/server/src/state.js +45 -0
  195. package/vendor/server-ui/dist/assets/index-B0nWuUyL.js +257 -0
  196. package/vendor/server-ui/dist/assets/index-BqWWFlTU.css +1 -0
  197. package/vendor/server-ui/dist/index.html +13 -0
  198. package/vendor/serverd/package.json +44 -0
  199. package/vendor/serverd/src/boot.js +13 -0
  200. package/vendor/serverd/src/index.js +191 -0
  201. package/vendor/serverd/src/lib/app-error.js +14 -0
  202. package/vendor/serverd/src/lib/authelia.js +85 -0
  203. package/vendor/serverd/src/lib/certbot.js +74 -0
  204. package/vendor/serverd/src/lib/chisel-args.js +6 -0
  205. package/vendor/serverd/src/lib/chisel-reconcile.js +232 -0
  206. package/vendor/serverd/src/lib/chisel-runtime.js +46 -0
  207. package/vendor/serverd/src/lib/chisel-users.js +109 -0
  208. package/vendor/serverd/src/lib/chisel.js +81 -0
  209. package/vendor/serverd/src/lib/config.js +190 -0
  210. package/vendor/serverd/src/lib/constants.js +8 -0
  211. package/vendor/serverd/src/lib/csr-signing.js +331 -0
  212. package/vendor/serverd/src/lib/enrollment.js +302 -0
  213. package/vendor/serverd/src/lib/files.js +19 -0
  214. package/vendor/serverd/src/lib/gatekeeper-client.js +135 -0
  215. package/vendor/serverd/src/lib/invite-page.js +281 -0
  216. package/vendor/serverd/src/lib/ip-utils.js +79 -0
  217. package/vendor/serverd/src/lib/migrations/state/0001_enrollment_tokens.sql +17 -0
  218. package/vendor/serverd/src/lib/migrations/state/0002_tickets.sql +70 -0
  219. package/vendor/serverd/src/lib/migrations/state/0003_plugins.sql +15 -0
  220. package/vendor/serverd/src/lib/migrations/state/0004_agents.sql +19 -0
  221. package/vendor/serverd/src/lib/mtls.js +795 -0
  222. package/vendor/serverd/src/lib/nginx.js +1090 -0
  223. package/vendor/serverd/src/lib/pki-paths.js +41 -0
  224. package/vendor/serverd/src/lib/pki-sign.js +103 -0
  225. package/vendor/serverd/src/lib/plugins.js +538 -0
  226. package/vendor/serverd/src/lib/push-install.js +390 -0
  227. package/vendor/serverd/src/lib/revocation.js +112 -0
  228. package/vendor/serverd/src/lib/services.js +131 -0
  229. package/vendor/serverd/src/lib/session.js +151 -0
  230. package/vendor/serverd/src/lib/state-db.js +130 -0
  231. package/vendor/serverd/src/lib/state.js +140 -0
  232. package/vendor/serverd/src/lib/storage.js +63 -0
  233. package/vendor/serverd/src/lib/system-stats.js +58 -0
  234. package/vendor/serverd/src/lib/tickets.js +1556 -0
  235. package/vendor/serverd/src/lib/totp.js +76 -0
  236. package/vendor/serverd/src/lib/tunnel-deps.js +41 -0
  237. package/vendor/serverd/src/lib/user-access-session.js +142 -0
  238. package/vendor/serverd/src/lib/user-access.js +52 -0
  239. package/vendor/serverd/src/middleware/errors.js +63 -0
  240. package/vendor/serverd/src/middleware/mtls.js +120 -0
  241. package/vendor/serverd/src/middleware/onboarding-guard.js +30 -0
  242. package/vendor/serverd/src/middleware/role-guard.js +58 -0
  243. package/vendor/serverd/src/middleware/twofa-session.js +65 -0
  244. package/vendor/serverd/src/middleware/user-access-session.js +52 -0
  245. package/vendor/serverd/src/routes/enrollment.js +120 -0
  246. package/vendor/serverd/src/routes/health.js +22 -0
  247. package/vendor/serverd/src/routes/invite.js +163 -0
  248. package/vendor/serverd/src/routes/management/agents.js +182 -0
  249. package/vendor/serverd/src/routes/management/certs.js +911 -0
  250. package/vendor/serverd/src/routes/management/gatekeeper-proxy.js +160 -0
  251. package/vendor/serverd/src/routes/management/identity.js +107 -0
  252. package/vendor/serverd/src/routes/management/invitations.js +166 -0
  253. package/vendor/serverd/src/routes/management/logs.js +218 -0
  254. package/vendor/serverd/src/routes/management/plugins.js +560 -0
  255. package/vendor/serverd/src/routes/management/services.js +63 -0
  256. package/vendor/serverd/src/routes/management/settings.js +325 -0
  257. package/vendor/serverd/src/routes/management/sites.js +522 -0
  258. package/vendor/serverd/src/routes/management/storage.js +192 -0
  259. package/vendor/serverd/src/routes/management/system.js +201 -0
  260. package/vendor/serverd/src/routes/management/tickets.js +457 -0
  261. package/vendor/serverd/src/routes/management/tunnels.js +709 -0
  262. package/vendor/serverd/src/routes/management/users.js +377 -0
  263. package/vendor/serverd/src/routes/management.js +36 -0
  264. package/vendor/serverd/src/routes/onboarding/dns.js +101 -0
  265. package/vendor/serverd/src/routes/onboarding/domain.js +42 -0
  266. package/vendor/serverd/src/routes/onboarding/index.js +18 -0
  267. package/vendor/serverd/src/routes/onboarding/provision.js +327 -0
  268. package/vendor/serverd/src/routes/onboarding/status.js +12 -0
  269. package/vendor/serverd/src/routes/plugin-router.js +79 -0
  270. package/vendor/serverd/src/routes/user-access.js +389 -0
@@ -0,0 +1,167 @@
1
+ # System Overview
2
+
3
+ ## Component Architecture
4
+
5
+ ```
6
+ ┌─────────────────────────────────────────────────────────────────────┐
7
+ │ INTERNET │
8
+ │ │
9
+ │ Admin Browser ─── HTTPS + Client Cert ──▶ panel.example.com │
10
+ │ (mTLS: no cert = TLS handshake rejection, no page loads) │
11
+ │ │
12
+ │ Admin Browser ─── HTTPS + Client Cert ──▶ <droplet-ip>:9292 │
13
+ │ (always accessible, fallback if domain is lost) │
14
+ │ │
15
+ │ End Users ──── HTTPS + TOTP ──▶ app1.example.com │
16
+ │ │
17
+ │ ┌────────────────────────────────────────────────────────────────┐ │
18
+ │ │ DigitalOcean Droplet ($4, 512MB) │ │
19
+ │ │ │ │
20
+ │ │ nginx (:443 + :9292) │ │
21
+ │ │ ├─ <ip>:9292 → mTLS → lamalibre-lamaste-serverd (always on) │ │
22
+ │ │ ├─ panel.example.com → mTLS → lamalibre-lamaste-serverd (after setup) │ │
23
+ │ │ ├─ auth.example.com → Authelia :9091 (after setup) │ │
24
+ │ │ ├─ tunnel.example.com → Chisel WS :9090 (after setup) │ │
25
+ │ │ └─ *.example.com → Authelia forward auth → Chisel │ │
26
+ │ │ │ │
27
+ │ │ Panel Server (:3100 on 127.0.0.1) ~30MB │ │
28
+ │ │ ├─ Fastify REST API │ │
29
+ │ │ ├─ Serves React UI (static files from lamaste-server-ui build) │ │
30
+ │ │ ├─ WebSocket → live journald log streaming │ │
31
+ │ │ ├─ Onboarding routes (first-time setup) │ │
32
+ │ │ └─ Management routes (tunnels, users, certs, services) │ │
33
+ │ │ │ │
34
+ │ │ Authelia (:9091) ~25MB │ │
35
+ │ │ └─ TOTP 2FA for proxied applications │ │
36
+ │ │ │ │
37
+ │ │ Chisel Server (:9090 on 127.0.0.1) ~20MB │ │
38
+ │ │ └─ WebSocket tunnel; per-agent credentials + port grants │ │
39
+ │ │ │ │
40
+ │ │ PKI: /etc/lamalibre/lamaste/pki/ │ │
41
+ │ │ ├─ ca.crt / ca.key (Lamaste CA, 10yr validity) │ │
42
+ │ │ ├─ client.crt / .key (Admin cert, CN=admin, 2yr) │ │
43
+ │ │ ├─ client.p12 (Admin browser import bundle) │ │
44
+ │ │ ├─ revoked.json (Revoked cert serial numbers) │ │
45
+ │ │ └─ agents/ (Agent certificate storage) │ │
46
+ │ │ ├─ registry.json (Agent metadata + capabilities) │ │
47
+ │ │ └─ <label>/ (Agent certs, CN=agent:<label>) │ │
48
+ │ │ │ │
49
+ │ │ Config: /etc/lamalibre/lamaste/ │ │
50
+ │ │ ├─ panel.json (panel runtime config + state) │ │
51
+ │ │ ├─ tunnels.json (active tunnel definitions) │ │
52
+ │ │ ├─ sites.json (static site definitions) │ │
53
+ │ │ └─ invitations.json (user invitation records) │ │
54
+ │ └────────────────────────────────────────────────────────────────┘ │
55
+ │ ▲ WebSocket tunnel (wss://) │
56
+ │ ┌───────────────────────────┴────────────────────────────────────┐ │
57
+ │ │ Mac Studio (or any machine behind NAT/firewall) │ │
58
+ │ │ │ │
59
+ │ │ Lamaste Desktop (Tauri v2) — dual mode │ │
60
+ │ │ ├─ Agent mode: service discovery + tunnel management │ │
61
+ │ │ │ (pages from @lamalibre/lamaste-agent-ui@4.0.0) │ │
62
+ │ │ ├─ Server mode: full admin panel (via lamaste-server-ui) │ │
63
+ │ │ ├─ Multi-server registry (~/.lamalibre/lamaste/servers.json) │ │
64
+ │ │ ├─ Cloud provisioning (DigitalOcean via lamaste-cloud) │ │
65
+ │ │ └─ Credential storage (macOS Keychain / Linux libsecret) │ │
66
+ │ │ │ │
67
+ │ │ Chisel client (launchd daemon, auto-reconnect) │ │
68
+ │ └────────────────────────────────────────────────────────────────┘ │
69
+ └──────────────────────────────────────────────────────────────────────┘
70
+ ```
71
+
72
+ ## Port Allocation
73
+
74
+ | Port | Binding | Service | Access |
75
+ | ---- | ----------------------------------- | --------------- | -------------------------------- |
76
+ | 443 | 0.0.0.0 | nginx | Public — all HTTPS traffic |
77
+ | 9292 | 0.0.0.0 (nginx) → 127.0.0.1 (panel) | Panel via nginx | Public — mTLS required |
78
+ | 9091 | 127.0.0.1 | Authelia | Internal only — proxied by nginx |
79
+ | 9090 | 127.0.0.1 | Chisel server | Internal only — proxied by nginx |
80
+
81
+ ## RAM Budget (512MB Droplet)
82
+
83
+ | Component | RAM | Notes |
84
+ | --------------------- | ---------- | -------------------------------------------------------- |
85
+ | Ubuntu 24.04 baseline | ~120MB | kernel + systemd + sshd |
86
+ | nginx | ~15MB | reverse proxy + TLS termination |
87
+ | Authelia | ~25MB | **must use bcrypt, not argon2id** (argon2id needs ~93MB) |
88
+ | Chisel server | ~20MB | Go binary, minimal footprint |
89
+ | Panel (Node.js) | ~30MB | Fastify is lightweight |
90
+ | Fail2ban | ~35MB | SSH + nginx brute force protection |
91
+ | **Total** | **~245MB** | |
92
+ | Free + buffers | ~265MB | comfortable headroom |
93
+ | Swap (safety net) | 1GB | catches occasional spikes |
94
+
95
+ ## Filesystem Layout
96
+
97
+ ```
98
+ /etc/lamalibre/lamaste/
99
+ ├── panel.json ← panel config (port, paths, state)
100
+ ├── tunnels.json ← active tunnel definitions
101
+ ├── sites.json ← static site definitions
102
+ ├── invitations.json ← user invitation records
103
+ └── pki/
104
+ ├── ca.crt ← Lamaste CA certificate
105
+ ├── ca.key ← CA private key (600 permissions)
106
+ ├── client.crt ← Admin client certificate
107
+ ├── client.key ← Client private key
108
+ ├── client.p12 ← PKCS12 browser bundle
109
+ ├── self-signed.pem ← Self-signed cert for IP:port access
110
+ └── self-signed-key.pem ← Self-signed private key for IP:port access
111
+
112
+ /etc/nginx/
113
+ ├── sites-available/
114
+ │ ├── lamalibre-lamaste-panel-ip ← IP:9292 mTLS vhost (always present)
115
+ │ ├── lamalibre-lamaste-panel-domain ← panel.domain.com vhost (after onboarding)
116
+ │ ├── lamalibre-lamaste-auth ← auth.domain.com vhost (after onboarding)
117
+ │ ├── lamalibre-lamaste-tunnel ← tunnel.domain.com vhost (after onboarding)
118
+ │ ├── lamalibre-lamaste-app-* ← per-tunnel app vhosts (dynamic)
119
+ │ └── lamalibre-lamaste-site-* ← per-static-site vhosts (dynamic)
120
+ ├── sites-enabled/ ← symlinks to above
121
+ └── snippets/
122
+ └── lamalibre-lamaste-mtls.conf ← shared mTLS directives
123
+
124
+ /etc/authelia/
125
+ ├── configuration.yml ← Authelia config
126
+ └── users.yml ← User database (bcrypt hashes)
127
+
128
+ /etc/systemd/system/
129
+ ├── lamalibre-lamaste-serverd.service
130
+ ├── chisel.service
131
+ └── authelia.service
132
+
133
+ /opt/lamalibre/lamaste/
134
+ ├── lamaste-serverd/ ← deployed panel backend
135
+ └── lamaste-server-ui/ ← built React static files
136
+ ```
137
+
138
+ ## Security Model
139
+
140
+ ### mTLS (Panel Access)
141
+
142
+ - nginx uses `ssl_verify_client optional` at the server level. Enforcement is per-location via `if ($ssl_client_verify != SUCCESS) { return 496; }` — public endpoints (`/api/enroll`, `/api/invite`) skip the check.
143
+ - No login page — connection is refused at TLS layer for invalid certs on protected locations
144
+ - On SSL errors (codes 495/496), nginx serves `cert-help.html` with certificate import instructions
145
+ - Panel backend double-checks via `X-SSL-Client-Verify: SUCCESS` header
146
+ - Agent certificates have capability-based access (capabilities stored in `agents/registry.json`)
147
+ - IP:9292 and panel.domain.com both enforce mTLS identically
148
+
149
+ ### Authelia (Proxied App Access)
150
+
151
+ - End users authenticate with username + TOTP
152
+ - nginx `auth_request` to Authelia before proxying to tunneled apps
153
+ - Session cookies managed by Authelia
154
+ - bcrypt password hashing (not argon2id — RAM constraint)
155
+
156
+ ### Firewall (UFW)
157
+
158
+ - Allow: 22 (SSH), 443 (HTTPS), 9292 (Panel)
159
+ - Deny: everything else
160
+ - Fail2ban watches SSH + nginx auth failures
161
+
162
+ ### Service Isolation
163
+
164
+ - Chisel binds 127.0.0.1 only — never exposed directly
165
+ - Authelia binds 127.0.0.1 only — proxied through nginx
166
+ - Panel server binds 127.0.0.1 only — proxied through nginx
167
+ - All inter-service communication is localhost