TLS and Reverse Proxy Requirements
Any network-accessible deployment of the pgEdge AI DBA Workbench must terminate TLS in front of the server. This page documents the supported deployment topology, the operator responsibilities, and the risks of ignoring the requirement.
Why TLS Is Mandatory
The web client sends user credentials, session tokens, and API tokens to the server on every authenticated request. Plain HTTP transmits these credentials in cleartext over the network. Anyone on the path between the browser and the server can read or replay the captured credentials.
The workbench therefore treats TLS as a hard requirement for any deployment that is reachable from a network other than the loopback interface of the host running the server. The requirement applies equally to production deployments, staging deployments, and shared development environments.
Recommended Topology
The recommended topology places a TLS-terminating reverse proxy in front of the
server. The reverse proxy accepts HTTPS connections from browsers and proxies
plain HTTP to the server on the loopback interface or across a private network.
The reverse proxy also serves the static web client assets that the build
process emits into client/dist/.
The recommended topology has the following properties:
- The reverse proxy terminates TLS for browser connections and the MCP transport.
- The reverse proxy redirects HTTP requests to HTTPS so that no credential ever travels over plain HTTP.
- The reverse proxy issues an HTTP Strict Transport Security (HSTS) header so browsers refuse to downgrade subsequent requests.
- The reverse proxy serves the static client bundle and proxies
/api,/mcp, and/healthto the Go server on port 8080. - The Go server listens on plain HTTP on a port that is not exposed to the network; the reverse proxy is the only client that connects to the server directly.
The official Docker images follow this topology. The client container runs nginx as a non-root user, serves the bundled SPA, and proxies API and MCP traffic to the server container. See the Docker deployment guide for the production Compose configuration and the web client configuration page for an annotated nginx configuration.
Operator Responsibilities
A reverse proxy alone does not satisfy the requirement; the operator must also configure the proxy correctly.
- The proxy must present a valid TLS certificate issued by a certificate authority the browser trusts.
- The proxy must redirect every plain HTTP request to the corresponding HTTPS
URL with a
301or308response. - The proxy must set the
Strict-Transport-Securityresponse header with amax-ageof at least31536000seconds (one year). - The proxy must forward the
X-Forwarded-ForandX-Forwarded-Protoheaders so the server records the original client IP and scheme. - The proxy must restrict access to the server's plain-HTTP listener; bind the
listener to
127.0.0.1or to a private interface that the proxy alone can reach.
The server's http.trusted_proxies list pairs with the operator's network
controls; configure the list with the CIDR ranges of the reverse proxies that
send X-Forwarded-For headers. See the
server configuration reference
for details.
Direct TLS on the Server
The Go server can terminate TLS directly when an operator chooses not to deploy a reverse proxy. The direct TLS path remains supported for environments where a reverse proxy is impractical, such as single-host appliance deployments or short-lived test deployments behind a corporate VPN.
Configure direct TLS through the http.tls section of ai-dba-server.yaml:
http:
address: ":8443"
tls:
enabled: true
cert_file: "/etc/pgedge/certs/cert.pem"
key_file: "/etc/pgedge/certs/key.pem"
chain_file: "/etc/pgedge/certs/chain.pem"
Operators who terminate TLS on the server must still serve the static web client bundle from a separate web server because the Go server is API-only. The Go server does not redirect plain HTTP to HTTPS and does not emit an HSTS header; the operator must rely on network controls to prevent plain-HTTP access to the server's listener.
The recommended topology remains the reverse proxy in front of the server. Direct TLS is the exception rather than the rule.
The Vite Development Server
The Vite development server at http://localhost:5173 is a developer-only
tool. The development server runs on plain HTTP, lacks the production hardening
of the reverse proxy, and includes hot-reload tooling that is unsuitable for
any shared environment. The development server is supported only for local
development on the loopback interface.
Do not expose port 5173 to a network of any kind. The development server transmits credentials over plain HTTP and provides no path to enable TLS. Deploy the production client bundle behind a reverse proxy instead, as described above.
Risks of Ignoring This Requirement
A deployment that exposes the workbench over plain HTTP exposes every credential the user enters or the client sends. The concrete risks include the following items.
- A passive attacker on the network path can capture the user's password during login.
- A passive attacker can capture a session token from the
Authorizationheader of any subsequent request. - A passive attacker can capture API tokens that scripts send through the REST API or the MCP endpoint.
- An active attacker can inject responses, replace the SPA bundle, or intercept multi-factor challenges.
The workbench treats reports of plain-HTTP credential exposure on the development server as configuration issues rather than vulnerabilities, because the development server is documented as localhost-only. Reports of plain-HTTP credential exposure on a production deployment indicate a missing or misconfigured reverse proxy; review the topology above and the Docker deployment guide to restore a supported configuration.
See Also
- The installation guide covers the standard production deployment.
- The Docker deployment guide documents the container topology that ships with the project.
- The
server configuration reference
lists every option for the
httpandhttp.tlssections. - The web client configuration page shows an annotated nginx configuration for the static SPA.