PostgreSQL 16: Setup, Roles, and Remote Connections
Connect your application to a PostgreSQL service, get roles and schema privileges right, and take backups with pg_dump.
Verified against
- PostgreSQL
- 16
- Client
- psql 16 / pgAdmin 4
- Last checked
- 2026-09-13
Before you start
- A PostgreSQL service created in the panel and booted at least once
- The service IP and port (shown on the 'Address' card in the panel)
- psql or pgAdmin on your local machine
Unlike MySQL, PostgreSQL keeps role privileges and database privileges separate. This is where most people get stuck: letting a role connect to a database does not mean it can create tables in it. This guide creates an application role from scratch and grants only what it needs.
First connection and the superuser#
When you create the service, the initial user and password are set through environment variables; you can see them under 'Startup Variables' on the service detail page. Make the first connection with that user, then create a separate role for your app -- running your app as superuser turns a single SQL injection bug into the loss of the whole cluster.
# Panelde yazan IP ve portu kullanin
psql "postgresql://postgres:[email protected]:5432/postgres"
# Baglanti kuruldu mu?
postgres=# SELECT version();A dedicated role and database for the app#
-- 1) Rolu olustur (LOGIN olmadan baglanamaz)
CREATE ROLE uygulama WITH LOGIN PASSWORD 'guclu-bir-parola';
-- 2) Veritabanini bu rolun sahipligiyle olustur
CREATE DATABASE uygulama_db OWNER uygulama;
-- 3) Herkese acik public semasindan yazma yetkisini al
\c uygulama_db
REVOKE CREATE ON SCHEMA public FROM PUBLIC;
-- 4) Yalnizca uygulama rolune ver
GRANT ALL ON SCHEMA public TO uygulama;Keeping remote access safe#
- Instead of exposing the port to the world, allow only your application server's IP.
- Keep the password in the service's environment variables, not in application code.
- Use different roles and passwords per environment; sharing one password means a leak in staging is a leak in production.
- For read-only consumers, create a separate role limited to SELECT.
Taking backups with pg_dump#
Backup and restore
# Ozel bicim (-Fc): sikistirilmis ve secici geri yuklemeye uygun
pg_dump -Fc \
-h 192.0.2.10 -p 5432 -U uygulama \
-d uygulama_db \
-f uygulama_db_$(date +%F).dumpTroubleshooting
connection refused / timeout
The service is stopped, the wrong port is used, or PostgreSQL only listens on localhost.
Confirm the service is running and check the port on the 'Address' card; make sure listen_addresses is set to '*'.
permission denied for schema public
PostgreSQL 15+ behaviour: the role can connect but has no CREATE privilege on the schema.
Run GRANT ALL ON SCHEMA public TO <role>; while connected to that database.
too many clients already
The app opens a new connection per request and never closes it, filling max_connections.
Use a connection pool in the application and keep the pool size below max_connections.
Frequently Asked Questions
Should I migrate from MySQL to PostgreSQL?
If you already have a working MySQL setup, migrate only for a concrete reason: JSONB indexing, advanced window functions, geospatial data (PostGIS) or strict typing. The migration itself has a cost, and both engines are more than enough for a typical web app.
Why can't I create a database from the panel?
PostgreSQL runs as its own service here; you create databases with CREATE DATABASE in psql rather than through the panel. The steps in this guide follow exactly that path.
Was this guide helpful?
Feedback goes straight to the team that maintains this guide.
Related Guides
MySQL Remote Connection Access and Automated Backups
Guide to enabling remote access on MySQL, configuring user grants, and setting up automated mysqldump backups.
Redis Installation, Memory Constraints, and Password Authentication
Configure in-memory Redis key-value store, tune maxmemory eviction policies, and mandate requirepass authentication.

