This guide assumes
kubectl is already configured and pointed at the right cluster and namespace.How to share information with the TextQL team
TextQL Doctor
Use the TextQL Doctor utility (shell script) to quickly generate an encrypted file to share with TextQL. The file contains logs, cluster configuration, and resource status.textql-doctor.sh ships with your Helm chart (versions 1.2.3 and later, under textql-charts/). If you don’t have access to the chart, or run an older version, you can request the script from the TextQL team.
Alternative
If you can’t run TextQL Doctor, provide the output of these commands:- The exact error message from the browser Console or Network tabs if the issue is reproducible in the UI.
- Your
values.yamlfile and/or the relevant attributes in that file. Make sure you redact any private information like tokens.
1. What runs in the cluster
TextQL deploys a small set of Deployments into a single namespace. Knowing which one to look at is the biggest single win when triaging.2. Inspect the environment
3. Getting logs from compute-engine
This is the section you’ll come back to. Most issues you’ll debug live incompute-engine.
3.1 Print the logs
compute-engine pod. Add --previous if the pod just restarted and you want what it logged before crashing.
3.2 Grep for specific errors
Pipe the log output throughgrep to find what you need.
3.3 When the pod isn’t healthy
If pods are not Ready or restarting,describe tells you why.
4. Debugging network problems from inside the cluster
When you suspect a connectivity issue (to the DB, object storage, an LLM provider, or another in-cluster service), you can attach a debug container to the pod with networking tools. Thenicolaka/netshoot image bundles curl, dig, nslookup, nc, tcpdump, mtr, and others.
- DNS works: if
nslookupfails, cluster DNS is misconfigured. - TCP port is open:
nc -vzsucceeding rules out security-group / network-policy issues. - TLS handshake completes:
curl -vcan show you related information. - In-cluster service DNS resolves:
<service>.<namespace>.svc.cluster.local.
5. Logs from the browser (DevTools)
Many issues show up in the user’s browser, which provides an easier view. Right-click anywhere on the page → Inspect (orCmd+Option+I on Mac, Ctrl+Shift+I on Windows/Linux).
5.1 Console tab: JavaScript errors and stack traces
The Console tab shows everything the frontend logged: unhandled promise rejections, RPC errors with full server-side detail, and toast errors that disappeared too fast to read. What to look for:- Red lines are errors. The first red line is usually the actionable one.
- HTTP error codes identify the type of error, e.g. 404 for a resource not found, or 500 for an internal server error.
- Examples:
ConnectError: [code] message: a Connect-RPC failure fromcompute-engine. The bracketed code ([unavailable],[invalid_argument],[unauthenticated],[internal]) tells you the category.Failed to fetch/ CORS errors: the load balancer is misconfigured, or the object storage bucket CORS policy doesn’t include your domain inAllowedOrigins.WebSocket connection failed: the load balancer is dropping long-lived connections (idle timeout too low), or/rpc/publicisn’t routed tocompute-engine.
- Toggle Preserve log so you don’t lose errors on page reload.
- Turn on timestamps (Settings cog → Console).
- Right-click any line → Save as to capture the full Console output.
- Filter by level (Errors only) when there’s a lot of noise.
5.2 Network tab: what the app actually asked the backend
When chats hang, files won’t upload, or an action “does nothing,” the Network tab tells you whether the request left the browser, where it went, and what came back. Setup once per session:- Open DevTools → Network tab.
- Toggle Preserve log.
- Toggle Disable cache while DevTools is open.
- Filter by Fetch/XHR to hide static assets, shows only API calls.
- Reproduce the issue.
- Payload: what the frontend actually sent (chat ID, org ID, etc.).
- Response: the server’s response body. Connect-RPC errors include structured JSON with
codeandmessage. Copy verbatim when reaching out for support. - Timing: where time was spent, and possible timeouts.
6. Helm commands
If you installed TextQL via Helm and the installation or upgrade failed (see Upgrading for the upgrade checklist and rollback), review the output of the installation process. This can surface errors like:- Secrets not being created
- Timeouts on pending upgrades
- Attributes missing in
values.yaml
7. SCIM: Reference for Self-Hosted / VPC Deployments
This section extends SCIM Provisioning with the endpoints reference, operational commands, and Helm values relevant to operators of a self-hosted deployment withkubectl access to the cluster.
Endpoints Reference
All SCIM endpoints are served under/scim/v2/:
Operational Commands
Replace<namespace> with your deployment namespace (typically textql).
Get compute-engine logs
SCIM operations are handled by thecompute-engine pod. All SCIM auth checks, provisioning events, and errors are logged there.
SCIM token check: valid but no subsequent group operation logs, the group sync requests are being dropped before reaching the application (likely a network issue).
Get the Oathkeeper configmap
The Oathkeeper configmap controls how SCIM requests are routed and authenticated. If SCIM is failing entirely for a VPC deployment, this is the first thing to inspect.- A rule with
"id": "scim:v2:authenticated"must exist, matching<http|https>://<[^/]+>/scim/v2/<.*>. - The frontend catch-all rule (
web:frontend:authenticated) must havescim/in its negative lookahead exclusion pattern, e.g.(?!health|v1/|rpc/|...|scim/|...). Ifscim/is absent, Oathkeeper will intercept SCIM requests and apply browser-based OIDC auth instead.
Get the Oathkeeper deployment and check its version
Check and adjust the SCIM rate limit
Restart compute-engine (after a configmap or env var change)
Helm Values Reference
Thesevalues.yaml keys control SCIM and OIDC behavior for self-hosted deployments. They’re set at deployment time and take effect after a helm upgrade.
Corresponding environment variables (set automatically from values by the Helm chart):