release(v2.0.2): unify component docs, bump theta-directory/proxy/jump-host (#194)

Unifies the GitHub Pages docs site: the SSO/Proxy/Jump Host pages, their
nav labels, and each component's own README now consistently say Theta
Directory / Theta Proxy / Theta Gateway, drop marketing sections ("Why this
over the alternatives", "Get it", "Related projects") that don't apply to a
suite component, remove every standalone/bare-metal install path, and link
to theta42.github.io/theta-suite/... instead of the old per-repo Pages sites.

Bumps submodules: theta-directory v2.0.2, proxy v2.0.1, jump-host v2.0.1.

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-09 16:14:23 -07:00
committed by GitHub
parent 141e5e14f0
commit a917915037
37 changed files with 122 additions and 250 deletions
+22 -1
View File
@@ -5,9 +5,30 @@ follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); versions
correspond to git tags (`vX.Y.Z`). Entries here cover theta-suite's own correspond to git tags (`vX.Y.Z`). Entries here cover theta-suite's own
orchestration code; see each submodule's own `CHANGELOG.md` orchestration code; see each submodule's own `CHANGELOG.md`
([proxy](https://github.com/theta42/proxy/blob/master/CHANGELOG.md), ([proxy](https://github.com/theta42/proxy/blob/master/CHANGELOG.md),
[sso-manager-node](https://github.com/theta42/sso-manager-node/blob/master/CHANGELOG.md)) [theta-directory](https://github.com/theta42/theta-directory/blob/master/CHANGELOG.md),
[jump-host](https://github.com/theta42/jump-host/blob/master/CHANGELOG.md))
for what changed inside the apps it composes. for what changed inside the apps it composes.
## [v2.0.2] - 2026-08-09
Rolls up **theta-directory v2.0.2**, **proxy v2.0.1**, **jump-host v2.0.1**. Unifies the GitHub Pages docs site: the SSO/Proxy/Jump Host pages, their nav labels, and each component's own README now consistently say Theta Directory / Theta Proxy / Theta Gateway, drop marketing sections ("Why this over the alternatives", "Get it", "Related projects") that don't apply to a suite component, remove every standalone/bare-metal install path, and link to `theta42.github.io/theta-suite/...` instead of the old per-repo Pages sites.
### theta-directory v2.0.2
- **README rebranding & standalone-install cleanup.** Removed the "Why this over the alternatives" section and stale links to the old per-repo GitHub Pages site (`theta42.github.io/sso-manager-node/`); documentation and secrets links now point at the unified `theta42.github.io/theta-suite/` site. Made explicit that Theta Directory is deployed as part of Theta Suite and isn't installed or run on its own. Added the agent capability/install screenshots to the gallery.
- **Docs site (`docs/sso/`)**: full rewrite of the landing page — dropped "Why this over the alternatives" / "Get it" / "Related projects", refreshed all screenshots, added the two agent screenshots, and swept "SSO Manager" → "Theta Directory" across every sub-page (configuration, OAuth, LDAP, directory, agents, replication, vault, concepts-*).
### proxy v2.0.1
- Finishes the pending v2.0.0 Docker-only rewrite (README's Quick start already trimmed to one Docker Compose path via Theta Suite).
- Removed "Why this over the alternatives"; trimmed Requirements to actual Docker-host requirements (was still listing bare-metal items: root access, directly-installed OpenResty/Redis).
- Fixed stale links to the old per-repo GitHub Pages site; synced `package-lock.json`'s version (missed by the earlier 2.0.0 bump commit).
- Docs site (`docs/proxy/`): renamed to Theta Proxy, dropped the same three sections, refreshed screenshots, relative links within the unified site. Deleted a stale `docs/proxy/README.md` meta-doc left over from when this repo had its own separate Pages site (wrong live URL, referenced a deleted `installation.md`).
### jump-host v2.0.1
- Rebranded docs to Theta Gateway (matches the repo's own README/package.json naming).
- Removed the "Standalone Docker" and "Bare metal" install paths, which contradicted the Deployment section's own "exclusively via Docker Compose within Theta Suite" claim.
- Fixed stale links to the old per-repo GitHub Pages sites.
- Docs site (`docs/jump-host/`): same section removal, added a WireGuard mesh-routing feature bullet, refreshed screenshots, fixed three more stale absolute links in `architecture.md`. Deleted the same kind of stale `docs/jump-host/README.md` meta-doc.
## [v2.0.1] - 2026-08-09 ## [v2.0.1] - 2026-08-09
Rolls up **sso-manager-node v2.0.1** and **theta-agent v2.0.1**. Rolls up **sso-manager-node v2.0.1** and **theta-agent v2.0.1**.
+3 -3
View File
@@ -28,13 +28,13 @@ nav:
- title: Secrets - title: Secrets
page: /secrets.html page: /secrets.html
icon: fa-key icon: fa-key
- title: SSO Manager - title: Theta Directory
page: /sso/ page: /sso/
icon: fa-users icon: fa-users
- title: Proxy - title: Theta Proxy
page: /proxy/ page: /proxy/
icon: fa-shield-halved icon: fa-shield-halved
- title: Jump Host - title: Theta Gateway
page: /jump-host/ page: /jump-host/
icon: fa-terminal icon: fa-terminal
- title: Changelog - title: Changelog
-24
View File
@@ -1,24 +0,0 @@
# Documentation
This directory is the GitHub Pages documentation site for the Jump Host project.
**Live site:** https://theta42.github.io/jump-host/
## Pages
- `index.md` — overview and quick start
- `connecting.md` — usage: the username grammar, the TUI picker, SFTP/WinSCP
- `architecture.md` — how auth, access resolution, key injection, and bridging work
- `installation.md` — Docker, bare-metal, and theta-env install; the LDAP write-ACL
## Local preview
```bash
gem install jekyll bundler
cd docs && jekyll serve
# http://localhost:4000/jump-host/
```
## Updating
Edit the markdown, push to `master`, and GitHub Pages rebuilds automatically.
+6 -6
View File
@@ -56,8 +56,8 @@ name → IP → address hostname. A raw IP that isn't an accessible directory ho
is refused unless explicitly allowed. is refused unless explicitly allowed.
> The directory auto-creates `<slug>_access` / `<slug>_admin` groups for every > The directory auto-creates `<slug>_access` / `<slug>_admin` groups for every
> host and service (see the SSO's > host and service (see Theta Directory's
> [Directory & Inventory](https://theta42.github.io/sso-manager-node/directory.html) > [Directory & Inventory](../sso/directory.html)
> docs), which is exactly what this authorization reads. > docs), which is exactly what this authorization reads.
## 3. Upstream Authentication (PKI or LDAP Keys) {#upstream-authentication} ## 3. Upstream Authentication (PKI or LDAP Keys) {#upstream-authentication}
@@ -96,7 +96,7 @@ Byte counts per direction are tallied cheaply for the audit record.
## Web UI, API & audit ## Web UI, API & audit
An Express + EJS + Bootstrap app on `:3002` — the same front-end stack and An Express + EJS + Bootstrap app on `:3002` — the same front-end stack and
look/feel as the SSO Manager and Proxy. Login is OIDC against the SSO plus a look/feel as Theta Directory and Theta Proxy. Login is OIDC against the SSO plus a
local anti-lockout admin (`auth.adminUsers`), with admin access gated by local anti-lockout admin (`auth.adminUsers`), with admin access gated by
`auth.adminGroups`. It exposes: `auth.adminGroups`. It exposes:
@@ -111,12 +111,12 @@ success + failure reason, downstream host-key fingerprint, timing, and bytes in/
## Where it sits in the stack ## Where it sits in the stack
- **[SSO Manager](https://theta42.github.io/sso-manager-node/)** — provides the - **[Theta Directory](../sso/)** — provides the
OpenLDAP directory (users, groups, `sshPublicKey`) and the inventory API this OpenLDAP directory (users, groups, `sshPublicKey`) and the inventory API this
jump host reads. jump host reads.
- **[ldap-client](https://github.com/theta42/ldap-client)** — enrolls the - **[ldap-client](https://github.com/theta42/ldap-client)** — enrolls the
downstream Linux hosts (SSSD/PAM + `AuthorizedKeysCommand`) that the jump host downstream Linux hosts (SSSD/PAM + `AuthorizedKeysCommand`) that the jump host
connects into. connects into.
- **[Proxy](https://theta42.github.io/proxy/)** — fronts the jump host's web UI - **[Theta Proxy](../proxy/)** — fronts the jump host's web UI
under TLS. under TLS.
- **[theta-env](https://theta42.github.io/theta-env/)** — wires it all together. - **theta-suite** — wires it all together.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 90 KiB

After

Width:  |  Height:  |  Size: 123 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 83 KiB

After

Width:  |  Height:  |  Size: 177 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 78 KiB

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 72 KiB

After

Width:  |  Height:  |  Size: 72 KiB

+23 -48
View File
@@ -1,25 +1,24 @@
--- ---
layout: default layout: default
title: Home title: Home
description: An SSH jump host for the theta42 stack — one public host and directory-driven access to every downstream machine you're entitled to. description: Theta Gateway — an SSH jump host for theta-suite, giving directory-driven access to every downstream machine you're entitled to from one public host.
--- ---
# Jump Host # Theta Gateway
An SSH jump host for the [theta42](https://github.com/theta42) self-hosted The SSH jump host component of [theta-suite](../). Users SSH into **one**
stack. Users SSH into **one** public host and land on any downstream host public host and land on any downstream host they're entitled to —
they're entitled to — authenticated against the shared LDAP directory, authenticated against the shared LDAP directory, authorized from
authorized from the [SSO Manager](https://theta42.github.io/sso-manager-node/)'s [Theta Directory](../sso/)'s inventory graph, and audited end to end.
inventory graph, and audited end to end.
No per-host accounts, no distributing keys, no VPN. The same people who log in No per-host accounts, no distributing keys, no VPN. The same people who log in
to your SSO are the people who can reach your machines — and only the machines to Theta Directory are the people who can reach your machines — and only the
their directory groups grant. machines their directory groups grant.
Part of the theta42 self-hosted identity stack, alongside Theta Gateway is deployed as part of theta-suite, alongside
[SSO Manager](https://theta42.github.io/sso-manager-node/) and [Theta Directory](../sso/) and [Theta Proxy](../proxy/) — it isn't installed
[Proxy](https://theta42.github.io/proxy/), composable with one command via or run on its own. See the [Quickstart](../quickstart.html) to stand up the
[theta-env](https://theta42.github.io/theta-env/). whole stack with one command.
## Screenshots ## Screenshots
@@ -30,8 +29,6 @@ Part of the theta42 self-hosted identity stack, alongside
*(click any screenshot to view full size)* *(click any screenshot to view full size)*
## Two ways to connect ## Two ways to connect
**Direct (WinSCP/SFTP-friendly):** **Direct (WinSCP/SFTP-friendly):**
@@ -63,17 +60,18 @@ through a single audited entry point. What's usually painful is *authorization*
and *credentials*: who may reach which host, and how the bastion authenticates and *credentials*: who may reach which host, and how the bastion authenticates
onward without you copying keys everywhere. onward without you copying keys everywhere.
This jump host answers both from your directory: Theta Gateway answers both from your directory:
- **Authorization is your directory graph.** The hosts you can reach are the - **Authorization is your directory graph.** The hosts you can reach are the
union of your LDAP groups × the SSO's inventory (the `host_<name>_access` union of your LDAP groups × Theta Directory's inventory (the
groups the directory already auto-creates). Add someone to a group; they can `host_<name>_access` groups the directory already auto-creates). Add
reach the host. No bastion-side allow-list to maintain. someone to a group; they can reach the host. No bastion-side allow-list to
- **Onward auth is automatic.** The jump host holds one key and injects its maintain.
- **Onward auth is automatic.** Theta Gateway holds one key and injects its
public half into your `sshPublicKey` on first use, then connects downstream public half into your `sshPublicKey` on first use, then connects downstream
**as you**. Downstream hosts already serve keys from LDAP (via **as you**. Downstream hosts already serve keys from LDAP (via
[ldap-client](https://github.com/theta42/ldap-client)'s ldap-client's `AuthorizedKeysCommand`), so nothing downstream needs
`AuthorizedKeysCommand`), so nothing downstream needs configuring. configuring.
## Features ## Features
@@ -82,35 +80,12 @@ This jump host answers both from your directory:
- **Interactive TUI host picker** on plain login, scoped to your access - **Interactive TUI host picker** on plain login, scoped to your access
- **LDAP inbound auth** — public key or password (keys-only policy recommended - **LDAP inbound auth** — public key or password (keys-only policy recommended
for a public host) for a public host)
- **Directory-driven access** — reachable hosts come from the SSO inventory, not - **Directory-driven access** — reachable hosts come from the Theta Directory
a static list inventory, not a static list
- **Per-user key injection** — no downstream changes, no key distribution - **Per-user key injection** — no downstream changes, no key distribution
- **Shell, exec, and SFTP** bridging - **Shell, exec, and SFTP** bridging
- **WireGuard mesh routing** — cross-site network access alongside SSH
- **Web UI + HTTP API** for auditing and metrics — active sessions, a searchable - **Web UI + HTTP API** for auditing and metrics — active sessions, a searchable
audit log, per-user/per-host counters audit log, per-user/per-host counters
- **Full audit trail** — who, target, method, result, bytes, duration, and the - **Full audit trail** — who, target, method, result, bytes, duration, and the
downstream host-key fingerprint downstream host-key fingerprint
- Packaged like the rest of the stack: one-command Docker, idempotent bare-metal
installer, or bundled in theta-env
## Get it
```bash
git clone https://github.com/theta42/jump-host.git
cd jump-host
cp secrets.js.example config/jump-secrets.js # then edit it
docker compose up -d --build
```
For bare-metal and the bundled theta-env
option, see **[Installation](installation.html)**.
## Related projects
- **[SSO Manager](https://theta42.github.io/sso-manager-node/)** — the OpenLDAP
directory + OIDC provider + the inventory graph this jump host reads.
- **[Proxy](https://theta42.github.io/proxy/)** — puts your web apps behind the
same identity; fronts this jump host's web UI.
- **[theta-env](https://theta42.github.io/theta-env/)** — runs the whole stack,
jump host included, with one command.
-39
View File
@@ -1,39 +0,0 @@
# Documentation
This directory contains the GitHub Pages documentation site for the Proxy project.
**Live site:** https://theta42.github.io/proxy/
## Pages
- `index.md` - Home page with project overview
- `installation.md` - Installation and setup guide
- `api.md` - Complete API reference
- `architecture.md` - System architecture and design
- `contributing.md` - Development and contribution guide
## Local Preview
To preview the site locally:
```bash
# Install Jekyll (one-time setup)
gem install jekyll bundler
# Run local server
cd docs
jekyll serve
# View at http://localhost:4000/proxy/
```
## Theme
The site uses the Cayman theme (`jekyll-theme-cayman`). Configuration is in `_config.yml`.
## Updating Documentation
1. Edit markdown files in this directory
2. Commit and push to master branch
3. GitHub Pages automatically rebuilds (may take 1-2 minutes)
4. Changes visible at https://theta42.github.io/proxy/
+1 -1
View File
@@ -22,7 +22,7 @@ There are two ways someone gets into the proxy's own management UI:
- **A local account**, created on the **Users** page — a username and - **A local account**, created on the **Users** page — a username and
password specific to this app. password specific to this app.
- **Single sign-on**, if you've connected this proxy to an SSO Manager (or - **Single sign-on**, if you've connected this proxy to Theta Directory (or
another OIDC provider) — the same login your other connected apps use. another OIDC provider) — the same login your other connected apps use.
Either way, once logged in, what they're actually *allowed to do* here is Either way, once logged in, what they're actually *allowed to do* here is
Binary file not shown.

Before

Width:  |  Height:  |  Size: 328 KiB

After

Width:  |  Height:  |  Size: 345 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 326 KiB

After

Width:  |  Height:  |  Size: 376 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 310 KiB

After

Width:  |  Height:  |  Size: 506 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 428 KiB

After

Width:  |  Height:  |  Size: 440 KiB

+15 -42
View File
@@ -1,24 +1,24 @@
--- ---
layout: default layout: default
title: Home title: Home
description: A reverse proxy and HTTPS termination service built on OpenResty/nginx, with automatic Let's Encrypt certs, OIDC login, and direct LDAP access control per host. description: Theta Proxy — a reverse proxy and HTTPS termination service built on OpenResty/nginx, with automatic Let's Encrypt certs, OIDC login, and direct LDAP access control per host.
--- ---
# Proxy # Theta Proxy
A reverse proxy and HTTPS termination service built on OpenResty/nginx, with a The reverse proxy and HTTPS termination component of [theta-suite](../), built
management API and web GUI. It puts any of your apps behind single sign-on on OpenResty/nginx. It puts any of your apps behind single sign-on (OIDC) and
(OIDC) and can also look users up directly in LDAP — so the same people who can also look users up directly in LDAP — so the same people who log in to
log in to your SSO are the people allowed to reach your proxied apps. [Theta Directory](../sso/) are the people allowed to reach your proxied apps.
Automatic HTTPS from Let's Encrypt (including wildcards), routing by hostname, Automatic HTTPS from Let's Encrypt (including wildcards), routing by hostname,
and per-host access control tied to your identity provider — managed from a and per-host access control tied to your identity provider — managed from a
web UI or a REST API, with no downtime on config changes. web UI or a REST API, with no downtime on config changes.
Part of the theta42 self-hosted identity stack, alongside Theta Proxy is deployed as part of theta-suite, alongside
[SSO Manager](https://theta42.github.io/sso-manager-node/) and [Theta Directory](../sso/) and [Theta Gateway](../jump-host/) — it isn't
[theta-env](https://theta42.github.io/theta-env/) (the two composed with one installed or run on its own. See the [Quickstart](../quickstart.html) to stand
command). up the whole stack with one command.
## Screenshots ## Screenshots
@@ -30,49 +30,22 @@ management once basic auth is enabled:
<a href="images/host-auth-basic.png" target="_blank"><img src="images/host-auth-basic.png" alt="Per-host basic auth" width="60%"></a> <a href="images/host-auth-basic.png" target="_blank"><img src="images/host-auth-basic.png" alt="Per-host basic auth" width="60%"></a>
Multiple backend targets per host, load balanced round-robin:
<a href="images/load-balancing.png" target="_blank"><img src="images/load-balancing.png" alt="Load balancing" width="60%"></a>
*(click any screenshot to view full size)* *(click any screenshot to view full size)*
## Why this over the alternatives
Nginx Proxy Manager, Traefik, and Caddy are all good reverse proxies with
auto-HTTPS. This one is built around identity: it is both an **OIDC client**
of an SSO provider (for browser login) **and** a direct **LDAP client** (for
user lookups and per-host access control), so access decisions come from your
real user directory, not a static allow-list or a separate auth proxy bolted
on top. The trade-off is that it expects an OIDC/LDAP identity source to point
at — it is not an auth server on its own. Pair it with
[SSO Manager](https://theta42.github.io/sso-manager-node/) (bundled OpenLDAP +
OIDC) for a self-hosted SSO + proxy stack, or point it at any OIDC provider +
LDAP directory you already run.
## Features ## Features
- Automated HTTPS via Let's Encrypt — HTTP-01 and DNS-01 (wildcard) challenges - Automated HTTPS via Let's Encrypt — HTTP-01 and DNS-01 (wildcard) challenges
- Multiple DNS providers (Cloudflare, DigitalOcean, PorkBun, DuckDNS — free) - Multiple DNS providers (Cloudflare, DigitalOcean, PorkBun, DuckDNS — free)
- Dynamic host routing with wildcard domain matching (`*`, `**`) - Dynamic host routing with wildcard domain matching (`*`, `**`)
- **Multi-target load balancing** — configure multiple backend targets per host with built-in round-robin load balancing - **Multi-target load balancing** — configure multiple backend targets per host with built-in round-robin load balancing
- **OIDC login** and **direct LDAP lookups**, independently of each other - **OIDC login** and **direct LDAP lookups**, independently of each other, against [Theta Directory](../sso/)
- Per-host **basic auth** as an alternative to SSO (mutually exclusive, so - Per-host **basic auth** as an alternative to SSO (mutually exclusive, so
it's never ambiguous which one gated a request) it's never ambiguous which one gated a request)
- **Role-based access control** — global admins, local groups, and - **Role-based access control** — global admins, local groups, and
per-domain permissions (viewer/manager) per-domain permissions (viewer/manager)
- Self-service API tokens for scripting/CI without a browser session - Self-service API tokens for scripting/CI without a browser session
- Web UI and a full REST API - Web UI and a full REST API
## Get it
```bash
git clone https://github.com/theta42/proxy.git
cd proxy && docker compose up -d --build
```
For the full set of install options (Docker, bare-metal, or as part of the combined
SSO + proxy stack), configuration reference, and API docs, see the
**[GitHub repository](https://github.com/theta42/proxy)**.
## Related projects
- **[SSO Manager](https://theta42.github.io/sso-manager-node/)** — the OIDC
provider + LDAP directory this proxy is designed to sit in front of.
- **[theta-env](https://theta42.github.io/theta-env/)** — runs this proxy and
SSO Manager together with one command.
+1 -1
View File
@@ -6,7 +6,7 @@ nav_order: 5
# Discovery Agents # Discovery Agents
The SSO Manager supports a robust agent architecture for auto-discovering devices, hosts, and services across your home lab or data center. Agents run on a scheduled cron and feed their data into a central **Reconciliation Engine** that smartly merges information based on MAC addresses and IPs. Theta Directory supports a robust agent architecture for auto-discovering devices, hosts, and services across your home lab or data center. Agents run on a scheduled cron and feed their data into a central **Reconciliation Engine** that smartly merges information based on MAC addresses and IPs.
## Writing a Custom Agent ## Writing a Custom Agent
+2 -2
View File
@@ -1,7 +1,7 @@
--- ---
layout: default layout: default
title: Accounts, Groups & Managers title: Accounts, Groups & Managers
description: A plain-language guide to users, service accounts, personal groups, and managers in SSO Manager. description: A plain-language guide to users, service accounts, personal groups, and managers in Theta Directory.
--- ---
# Accounts, Groups & Managers # Accounts, Groups & Managers
@@ -12,7 +12,7 @@ see the [LDAP reference](ldap.html).
## What's an account? ## What's an account?
Every person (or app) that can sign in through this SSO Manager has an Every person (or app) that can sign in through Theta Directory has an
**account** — a username, a display name, maybe an email address, and a **account** — a username, a display name, maybe an email address, and a
password (or, for service accounts, no password at all — see below). password (or, for service accounts, no password at all — see below).
Accounts live in the directory this app manages, and any other app you've Accounts live in the directory this app manages, and any other app you've
+1 -1
View File
@@ -1,7 +1,7 @@
--- ---
layout: default layout: default
title: API Tokens title: API Tokens
description: A plain-language guide to personal access tokens in SSO Manager. description: A plain-language guide to personal access tokens in Theta Directory.
--- ---
# API Tokens # API Tokens
+7 -7
View File
@@ -1,20 +1,20 @@
--- ---
layout: default layout: default
title: Connecting Apps (Single Sign-On) title: Connecting Apps (Single Sign-On)
description: A plain-language guide to OAuth/OIDC clients and single sign-on in SSO Manager. description: A plain-language guide to OAuth/OIDC clients and single sign-on in Theta Directory.
--- ---
# Connecting Apps (Single Sign-On) # Connecting Apps (Single Sign-On)
This page explains, in plain language, what happens when you "connect" an This page explains, in plain language, what happens when you "connect" an
app to your SSO Manager so people can log into it with their existing app to Theta Directory so people can log into it with their existing
account. For the technical endpoint/token detail, see the account. For the technical endpoint/token detail, see the
[OAuth reference](oauth.html). [OAuth reference](oauth.html).
## What does "single sign-on" actually mean? ## What does "single sign-on" actually mean?
Instead of every app you run having its own separate list of usernames and Instead of every app you run having its own separate list of usernames and
passwords, they all check with this SSO Manager instead. You log in once, passwords, they all check with Theta Directory instead. You log in once,
here, and any connected app trusts that login — no separate password to here, and any connected app trusts that login — no separate password to
remember or manage for each one. If you ever need to lock someone out remember or manage for each one. If you ever need to lock someone out
everywhere at once, you do it in one place (deactivate their account here) everywhere at once, you do it in one place (deactivate their account here)
@@ -33,11 +33,11 @@ gives you a **Client ID** and **Client Secret**: think of these like a
username and password, but for the *app itself* rather than for a person. username and password, but for the *app itself* rather than for a person.
You paste them into the other app's own "Single Sign-On" or "OIDC" setup You paste them into the other app's own "Single Sign-On" or "OIDC" setup
screen, along with the discovery URL shown at the top of this page, and screen, along with the discovery URL shown at the top of this page, and
that app is now able to ask this SSO Manager to authenticate people on its that app is now able to ask Theta Directory to authenticate people on its
behalf. behalf.
**Treat the Client Secret like a password** — anyone who has it can **Treat the Client Secret like a password** — anyone who has it can
impersonate that app when talking to your SSO Manager. If you ever suspect impersonate that app when talking to Theta Directory. If you ever suspect
it's leaked, rotate it from the client's card. it's leaked, rotate it from the client's card.
## What are "scopes"? ## What are "scopes"?
@@ -50,13 +50,13 @@ setup instructions; when in doubt, the default set (`openid`, `profile`,
## "Restrict to Groups" ## "Restrict to Groups"
By default, *any* account with an SSO Manager login can sign into a By default, *any* account with a Theta Directory login can sign into a
connected app. If that's not what you want — say, a home automation connected app. If that's not what you want — say, a home automation
dashboard that only certain family members should reach — set **Restrict dashboard that only certain family members should reach — set **Restrict
to Groups** on that client to one of your [groups](concepts-accounts.html). to Groups** on that client to one of your [groups](concepts-accounts.html).
Only members of that group will be allowed to log into that particular Only members of that group will be allowed to log into that particular
app; everyone else gets turned away at the login step, even though their app; everyone else gets turned away at the login step, even though their
SSO Manager account still works everywhere else. Theta Directory account still works everywhere else.
## Redirect URIs ## Redirect URIs
+1 -1
View File
@@ -1,7 +1,7 @@
--- ---
layout: default layout: default
title: Configuration title: Configuration
description: SSO Manager's config layers — conf/base.js defaults, secrets.js overrides, and app_* environment variables. description: Theta Directory's config layers — conf/base.js defaults, secrets.js overrides, and app_* environment variables.
--- ---
# Configuration # Configuration
+5 -5
View File
@@ -6,7 +6,7 @@ description: Managing your Home-Lab infrastructure, services, and LDAP access re
# Directory Management # Directory Management
The SSO Manager ships with a built-in **Directory & Inventory Management** feature. Instead of just managing bare LDAP groups for your homelab, the Directory allows you to map out your infrastructure graph and assign rich metadata to your services. Theta Directory ships with a built-in **Directory & Inventory Management** feature. Instead of just managing bare LDAP groups for your homelab, the Directory allows you to map out your infrastructure graph and assign rich metadata to your services.
## Architecture ## Architecture
@@ -18,11 +18,11 @@ There are three primary **Kinds** of resources you can define:
- **Service (App)**: An application, web service. A Service **must** have a parent Host or another Service. - **Service (App)**: An application, web service. A Service **must** have a parent Host or another Service.
- **OAuth Integration**: An OAuth 2.0 / OpenID Connect client application. An OAuth integration **must** have a parent Service. - **OAuth Integration**: An OAuth 2.0 / OpenID Connect client application. An OAuth integration **must** have a parent Service.
By defining this hierarchy, the SSO Manager builds a queryable graph of your infrastructure. By defining this hierarchy, Theta Directory builds a queryable graph of your infrastructure.
## Automatic LDAP Group Creation ## Automatic LDAP Group Creation
When you create a new **Host** or **Service** in the Directory via the web UI (or API), the SSO Manager will automatically provision two LDAP groups in your directory to govern access to that resource: When you create a new **Host** or **Service** in the Directory via the web UI (or API), Theta Directory will automatically provision two LDAP groups in your directory to govern access to that resource:
1. `<slug>_access` (Member level access) 1. `<slug>_access` (Member level access)
2. `<slug>_admin` (Owner level access) 2. `<slug>_admin` (Owner level access)
@@ -84,7 +84,7 @@ The Directory Management interface provides a **Tree View** toggle that visually
## Slug conventions ## Slug conventions
Slugs are the stable identifiers automation keys off, so the tooling around the SSO Manager follows a shared convention: Slugs are the stable identifiers automation keys off, so the tooling around Theta Directory follows a shared convention:
- **Sites**: `site_<name>` — e.g. `site_local`, `site_us-east` - **Sites**: `site_<name>` — e.g. `site_local`, `site_us-east`
- **Hosts**: `host_<hostname>` — e.g. `host_pve1`, `host_web01` - **Hosts**: `host_<hostname>` — e.g. `host_pve1`, `host_web01`
@@ -102,7 +102,7 @@ You don't have to build the graph by hand — the theta42 tooling registers itse
- a **site** (name from `CFG_SITE_NAME` in `setup.env`, default `local` → slug `site_local`) marked as the current site - a **site** (name from `CFG_SITE_NAME` in `setup.env`, default `local` → slug `site_local`) marked as the current site
- the **host** the stack runs on (`host_<hostname>`), with IP, MAC address, OS, and kernel collected from the machine - the **host** the stack runs on (`host_<hostname>`), with IP, MAC address, OS, and kernel collected from the machine
- the **services** it composes — SSO Manager, Proxy (management UI), OpenLDAP Directory (the LDAPS endpoint Linux hosts and LDAP-native apps bind to), and OpenResty Edge (the 80/443 data plane) — each with its address, internal port, and git repo - the **services** it composes — Theta Directory, Proxy (management UI), OpenLDAP Directory (the LDAPS endpoint Linux hosts and LDAP-native apps bind to), and OpenResty Edge (the 80/443 data plane) — each with its address, internal port, and git repo
- the proxy's auto-registered **OAuth client**, linked under its service - the proxy's auto-registered **OAuth client**, linked under its service
The seed is idempotent and non-destructive: a resource whose slug already exists is considered operator-owned — the seed only fills in metadata fields you haven't set, and never overwrites your values. The seed is idempotent and non-destructive: a resource whose slug already exists is considered operator-owned — the seed only fills in metadata fields you haven't set, and never overwrites your values.
Binary file not shown.

After

Width:  |  Height:  |  Size: 401 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 430 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 141 KiB

After

Width:  |  Height:  |  Size: 332 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 392 KiB

After

Width:  |  Height:  |  Size: 503 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 430 KiB

After

Width:  |  Height:  |  Size: 119 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 313 KiB

After

Width:  |  Height:  |  Size: 358 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 221 KiB

After

Width:  |  Height:  |  Size: 320 KiB

+18 -52
View File
@@ -1,24 +1,25 @@
--- ---
layout: default layout: default
title: Home title: Home
description: A self-hosted OpenID Connect provider with a bundled OpenLDAP directory and a web management UI. One login for your modern apps, one LDAP directory for the rest, no phone-home. description: Theta Directory — the OpenID Connect provider, bundled OpenLDAP directory, and resource inventory at the core of theta-suite. One login for your modern apps, one LDAP directory for the rest, no phone-home.
--- ---
# SSO Manager # Theta Directory
A self-hosted **OpenID Connect provider** with a bundled **OpenLDAP directory** The identity and directory component of [theta-suite](../): an **OpenID
and a web management UI — for home labs and small businesses that want their Connect provider**, a bundled **OpenLDAP directory**, and a **resource
own identity provider instead of a hosted one. inventory & IAM engine**, all behind one web console.
One place to manage your users and groups, one login (OIDC) your modern apps One place to manage your users and groups, one login (OIDC) your modern apps
can use, and one LDAP directory your older or odder apps can bind to directly. can use, and one LDAP directory your older or odder apps can bind to directly
Everything runs on your own hardware; no phone-home, no hosted control plane, — plus a graph of every site, host, and service you run, with auto-provisioned
no per-user pricing. access groups. Everything runs on your own hardware; no phone-home, no hosted
control plane, no per-user pricing.
Part of the theta42 self-hosted identity stack, alongside Theta Directory is deployed as part of theta-suite, alongside
[Proxy](https://theta42.github.io/proxy/) (an OIDC + LDAP-aware reverse proxy) [Proxy](../proxy/) and [Jump Host](../jump-host/) — it isn't installed or run
and [theta-env](https://theta42.github.io/theta-env/) (the two composed with on its own. See the [Quickstart](../quickstart.html) to stand up the whole
one command). stack with one command.
## Screenshots ## Screenshots
@@ -27,23 +28,11 @@ one command).
<a href="images/groups.png" target="_blank"><img src="images/groups.png" alt="Groups" width="49%"></a> <a href="images/groups.png" target="_blank"><img src="images/groups.png" alt="Groups" width="49%"></a>
<a href="images/directory.png" target="_blank"><img src="images/directory.png" alt="Directory & inventory" width="49%"></a> <a href="images/directory.png" target="_blank"><img src="images/directory.png" alt="Directory & inventory" width="49%"></a>
<a href="images/oauth-clients.png" target="_blank"><img src="images/oauth-clients.png" alt="OAuth client (edit view)" width="49%"></a> <a href="images/oauth-clients.png" target="_blank"><img src="images/oauth-clients.png" alt="OAuth client (edit view)" width="49%"></a>
<a href="images/agent-capabilities-metrics.png" target="_blank"><img src="images/agent-capabilities-metrics.png" alt="Agent capabilities & metrics" width="49%"></a>
<a href="images/agent-install-join-key.png" target="_blank"><img src="images/agent-install-join-key.png" alt="Agent install with join key" width="49%"></a>
*(click any screenshot to view full size)* *(click any screenshot to view full size)*
## Why this over the alternatives
Tools like Keycloak, Authentik, Authelia, or Zitadel are OIDC providers, but
LDAP is either a paid feature, a federation target you have to run
separately, or absent. If your stack already has apps that speak LDAP
directly — or you just want one real directory as the source of truth — you
end up running *two* identity systems and keeping them in sync.
SSO Manager bundles the OpenLDAP directory with the OIDC provider, so OIDC
apps and LDAP apps read from the same users and groups. The trade-off is
scope: it's intentionally small and self-hosted, not an enterprise IAM suite.
If you want a lightweight, self-contained identity provider with a real LDAP
backend, that's the niche.
## Features ## Features
- **OpenID Connect / OAuth 2.0 provider** — your own access/refresh/ID - **OpenID Connect / OAuth 2.0 provider** — your own access/refresh/ID
@@ -56,30 +45,7 @@ backend, that's the niche.
- **Direct LDAP binds** — anything that binds LDAP directly (Linux hosts - **Direct LDAP binds** — anything that binds LDAP directly (Linux hosts
via PAM/SSSD, Gitea, Emby, …) uses LDAPS/StartTLS against the same via PAM/SSSD, Gitea, Emby, …) uses LDAPS/StartTLS against the same
directory. directory.
- **All-in-one Docker image** — app + OpenLDAP + Redis in one container, or
run the pieces separately via `app_*` env config.
- **Geo-Location Scaling** — built-in support for N-Way Multi-Master OpenLDAP [replication](replication.html) across physical sites. - **Geo-Location Scaling** — built-in support for N-Way Multi-Master OpenLDAP [replication](replication.html) across physical sites.
- **[Directory & Inventory](directory.html)** — map sites, hosts, and services as a graph with rich metadata (IP/MAC, OS/kernel, ports, git repos), auto-provisioned access groups, and automatic registration from theta-env and ldap-client. Drives directory-aware tools like the [SSH jump host](https://theta42.github.io/jump-host/). - **[Directory & Inventory](directory.html)** — map sites, hosts, and services as a graph with rich metadata (IP/MAC, OS/kernel, ports, git repos), auto-provisioned access groups, and automatic registration from theta-suite's agents and discovery plugins. Drives directory-aware tools like the [SSH jump host](../jump-host/).
- **Subtype metrics & lifecycle drivers** — telemetry, log streaming, and remote control for resources tagged with a `subType` (`systemd`, `docker`, `proxmox`, `wireguard`, `postgresql`, `redis`, `k8s`, …).
## Get it - **OpenBao-backed secrets** — per-resource and per-user secrets with explicit upward inheritance (`Resource → Host → Cluster → Site`).
```bash
git clone https://github.com/theta42/sso-manager-node.git
cd sso-manager-node
cp secrets.js.example nodejs/conf/secrets.js # edit it, or use app_* env
docker compose up -d --build
```
For the full set of install options
(Docker, bare-metal, or as part of the combined SSO + proxy stack), the
`app_*` env reference, and the OAuth/LDAP internals, see the
**[GitHub repository](https://github.com/theta42/sso-manager-node)**.
## Related projects
- **[Proxy](https://theta42.github.io/proxy/)** — an OIDC + LDAP-aware
reverse proxy, designed to sit in front of this SSO.
- **[Jump Host](https://theta42.github.io/jump-host/)** — an SSH jump host that
uses this SSO's directory to decide who may reach which machine.
- **[theta-env](https://theta42.github.io/theta-env/)** — runs this SSO
Manager and the proxy together with one command.
+4 -4
View File
@@ -1,7 +1,7 @@
--- ---
layout: default layout: default
title: LDAP title: LDAP
description: SSO Manager's bundled OpenLDAP directory — schema, service accounts, TLS, and connecting third-party apps directly. description: Theta Directory's bundled OpenLDAP directory — schema, service accounts, TLS, and connecting third-party apps directly.
--- ---
# LDAP Directory # LDAP Directory
@@ -12,7 +12,7 @@ description: SSO Manager's bundled OpenLDAP directory — schema, service accoun
> instead of schema/attribute detail? See > instead of schema/attribute detail? See
> [Accounts, Groups & Managers](concepts-accounts.html). > [Accounts, Groups & Managers](concepts-accounts.html).
SSO Manager runs an OpenLDAP directory holding your users and groups. The app Theta Directory runs an OpenLDAP directory holding your users and groups. The app
authenticates against it over `localhost:389` (inside the all-in-one container) authenticates against it over `localhost:389` (inside the all-in-one container)
and exposes **LDAPS** (`ldaps://…:636`, TLS) for anything that binds LDAP and exposes **LDAPS** (`ldaps://…:636`, TLS) for anything that binds LDAP
directly — Linux hosts (PAM/SSSD, sudo rules, SSH keys), Gitea, Emby, the directly — Linux hosts (PAM/SSSD, sudo rules, SSH keys), Gitea, Emby, the
@@ -167,8 +167,8 @@ internal-only patterns and set `conf.ldap.ldapsHost` (or
### 1. Same Docker / local network host (best for apps on this machine) ### 1. Same Docker / local network host (best for apps on this machine)
If the LDAP client runs on the same Docker network as the SSO Manager (for If the LDAP client runs on the same Docker network as Theta Directory (for
example, the bundled `theta-env` stack), use the internal service name: example, the bundled `theta-suite` stack), use the internal service name:
``` ```
ldaps://sso-manager:636 ldaps://sso-manager:636
+2 -2
View File
@@ -1,7 +1,7 @@
--- ---
layout: default layout: default
title: OAuth / OIDC title: OAuth / OIDC
description: SSO Manager's OpenID Connect / OAuth 2.0 provider — discovery document, client registration, and token endpoints. description: Theta Directory's OpenID Connect / OAuth 2.0 provider — discovery document, client registration, and token endpoints.
--- ---
# OAuth 2.0 / OpenID Connect # OAuth 2.0 / OpenID Connect
@@ -12,7 +12,7 @@ description: SSO Manager's OpenID Connect / OAuth 2.0 provider — discovery doc
> of endpoint-level detail? See > of endpoint-level detail? See
> [Connecting Apps (Single Sign-On)](concepts-oauth-apps.html). > [Connecting Apps (Single Sign-On)](concepts-oauth-apps.html).
SSO Manager is an **OpenID Connect / OAuth 2.0 provider**: it issues its own Theta Directory is an **OpenID Connect / OAuth 2.0 provider**: it issues its own
access, refresh, and ID tokens that your apps can consume to authenticate access, refresh, and ID tokens that your apps can consume to authenticate
users and authorize API calls. It also runs a full OpenLDAP directory, so it users and authorize API calls. It also runs a full OpenLDAP directory, so it
can be both your SSO and your user directory at once. can be both your SSO and your user directory at once.
+1 -1
View File
@@ -5,7 +5,7 @@ title: Geo-Location Scaling (Replication)
# Geo-Location Scaling (Replication) # Geo-Location Scaling (Replication)
SSO Manager is built to be a self-contained identity provider, but if you have multiple physical sites, you may want a local copy of the directory at each site to ensure low latency and high availability. Theta Directory bundles its own identity provider, but if you have multiple physical sites, you may want a local copy of the directory at each site to ensure low latency and high availability.
## Why and when to use this? ## Why and when to use this?
- **High Availability (HA)**: If your primary site goes completely offline, your other sites can still authenticate users locally without depending on a WAN link. - **High Availability (HA)**: If your primary site goes completely offline, your other sites can still authenticate users locally without depending on a WAN link.
+7 -7
View File
@@ -6,9 +6,9 @@ nav_order: 6
# Secrets Vault # Secrets Vault
SSO Manager integrates natively with **OpenBao** (a Vault fork) to securely manage and store sensitive data, configuration, and API keys. Theta Directory integrates natively with **OpenBao** (a Vault fork) to securely manage and store sensitive data, configuration, and API keys.
The Vault proxy endpoint is exposed directly through SSO Manager at `/api/vault/v1/`, which safely authenticates and authorizes requests before forwarding them to the internal OpenBao container. The Vault proxy endpoint is exposed directly through Theta Directory at `/api/vault/v1/`, which safely authenticates and authorizes requests before forwarding them to the internal OpenBao container.
## Architecture ## Architecture
@@ -18,10 +18,10 @@ When the environment is initialized via `setup.sh`, OpenBao is automatically uns
## Accessing the Vault ## Accessing the Vault
The SSO Manager Vault can be accessed in two ways: The Theta Directory Vault can be accessed in two ways:
1. **Via the SSO Manager UI**: Go to the **Admin Configuration** page (`/conf`) to edit the application's configuration secrets directly. SMTP and OAuth settings are edited through structured form fields (not a raw JSON blob) and saved to OpenBao at `secret/sso-manager/conf` at runtime, taking effect immediately. Secret fields — the SMTP password and the OAuth JWT secret — are returned masked (`********`); leave the field unchanged (or blank) to keep the stored value, or enter a new value to replace it. 1. **Via the Theta Directory UI**: Go to the **Admin Configuration** page (`/conf`) to edit the application's configuration secrets directly. SMTP and OAuth settings are edited through structured form fields (not a raw JSON blob) and saved to OpenBao at `secret/sso-manager/conf` at runtime, taking effect immediately. Secret fields — the SMTP password and the OAuth JWT secret — are returned masked (`********`); leave the field unchanged (or blank) to keep the stored value, or enter a new value to replace it.
2. **Via the REST API**: Send requests to `/api/vault/v1/...` with your SSO Manager session or API Token. 2. **Via the REST API**: Send requests to `/api/vault/v1/...` with your Theta Directory session or API Token.
### API Example ### API Example
@@ -32,14 +32,14 @@ Only administrators with `app_sso_admin` or `admin` permissions can query the va
## Namespaces and Paths ## Namespaces and Paths
Currently, secrets are maintained at `/v1/secret/data/sso-manager/conf` using the `kv-v2` backend. When configurations are edited via the admin UI, SSO Manager performs a deep-merge so that partial updates don't overwrite unrelated keys (such as SMTP vs OAuth configurations). Currently, secrets are maintained at `/v1/secret/data/sso-manager/conf` using the `kv-v2` backend. When configurations are edited via the admin UI, Theta Directory performs a deep-merge so that partial updates don't overwrite unrelated keys (such as SMTP vs OAuth configurations).
## Plugin Integration ## Plugin Integration
Plugin instances store their per-instance secrets in OpenBao at Plugin instances store their per-instance secrets in OpenBao at
`secret/plugins/<instance-id>/conf` (configured, loaded/unloaded, and run from `secret/plugins/<instance-id>/conf` (configured, loaded/unloaded, and run from
the **Plugins** page — see [Plugins](plugins.html)). The plugin process runs the **Plugins** page — see [Plugins](plugins.html)). The plugin process runs
in-process, so the SSO Manager reads/writes those secrets server-side through in-process, so Theta Directory reads/writes those secrets server-side through
the `sso-broker` token; the admin UI only ever sees masked values, and external the `sso-broker` token; the admin UI only ever sees masked values, and external
apps can retrieve API tokens via the `/api/vault` proxy to keep permissions apps can retrieve API tokens via the `/api/vault` proxy to keep permissions
consistently enforced instead of hardcoding them. consistently enforced instead of hardcoding them.
+1 -1
Submodule proxy updated: f9fbb0b987...59b8eb70e3