@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.
- package/LICENSE.md +118 -0
- package/README.md +114 -0
- package/bin/create-lamaste.js +15 -0
- package/package.json +54 -0
- package/scripts/bundle-vendor.js +110 -0
- package/scripts/lamaste-cert-info +62 -0
- package/scripts/lamaste-certbot +96 -0
- package/scripts/lamaste-priv +693 -0
- package/src/index.js +646 -0
- package/src/lib/accounts.js +86 -0
- package/src/lib/binaries.js +137 -0
- package/src/lib/cert-help-page.js +160 -0
- package/src/lib/env.js +132 -0
- package/src/lib/http-redirect.js +38 -0
- package/src/lib/ownership.js +231 -0
- package/src/lib/relay-services.js +103 -0
- package/src/lib/secrets.js +19 -0
- package/src/lib/service-config.js +311 -0
- package/src/lib/summary.js +131 -0
- package/src/lib/wrappers.js +63 -0
- package/src/tasks/gatekeeper.js +233 -0
- package/src/tasks/harden.js +293 -0
- package/src/tasks/mtls.js +193 -0
- package/src/tasks/nginx.js +265 -0
- package/src/tasks/node.js +110 -0
- package/src/tasks/panel.js +408 -0
- package/src/tasks/redeploy.js +438 -0
- package/vendor/docs/00-introduction/how-it-works.md +447 -0
- package/vendor/docs/00-introduction/quickstart.md +472 -0
- package/vendor/docs/00-introduction/what-is-lamaste.md +112 -0
- package/vendor/docs/01-concepts/authentication.md +464 -0
- package/vendor/docs/01-concepts/authorization.md +242 -0
- package/vendor/docs/01-concepts/certificates.md +452 -0
- package/vendor/docs/01-concepts/dns-and-domains.md +343 -0
- package/vendor/docs/01-concepts/mtls.md +490 -0
- package/vendor/docs/01-concepts/nginx-reverse-proxy.md +540 -0
- package/vendor/docs/01-concepts/security-model.md +600 -0
- package/vendor/docs/01-concepts/tickets.md +414 -0
- package/vendor/docs/01-concepts/tunneling.md +367 -0
- package/vendor/docs/02-guides/agent-setup.md +194 -0
- package/vendor/docs/02-guides/certificate-management.md +341 -0
- package/vendor/docs/02-guides/cloud-provisioning.md +406 -0
- package/vendor/docs/02-guides/desktop-app-setup.md +226 -0
- package/vendor/docs/02-guides/disaster-recovery.md +464 -0
- package/vendor/docs/02-guides/first-tunnel.md +230 -0
- package/vendor/docs/02-guides/installation.md +393 -0
- package/vendor/docs/02-guides/managing-users.md +255 -0
- package/vendor/docs/02-guides/onboarding.md +244 -0
- package/vendor/docs/02-guides/standalone-plugin-with-tickets.md +375 -0
- package/vendor/docs/02-guides/static-sites.md +364 -0
- package/vendor/docs/03-architecture/e2e-three-vm-sequences.md +457 -0
- package/vendor/docs/03-architecture/installer-flow.md +151 -0
- package/vendor/docs/03-architecture/installer.md +445 -0
- package/vendor/docs/03-architecture/management-flow.md +288 -0
- package/vendor/docs/03-architecture/nginx-configuration.md +830 -0
- package/vendor/docs/03-architecture/onboarding-flow.md +164 -0
- package/vendor/docs/03-architecture/overview.md +541 -0
- package/vendor/docs/03-architecture/panel-client.md +416 -0
- package/vendor/docs/03-architecture/panel-server.md +695 -0
- package/vendor/docs/03-architecture/state-management.md +529 -0
- package/vendor/docs/03-architecture/system-overview.md +167 -0
- package/vendor/docs/04-api-reference/certificates.md +1141 -0
- package/vendor/docs/04-api-reference/gatekeeper.md +592 -0
- package/vendor/docs/04-api-reference/onboarding.md +473 -0
- package/vendor/docs/04-api-reference/overview.md +404 -0
- package/vendor/docs/04-api-reference/services.md +267 -0
- package/vendor/docs/04-api-reference/settings.md +343 -0
- package/vendor/docs/04-api-reference/sites.md +716 -0
- package/vendor/docs/04-api-reference/system.md +268 -0
- package/vendor/docs/04-api-reference/tickets.md +618 -0
- package/vendor/docs/04-api-reference/tunnels.md +417 -0
- package/vendor/docs/04-api-reference/users.md +333 -0
- package/vendor/docs/05-operations/backup-and-restore.md +342 -0
- package/vendor/docs/05-operations/monitoring.md +285 -0
- package/vendor/docs/05-operations/uninstalling.md +344 -0
- package/vendor/docs/05-operations/upgrades.md +270 -0
- package/vendor/docs/06-reference/config-files.md +1080 -0
- package/vendor/docs/06-reference/glossary.md +528 -0
- package/vendor/docs/06-reference/installer-flags.md +260 -0
- package/vendor/docs/06-reference/ports-and-services.md +244 -0
- package/vendor/docs/06-reference/troubleshooting.md +665 -0
- package/vendor/docs/_index.json +233 -0
- package/vendor/docs/gatekeeper-design.md +953 -0
- package/vendor/docs/package.json +15 -0
- package/vendor/docs/todo/lib-cli-desktop-refactor.md +641 -0
- package/vendor/gatekeeper/dist/boot.d.ts +1 -0
- package/vendor/gatekeeper/dist/boot.d.ts.map +1 -0
- package/vendor/gatekeeper/dist/boot.js +17 -0
- package/vendor/gatekeeper/dist/boot.js.map +1 -0
- package/vendor/gatekeeper/dist/cli/commands/access.d.ts +2 -0
- package/vendor/gatekeeper/dist/cli/commands/access.d.ts.map +1 -0
- package/vendor/gatekeeper/dist/cli/commands/access.js +33 -0
- package/vendor/gatekeeper/dist/cli/commands/access.js.map +1 -0
- package/vendor/gatekeeper/dist/cli/commands/grants.d.ts +2 -0
- package/vendor/gatekeeper/dist/cli/commands/grants.d.ts.map +1 -0
- package/vendor/gatekeeper/dist/cli/commands/grants.js +110 -0
- package/vendor/gatekeeper/dist/cli/commands/grants.js.map +1 -0
- package/vendor/gatekeeper/dist/cli/commands/groups.d.ts +2 -0
- package/vendor/gatekeeper/dist/cli/commands/groups.d.ts.map +1 -0
- package/vendor/gatekeeper/dist/cli/commands/groups.js +98 -0
- package/vendor/gatekeeper/dist/cli/commands/groups.js.map +1 -0
- package/vendor/gatekeeper/dist/cli/index.d.ts +3 -0
- package/vendor/gatekeeper/dist/cli/index.d.ts.map +1 -0
- package/vendor/gatekeeper/dist/cli/index.js +45 -0
- package/vendor/gatekeeper/dist/cli/index.js.map +1 -0
- package/vendor/gatekeeper/dist/index.d.ts +9 -0
- package/vendor/gatekeeper/dist/index.d.ts.map +1 -0
- package/vendor/gatekeeper/dist/index.js +13 -0
- package/vendor/gatekeeper/dist/index.js.map +1 -0
- package/vendor/gatekeeper/dist/lib/authz.d.ts +16 -0
- package/vendor/gatekeeper/dist/lib/authz.d.ts.map +1 -0
- package/vendor/gatekeeper/dist/lib/authz.js +42 -0
- package/vendor/gatekeeper/dist/lib/authz.js.map +1 -0
- package/vendor/gatekeeper/dist/lib/cache-bust.d.ts +15 -0
- package/vendor/gatekeeper/dist/lib/cache-bust.d.ts.map +1 -0
- package/vendor/gatekeeper/dist/lib/cache-bust.js +19 -0
- package/vendor/gatekeeper/dist/lib/cache-bust.js.map +1 -0
- package/vendor/gatekeeper/dist/lib/constants.d.ts +82 -0
- package/vendor/gatekeeper/dist/lib/constants.d.ts.map +1 -0
- package/vendor/gatekeeper/dist/lib/constants.js +79 -0
- package/vendor/gatekeeper/dist/lib/constants.js.map +1 -0
- package/vendor/gatekeeper/dist/lib/grants.d.ts +32 -0
- package/vendor/gatekeeper/dist/lib/grants.d.ts.map +1 -0
- package/vendor/gatekeeper/dist/lib/grants.js +314 -0
- package/vendor/gatekeeper/dist/lib/grants.js.map +1 -0
- package/vendor/gatekeeper/dist/lib/groups.d.ts +10 -0
- package/vendor/gatekeeper/dist/lib/groups.d.ts.map +1 -0
- package/vendor/gatekeeper/dist/lib/groups.js +247 -0
- package/vendor/gatekeeper/dist/lib/groups.js.map +1 -0
- package/vendor/gatekeeper/dist/lib/migration.d.ts +17 -0
- package/vendor/gatekeeper/dist/lib/migration.d.ts.map +1 -0
- package/vendor/gatekeeper/dist/lib/migration.js +79 -0
- package/vendor/gatekeeper/dist/lib/migration.js.map +1 -0
- package/vendor/gatekeeper/dist/lib/migrations/gatekeeper/0001_groups.sql +7 -0
- package/vendor/gatekeeper/dist/lib/migrations/gatekeeper/0002_access_grants.sql +14 -0
- package/vendor/gatekeeper/dist/lib/migrations/gatekeeper/0003_access_request_log.sql +9 -0
- package/vendor/gatekeeper/dist/lib/migrations/migrations/gatekeeper/0001_groups.sql +7 -0
- package/vendor/gatekeeper/dist/lib/migrations/migrations/gatekeeper/0002_access_grants.sql +14 -0
- package/vendor/gatekeeper/dist/lib/migrations/migrations/gatekeeper/0003_access_request_log.sql +9 -0
- package/vendor/gatekeeper/dist/lib/state-db.d.ts +16 -0
- package/vendor/gatekeeper/dist/lib/state-db.d.ts.map +1 -0
- package/vendor/gatekeeper/dist/lib/state-db.js +154 -0
- package/vendor/gatekeeper/dist/lib/state-db.js.map +1 -0
- package/vendor/gatekeeper/dist/lib/templates.d.ts +21 -0
- package/vendor/gatekeeper/dist/lib/templates.d.ts.map +1 -0
- package/vendor/gatekeeper/dist/lib/templates.js +151 -0
- package/vendor/gatekeeper/dist/lib/templates.js.map +1 -0
- package/vendor/gatekeeper/dist/lib/types.d.ts +178 -0
- package/vendor/gatekeeper/dist/lib/types.d.ts.map +1 -0
- package/vendor/gatekeeper/dist/lib/types.js +2 -0
- package/vendor/gatekeeper/dist/lib/types.js.map +1 -0
- package/vendor/gatekeeper/dist/server/index.d.ts +15 -0
- package/vendor/gatekeeper/dist/server/index.d.ts.map +1 -0
- package/vendor/gatekeeper/dist/server/index.js +251 -0
- package/vendor/gatekeeper/dist/server/index.js.map +1 -0
- package/vendor/gatekeeper/dist/server/routes/access-request.d.ts +7 -0
- package/vendor/gatekeeper/dist/server/routes/access-request.d.ts.map +1 -0
- package/vendor/gatekeeper/dist/server/routes/access-request.js +17 -0
- package/vendor/gatekeeper/dist/server/routes/access-request.js.map +1 -0
- package/vendor/gatekeeper/dist/server/routes/authz.d.ts +3 -0
- package/vendor/gatekeeper/dist/server/routes/authz.d.ts.map +1 -0
- package/vendor/gatekeeper/dist/server/routes/authz.js +279 -0
- package/vendor/gatekeeper/dist/server/routes/authz.js.map +1 -0
- package/vendor/gatekeeper/dist/server/routes/diagnostic.d.ts +13 -0
- package/vendor/gatekeeper/dist/server/routes/diagnostic.d.ts.map +1 -0
- package/vendor/gatekeeper/dist/server/routes/diagnostic.js +249 -0
- package/vendor/gatekeeper/dist/server/routes/diagnostic.js.map +1 -0
- package/vendor/gatekeeper/dist/server/routes/grants.d.ts +3 -0
- package/vendor/gatekeeper/dist/server/routes/grants.d.ts.map +1 -0
- package/vendor/gatekeeper/dist/server/routes/grants.js +112 -0
- package/vendor/gatekeeper/dist/server/routes/grants.js.map +1 -0
- package/vendor/gatekeeper/dist/server/routes/groups.d.ts +3 -0
- package/vendor/gatekeeper/dist/server/routes/groups.d.ts.map +1 -0
- package/vendor/gatekeeper/dist/server/routes/groups.js +139 -0
- package/vendor/gatekeeper/dist/server/routes/groups.js.map +1 -0
- package/vendor/gatekeeper/package.json +49 -0
- package/vendor/server/bin/lamaste-server.js +204 -0
- package/vendor/server/package.json +31 -0
- package/vendor/server/src/commands/certs.js +224 -0
- package/vendor/server/src/commands/chisel.js +132 -0
- package/vendor/server/src/commands/logs.js +49 -0
- package/vendor/server/src/commands/plugins.js +321 -0
- package/vendor/server/src/commands/reset-admin.js +478 -0
- package/vendor/server/src/commands/restart.js +94 -0
- package/vendor/server/src/commands/sites.js +257 -0
- package/vendor/server/src/commands/status.js +158 -0
- package/vendor/server/src/commands/tunnels.js +365 -0
- package/vendor/server/src/commands/uninstall.js +326 -0
- package/vendor/server/src/config.js +38 -0
- package/vendor/server/src/exec.js +26 -0
- package/vendor/server/src/logger.js +39 -0
- package/vendor/server/src/ndjson.js +56 -0
- package/vendor/server/src/panel-api.js +85 -0
- package/vendor/server/src/state.js +45 -0
- package/vendor/server-ui/dist/assets/index-B0nWuUyL.js +257 -0
- package/vendor/server-ui/dist/assets/index-BqWWFlTU.css +1 -0
- package/vendor/server-ui/dist/index.html +13 -0
- package/vendor/serverd/package.json +44 -0
- package/vendor/serverd/src/boot.js +13 -0
- package/vendor/serverd/src/index.js +191 -0
- package/vendor/serverd/src/lib/app-error.js +14 -0
- package/vendor/serverd/src/lib/authelia.js +85 -0
- package/vendor/serverd/src/lib/certbot.js +74 -0
- package/vendor/serverd/src/lib/chisel-args.js +6 -0
- package/vendor/serverd/src/lib/chisel-reconcile.js +232 -0
- package/vendor/serverd/src/lib/chisel-runtime.js +46 -0
- package/vendor/serverd/src/lib/chisel-users.js +109 -0
- package/vendor/serverd/src/lib/chisel.js +81 -0
- package/vendor/serverd/src/lib/config.js +190 -0
- package/vendor/serverd/src/lib/constants.js +8 -0
- package/vendor/serverd/src/lib/csr-signing.js +331 -0
- package/vendor/serverd/src/lib/enrollment.js +302 -0
- package/vendor/serverd/src/lib/files.js +19 -0
- package/vendor/serverd/src/lib/gatekeeper-client.js +135 -0
- package/vendor/serverd/src/lib/invite-page.js +281 -0
- package/vendor/serverd/src/lib/ip-utils.js +79 -0
- package/vendor/serverd/src/lib/migrations/state/0001_enrollment_tokens.sql +17 -0
- package/vendor/serverd/src/lib/migrations/state/0002_tickets.sql +70 -0
- package/vendor/serverd/src/lib/migrations/state/0003_plugins.sql +15 -0
- package/vendor/serverd/src/lib/migrations/state/0004_agents.sql +19 -0
- package/vendor/serverd/src/lib/mtls.js +795 -0
- package/vendor/serverd/src/lib/nginx.js +1090 -0
- package/vendor/serverd/src/lib/pki-paths.js +41 -0
- package/vendor/serverd/src/lib/pki-sign.js +103 -0
- package/vendor/serverd/src/lib/plugins.js +538 -0
- package/vendor/serverd/src/lib/push-install.js +390 -0
- package/vendor/serverd/src/lib/revocation.js +112 -0
- package/vendor/serverd/src/lib/services.js +131 -0
- package/vendor/serverd/src/lib/session.js +151 -0
- package/vendor/serverd/src/lib/state-db.js +130 -0
- package/vendor/serverd/src/lib/state.js +140 -0
- package/vendor/serverd/src/lib/storage.js +63 -0
- package/vendor/serverd/src/lib/system-stats.js +58 -0
- package/vendor/serverd/src/lib/tickets.js +1556 -0
- package/vendor/serverd/src/lib/totp.js +76 -0
- package/vendor/serverd/src/lib/tunnel-deps.js +41 -0
- package/vendor/serverd/src/lib/user-access-session.js +142 -0
- package/vendor/serverd/src/lib/user-access.js +52 -0
- package/vendor/serverd/src/middleware/errors.js +63 -0
- package/vendor/serverd/src/middleware/mtls.js +120 -0
- package/vendor/serverd/src/middleware/onboarding-guard.js +30 -0
- package/vendor/serverd/src/middleware/role-guard.js +58 -0
- package/vendor/serverd/src/middleware/twofa-session.js +65 -0
- package/vendor/serverd/src/middleware/user-access-session.js +52 -0
- package/vendor/serverd/src/routes/enrollment.js +120 -0
- package/vendor/serverd/src/routes/health.js +22 -0
- package/vendor/serverd/src/routes/invite.js +163 -0
- package/vendor/serverd/src/routes/management/agents.js +182 -0
- package/vendor/serverd/src/routes/management/certs.js +911 -0
- package/vendor/serverd/src/routes/management/gatekeeper-proxy.js +160 -0
- package/vendor/serverd/src/routes/management/identity.js +107 -0
- package/vendor/serverd/src/routes/management/invitations.js +166 -0
- package/vendor/serverd/src/routes/management/logs.js +218 -0
- package/vendor/serverd/src/routes/management/plugins.js +560 -0
- package/vendor/serverd/src/routes/management/services.js +63 -0
- package/vendor/serverd/src/routes/management/settings.js +325 -0
- package/vendor/serverd/src/routes/management/sites.js +522 -0
- package/vendor/serverd/src/routes/management/storage.js +192 -0
- package/vendor/serverd/src/routes/management/system.js +201 -0
- package/vendor/serverd/src/routes/management/tickets.js +457 -0
- package/vendor/serverd/src/routes/management/tunnels.js +709 -0
- package/vendor/serverd/src/routes/management/users.js +377 -0
- package/vendor/serverd/src/routes/management.js +36 -0
- package/vendor/serverd/src/routes/onboarding/dns.js +101 -0
- package/vendor/serverd/src/routes/onboarding/domain.js +42 -0
- package/vendor/serverd/src/routes/onboarding/index.js +18 -0
- package/vendor/serverd/src/routes/onboarding/provision.js +327 -0
- package/vendor/serverd/src/routes/onboarding/status.js +12 -0
- package/vendor/serverd/src/routes/plugin-router.js +79 -0
- package/vendor/serverd/src/routes/user-access.js +389 -0
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
# Managing Users
|
|
2
|
+
|
|
3
|
+
> Add, update, and remove Authelia users who can access your tunneled apps through TOTP two-factor authentication.
|
|
4
|
+
|
|
5
|
+
## In Plain English
|
|
6
|
+
|
|
7
|
+
Every tunneled app in Lamaste is protected by Authelia, a login system that requires a username, password, and a one-time code from an authenticator app. When you create a user in the Lamaste panel, that person can log in to any of your tunneled apps. This guide covers the full lifecycle: creating users, enrolling them in two-factor authentication, changing passwords, and safely removing users.
|
|
8
|
+
|
|
9
|
+
## Prerequisites
|
|
10
|
+
|
|
11
|
+
- A completed [Lamaste onboarding](onboarding.md)
|
|
12
|
+
- Access to the Lamaste admin panel
|
|
13
|
+
- An authenticator app for TOTP enrollment (Google Authenticator, Authy, 1Password, etc.)
|
|
14
|
+
|
|
15
|
+
## Step-by-Step
|
|
16
|
+
|
|
17
|
+
### 1. Open the Users Page
|
|
18
|
+
|
|
19
|
+
Log in to the Lamaste admin panel at `https://<ip>:9292`.
|
|
20
|
+
|
|
21
|
+
Click **Users** in the sidebar navigation.
|
|
22
|
+
|
|
23
|
+
You see a list of existing users. After onboarding, there is one user: `admin` — the account created during provisioning.
|
|
24
|
+
|
|
25
|
+
### 2. Add a New User
|
|
26
|
+
|
|
27
|
+
Click the **Add User** button.
|
|
28
|
+
|
|
29
|
+
A form appears with these fields:
|
|
30
|
+
|
|
31
|
+
| Field | Required | Rules | Example |
|
|
32
|
+
| ---------------- | -------- | ------------------------------------------------------------------------------------------------ | ------------------------- |
|
|
33
|
+
| **Username** | Yes | 2-32 chars, lowercase alphanumeric with underscores and hyphens, starting with a letter or digit | `alice` |
|
|
34
|
+
| **Display Name** | Yes | 1-100 characters | `Alice Johnson` |
|
|
35
|
+
| **Email** | Yes | Valid email address | `alice@example.com` |
|
|
36
|
+
| **Password** | Yes | 8-128 characters | A strong, unique password |
|
|
37
|
+
| **Groups** | No | Optional list of group names | `admins`, `developers` |
|
|
38
|
+
|
|
39
|
+
Fill in the form and click **Create User**.
|
|
40
|
+
|
|
41
|
+
**What happens behind the scenes:**
|
|
42
|
+
|
|
43
|
+
1. The panel validates all fields against the schema.
|
|
44
|
+
2. The password is hashed with **bcrypt** (not argon2id — argon2id uses ~93 MB per hash and causes OOM kills on 512 MB droplets).
|
|
45
|
+
3. The user record is written to `/etc/authelia/users.yml` using an atomic write (write to temp file, then rename) to prevent corruption.
|
|
46
|
+
4. Authelia is reloaded to pick up the new user.
|
|
47
|
+
|
|
48
|
+
**Expected result:** The new user appears in the list. Share the username and password with the person — they need these to log in to your tunneled apps.
|
|
49
|
+
|
|
50
|
+
### 3. TOTP Enrollment
|
|
51
|
+
|
|
52
|
+
When a new user visits a Lamaste-protected app for the first time:
|
|
53
|
+
|
|
54
|
+
1. They are redirected to `auth.example.com`.
|
|
55
|
+
2. They enter their username and password.
|
|
56
|
+
3. Authelia presents a QR code for TOTP enrollment.
|
|
57
|
+
4. They scan the QR code with their authenticator app.
|
|
58
|
+
5. They enter the 6-digit code to verify.
|
|
59
|
+
6. TOTP is now active. Every future login requires the code.
|
|
60
|
+
|
|
61
|
+
**Walk a new user through this process:**
|
|
62
|
+
|
|
63
|
+
1. Share the tunnel URL (e.g., `https://app.example.com`) and their credentials.
|
|
64
|
+
2. Tell them to open the URL in their browser.
|
|
65
|
+
3. They log in with the username and password you provided.
|
|
66
|
+
4. They scan the QR code with Google Authenticator, Authy, 1Password, or any TOTP-compatible app.
|
|
67
|
+
5. They enter the verification code.
|
|
68
|
+
6. They are logged in and can access the app.
|
|
69
|
+
|
|
70
|
+
### 4. Reset a User's TOTP Secret
|
|
71
|
+
|
|
72
|
+
If a user loses access to their authenticator app (lost phone, new device), you can reset their TOTP secret so they can re-enroll.
|
|
73
|
+
|
|
74
|
+
1. Go to the **Users** page.
|
|
75
|
+
2. Find the user in the list.
|
|
76
|
+
3. Click the **Reset TOTP** button next to the user.
|
|
77
|
+
4. The panel generates a new TOTP secret and returns a TOTP URI.
|
|
78
|
+
5. A QR code is displayed — the user scans it with their authenticator app.
|
|
79
|
+
|
|
80
|
+
**What happens behind the scenes:**
|
|
81
|
+
|
|
82
|
+
1. The panel generates a new base32-encoded TOTP secret.
|
|
83
|
+
2. The secret is written to Authelia's SQLite database (`/etc/authelia/db.sqlite3`) via the `authelia storage user totp generate` CLI command. TOTP secrets are stored in the database, not in `users.yml` (the `totp_secret` field in `users.yml` is deprecated and ignored in Authelia v4.38+).
|
|
84
|
+
3. The TOTP URI is returned in the format `otpauth://totp/Lamaste:<username>?secret=<secret>&issuer=Lamaste&algorithm=SHA1&digits=6&period=30`.
|
|
85
|
+
|
|
86
|
+
On their next login, the user enters a code from the new TOTP entry in their authenticator app. The old entry no longer works.
|
|
87
|
+
|
|
88
|
+
### 5. Change a User's Password
|
|
89
|
+
|
|
90
|
+
1. Go to the **Users** page.
|
|
91
|
+
2. Find the user and click **Edit** (or the edit icon).
|
|
92
|
+
3. Enter a new password in the password field.
|
|
93
|
+
4. Click **Save**.
|
|
94
|
+
|
|
95
|
+
The new password is hashed with bcrypt and written to `users.yml`. Authelia is reloaded. The user must use the new password on their next login.
|
|
96
|
+
|
|
97
|
+
You can also update the display name, email, and groups in the same edit form.
|
|
98
|
+
|
|
99
|
+
### 6. Update User Details
|
|
100
|
+
|
|
101
|
+
To change a user's display name, email, or group membership:
|
|
102
|
+
|
|
103
|
+
1. Go to the **Users** page.
|
|
104
|
+
2. Click **Edit** on the user.
|
|
105
|
+
3. Modify the fields you want to change.
|
|
106
|
+
4. Click **Save**.
|
|
107
|
+
|
|
108
|
+
Only the fields you change are updated — the password and TOTP secret remain the same unless explicitly changed.
|
|
109
|
+
|
|
110
|
+
### 7. Remove a User
|
|
111
|
+
|
|
112
|
+
1. Go to the **Users** page.
|
|
113
|
+
2. Click the **Delete** button next to the user you want to remove.
|
|
114
|
+
3. Confirm the deletion.
|
|
115
|
+
|
|
116
|
+
**Safety rule:** You cannot delete the last user. Lamaste enforces this to prevent locking everyone out of the tunneled apps. If you try to delete the last user, the panel returns an error: "Cannot delete the last user."
|
|
117
|
+
|
|
118
|
+
**What happens behind the scenes:**
|
|
119
|
+
|
|
120
|
+
1. The panel removes the user from `users.yml` (atomic write).
|
|
121
|
+
2. Authelia is reloaded.
|
|
122
|
+
3. Any active sessions for that user expire naturally (Authelia does not have a "force logout" mechanism, but sessions have a timeout).
|
|
123
|
+
|
|
124
|
+
After deletion, the user can no longer log in to any tunneled app.
|
|
125
|
+
|
|
126
|
+
## For Developers
|
|
127
|
+
|
|
128
|
+
### User Storage
|
|
129
|
+
|
|
130
|
+
Users are stored in Authelia's `users.yml` file at `/etc/authelia/users.yml`. The file format is:
|
|
131
|
+
|
|
132
|
+
```yaml
|
|
133
|
+
users:
|
|
134
|
+
admin:
|
|
135
|
+
displayname: Admin
|
|
136
|
+
email: admin@example.com
|
|
137
|
+
password: $2b$12$... # bcrypt hash
|
|
138
|
+
groups:
|
|
139
|
+
- admins
|
|
140
|
+
alice:
|
|
141
|
+
displayname: Alice Johnson
|
|
142
|
+
email: alice@example.com
|
|
143
|
+
password: $2b$12$...
|
|
144
|
+
groups: []
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
Note: TOTP secrets are stored in Authelia's SQLite database (`/etc/authelia/db.sqlite3`), not in `users.yml`. The `totp_secret` field in `users.yml` is deprecated and ignored in Authelia v4.38+.
|
|
148
|
+
|
|
149
|
+
All writes to this file are atomic: write to a temp file, then rename. This prevents Authelia from reading a partially-written file.
|
|
150
|
+
|
|
151
|
+
### API Endpoints
|
|
152
|
+
|
|
153
|
+
| Method | Path | Purpose |
|
|
154
|
+
| -------- | --------------------------------- | ----------------------------------------------------------- |
|
|
155
|
+
| `GET` | `/api/users` | List all users (sorted alphabetically, no sensitive fields) |
|
|
156
|
+
| `POST` | `/api/users` | Create a new user |
|
|
157
|
+
| `PUT` | `/api/users/:username` | Update user fields |
|
|
158
|
+
| `DELETE` | `/api/users/:username` | Delete a user (not the last one) |
|
|
159
|
+
| `POST` | `/api/users/:username/reset-totp` | Generate a new TOTP secret |
|
|
160
|
+
|
|
161
|
+
### Create User Request
|
|
162
|
+
|
|
163
|
+
```json
|
|
164
|
+
POST /api/users
|
|
165
|
+
{
|
|
166
|
+
"username": "alice",
|
|
167
|
+
"displayname": "Alice Johnson",
|
|
168
|
+
"email": "alice@example.com",
|
|
169
|
+
"password": "securepassword123",
|
|
170
|
+
"groups": ["developers"]
|
|
171
|
+
}
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
Response:
|
|
175
|
+
|
|
176
|
+
```json
|
|
177
|
+
{
|
|
178
|
+
"ok": true,
|
|
179
|
+
"user": {
|
|
180
|
+
"username": "alice",
|
|
181
|
+
"displayname": "Alice Johnson",
|
|
182
|
+
"email": "alice@example.com",
|
|
183
|
+
"groups": ["developers"]
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
### Update User Request
|
|
189
|
+
|
|
190
|
+
```json
|
|
191
|
+
PUT /api/users/alice
|
|
192
|
+
{
|
|
193
|
+
"displayname": "Alice J.",
|
|
194
|
+
"password": "newpassword456"
|
|
195
|
+
}
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
Only provided fields are updated. At least one field must be present.
|
|
199
|
+
|
|
200
|
+
### Reset TOTP Response
|
|
201
|
+
|
|
202
|
+
```json
|
|
203
|
+
POST /api/users/alice/reset-totp
|
|
204
|
+
|
|
205
|
+
{
|
|
206
|
+
"ok": true,
|
|
207
|
+
"totpUri": "otpauth://totp/Lamaste:alice?secret=JBSWY3DPEHPK3PXP&issuer=Lamaste"
|
|
208
|
+
}
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
The `totpUri` is used to generate a QR code that the user scans with their authenticator app.
|
|
212
|
+
|
|
213
|
+
### Validation Rules (Zod Schema)
|
|
214
|
+
|
|
215
|
+
| Field | Rules |
|
|
216
|
+
| ------------- | ----------------------------------------- |
|
|
217
|
+
| `username` | 2-32 chars, regex `^[a-z0-9][a-z0-9_-]*$` |
|
|
218
|
+
| `displayname` | 1-100 chars |
|
|
219
|
+
| `email` | Valid email format |
|
|
220
|
+
| `password` | 8-128 chars |
|
|
221
|
+
| `groups` | Optional array of strings |
|
|
222
|
+
|
|
223
|
+
### Password Hashing
|
|
224
|
+
|
|
225
|
+
Passwords are hashed with bcrypt at cost factor 12. The `hashPassword()` function in `lib/authelia.js` handles this. Argon2id is explicitly avoided because a single hash operation consumes ~93 MB of memory, which causes OOM kills on the 512 MB target droplet.
|
|
226
|
+
|
|
227
|
+
### Authelia Reload
|
|
228
|
+
|
|
229
|
+
After every write to `users.yml`, the panel restarts Authelia:
|
|
230
|
+
|
|
231
|
+
```bash
|
|
232
|
+
sudo systemctl restart authelia
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
Authelia reads `users.yml` on restart. If the restart fails, a warning is logged but the API request still succeeds — the user data is persisted and the next Authelia restart picks it up.
|
|
236
|
+
|
|
237
|
+
## Quick Reference
|
|
238
|
+
|
|
239
|
+
| Action | Steps |
|
|
240
|
+
| ------------------- | ------------------------------------------------- |
|
|
241
|
+
| **Add user** | Users page, "Add User", fill form, "Create User" |
|
|
242
|
+
| **Edit user** | Users page, "Edit" on user, modify fields, "Save" |
|
|
243
|
+
| **Change password** | Edit user, enter new password, "Save" |
|
|
244
|
+
| **Reset TOTP** | Users page, "Reset TOTP" on user, share QR code |
|
|
245
|
+
| **Delete user** | Users page, "Delete" on user, confirm |
|
|
246
|
+
|
|
247
|
+
| Constraint | Value |
|
|
248
|
+
| ---------------- | ----------------------------------------------- |
|
|
249
|
+
| Username format | `^[a-z0-9][a-z0-9_-]*$` (users and invitations) |
|
|
250
|
+
| Username length | 2-32 characters |
|
|
251
|
+
| Password length | 8-128 characters |
|
|
252
|
+
| Password hashing | bcrypt (cost 12) |
|
|
253
|
+
| Minimum users | 1 (cannot delete last user) |
|
|
254
|
+
| TOTP algorithm | SHA1, 6 digits, 30-second period |
|
|
255
|
+
| User file | `/etc/authelia/users.yml` |
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
# Onboarding
|
|
2
|
+
|
|
3
|
+
> Walk through the onboarding wizard to configure your domain, verify DNS, and provision the full Lamaste stack.
|
|
4
|
+
|
|
5
|
+
## In Plain English
|
|
6
|
+
|
|
7
|
+
After installing Lamaste, the server is accessible only by IP address. The onboarding wizard connects your domain, verifies that DNS is pointing correctly, and starts all the services needed to run secure tunnels — Chisel for tunneling, Authelia for two-factor authentication, and Let's Encrypt for proper TLS certificates. The Chisel and Authelia programs themselves were already installed by the installer; onboarding configures and starts them. When it finishes, you have a fully operational platform.
|
|
8
|
+
|
|
9
|
+
## Prerequisites
|
|
10
|
+
|
|
11
|
+
- A completed [Lamaste installation](installation.md) with the admin panel accessible at `https://<ip>:9292`
|
|
12
|
+
- A **domain name** you control (e.g., `example.com`)
|
|
13
|
+
- Access to your domain's **DNS management** (registrar dashboard, Cloudflare, Route 53, etc.)
|
|
14
|
+
- An **email address** for Let's Encrypt certificate registration
|
|
15
|
+
|
|
16
|
+
## Step-by-Step
|
|
17
|
+
|
|
18
|
+
### 1. Open the Admin Panel
|
|
19
|
+
|
|
20
|
+
Navigate to `https://<ip>:9292` in your browser. Your browser presents the client certificate you imported during installation — select the "admin" certificate.
|
|
21
|
+
|
|
22
|
+
You see the onboarding wizard with the first step: **Configure your domain**.
|
|
23
|
+
|
|
24
|
+
### 2. Enter Domain and Email
|
|
25
|
+
|
|
26
|
+
The first step asks for two pieces of information:
|
|
27
|
+
|
|
28
|
+
| Field | Example | Purpose |
|
|
29
|
+
| ---------- | ----------------- | ----------------------------------------------- |
|
|
30
|
+
| **Domain** | `example.com` | Base domain for your Lamaste installation |
|
|
31
|
+
| **Email** | `you@example.com` | Used for Let's Encrypt certificate registration |
|
|
32
|
+
|
|
33
|
+
Enter your domain name (without `www.` or any prefix — just the base domain) and your email address, then click **Save & Continue**.
|
|
34
|
+
|
|
35
|
+
The domain must be a valid fully qualified domain name. The email is registered with Let's Encrypt and receives expiry warnings if auto-renewal fails. It must start with a letter or digit (for example `admin@example.com`) — the panel applies the same rule as the certificate tooling, so an address it accepts here never fails later at issuance.
|
|
36
|
+
|
|
37
|
+
**What happens behind the scenes:** The panel sends a `POST /api/onboarding/domain` request. The server validates the domain format and email, stores them in `/etc/lamalibre/lamaste/panel.json`, and advances the onboarding status from `FRESH` to `DOMAIN_SET`.
|
|
38
|
+
|
|
39
|
+
### 3. Configure DNS Records
|
|
40
|
+
|
|
41
|
+
The wizard now shows the DNS records you need to create at your domain registrar or DNS provider.
|
|
42
|
+
|
|
43
|
+
The wizard lists two A records:
|
|
44
|
+
|
|
45
|
+
| Type | Name | Value |
|
|
46
|
+
| ----- | --------------- | -------------- |
|
|
47
|
+
| **A** | `*.example.com` | `203.0.113.42` |
|
|
48
|
+
| **A** | `example.com` | `203.0.113.42` |
|
|
49
|
+
|
|
50
|
+
The wildcard record covers the three subdomains Lamaste itself serves (`panel.`, `auth.` and `tunnel.`) and lets it create subdomains (like `app.example.com`, `blog.example.com`) without adding individual DNS records each time. Without a wildcard, add an A record for each of `panel.example.com`, `auth.example.com` and `tunnel.example.com`.
|
|
51
|
+
|
|
52
|
+
The record for the base domain is optional. It is only needed to serve a site on `example.com` itself, so if another host serves that name today, leave it where it is — onboarding does not require it.
|
|
53
|
+
|
|
54
|
+
**How to add these records** (varies by provider):
|
|
55
|
+
|
|
56
|
+
**Cloudflare:**
|
|
57
|
+
|
|
58
|
+
1. Go to your domain's DNS settings.
|
|
59
|
+
2. Click "Add Record".
|
|
60
|
+
3. Type: A, Name: `@`, Content: your server IP, Proxy: DNS only (gray cloud).
|
|
61
|
+
4. Add another: Type: A, Name: `*`, Content: your server IP, Proxy: DNS only.
|
|
62
|
+
|
|
63
|
+
**DigitalOcean DNS:**
|
|
64
|
+
|
|
65
|
+
1. Go to Networking and select your domain.
|
|
66
|
+
2. Add an A record: Hostname `@`, Directs to: your droplet.
|
|
67
|
+
3. Add an A record: Hostname `*`, Directs to: your droplet.
|
|
68
|
+
|
|
69
|
+
**Namecheap:**
|
|
70
|
+
|
|
71
|
+
1. Go to Domain List and click Manage next to your domain.
|
|
72
|
+
2. Go to Advanced DNS.
|
|
73
|
+
3. Add: Type A Record, Host `@`, Value: your server IP.
|
|
74
|
+
4. Add: Type A Record, Host `*`, Value: your server IP.
|
|
75
|
+
|
|
76
|
+
**GoDaddy:**
|
|
77
|
+
|
|
78
|
+
1. Go to My Products and click DNS next to your domain.
|
|
79
|
+
2. Add Record: Type A, Name `@`, Value: your server IP.
|
|
80
|
+
3. Add Record: Type A, Name `*`, Value: your server IP.
|
|
81
|
+
|
|
82
|
+
DNS propagation usually takes a few minutes but can take up to 48 hours in some cases.
|
|
83
|
+
|
|
84
|
+
### 4. Verify DNS
|
|
85
|
+
|
|
86
|
+
After adding the records, click **Verify DNS** in the wizard.
|
|
87
|
+
|
|
88
|
+
The server checks:
|
|
89
|
+
|
|
90
|
+
1. **Required** — Do `panel.example.com`, `auth.example.com` and `tunnel.example.com` resolve to your server's IP? Provisioning issues certificates for exactly these names.
|
|
91
|
+
2. **Optional: wildcard** — Does `*.example.com` resolve to your server's IP?
|
|
92
|
+
3. **Optional: base domain** — Does `example.com` itself resolve to your server's IP?
|
|
93
|
+
|
|
94
|
+
**If the three required names pass:** You see a green checkmark for each and the message "DNS is correctly configured. panel, auth and tunnel resolve to your server." Click **Continue**.
|
|
95
|
+
|
|
96
|
+
**If the wildcard or the base domain does not point here:** You see a yellow warning for it and can still continue. Without a wildcard you add an A record manually for each tunnel subdomain. The base domain only has to point here once you serve a site on it.
|
|
97
|
+
|
|
98
|
+
**If a required name fails:** You see a red X next to it. The message tells you what IP the name resolves to (or that it does not resolve yet). Wait a few minutes and click **Verify DNS** again.
|
|
99
|
+
|
|
100
|
+
**If something goes wrong:** DNS propagation delays are the most common issue. Use a tool like `dig example.com` or [dnschecker.org](https://dnschecker.org) to verify your records are propagating. Some registrars cache aggressively — try clearing the DNS cache or waiting longer.
|
|
101
|
+
|
|
102
|
+
### 5. Start Provisioning
|
|
103
|
+
|
|
104
|
+
After DNS verification succeeds, click **Continue** to reach the provisioning step. Click **Start Provisioning** to begin.
|
|
105
|
+
|
|
106
|
+
The wizard displays a real-time progress view with six tasks:
|
|
107
|
+
|
|
108
|
+
**Task 1 — Starting Chisel**
|
|
109
|
+
|
|
110
|
+
Chisel is the tunneling engine. The installer already put the pinned Chisel release and its systemd unit in place; the provisioner checks the binary is there, creates the Chisel server key and the authfile, and starts the service. Chisel listens on `127.0.0.1:9090` for WebSocket connections from your machine.
|
|
111
|
+
|
|
112
|
+
**Task 2 — Configuring Authelia**
|
|
113
|
+
|
|
114
|
+
Authelia provides two-factor authentication for your tunneled apps. The installer already put the pinned Authelia release, its systemd unit and its `lamaste-authelia` service account in place; the provisioner checks the binary is there, writes the configuration file (using your domain), creates the initial admin user with a random password, and starts the service. Authelia listens on `127.0.0.1:9091`.
|
|
115
|
+
|
|
116
|
+
Onboarding downloads nothing. If either task fails with "… is not installed. Run `npx @lamalibre/create-lamaste@4.0.0` on the server to repair the installation.", re-run the installer on the server (it is idempotent) and start provisioning again.
|
|
117
|
+
|
|
118
|
+
Authelia uses **bcrypt** for password hashing (not argon2id) because argon2id uses approximately 93 MB per hash, which causes out-of-memory kills on a 512 MB droplet.
|
|
119
|
+
|
|
120
|
+
**Task 3 — Issuing TLS certificates**
|
|
121
|
+
|
|
122
|
+
The provisioner runs certbot to obtain Let's Encrypt certificates for `panel.example.com`, `auth.example.com`, and `tunnel.example.com`. It also sets up the certbot auto-renewal timer.
|
|
123
|
+
|
|
124
|
+
**Task 4 — Configuring nginx**
|
|
125
|
+
|
|
126
|
+
Three new nginx vhosts are written and enabled:
|
|
127
|
+
|
|
128
|
+
| Vhost | Domain | Purpose |
|
|
129
|
+
| ------ | -------------------- | ------------------------- |
|
|
130
|
+
| Panel | `panel.example.com` | Admin panel with mTLS |
|
|
131
|
+
| Auth | `auth.example.com` | Authelia login portal |
|
|
132
|
+
| Tunnel | `tunnel.example.com` | Chisel WebSocket endpoint |
|
|
133
|
+
|
|
134
|
+
nginx is tested with `nginx -t` and reloaded.
|
|
135
|
+
|
|
136
|
+
**Task 5 — Verifying services**
|
|
137
|
+
|
|
138
|
+
The provisioner checks that Chisel, Authelia, nginx, and the panel server are all running and healthy.
|
|
139
|
+
|
|
140
|
+
**Task 6 — Finalizing setup**
|
|
141
|
+
|
|
142
|
+
The onboarding status is set to `COMPLETED` in `panel.json`. Management routes become available and onboarding routes return `410 Gone`.
|
|
143
|
+
|
|
144
|
+
### 6. Save Your Credentials
|
|
145
|
+
|
|
146
|
+
After provisioning completes, the wizard shows the completion screen with:
|
|
147
|
+
|
|
148
|
+
- **Admin username:** `admin`
|
|
149
|
+
- **Admin password:** A randomly generated password (click the eye icon to reveal, click copy to copy)
|
|
150
|
+
- **Panel URL:** `https://panel.example.com`
|
|
151
|
+
- **Auth Portal URL:** `https://auth.example.com`
|
|
152
|
+
- **IP Access URL:** `https://203.0.113.42:9292` (always works, requires client certificate)
|
|
153
|
+
|
|
154
|
+
**Save the admin credentials immediately.** The password is generated during provisioning and is not shown again. You use these credentials to log into the Authelia portal when accessing your tunneled apps.
|
|
155
|
+
|
|
156
|
+
### 7. Set Up Two-Factor Authentication
|
|
157
|
+
|
|
158
|
+
On your first login to `auth.example.com`, Authelia prompts you to enroll in TOTP two-factor authentication:
|
|
159
|
+
|
|
160
|
+
1. Open an authenticator app (Google Authenticator, Authy, 1Password, etc.).
|
|
161
|
+
2. Scan the QR code displayed by Authelia.
|
|
162
|
+
3. Enter the 6-digit code from your authenticator to verify.
|
|
163
|
+
|
|
164
|
+
After enrollment, every login to a tunneled app requires your username, password, and a TOTP code.
|
|
165
|
+
|
|
166
|
+
### 8. Go to the Dashboard
|
|
167
|
+
|
|
168
|
+
Click **Go to Dashboard** to enter the management interface. You now have access to:
|
|
169
|
+
|
|
170
|
+
- **Dashboard** — System stats and service health
|
|
171
|
+
- **Tunnels** — Create and manage tunnels
|
|
172
|
+
- **Users** — Manage Authelia users
|
|
173
|
+
- **Certificates** — View and renew TLS certificates
|
|
174
|
+
- **Sites** — Host static websites
|
|
175
|
+
- **Services** — Start, stop, and restart services
|
|
176
|
+
|
|
177
|
+
Proceed to [Creating Your First Tunnel](first-tunnel.md) to expose your first local app.
|
|
178
|
+
|
|
179
|
+
## For Developers
|
|
180
|
+
|
|
181
|
+
### Onboarding State Machine
|
|
182
|
+
|
|
183
|
+
The onboarding follows a strict state progression stored in `panel.json`:
|
|
184
|
+
|
|
185
|
+
```
|
|
186
|
+
FRESH → DOMAIN_SET → DNS_READY → PROVISIONING → COMPLETED
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
Each transition is enforced by the API:
|
|
190
|
+
|
|
191
|
+
| Endpoint | Required State | New State |
|
|
192
|
+
| --------------------------------- | --------------------------- | ------------------------------- |
|
|
193
|
+
| `POST /api/onboarding/domain` | `FRESH` or `DOMAIN_SET` | `DOMAIN_SET` |
|
|
194
|
+
| `POST /api/onboarding/verify-dns` | `DOMAIN_SET` or `DNS_READY` | `DNS_READY` |
|
|
195
|
+
| `POST /api/onboarding/provision` | `DNS_READY` | `PROVISIONING` then `COMPLETED` |
|
|
196
|
+
|
|
197
|
+
After `COMPLETED`, all onboarding endpoints return `410 Gone`. Management endpoints return `503 Service Unavailable` before `COMPLETED`.
|
|
198
|
+
|
|
199
|
+
### Provisioning Internals
|
|
200
|
+
|
|
201
|
+
Provisioning runs asynchronously — the `POST /api/onboarding/provision` endpoint returns `202 Accepted` immediately and starts the provisioning sequence in the background. Progress is streamed to the client via a WebSocket connection at `/api/onboarding/provision/stream`.
|
|
202
|
+
|
|
203
|
+
Each provisioning task calls library functions in `packages/lamaste-serverd/src/lib/`:
|
|
204
|
+
|
|
205
|
+
| Task | Library | Key Function |
|
|
206
|
+
| ------------------ | ----------------- | ---------------------------------------------------------------- |
|
|
207
|
+
| Start Chisel | `lib/chisel.js` | `isChiselInstalled()`, `ensureChiselKey()`, `startChisel()` |
|
|
208
|
+
| Configure Authelia | `lib/authelia.js` | `isAutheliaInstalled()`, `writeAutheliaConfig()`, `createUser()` |
|
|
209
|
+
| Issue certs | `lib/certbot.js` | `issueCoreCerts()`, `setupAutoRenew()` |
|
|
210
|
+
| Configure nginx | `lib/nginx.js` | `writePanelVhost()`, `writeAuthVhost()`, `writeTunnelVhost()` |
|
|
211
|
+
|
|
212
|
+
### DNS Verification Logic
|
|
213
|
+
|
|
214
|
+
The DNS check resolves these hostnames using Node's `dns.resolve4()`:
|
|
215
|
+
|
|
216
|
+
1. `panel.example.com`, `auth.example.com`, `tunnel.example.com` — must resolve to the server IP (required; `CORE_SUBDOMAINS` in `@lamalibre/lamaste@4.0.0`)
|
|
217
|
+
2. `test-lamaste-check.example.com` — tests wildcard resolution (optional)
|
|
218
|
+
3. `example.com` — reported, not required
|
|
219
|
+
|
|
220
|
+
The test subdomain `test-lamaste-check` is chosen to be unlikely to have an explicit A record, so resolution only succeeds if a wildcard record is present.
|
|
221
|
+
|
|
222
|
+
## Quick Reference
|
|
223
|
+
|
|
224
|
+
| Step | Action | Expected Duration |
|
|
225
|
+
| --------------- | ---------------- | ----------------- |
|
|
226
|
+
| Domain + email | Enter in wizard | 30 seconds |
|
|
227
|
+
| DNS records | Add at registrar | 2-5 minutes |
|
|
228
|
+
| DNS propagation | Wait and verify | 1-30 minutes |
|
|
229
|
+
| Provisioning | Automatic | 2-5 minutes |
|
|
230
|
+
| TOTP enrollment | Scan QR code | 1 minute |
|
|
231
|
+
|
|
232
|
+
| URL | Purpose | Auth Method |
|
|
233
|
+
| --------------------------- | ----------------- | -------------------------- |
|
|
234
|
+
| `https://panel.example.com` | Admin panel | mTLS client certificate |
|
|
235
|
+
| `https://auth.example.com` | Authelia login | Username + password + TOTP |
|
|
236
|
+
| `https://203.0.113.42:9292` | IP fallback panel | mTLS client certificate |
|
|
237
|
+
|
|
238
|
+
| Onboarding Status | Meaning |
|
|
239
|
+
| ----------------- | -------------------------------- |
|
|
240
|
+
| `FRESH` | No domain configured yet |
|
|
241
|
+
| `DOMAIN_SET` | Domain saved, DNS not verified |
|
|
242
|
+
| `DNS_READY` | DNS verified, ready to provision |
|
|
243
|
+
| `PROVISIONING` | Stack installation in progress |
|
|
244
|
+
| `COMPLETED` | Fully operational |
|