readonly setting enabled. Turn Write access on when you want the agent to change data, and Allow DROP and TRUNCATE separately when you want it to remove objects.
Prerequisites
- A ClickHouse server reachable from CloudThinker over its HTTP interface (
8443with TLS,8123without). ClickHouse Cloud, a self-hosted cluster, a cluster run by an operator on Kubernetes, and managed ClickHouse from another provider all work — that one port is all CloudThinker needs. - Admin access to create a dedicated user.
- The native TCP port (
9000) is not used and does not need to be exposed.
Setup
1
Create a dedicated user
Connect as an admin and create the CloudThinker user:
2
Grant read access
Grant
SELECT on the databases the agent should see, plus SHOW:3
Pin the user to read-only (recommended)
The connection defaults to read-only, but a settings profile makes the restriction hold at the server, independent of any client:Skip this step if you plan to turn Write access on. The profile uses
READONLY, so the user cannot lift it, and CloudThinker’s switch cannot override it either.4
Allow access to system tables (optional)
Table sizes, part counts, and column metadata come from
system:5
Configure network access
Open the HTTP interface to CloudThinker:
- ClickHouse Cloud: add CloudThinker to the service IP access list, under the service’s Settings → Security.
- Self-hosted: allow inbound
8443(or8123) from CloudThinker in your firewall or security group.
6
Add the connection in CloudThinker
Go to Connections → ClickHouse and enter:
- Host: hostname only, with no scheme and no port, for example
abc123.ap-southeast-1.aws.clickhouse.cloud - Port:
8443with TLS,8123without - Username:
cloudthinker - Password: the password you set above
- Use TLS:
Yesfor ClickHouse Cloud and any public endpoint - Verify the TLS certificate: leave on
Yes; turn it off only for a self-signed or internal-CA certificate - Default database: optional; leave blank to use the server default
- Write access: leave on
Read-onlyunless the agent needs to change data - Allow DROP and TRUNCATE: appears only once write access is on; leave
Blockedunless you want the agent to remove objects
SELECT version() as that user to check the credentials, and the Connected message names the ClickHouse version it reached, the username it used, and the default database when you set one. Anything else comes back as a specific reason — see Troubleshooting.Connection details
Required permissions
Minimum
Recommended (full analysis)
system.query_log is what turns “this dashboard is slow” into a ranked list of the queries responsible.
Write access (only if you enable it)
*.*. A grant the user does not hold is the boundary the Write access switch cannot cross.
Agent capabilities
Once connected, Tony can:Verify the connection
Example prompts
Write access
The connection ships read-only, and two switches open it up one step at a time.
Three things to weigh before turning write access on:
Blockedprotects the table, not the rows. It rejects theDROP TABLEandTRUNCATEstatements. It does not rejectALTER TABLE ... DELETE,DROP PARTITION, orDROP COLUMN, each of which removes data while leaving the table in place. TreatFull accessas “the agent can destroy data”, regardless of the second switch.- ClickHouse has no transactions. An
ALTER TABLE ... DELETEis an asynchronous mutation and aDROPis immediate. Neither can be rolled back, so recovery means restoring from a backup. - Grants are the stronger control. These switches only decide whether CloudThinker sends
readonly=1; they never grant a privilege the ClickHouse user does not already have. Give the CloudThinker user write privileges on exactly the databases you want reachable, and the switch cannot exceed that.
Troubleshooting
ClickHouse rejected the username or password
ClickHouse rejected the username or password
ClickHouse answered and refused the credentials.
- Confirm the user exists:
SHOW USERS; - Retype the password rather than pasting it. A pasted value that carries a line break is rejected before CloudThinker even contacts the server.
- ClickHouse Cloud disables password auth for some SSO-provisioned users. Create a dedicated database user instead of reusing a console login.
ClickHouse has no database named …
ClickHouse has no database named …
The name in Default database is not a database ClickHouse found. Database names are case-sensitive, so check the spelling, or leave the field blank to use the server default.
ClickHouse rejected the request path. Check the port.
ClickHouse rejected the request path. Check the port.
Something answered, but it was not the ClickHouse HTTP interface.
- Confirm Port and Use TLS agree:
8443with TLS,8123without. - The native TCP port
9000is not the HTTP interface. Pointing the connection at it fails.
ClickHouse is unreachable
ClickHouse is unreachable
Nothing answered at that host and port.
- Check that Host carries no
https://prefix and no:portsuffix. Both belong in their own fields. - ClickHouse Cloud: add CloudThinker to the service IP access list.
- Self-hosted: confirm
<listen_host>includes the interface you exposed, and that the firewall allows8443or8123. - A TLS mismatch reads the same way — Use TLS on against a plain HTTP port, or off against an HTTPS-only one.
ClickHouse did not answer in time
ClickHouse did not answer in time
The address was reachable but no reply arrived before the check gave up. On ClickHouse Cloud this is usually automatic idling: a service that has been inactive suspends, and connections to it time out until it restarts. Wake the service, then connect again.
Cannot execute query in readonly mode
Cannot execute query in readonly mode
The connection is read-only, which is the default. If the agent should be able to write, set Write access to
Full access and reconnect.If it still fails after that, the restriction is server-side: check whether the user carries a readonly settings profile (SHOW CREATE USER cloudthinker;) and whether it holds the write grants the query needs.DROP is refused even with write access on
DROP is refused even with write access on
DROP and TRUNCATE sit behind their own switch. Set Allow DROP and TRUNCATE to Allowed. It appears only once Write access is Full access.Empty table list
Empty table list
- The user needs
SHOW TABLESandSELECTon the database, not only on individual tables. - Grant
SELECT ON system.tablesso metadata queries return rows.
Security
- Least privilege — grant only the permissions the agents need for your use case; start read-only and widen later.
- Read-only by default — use read-only credentials unless you want agents to make changes through this connection.
- Rotate credentials — rotate keys and tokens on your normal schedule; CloudThinker picks up the new value when you update the connection.
- Revoke on offboarding — remove the credential at the provider when you delete a connection or a teammate leaves.
- TLS on public endpoints — keep Use TLS on for ClickHouse Cloud and any endpoint outside a private network.
- Dedicated user — never reuse an admin account; a separate user keeps the audit trail readable.
- Grants over switches — the privileges on the ClickHouse user are the durable boundary. The Write access switch decides whether CloudThinker asks for a write; the grant decides whether ClickHouse allows one.
- Server-side read-only — for a connection that must never write, add the settings profile in step 3.
READONLYmakes it un-liftable from the client side.
Related
Tony Agent
Database-focused optimization agent
PostgreSQL Connection
Similar setup for PostgreSQL databases