@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,592 @@
1
+ # Gatekeeper API
2
+
3
+ > Endpoints for managing Gatekeeper authorization: groups, grants, access checks, diagnostics, and settings. All proxied endpoints go through the lamalibre-lamaste-serverd at `/api/gatekeeper/*`.
4
+
5
+ ## Authentication
6
+
7
+ All Gatekeeper endpoints proxied through the panel require admin mTLS authentication. The internal `authz/check` endpoint on `127.0.0.1:9294` is called by nginx only and is not exposed externally.
8
+
9
+ If the Gatekeeper service is unavailable, proxied endpoints return `503 Service Unavailable`.
10
+
11
+ ---
12
+
13
+ ## Groups
14
+
15
+ ### Create Group
16
+
17
+ ```
18
+ POST /api/gatekeeper/groups
19
+ ```
20
+
21
+ **Auth:** Admin only
22
+
23
+ Create a new Gatekeeper group.
24
+
25
+ **Request body:**
26
+
27
+ | Field | Type | Required | Description |
28
+ | ------------- | ------ | -------- | --------------------------------------------------------- |
29
+ | `name` | string | Yes | Group name (2-63 chars, lowercase alphanumeric + hyphens) |
30
+ | `description` | string | No | Human-readable description |
31
+ | `createdBy` | string | No | Creator identifier |
32
+
33
+ **Response (201):**
34
+
35
+ ```json
36
+ {
37
+ "ok": true,
38
+ "group": {
39
+ "name": "engineering",
40
+ "description": "Engineering team",
41
+ "createdBy": "admin",
42
+ "members": [],
43
+ "createdAt": "2026-04-04T12:00:00.000Z"
44
+ }
45
+ }
46
+ ```
47
+
48
+ **Errors:** 400 (invalid name format), 409 (group already exists), 503 (Gatekeeper unavailable)
49
+
50
+ ---
51
+
52
+ ### List Groups
53
+
54
+ ```
55
+ GET /api/gatekeeper/groups
56
+ ```
57
+
58
+ **Auth:** Admin only
59
+
60
+ Returns all groups.
61
+
62
+ **Response (200):**
63
+
64
+ ```json
65
+ {
66
+ "groups": [
67
+ {
68
+ "name": "engineering",
69
+ "description": "Engineering team",
70
+ "createdBy": "admin",
71
+ "members": ["alice", "bob"],
72
+ "createdAt": "2026-04-04T12:00:00.000Z"
73
+ }
74
+ ]
75
+ }
76
+ ```
77
+
78
+ ---
79
+
80
+ ### Get Group
81
+
82
+ ```
83
+ GET /api/gatekeeper/groups/:name
84
+ ```
85
+
86
+ **Auth:** Admin only
87
+
88
+ Returns a single group with its members.
89
+
90
+ **Response (200):**
91
+
92
+ ```json
93
+ {
94
+ "group": {
95
+ "name": "engineering",
96
+ "description": "Engineering team",
97
+ "createdBy": "admin",
98
+ "members": ["alice", "bob"],
99
+ "createdAt": "2026-04-04T12:00:00.000Z"
100
+ }
101
+ }
102
+ ```
103
+
104
+ **Errors:** 404 (group not found)
105
+
106
+ ---
107
+
108
+ ### Update Group
109
+
110
+ ```
111
+ PATCH /api/gatekeeper/groups/:name
112
+ ```
113
+
114
+ **Auth:** Admin only
115
+
116
+ Update a group's name or description.
117
+
118
+ **Request body:**
119
+
120
+ | Field | Type | Required | Description |
121
+ | ------------- | ------ | -------- | ------------------------------------------------------------- |
122
+ | `name` | string | No | New group name (2-63 chars, lowercase alphanumeric + hyphens) |
123
+ | `description` | string | No | New description |
124
+
125
+ **Response (200):**
126
+
127
+ ```json
128
+ {
129
+ "ok": true,
130
+ "group": {
131
+ "name": "eng",
132
+ "description": "Updated description",
133
+ "createdBy": "admin",
134
+ "members": ["alice", "bob"],
135
+ "createdAt": "2026-04-04T12:00:00.000Z"
136
+ }
137
+ }
138
+ ```
139
+
140
+ **Errors:** 400 (invalid name format), 404 (group not found), 409 (new name conflicts with existing group)
141
+
142
+ ---
143
+
144
+ ### Delete Group
145
+
146
+ ```
147
+ DELETE /api/gatekeeper/groups/:name
148
+ ```
149
+
150
+ **Auth:** Admin only
151
+
152
+ Delete a group. Any grants referencing this group as a principal are automatically revoked.
153
+
154
+ **Response (200):**
155
+
156
+ ```json
157
+ {
158
+ "ok": true,
159
+ "deletedGrants": 3
160
+ }
161
+ ```
162
+
163
+ **Errors:** 404 (group not found)
164
+
165
+ ---
166
+
167
+ ### Add Members
168
+
169
+ ```
170
+ POST /api/gatekeeper/groups/:name/members
171
+ ```
172
+
173
+ **Auth:** Admin only
174
+
175
+ Add one or more members to a group.
176
+
177
+ **Request body:**
178
+
179
+ | Field | Type | Required | Description |
180
+ | ----------- | -------- | -------- | ----------------------------------- |
181
+ | `usernames` | string[] | Yes | Usernames to add (1-50 per request) |
182
+
183
+ **Response (201):**
184
+
185
+ ```json
186
+ {
187
+ "ok": true,
188
+ "group": {
189
+ "name": "engineering",
190
+ "description": "Engineering team",
191
+ "createdBy": "admin",
192
+ "members": ["alice", "bob", "carol"],
193
+ "createdAt": "2026-04-04T12:00:00.000Z"
194
+ }
195
+ }
196
+ ```
197
+
198
+ **Errors:** 400 (invalid or empty usernames array), 404 (group not found)
199
+
200
+ ---
201
+
202
+ ### Remove Member
203
+
204
+ ```
205
+ DELETE /api/gatekeeper/groups/:name/members/:username
206
+ ```
207
+
208
+ **Auth:** Admin only
209
+
210
+ Remove a single member from a group.
211
+
212
+ **Response (200):**
213
+
214
+ ```json
215
+ {
216
+ "ok": true,
217
+ "group": {
218
+ "name": "engineering",
219
+ "description": "Engineering team",
220
+ "createdBy": "admin",
221
+ "members": ["alice", "bob"],
222
+ "createdAt": "2026-04-04T12:00:00.000Z"
223
+ }
224
+ }
225
+ ```
226
+
227
+ **Errors:** 404 (group not found, or username not a member)
228
+
229
+ ---
230
+
231
+ ## Grants
232
+
233
+ ### Create Grant
234
+
235
+ ```
236
+ POST /api/gatekeeper/grants
237
+ ```
238
+
239
+ **Auth:** Admin only
240
+
241
+ Create a new authorization grant linking a principal (user or group) to a resource.
242
+
243
+ **Request body:**
244
+
245
+ | Field | Type | Required | Description |
246
+ | --------------- | ------ | -------- | ----------------------------------------- |
247
+ | `principalType` | string | Yes | `"user"` or `"group"` |
248
+ | `principalId` | string | Yes | Username or group name |
249
+ | `resourceType` | string | Yes | Type of resource being granted access to |
250
+ | `resourceId` | string | Yes | Identifier of the specific resource |
251
+ | `context` | object | No | Additional context metadata for the grant |
252
+
253
+ **Response (201):**
254
+
255
+ ```json
256
+ {
257
+ "ok": true,
258
+ "grant": {
259
+ "grantId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
260
+ "principalType": "group",
261
+ "principalId": "engineering",
262
+ "resourceType": "site",
263
+ "resourceId": "docs.example.com",
264
+ "context": null,
265
+ "used": false,
266
+ "createdAt": "2026-04-04T12:00:00.000Z"
267
+ }
268
+ }
269
+ ```
270
+
271
+ **Errors:** 400 (invalid body), 409 (duplicate grant), 503 (Gatekeeper unavailable)
272
+
273
+ ---
274
+
275
+ ### List Grants
276
+
277
+ ```
278
+ GET /api/gatekeeper/grants
279
+ ```
280
+
281
+ **Auth:** Admin only
282
+
283
+ Returns all grants, optionally filtered by query parameters.
284
+
285
+ **Query parameters:**
286
+
287
+ | Parameter | Type | Description |
288
+ | --------------- | ------- | -------------------------------- |
289
+ | `principalType` | string | Filter by `"user"` or `"group"` |
290
+ | `principalId` | string | Filter by username or group name |
291
+ | `resourceType` | string | Filter by resource type |
292
+ | `resourceId` | string | Filter by resource identifier |
293
+ | `used` | boolean | Filter by usage status |
294
+
295
+ **Response (200):**
296
+
297
+ ```json
298
+ {
299
+ "grants": [
300
+ {
301
+ "grantId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
302
+ "principalType": "group",
303
+ "principalId": "engineering",
304
+ "resourceType": "site",
305
+ "resourceId": "docs.example.com",
306
+ "context": null,
307
+ "used": false,
308
+ "createdAt": "2026-04-04T12:00:00.000Z"
309
+ }
310
+ ]
311
+ }
312
+ ```
313
+
314
+ ---
315
+
316
+ ### Get Grant
317
+
318
+ ```
319
+ GET /api/gatekeeper/grants/:grantId
320
+ ```
321
+
322
+ **Auth:** Admin only
323
+
324
+ Returns a single grant by ID.
325
+
326
+ **Response (200):**
327
+
328
+ ```json
329
+ {
330
+ "grant": {
331
+ "grantId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
332
+ "principalType": "user",
333
+ "principalId": "alice",
334
+ "resourceType": "site",
335
+ "resourceId": "docs.example.com",
336
+ "context": null,
337
+ "used": true,
338
+ "createdAt": "2026-04-04T12:00:00.000Z"
339
+ }
340
+ }
341
+ ```
342
+
343
+ **Errors:** 404 (grant not found)
344
+
345
+ ---
346
+
347
+ ### Revoke Grant
348
+
349
+ ```
350
+ DELETE /api/gatekeeper/grants/:grantId
351
+ ```
352
+
353
+ **Auth:** Admin only
354
+
355
+ Revoke an existing grant.
356
+
357
+ **Response (200):**
358
+
359
+ ```json
360
+ {
361
+ "ok": true,
362
+ "grant": {
363
+ "grantId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
364
+ "principalType": "user",
365
+ "principalId": "alice",
366
+ "resourceType": "site",
367
+ "resourceId": "docs.example.com",
368
+ "context": null,
369
+ "used": false,
370
+ "createdAt": "2026-04-04T12:00:00.000Z"
371
+ }
372
+ }
373
+ ```
374
+
375
+ **Errors:** 404 (grant not found), 409 (grant already revoked or in conflicting state)
376
+
377
+ ---
378
+
379
+ ## Diagnostics and Settings
380
+
381
+ ### Check Access
382
+
383
+ ```
384
+ GET /api/gatekeeper/access/check
385
+ ```
386
+
387
+ **Auth:** Admin only
388
+
389
+ Test whether a user has access to a specific resource. Useful for debugging authorization decisions without making real requests.
390
+
391
+ **Query parameters:**
392
+
393
+ | Parameter | Type | Required | Description |
394
+ | -------------- | ------ | -------- | -------------------------- |
395
+ | `username` | string | Yes | Username to check |
396
+ | `resourceType` | string | Yes | Type of resource |
397
+ | `resourceId` | string | Yes | Identifier of the resource |
398
+
399
+ **Response (200) -- access granted:**
400
+
401
+ ```json
402
+ {
403
+ "allowed": true
404
+ }
405
+ ```
406
+
407
+ **Response (200) -- access denied:**
408
+
409
+ ```json
410
+ {
411
+ "allowed": false,
412
+ "resource": "site:docs.example.com",
413
+ "templates": []
414
+ }
415
+ ```
416
+
417
+ The `templates` array contains any access request templates available for the denied resource.
418
+
419
+ **Errors:** 400 (missing required query parameters)
420
+
421
+ ---
422
+
423
+ ### Bust Cache
424
+
425
+ ```
426
+ POST /api/gatekeeper/cache/bust
427
+ ```
428
+
429
+ **Auth:** Admin only
430
+
431
+ Invalidate all cached authorization decisions. Use this after making changes to grants or groups that need to take effect immediately.
432
+
433
+ **Response (200):**
434
+
435
+ ```json
436
+ {
437
+ "ok": true
438
+ }
439
+ ```
440
+
441
+ ---
442
+
443
+ ### Get Settings
444
+
445
+ ```
446
+ GET /api/gatekeeper/settings
447
+ ```
448
+
449
+ **Auth:** Admin only
450
+
451
+ Returns the current Gatekeeper settings.
452
+
453
+ **Response (200):**
454
+
455
+ ```json
456
+ {
457
+ "settings": {
458
+ "adminEmail": "admin@example.com",
459
+ "adminName": "Admin",
460
+ "slackChannel": null,
461
+ "teamsChannel": null,
462
+ "sessionCacheTtlMs": 300000,
463
+ "accessLoggingEnabled": true,
464
+ "accessLogRetentionDays": 30
465
+ }
466
+ }
467
+ ```
468
+
469
+ ---
470
+
471
+ ### Update Settings
472
+
473
+ ```
474
+ PATCH /api/gatekeeper/settings
475
+ ```
476
+
477
+ **Auth:** Admin only
478
+
479
+ Update Gatekeeper settings. Only provided fields are changed; omitted fields remain unchanged.
480
+
481
+ **Request body:**
482
+
483
+ | Field | Type | Required | Description |
484
+ | ------------------------ | ------- | -------- | ------------------------------------------- |
485
+ | `adminEmail` | string | No | Admin contact email |
486
+ | `adminName` | string | No | Admin display name |
487
+ | `slackChannel` | string | No | Slack channel for notifications |
488
+ | `teamsChannel` | string | No | Microsoft Teams channel for notifications |
489
+ | `sessionCacheTtlMs` | number | No | Session cache TTL in milliseconds |
490
+ | `accessLoggingEnabled` | boolean | No | Enable or disable access logging |
491
+ | `accessLogRetentionDays` | number | No | Number of days to retain access log entries |
492
+
493
+ **Response (200):**
494
+
495
+ ```json
496
+ {
497
+ "ok": true,
498
+ "settings": {
499
+ "adminEmail": "admin@example.com",
500
+ "adminName": "Admin",
501
+ "slackChannel": "#lamaste-alerts",
502
+ "teamsChannel": null,
503
+ "sessionCacheTtlMs": 300000,
504
+ "accessLoggingEnabled": true,
505
+ "accessLogRetentionDays": 30
506
+ }
507
+ }
508
+ ```
509
+
510
+ **Errors:** 400 (invalid settings values)
511
+
512
+ ---
513
+
514
+ ### Get Access Log
515
+
516
+ ```
517
+ GET /api/gatekeeper/access-log
518
+ ```
519
+
520
+ **Auth:** Admin only
521
+
522
+ Returns access log entries for auditing authorization decisions.
523
+
524
+ **Query parameters:**
525
+
526
+ | Parameter | Type | Required | Description |
527
+ | --------- | ------ | -------- | ------------------------------------------------ |
528
+ | `limit` | number | No | Max entries to return (default varies, max 1000) |
529
+ | `offset` | number | No | Number of entries to skip |
530
+
531
+ **Response (200):**
532
+
533
+ ```json
534
+ {
535
+ "entries": [
536
+ {
537
+ "timestamp": "2026-04-04T12:05:00.000Z",
538
+ "username": "alice",
539
+ "resourceType": "site",
540
+ "resourceId": "docs.example.com",
541
+ "allowed": true
542
+ }
543
+ ],
544
+ "total": 142
545
+ }
546
+ ```
547
+
548
+ ---
549
+
550
+ ### Clear Access Log
551
+
552
+ ```
553
+ DELETE /api/gatekeeper/access-log
554
+ ```
555
+
556
+ **Auth:** Admin only
557
+
558
+ Delete all access log entries.
559
+
560
+ **Response (200):**
561
+
562
+ ```json
563
+ {
564
+ "ok": true
565
+ }
566
+ ```
567
+
568
+ ---
569
+
570
+ ## Internal Endpoints
571
+
572
+ These endpoints are not proxied through the lamalibre-lamaste-serverd and are not accessible externally.
573
+
574
+ ### Authorization Check (nginx auth_request)
575
+
576
+ ```
577
+ GET /authz/check
578
+ ```
579
+
580
+ **Host:** `127.0.0.1:9294`
581
+
582
+ This is the nginx `auth_request` target. nginx calls this endpoint on every request to a Gatekeeper-protected resource. It validates the user's Authelia session cookie and checks the corresponding grant.
583
+
584
+ **Response codes:**
585
+
586
+ | Status | Meaning | Description |
587
+ | ------ | ------- | --------------------------------------------------------------------------------- |
588
+ | 200 | Pass | User is authenticated and authorized; request proceeds |
589
+ | 401 | No auth | No valid Authelia session; nginx redirects to login |
590
+ | 403 | Denied | User is authenticated but lacks a grant; returns an HTML body with denial details |
591
+
592
+ This endpoint is bound to `127.0.0.1` only. External traffic never reaches it directly -- nginx forwards the subrequest internally.