@lamalibre/create-lamaste 4.4.1 → 4.6.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.
- package/package.json +2 -2
- package/scripts/lamaste-priv +234 -18
- package/src/index.js +1 -0
- package/src/lib/backend-cookie.js +65 -0
- package/src/lib/ip-panel-vhost.js +208 -0
- package/src/lib/service-config.js +5 -3
- package/src/tasks/nginx.js +18 -135
- package/src/tasks/redeploy.js +39 -1
- package/vendor/docs/00-introduction/how-it-works.md +2 -2
- package/vendor/docs/00-introduction/quickstart.md +5 -5
- package/vendor/docs/00-introduction/what-is-lamaste.md +5 -5
- package/vendor/docs/01-concepts/authentication.md +1 -1
- package/vendor/docs/01-concepts/authorization.md +66 -48
- package/vendor/docs/01-concepts/certificates.md +3 -3
- package/vendor/docs/01-concepts/mtls.md +2 -2
- package/vendor/docs/01-concepts/security-model.md +70 -33
- package/vendor/docs/01-concepts/tickets.md +2 -2
- package/vendor/docs/01-concepts/tunneling.md +4 -4
- package/vendor/docs/02-guides/agent-setup.md +5 -5
- package/vendor/docs/02-guides/certificate-management.md +2 -2
- package/vendor/docs/02-guides/cloud-provisioning.md +3 -3
- package/vendor/docs/02-guides/desktop-app-setup.md +10 -10
- package/vendor/docs/02-guides/installation.md +3 -3
- package/vendor/docs/02-guides/managing-users.md +113 -25
- package/vendor/docs/02-guides/onboarding.md +2 -2
- package/vendor/docs/02-guides/standalone-plugin-with-tickets.md +2 -2
- package/vendor/docs/02-guides/static-sites.md +4 -0
- package/vendor/docs/03-architecture/installer-flow.md +2 -2
- package/vendor/docs/03-architecture/installer.md +4 -4
- package/vendor/docs/03-architecture/management-flow.md +3 -1
- package/vendor/docs/03-architecture/nginx-configuration.md +229 -24
- package/vendor/docs/03-architecture/overview.md +13 -17
- package/vendor/docs/03-architecture/panel-client.md +6 -6
- package/vendor/docs/03-architecture/panel-server.md +3 -2
- package/vendor/docs/03-architecture/state-management.md +4 -8
- package/vendor/docs/03-architecture/system-overview.md +1 -1
- package/vendor/docs/04-api-reference/agent-hosted-plugins.md +378 -34
- package/vendor/docs/04-api-reference/app-host.md +3 -3
- package/vendor/docs/04-api-reference/gatekeeper.md +78 -5
- package/vendor/docs/04-api-reference/lifecycle-hooks.md +14 -12
- package/vendor/docs/04-api-reference/onboarding.md +1 -1
- package/vendor/docs/04-api-reference/registry-and-oidc.md +3 -3
- package/vendor/docs/04-api-reference/sites.md +4 -0
- package/vendor/docs/04-api-reference/tunnels.md +87 -47
- package/vendor/docs/04-api-reference/users.md +241 -45
- package/vendor/docs/05-operations/backup-and-restore.md +35 -26
- package/vendor/docs/05-operations/monitoring.md +39 -0
- package/vendor/docs/05-operations/uninstalling.md +2 -1
- package/vendor/docs/05-operations/upgrades.md +24 -6
- package/vendor/docs/06-reference/config-files.md +100 -202
- package/vendor/docs/06-reference/glossary.md +3 -3
- package/vendor/docs/06-reference/installer-flags.md +13 -13
- package/vendor/docs/06-reference/ports-and-services.md +25 -26
- package/vendor/docs/06-reference/troubleshooting.md +8 -8
- package/vendor/docs/gatekeeper-design.md +10 -8
- package/vendor/docs/identity-directory-design.md +48 -14
- package/vendor/docs/package.json +1 -1
- package/vendor/docs/todo/lib-cli-desktop-refactor.md +27 -27
- package/vendor/gatekeeper/dist/cli/index.js +0 -0
- package/vendor/gatekeeper/dist/index.d.ts +4 -3
- package/vendor/gatekeeper/dist/index.d.ts.map +1 -1
- package/vendor/gatekeeper/dist/index.js +4 -2
- package/vendor/gatekeeper/dist/index.js.map +1 -1
- package/vendor/gatekeeper/dist/lib/authz.d.ts +9 -0
- package/vendor/gatekeeper/dist/lib/authz.d.ts.map +1 -1
- package/vendor/gatekeeper/dist/lib/authz.js +31 -0
- package/vendor/gatekeeper/dist/lib/authz.js.map +1 -1
- package/vendor/gatekeeper/dist/lib/constants.d.ts +5 -2
- package/vendor/gatekeeper/dist/lib/constants.d.ts.map +1 -1
- package/vendor/gatekeeper/dist/lib/constants.js +5 -2
- package/vendor/gatekeeper/dist/lib/constants.js.map +1 -1
- package/vendor/gatekeeper/dist/lib/grants.d.ts +6 -0
- package/vendor/gatekeeper/dist/lib/grants.d.ts.map +1 -1
- package/vendor/gatekeeper/dist/lib/grants.js +6 -1
- package/vendor/gatekeeper/dist/lib/grants.js.map +1 -1
- package/vendor/gatekeeper/dist/lib/groups.d.ts +5 -0
- package/vendor/gatekeeper/dist/lib/groups.d.ts.map +1 -1
- package/vendor/gatekeeper/dist/lib/groups.js +5 -1
- package/vendor/gatekeeper/dist/lib/groups.js.map +1 -1
- package/vendor/gatekeeper/dist/lib/principals.d.ts +29 -0
- package/vendor/gatekeeper/dist/lib/principals.d.ts.map +1 -0
- package/vendor/gatekeeper/dist/lib/principals.js +67 -0
- package/vendor/gatekeeper/dist/lib/principals.js.map +1 -0
- package/vendor/gatekeeper/dist/lib/tunnels.d.ts +10 -0
- package/vendor/gatekeeper/dist/lib/tunnels.d.ts.map +1 -0
- package/vendor/gatekeeper/dist/lib/tunnels.js +56 -0
- package/vendor/gatekeeper/dist/lib/tunnels.js.map +1 -0
- package/vendor/gatekeeper/dist/server/index.d.ts +2 -1
- package/vendor/gatekeeper/dist/server/index.d.ts.map +1 -1
- package/vendor/gatekeeper/dist/server/index.js +49 -56
- package/vendor/gatekeeper/dist/server/index.js.map +1 -1
- package/vendor/gatekeeper/dist/server/routes/authz.d.ts +15 -1
- package/vendor/gatekeeper/dist/server/routes/authz.d.ts.map +1 -1
- package/vendor/gatekeeper/dist/server/routes/authz.js +332 -104
- package/vendor/gatekeeper/dist/server/routes/authz.js.map +1 -1
- package/vendor/gatekeeper/dist/server/routes/diagnostic.d.ts.map +1 -1
- package/vendor/gatekeeper/dist/server/routes/diagnostic.js +61 -4
- package/vendor/gatekeeper/dist/server/routes/diagnostic.js.map +1 -1
- package/vendor/gatekeeper/dist/server/routes/principals.d.ts +3 -0
- package/vendor/gatekeeper/dist/server/routes/principals.d.ts.map +1 -0
- package/vendor/gatekeeper/dist/server/routes/principals.js +27 -0
- package/vendor/gatekeeper/dist/server/routes/principals.js.map +1 -0
- package/vendor/gatekeeper/package.json +2 -2
- package/vendor/server/bin/lamaste-server.js +15 -1
- package/vendor/server/package.json +2 -2
- package/vendor/server/src/commands/plugin-identity.js +335 -0
- package/vendor/server/src/commands/plugin-web-surface.js +269 -0
- package/vendor/server/src/commands/plugins.js +156 -11
- package/vendor/server/src/commands/registry-credential.js +2 -1
- package/vendor/server/src/commands/sites.js +15 -1
- package/vendor/server/src/commands/tunnels.js +102 -2
- package/vendor/server/src/commands/uninstall.js +3 -1
- package/vendor/server/src/commands/users.js +358 -0
- package/vendor/server/src/plugin-approval.js +186 -5
- package/vendor/server/src/plugin-identity.js +382 -0
- package/vendor/server/src/plugin-web-surface.js +307 -0
- package/vendor/server-ui/dist/assets/index-BZwQ_aQc.css +1 -0
- package/vendor/server-ui/dist/assets/index-BvEfCZYS.js +84 -0
- package/vendor/server-ui/dist/index.html +2 -2
- package/vendor/serverd/package.json +2 -2
- package/vendor/serverd/src/index.js +34 -5
- package/vendor/serverd/src/lib/audience.js +576 -0
- package/vendor/serverd/src/lib/authelia.js +78 -7
- package/vendor/serverd/src/lib/chisel-runtime.js +18 -6
- package/vendor/serverd/src/lib/chisel.js +10 -2
- package/vendor/serverd/src/lib/config.js +68 -43
- package/vendor/serverd/src/lib/directory.js +1113 -0
- package/vendor/serverd/src/lib/entitlements.js +517 -0
- package/vendor/serverd/src/lib/gatekeeper-client.js +226 -10
- package/vendor/serverd/src/lib/hook-pipelines.js +21 -3
- package/vendor/serverd/src/lib/identity-sync.js +905 -0
- package/vendor/serverd/src/lib/migrations/state/0013_identity_directory.sql +158 -0
- package/vendor/serverd/src/lib/migrations/state/0014_identity_ledger.sql +20 -0
- package/vendor/serverd/src/lib/migrations/state/0015_plugin_web_surface.sql +14 -0
- package/vendor/serverd/src/lib/mtls.js +6 -2
- package/vendor/serverd/src/lib/nginx.js +546 -48
- package/vendor/serverd/src/lib/plugin-hooks.js +127 -45
- package/vendor/serverd/src/lib/plugin-hosting.js +33 -5
- package/vendor/serverd/src/lib/plugin-lifecycle.js +227 -13
- package/vendor/serverd/src/lib/plugin-packages.js +74 -2
- package/vendor/serverd/src/lib/plugins.js +95 -7
- package/vendor/serverd/src/lib/registry-credential.js +9 -6
- package/vendor/serverd/src/lib/request-logging.js +19 -0
- package/vendor/serverd/src/lib/retained-data.js +50 -4
- package/vendor/serverd/src/lib/state.js +36 -0
- package/vendor/serverd/src/lib/tunnel-hooks.js +4 -1
- package/vendor/serverd/src/lib/user-access-session.js +21 -11
- package/vendor/serverd/src/lib/user-caller.js +67 -0
- package/vendor/serverd/src/lib/user-surface.js +754 -0
- package/vendor/serverd/src/lib/vhost-reconcile.js +137 -33
- package/vendor/serverd/src/lib/web-surface.js +766 -0
- package/vendor/serverd/src/middleware/user-access-session.js +9 -0
- package/vendor/serverd/src/routes/agent-forwarder.js +4 -2
- package/vendor/serverd/src/routes/invite.js +53 -12
- package/vendor/serverd/src/routes/management/gatekeeper-proxy.js +107 -16
- package/vendor/serverd/src/routes/management/identity-directory.js +79 -0
- package/vendor/serverd/src/routes/management/invitations.js +78 -68
- package/vendor/serverd/src/routes/management/plugin-identity.js +221 -0
- package/vendor/serverd/src/routes/management/plugin-web-surface.js +151 -0
- package/vendor/serverd/src/routes/management/plugins.js +2 -0
- package/vendor/serverd/src/routes/management/registry-credential.js +1 -1
- package/vendor/serverd/src/routes/management/sites.js +143 -65
- package/vendor/serverd/src/routes/management/tunnels.js +109 -22
- package/vendor/serverd/src/routes/management/users.js +290 -208
- package/vendor/serverd/src/routes/management.js +6 -0
- package/vendor/serverd/src/routes/onboarding/provision.js +14 -1
- package/vendor/serverd/src/routes/user-access.js +17 -4
- package/vendor/serverd/src/routes/user-surface.js +69 -0
- package/vendor/server-ui/dist/assets/index-25wo_8av.css +0 -1
- package/vendor/server-ui/dist/assets/index-roDHz3dM.js +0 -84
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
<meta charset="UTF-8" />
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
6
|
<title>Lamaste</title>
|
|
7
|
-
<script type="module" crossorigin src="/assets/index-
|
|
8
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
7
|
+
<script type="module" crossorigin src="/assets/index-BvEfCZYS.js"></script>
|
|
8
|
+
<link rel="stylesheet" crossorigin href="/assets/index-BZwQ_aQc.css">
|
|
9
9
|
</head>
|
|
10
10
|
<body style="background-color: #09090b">
|
|
11
11
|
<div id="root"></div>
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lamalibre/lamaste-serverd",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.6.0",
|
|
4
4
|
"description": "Lamaste server daemon — REST API and plugin host",
|
|
5
5
|
"license": "SEE LICENSE IN LICENSE.md",
|
|
6
6
|
"publishConfig": {
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
"@fastify/rate-limit": "^10.3.0",
|
|
30
30
|
"@fastify/static": "^9.1.1",
|
|
31
31
|
"@fastify/websocket": "^11.0.0",
|
|
32
|
-
"@lamalibre/lamaste": "^4.
|
|
32
|
+
"@lamalibre/lamaste": "^4.6.0",
|
|
33
33
|
"bcryptjs": "^3.0.3",
|
|
34
34
|
"execa": "^9.6.1",
|
|
35
35
|
"fastify": "^5.8.4",
|
|
@@ -8,7 +8,9 @@ import fastifyStatic from '@fastify/static';
|
|
|
8
8
|
import websocket from '@fastify/websocket';
|
|
9
9
|
import path from 'node:path';
|
|
10
10
|
import { fileURLToPath } from 'node:url';
|
|
11
|
+
import { logRequestMetadata } from '@lamalibre/lamaste';
|
|
11
12
|
import { loadConfig } from './lib/config.js';
|
|
13
|
+
import { panelRequestLogOptions } from './lib/request-logging.js';
|
|
12
14
|
import mtlsMiddleware from './middleware/mtls.js';
|
|
13
15
|
import twofaSession from './middleware/twofa-session.js';
|
|
14
16
|
import roleGuard from './middleware/role-guard.js';
|
|
@@ -18,6 +20,7 @@ import onboardingRoutes from './routes/onboarding/index.js';
|
|
|
18
20
|
import managementRoutes from './routes/management.js';
|
|
19
21
|
import pluginRouter from './routes/plugin-router.js';
|
|
20
22
|
import agentForwarderRoutes from './routes/agent-forwarder.js';
|
|
23
|
+
import userSurfaceContext from './routes/user-surface.js';
|
|
21
24
|
import inviteRoutes from './routes/invite.js';
|
|
22
25
|
import enrollmentRoutes from './routes/enrollment.js';
|
|
23
26
|
import {
|
|
@@ -38,9 +41,11 @@ import {
|
|
|
38
41
|
stopHostedPluginHealthMonitor,
|
|
39
42
|
} from './lib/plugin-hosting.js';
|
|
40
43
|
import { refreshHostedPluginSettings } from './lib/plugin-settings.js';
|
|
44
|
+
import { startIdentityServices, stopIdentityServices } from './lib/identity-sync.js';
|
|
41
45
|
import { syncOidcClients } from './lib/plugin-oidc.js';
|
|
42
46
|
import { ensureRelaySigningKey } from './lib/relay-signing.js';
|
|
43
47
|
import { reconcileSiteVhosts, reconcileTunnelVhosts } from './lib/vhost-reconcile.js';
|
|
48
|
+
import { reconcileWebSurfaces } from './lib/web-surface.js';
|
|
44
49
|
import {
|
|
45
50
|
loadTicketScopeCapabilities,
|
|
46
51
|
checkInstanceLiveness,
|
|
@@ -73,12 +78,19 @@ async function start() {
|
|
|
73
78
|
|
|
74
79
|
const server = Fastify({
|
|
75
80
|
logger: true,
|
|
81
|
+
// Fastify's own request lines carry every URL with its query and the
|
|
82
|
+
// client address; one metadata line per request replaces them (below).
|
|
83
|
+
disableRequestLogging: true,
|
|
76
84
|
// Behind the local nginx: trust exactly that one loopback hop, so
|
|
77
85
|
// request.ip is the client address nginx appended to X-Forwarded-For —
|
|
78
86
|
// not a value the client sent, and nothing from a non-local peer.
|
|
79
87
|
trustProxy: trustLocalNginxHop,
|
|
80
88
|
});
|
|
81
89
|
|
|
90
|
+
// One metadata line per request, never a URL or a person's address
|
|
91
|
+
// (lib/request-logging.js).
|
|
92
|
+
logRequestMetadata(server, panelRequestLogOptions);
|
|
93
|
+
|
|
82
94
|
// Wire ticket module to the Fastify root logger so any load-time warnings
|
|
83
95
|
// (e.g. legacy tickets.json shape dropped on upgrade) reach journalctl.
|
|
84
96
|
setTicketModuleLogger(server.log);
|
|
@@ -177,10 +189,16 @@ async function start() {
|
|
|
177
189
|
app.register(userAccessAdminRoutes, { prefix: '/api' });
|
|
178
190
|
app.register(pluginRouter, { prefix: '/api' });
|
|
179
191
|
// Last: agent-hosted plugins with an agent half, forwarded over their
|
|
180
|
-
// internal tunnels. Only what no other /api route answers reaches it
|
|
192
|
+
// internal tunnels. Only what no other /api route answers reaches it —
|
|
193
|
+
// and never /api/<route>/app[/*], the user surface's static routes below.
|
|
181
194
|
app.register(agentForwarderRoutes, { prefix: '/api' });
|
|
182
195
|
});
|
|
183
196
|
|
|
197
|
+
// --- Plugins' user surfaces: /api/<route>/app[/*] from the host bound to
|
|
198
|
+
// the plugin. No mTLS, 2FA or role: only a relay assertion Gatekeeper
|
|
199
|
+
// signed for the panel admits a request (routes/user-surface.js) ---
|
|
200
|
+
server.register(userSurfaceContext);
|
|
201
|
+
|
|
184
202
|
// --- User-access session-protected routes (Bearer token, no mTLS) ---
|
|
185
203
|
server.register(async function userAccessContext(app) {
|
|
186
204
|
app.register(userAccessSessionMiddleware);
|
|
@@ -200,7 +218,7 @@ async function start() {
|
|
|
200
218
|
|
|
201
219
|
// The auth portal and static site vhosts an older version wrote name the
|
|
202
220
|
// client's Host header, not their own hostname, to Authelia. Before listen:
|
|
203
|
-
//
|
|
221
|
+
// no site change can arrive until the panel listens.
|
|
204
222
|
if (config.onboarding.status === 'COMPLETED' && config.domain) {
|
|
205
223
|
await reconcileSiteVhosts(server.log, config.domain).catch((err) => {
|
|
206
224
|
server.log.error({ err: err.message }, 'Startup site vhost reconcile failed');
|
|
@@ -222,9 +240,13 @@ async function start() {
|
|
|
222
240
|
// relay, and Gatekeeper vhosts name the client's Host header to Gatekeeper.
|
|
223
241
|
// After listen: a rewritten agent-panel vhost asks this server at once.
|
|
224
242
|
if (config.onboarding.status === 'COMPLETED') {
|
|
225
|
-
reconcileTunnelVhosts(server.log)
|
|
226
|
-
|
|
227
|
-
|
|
243
|
+
reconcileTunnelVhosts(server.log)
|
|
244
|
+
.catch((err) => {
|
|
245
|
+
server.log.error({ err: err.message }, 'Startup tunnel vhost reconcile failed');
|
|
246
|
+
})
|
|
247
|
+
// Plugins' web surfaces: each approved tree served (a redeploy may
|
|
248
|
+
// have reset the web root), each site's vhost in line.
|
|
249
|
+
.then(() => reconcileWebSurfaces(server.log));
|
|
228
250
|
}
|
|
229
251
|
|
|
230
252
|
// --- Health of hosted agent-hosted plugins (every 10s; idle without hostings) ---
|
|
@@ -238,6 +260,12 @@ async function start() {
|
|
|
238
260
|
server.log.warn({ err: err.message }, 'Startup refresh of plugin settings failed');
|
|
239
261
|
});
|
|
240
262
|
|
|
263
|
+
// --- Users and identity: the directory reconciled with users.yml (read
|
|
264
|
+
// only), the plugin audiences recomputed and sent to the agent halves that
|
|
265
|
+
// are behind — now, then every minute (Gatekeeper CLI edits, users.yml
|
|
266
|
+
// changed outside Lamaste, retries), with a daily full reconcile per plugin ---
|
|
267
|
+
startIdentityServices(server.log);
|
|
268
|
+
|
|
241
269
|
// --- Periodic ticket instance liveness check (every 60s) ---
|
|
242
270
|
const livenessInterval = setInterval(() => {
|
|
243
271
|
checkInstanceLiveness(server.log).catch((err) => {
|
|
@@ -250,6 +278,7 @@ async function start() {
|
|
|
250
278
|
const shutdown = async (signal) => {
|
|
251
279
|
server.log.info({ signal }, 'Received signal, shutting down gracefully');
|
|
252
280
|
clearInterval(livenessInterval);
|
|
281
|
+
stopIdentityServices();
|
|
253
282
|
stopHostedPluginHealthMonitor();
|
|
254
283
|
clearRateLimitInterval();
|
|
255
284
|
await server.close();
|