You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
utils.StringFlagEnv(fs, &flags.identityJSON, "identity-json", "", "identity json payload; overrides --identity-path contents and is persisted there when both are set", "IDENTITY_JSON")
96
96
utils.StringFlag(fs, &flags.name, "name", "", "Public hostname prefix (single DNS label); auto-generated when omitted")
Copy file name to clipboardExpand all lines: docs/src/routes/configuration/+page.md
+2-2Lines changed: 2 additions & 2 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -80,7 +80,7 @@ variables:
80
80
|`PORT`|`8081`| int | Frontend API HTTP listen port |
81
81
|`PORTAL_API_BASE_URL`|`https://portal:4017`| string | Relay API base URL used to compose frontend-owned state |
82
82
|`LANDING_PAGE_ENABLED`|`false`| bool | Default landing page flag when no frontend state has been saved yet |
83
-
|`PORTAL_FRONTEND_STATE_PATH`|`""`| string | Optional JSON file path for persisted frontend-owned state; bundled Compose stores this under `./.portal-certs/frontend-state/state.json`|
83
+
|`PORTAL_FRONTEND_STATE_PATH`|`""`| string | Optional JSON file path for persisted frontend-owned state; a Compose deployment can store this under `./.portal-certs/frontend-state/state.json`|
| Relay API and SNI certificate |`./.portal-certs/fullchain.pem`, `./.portal-certs/privatekey.pem`|`portal` unless managed ACME is configured |
128
128
129
-
Portal-managed ACME can manage the relay certificate and relay DNS records. The bundled nginx example still expects a browser-facing certificate in `./certs`; manage that with your normal edge certificate process.
129
+
Portal-managed ACME can manage the relay certificate and relay DNS records. If a separate front nginx only TCP-passthroughs Portal hostnames, it does not need Portal certificate material; the Portal nginx or relay edge behind it still terminates the Portal root host.
130
130
131
131
## 3. Deploy the Recommended Stack
132
132
133
-
Start from the single-domain nginx example:
133
+
Deploy the Portal services with your own Compose, systemd, or orchestration
134
+
manifest. If another nginx already owns public `443/tcp`, use the nginx
135
+
passthrough example only for SNI routing to the Portal nginx:
Replace every `portal.example.com`in `nginx.conf` and `.env`.
149
-
150
-
For deployments with multiple additional services behind the same edge nginx, use `docs/static/examples/nginx-proxy-multi-service` instead. The same Portal routing rules apply.
141
+
Replace `portal.example.com`and the `portal_nginx` upstream in `nginx.conf`.
142
+
The example does not deploy Portal containers, write Portal `.env` files, or
143
+
reload Portal services.
151
144
152
145
### Configure `.env`
153
146
@@ -176,7 +169,10 @@ TRUSTED_PROXY_CIDRS=
176
169
LANDING_PAGE_ENABLED=false
177
170
```
178
171
179
-
`API_PORT` defaults to `4017`. If you change it, update the relay `proxy_pass` targets in the bundled `nginx.conf` to the same port. Keep `SNI_PORT=443` because this is the public SNI port advertised to tunnel clients. The single-domain Compose example maps the relay container's SNI listener to `127.0.0.1:4443` on the host so nginx can own public `443/tcp` and still pass wildcard TCP traffic to the relay. Do not open `4443/tcp` publicly; it is only a host-local upstream in that example.
172
+
`API_PORT` defaults to `4017`. Keep `SNI_PORT=443` because this is the public
173
+
SNI port advertised to tunnel clients. If a separate nginx sits in front of
174
+
Portal's own nginx, it should TCP-passthrough `portal.example.com` and
175
+
`*.portal.example.com` instead of proxying Portal API paths itself.
180
176
181
177
If the relay joins public discovery, set `BOOTSTRAPS` to at least one reachable relay URL and keep `WIREGUARD_PORT/udp` open.
182
178
@@ -361,10 +357,36 @@ It owns:
361
357
-`/ui/policy/*` composition, while relay-enforced policy changes are still forwarded to `portal`.
362
358
-`/ui/service/status`, derived from relay state for quick-start UI checks.
363
359
-`/ui/thumbnail/<hostname>`, when optional screenshot generation is enabled.
364
-
- The landing-page flag persisted at `PORTAL_FRONTEND_STATE_PATH`; the bundled Compose files store it under `./.portal-certs/frontend-state/state.json`.
360
+
- The landing-page flag persisted at `PORTAL_FRONTEND_STATE_PATH`; a Compose deployment can store it under `./.portal-certs/frontend-state/state.json`.
365
361
366
362
The Go relay remains the owner of authentication, policy enforcement, lease state, tunnel ingress, install scripts, discovery, and x402 facilitator paths.
367
363
364
+
### Custom Frontend
365
+
366
+
To attach your own dashboard frontend, replace only the `portal-frontend`
367
+
service image. Keep the service name `portal-frontend` and serve plain HTTP on
368
+
port `8080` so the existing nginx route for SPA paths can continue to point at
369
+
`portal-frontend:8080`.
370
+
371
+
The custom frontend should use same-origin browser requests and leave these
If the automated release updater should also track your custom frontend image,
387
+
set `IMAGES` to include that image in addition to the Portal release-track
388
+
images.
389
+
368
390
### Thumbnail Screenshots
369
391
370
392
Generated thumbnails are optional and disabled by default. Without this feature, apps without a custom thumbnail simply use the default card background.
@@ -461,7 +479,7 @@ Logs like `"\x16\x03\x01..." 400` mean a client sent HTTPS to the plain HTTP `po
461
479
462
480
### Relay Logs Show `tls: unknown certificate`
463
481
464
-
This usually means a browser or proxy hit the relay API certificate directly instead of the public nginx certificate, or an upstream proxy tried to verify the relay's internal certificate. In the bundled nginx example, public browsers verify nginx's certificate, while nginx proxies to the relay API over internal HTTPS.
482
+
This usually means a browser or proxy hit the relay API certificate directly instead of the public nginx certificate, or an upstream proxy tried to verify the relay's internal certificate. In the recommended topology, public browsers verify the Portal HTTPS edge certificate, while the edge proxies to the relay API over internal HTTPS.
0 commit comments