Instalar PostgreSQL na VPS Ubuntu

PostgreSQL é o banco de dados relacional mais avançado do mundo open-source e a escolha padrão para APIs, SaaS e aplicações que precisam de ACID, JSON nativo e extensibilidade. Instalar pelo repositório oficial do PostgreSQL garante sempre a versão mais recente com suporte de longo prazo.

Instalar PostgreSQL 17 pelo repositório oficial

Use o repositório oficial do PostgreSQL (PGDG) para instalar a versão mais recente:

bash
# Adicionar repositório oficial do PostgreSQL
sudo apt install -y curl ca-certificates
sudo install -d /usr/share/postgresql-common/pgdg
curl -o /usr/share/postgresql-common/pgdg/apt.postgresql.org.asc --fail https://www.postgresql.org/media/keys/ACCC4CF8.asc

sudo sh -c 'echo "deb [signed-by=/usr/share/postgresql-common/pgdg/apt.postgresql.org.asc] https://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'

sudo apt update
sudo apt install -y postgresql-17

# Verificar instalação
sudo systemctl status postgresql
psql --version

# Habilitar início automático
sudo systemctl enable postgresql

Criar banco de dados e usuário

Nunca use o superusuário postgres para sua aplicação, crie um usuário dedicado:

sql
# Acessar o PostgreSQL como superusuário
sudo -u postgres psql

-- Criar usuário dedicado para a aplicação
CREATE USER minha_app WITH PASSWORD 'senha_forte_aqui';

-- Criar banco de dados
CREATE DATABASE minha_db OWNER minha_app;

-- Garantir permissões
GRANT ALL PRIVILEGES ON DATABASE minha_db TO minha_app;

-- Conectar ao banco e garantir permissões de schema
\c minha_db
GRANT ALL ON SCHEMA public TO minha_app;
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO minha_app;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO minha_app;

-- Definir privilégios padrão para tabelas futuras
ALTER DEFAULT PRIVILEGES IN SCHEMA public
  GRANT ALL ON TABLES TO minha_app;
ALTER DEFAULT PRIVILEGES IN SCHEMA public
  GRANT ALL ON SEQUENCES TO minha_app;

\q

Configurar acesso remoto seguro

Por padrão, PostgreSQL só aceita conexões locais. Para aceitar conexões da aplicação:

bash
# Editar postgresql.conf — escutar em todas as interfaces
sudo nano /etc/postgresql/17/main/postgresql.conf

# Alterar:
listen_addresses = '*'     # ou o IP específico da VPS: '10.0.0.1'

# Editar pg_hba.conf — controle de autenticação
sudo nano /etc/postgresql/17/main/pg_hba.conf

# Adicionar ao final (acesso do servidor da aplicação):
# host  BANCO       USUARIO     IP_APP/32       scram-sha-256
host    minha_db    minha_app   10.0.0.2/32     scram-sha-256

# Para permitir qualquer IP (NÃO use em produção sem firewall):
# host  all         all         0.0.0.0/0       scram-sha-256

# Reiniciar PostgreSQL
sudo systemctl restart postgresql

# Testar conexão remota
psql -h IP_DA_VPS -U minha_app -d minha_db

Configurações essenciais de performance

Ajuste o postgresql.conf para a memória disponível na VPS:

bash
# /etc/postgresql/17/main/postgresql.conf
# Para VPS com 4 GB de RAM:

# Memória
shared_buffers = 1GB            # 25% da RAM
effective_cache_size = 3GB      # 75% da RAM
work_mem = 64MB                 # por operação de sort/hash
maintenance_work_mem = 256MB    # VACUUM, CREATE INDEX

# Checkpoint
checkpoint_completion_target = 0.9
wal_buffers = 16MB

# Conexões
max_connections = 100           # ajuste conforme uso
# (use PgBouncer se precisar de mais conexões)

# Logging de queries lentas
log_min_duration_statement = 1000   # logar queries > 1s
log_line_prefix = '%t [%p]: [%l-1] '
log_checkpoints = on
log_lock_waits = on

# Reiniciar após mudanças
sudo systemctl restart postgresql

Verificar saúde do PostgreSQL

Comandos essenciais para verificar o estado do banco em produção:

sql
-- Conexões ativas
SELECT count(*), state, wait_event_type
FROM pg_stat_activity
WHERE datname = 'minha_db'
GROUP BY state, wait_event_type
ORDER BY count DESC;

-- Tamanho dos bancos de dados
SELECT datname,
       pg_size_pretty(pg_database_size(datname)) AS tamanho
FROM pg_database
ORDER BY pg_database_size(datname) DESC;

-- Tamanho das tabelas
SELECT schemaname, tablename,
       pg_size_pretty(pg_total_relation_size(schemaname||'.'||tablename)) AS tamanho
FROM pg_tables
WHERE schemaname = 'public'
ORDER BY pg_total_relation_size(schemaname||'.'||tablename) DESC
LIMIT 20;

-- Queries em execução agora
SELECT pid, now() - pg_stat_activity.query_start AS duracao,
       query, state
FROM pg_stat_activity
WHERE (now() - pg_stat_activity.query_start) > interval '5 seconds'
  AND state != 'idle';

Não quer configurar manualmente?

Implante o VPS em menos de 5 minutos com a Runstack. Infraestrutura da OPEN Datacenter, com servidores em São Paulo.

Perguntas frequentes

PostgreSQL: melhor para queries complexas, JSON nativo (JSONB), tipos avançados (arrays, UUID, enums), extensões (PostGIS, pgvector), conformidade SQL total. MySQL/MariaDB: mais simples, performance em queries muito simples, ecossistema PHP maduro. Para APIs modernas, Django, Rails, Node.js: PostgreSQL é a escolha padrão da comunidade em 2025.

Sempre a versão mais recente com suporte LTS. PostgreSQL 17 (lançado em 2024) tem suporte até 2029. Evite versões sem suporte (PostgreSQL 13 EOL em novembro 2025). O PGDG facilita upgrades in-place com pg_upgradecluster.

Funciona bem com 1 GB de RAM para workloads pequenos. Com 1 GB: shared_buffers = 256 MB, work_mem = 16 MB. Com 4 GB: shared_buffers = 1 GB, work_mem = 64 MB. O pgtune.leopard.in gera configurações otimizadas baseadas nos recursos da sua VPS.

sudo -u postgres pg_isready retorna /run/postgresql:5432 - accepting connections se OK. Para testar conexão de outro host: pg_isready -h IP_DA_VPS -p 5432 -U minha_app -d minha_db. Use psql -h HOST -U USER -d DB -c "SELECT 1" para um teste end-to-end.

sudo -u postgres psql -c "ALTER USER postgres WITH PASSWORD 'nova_senha';" Depois atualize pg_hba.conf para usar scram-sha-256 em vez de trust ou peer para conexões locais do superusuário, se segurança for crítica.