pg-checkup
Workspace
HomeReports
Learn
OverviewQuickstartChecks referenceConnectingTools that helpSecurity & privacyFAQ
Help
File a ticketRequest a featurePricing
PrivacyTerms
Docs/Connecting
Sign inNew checkupC

Connecting

pg-checkup works with any PostgreSQL 13 or newer that it can reach over the internet. The checks are the same on every host; what differs is roles, extensions and how long statistics last.

The role

Create a dedicated role and grant pg_monitor. It can read statistics views, not the rows in your tables. Avoid scanning as a superuser or as your application's role.

Query findings

Query findings need the pg_stat_statements extension. Most managed hosts include it; run CREATE EXTENSION pg_stat_statements; if it isn't enabled. On a self-hosted server, add it to shared_preload_libraries and restart first.

Its statistics cover the time since they were last reset or the server last restarted.

Poolers

Use a direct connection or a session-mode pooler. A transaction-mode pooler can send each query to a different server connection, so the scan's read-only session setting may not hold. The scan page refuses the common transaction-mode ports.

Private addresses

Hostnames that only resolve inside a private network (for example *.internal) can't be reached. Use the public connection string your host gives you.

Free disk space

Free disk space isn't visible from SQL. The Footprint on disk check adds up data and WAL; compare it with the disk size your host shows.

Neon

  • Neon runs fsync = off and full_page_writes = off on purpose, because its storage layer provides durability. It also names its own WAL service in synchronous_standby_names and keeps two internal replication slots. None of these are reported as findings; the checks pass with an explanation.
  • Unlogged tables are emptied whenever the compute suspends, not only after a crash.
  • Roles created in the Neon console get neon_superuser, which includes pg_monitor. A role created with SQL needs pg_monitor granted explicitly.
  • pg_stat_statements statistics are lost when the compute suspends or restarts, including scale-to-zero. Query findings cover the time since the last wake-up.

Supabase

  • Supabase's own roles (supabase_*, pgbouncer, dashboard_user), its managed schemas (auth, storage, realtime, vault, extensions, graphql and similar) and queries run by those roles are left out of findings.
  • The API roles (anon, authenticated, service_role) run your app's traffic, so their queries are counted.
  • Tables in public that the anon role can read with row-level security off are reported.
  • The pg_cron and pg_net bookkeeping tables (cron.job_run_details, net._http_response) are not hidden: they grow with your own usage and are a common cause of disk growth.
  • Use the session pooler (port 5432) or a direct connection. Port 6543 is the transaction-mode pooler.

Railway

  • Plain PostgreSQL on a fixed-size volume; nothing is hidden.
  • postgres.railway.internal only works inside the project. Use the public connection string (DATABASE_PUBLIC_URL).

Amazon RDS, Aurora, Google Cloud SQL, Azure

  • Enable pg_stat_statements through the instance's parameter settings.
  • Use sslmode=require.
  • Free storage is a metric in the provider's console, not visible from SQL.

Self-hosted

Follow the quickstart, and add pg_stat_statements to shared_preload_libraries before restarting.

PreviousChecks referenceNextTools that help