Skip to main content
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:
Also include:
  • The exact error message from the browser Console or Network tabs if the issue is reproducible in the UI.
  • Your values.yaml file and/or the relevant attributes in that file. Make sure you redact any private information like tokens.
In the following sections, you’ll find a more detailed guide on how to troubleshoot the deployment yourself, so you can identify issues and relevant logs before reaching out.

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 in compute-engine.

3.1 Print the logs

This command tails the live log stream for all containers in the 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 through grep to find what you need.
The TextQL team can point you at specific filters that you can apply in this step depending on your issue.

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. The nicolaka/netshoot image bundles curl, dig, nslookup, nc, tcpdump, mtr, and others.
You can also spin up a standalone netshoot pod (not attached to anything) when you want a generic in-cluster network shell:
Common things to confirm:
  • DNS works: if nslookup fails, cluster DNS is misconfigured.
  • TCP port is open: nc -vz succeeding rules out security-group / network-policy issues.
  • TLS handshake completes: curl -v can 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 (or Cmd+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 from compute-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 in AllowedOrigins.
    • WebSocket connection failed: the load balancer is dropping long-lived connections (idle timeout too low), or /rpc/public isn’t routed to compute-engine.
Actions to improve the output:
  1. Toggle Preserve log so you don’t lose errors on page reload.
  2. Turn on timestamps (Settings cog → Console).
  3. Right-click any line → Save as to capture the full Console output.
  4. 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:
  1. Open DevTools → Network tab.
  2. Toggle Preserve log.
  3. Toggle Disable cache while DevTools is open.
  4. Filter by Fetch/XHR to hide static assets, shows only API calls.
  5. Reproduce the issue.
Useful Network filter strings:
For any one request, the most useful sub-tabs are:
  • Payload: what the frontend actually sent (chat ID, org ID, etc.).
  • Response: the server’s response body. Connect-RPC errors include structured JSON with code and message. 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
These commands are generally useful even if you use Flux or ArgoCD on top of Helm.

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 with kubectl 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 the compute-engine pod. All SCIM auth checks, provisioning events, and errors are logged there.
If you see 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.
What to look for in the configmap:
  1. A rule with "id": "scim:v2:authenticated" must exist, matching <http|https>://<[^/]+>/scim/v2/<.*>.
  2. The frontend catch-all rule (web:frontend:authenticated) must have scim/ in its negative lookahead exclusion pattern, e.g. (?!health|v1/|rpc/|...|scim/|...). If scim/ 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

The default is 500 requests per minute. If this variable is absent, the default applies.

Restart compute-engine (after a configmap or env var change)

Helm Values Reference

These values.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):

Getting Support

If you’re still stuck after working through this guide, contact support@textql.com with the output of TextQL Doctor (or the commands under Alternative) attached.