$ sudo xbps-install -Su
$ cd Downloads
Acesse o link:
https://www.postgresql.org/ftp/source/v18.3/
Escolha o tar.gz da versão atual no momento:
postgresql-18.3.tar.gz
Ou use o wget:
$ wget https://ftp.postgresql.org/pub/source/v18.3/postgresql-18.3.tar.gz
$ ls
postgresql-18.3.tar.gz
Descompacte:
$ sudo tar xvf postgresql-18.3.tar.gz
Criando usuário e grupo:
$ sudo useradd -r -m -s /bin/bash -d /var/lib/postgres18 postgres18
O que essas flags fazem:
-r: Cria um usuário de sistema (ID abaixo de 1000). Isso evita que ele apareça na sua tela de login do ambiente gráfico.
-m: Cria o diretório home (o padrão no Void é não criar para usuários de sistema, mas o Postgres precisa de um lugar para arquivos de configuração e logs).
-s /bin/bash: Define o shell. Você precisará logar como ele (sudo su - postgres) para rodar o initdb.
-d /var/lib/postgres18: Define onde os dados e configurações do banco vão morar (fora do /opt, que deve guardar apenas os binários compilados).
Instalando dependências:
$ sudo xbps-install -S base-devel pkg-config readline-devel zlib-devel openssl-devel libicu-devel llvm21 llvm21-devel clang21 clang21-devel readline-devel bison flex gnupg2
Fazendo o diretório de construção:
$ mkdir -p ~/postgres18-build
Entrando e mimetizando:
$ cd ~/postgres18-build
$ cp -r ~/Downloads/postgresql-18.3/* .
$ ls
Criando o diretório (dê o nome que quiser):
$ sudo mkdir -p /opt/postgres18
Configurando
$ ./configure --prefix=/opt/postgres18 \
--with-openssl \
--with-icu \
--with-llvm \
--with-readline \
--with-zlib \
--with-system-tzdata=/usr/share/zoneinfo \
LLVM_CONFIG='/usr/lib/llvm/21/bin/llvm-config' \
CLANG='/usr/lib/llvm/21/bin/clang' \
CFLAGS="-O3 -march=native" \
CPPFLAGS="-I/usr/lib/llvm/21/include" \
LDFLAGS="-L/usr/lib/llvm/21/lib"
Terminará sem aviso de erros:
...
config.status: linking src/include/port/linux.h to src/include/pg_config_os.h
config.status: linking src/makefiles/Makefile.linux to src/Makefile.port
$ make -j$(nproc)
Aguarde terminar.
Terminará sem erros:
...
make[2]: Saindo do diretório '/home/kluster/postgres18-build/src/backend/jit/llvm'
make[1]: Saindo do diretório '/home/kluster/postgres18-build/src'
Sempre se deve rodar "make install" com "sudo":
$ sudo make install
Terminará sem erros:
...
/usr/bin/mkdir -p '/opt/postgres18/lib/pgxs/config'
/usr/bin/install -c -m 755 ./install-sh '/opt/postgres18/lib/pgxs/config/install-sh'
/usr/bin/install -c -m 755 ./missing '/opt/postgres18/lib/pgxs/config/missing'
make[1]: Saindo do diretório '/home/kluster/postgres18-build/config'
--with-openssl: Habilita o suporte a conexões criptografadas (SSL/TLS). Essencial para segurança em rede e autenticação via certificados.
--with-icu: Ativa a biblioteca International Components for Unicode. Melhora o suporte a ordenação (collation) e busca de textos em diferentes idiomas e alfabetos complexos.
--with-llvm: Habilita a compilação JIT (Just-In-Time). O Postgres usa o LLVM para acelerar a execução de consultas SQL complexas, transformando-as em código de máquina em tempo de execução.
--with-readline: Permite o uso da biblioteca Readline no terminal psql. Isso habilita o histórico de comandos (setas para cima/baixo) e o autocompletar (Tab).
--with-zlib: Habilita compressão de dados. É usado principalmente pelo utilitário pg_dump e para compressão de logs de transação (WAL).
--with-system-tzdata: Diz ao PostgreSQL para usar o banco de dados de fusos horários do sistema (/usr/share/zoneinfo) em vez de compilar e usar uma cópia própria. Isso facilita a atualização de horários de verão pelo SO.
CFLAGS="-O3 -march=native":
-O3: Aplica o nível máximo de otimização do compilador (GCC/Clang), priorizando velocidade de execução.
-march=native: Faz o compilador gerar código específico para as instruções do seu processador atual. Isso extrai o máximo de performance da sua CPU, mas torna o binário incompatível com outros modelos de processador.
Como instalamos em /opt, o sistema não vai achar as bibliotecas dinâmicas (.so) do Postgres automaticamente quando você tentar rodar o php ou o psql, então, cria-se um arquivo de configuração para o linkador:
$ echo "/opt/postgres18/lib" | sudo tee /etc/ld.so.conf.d/postgres18.conf
$ sudo ldconfig
/opt/postgres18/lib
Isso evita aquele erro clássico de "
error while loading shared libraries: libpq.so.5: cannot open shared object file".
Permissionando:
$ sudo chown -R postgres18:postgres18 /opt/postgres18
Cria a estrutura de pastas caso não exista:
$ sudo mkdir -p /var/lib/postgres18/data
Define o usuário 'postgres18' como dono de tudo:
$ sudo chown -R postgres18:postgres18 /var/lib/postgres18
Ajusta as permissões (obrigatório para o initdb não reclamar):
$ sudo chmod 700 /var/lib/postgres18/data
Inicializando os dados:
$ sudo su - postgres18
[postgres18@servidor ~]$ /opt/postgres18/bin/initdb -D /var/lib/postgres18/data --locale=pt_BR.UTF-8 --encoding=UTF8
Success. You can now start the database server using:
/opt/postgres18/bin/pg_ctl -D /var/lib/postgres18/data -l logfile start
[postgres18@servidor ~]$ exit
Quando quiser mudar o locale, execute num comando só:
$ sudo su - postgres18 -c "/opt/postgres18/bin/initdb -D /var/lib/postgres18/data --locale=pt_BR.UTF-8 --encoding=UTF8"
The files belonging to this database system will be owned by user "postgres18".
This user must also own the server process.
The database cluster will be initialized with locale "pt_BR.UTF-8".
The default text search configuration will be set to "portuguese".
Data page checksums are enabled.
initdb: error: directory "/var/lib/postgres18/data" exists but is not empty
initdb: hint: If you want to create a new database system, either remove or empty the directory "/var/lib/postgres18/data" or run initdb with an argument other than "/var/lib/postgres18/data".
Nota: Confira o arquivo /etc/default/libc-locales.
O PostgreSQL 18 está oficialmente inicializado e pronto para rodar.
Criando o Serviço no Runit (o Init do Void)
$ sudo mkdir -p /etc/sv/postgres18
$ sudo vim /etc/sv/postgres18/run
Copie e cole o conteúdo abaixo:
#!/bin/sh
# Garante que o log de erros seja visivel se o serviço falhar
exec 2>&1
# Define as variaveis de ambiente necessarias
export LD_LIBRARY_PATH=/opt/postgres18/lib
export PATH=/opt/postgres18/bin:$PATH
# Executa o postgres como o usuario correto (-u)
# O sinalizador -D aponta para o diretorio de dados que voce definiu
exec chpst -u postgres18 /opt/postgres18/bin/postgres18 -D /var/lib/postgres18/data
Salve e saia.
$ sudo chmod +x /etc/sv/postgres18/run
$ sudo ln -s /etc/sv/postgres18 /var/service/
$ sudo sv enable postgres18
$ sudo sv start postgres18
ok: run: postgres18: (pid 21369) 0s
Verificar status:
sudo sv status postgres18
Reiniciar:
sudo sv restart postgres18
Parar:
sudo sv stop postgres18
Para usar o comando psql direto no seu terminal de usuário, adicione esta linha ao seu ~/.bashrc (ou .zshrc):
export PATH="/opt/postgres18/bin:$PATH"
Para ver logs e configurações no Postgres faça como usuário postgres18:
$ sudo su - postgres18
[postgres18@servidor ~]$ cd /var/lib/postgres18/data/
[postgres18@servidor data]$ ls
PG_VERSION pg_hba.conf pg_replslot pg_subtrans postgresql.auto.conf
base pg_ident.conf pg_serial pg_tblspc postgresql.conf
global pg_logical pg_snapshots pg_twophase postmaster.opts
pg_commit_ts pg_multixact pg_stat pg_wal postmaster.pid
pg_dynshmem pg_notify pg_stat_tmp pg_xact
[postgres18@servidor data]$ exit
Configurando para escutar localmente:
$ sudo vim /var/lib/postgres18/data/postgresql.conf
Na linha ~60, descomente e mude:
#listen_addresses = 'localhost' # what IP address(es) to listen on;
listen_addresses = '127.0.0.1' # what IP address(es) to listen on;
Salve e saia.
Vamos editar o arquivo pg_hba.conf (Host-Based Authentication), ele está em /var/lib/postgres18/data/pg_hba.conf.
$ sudo -u postgres18 vim /var/lib/postgres18/data/pg_hba.conf
Verifique se está "trust" no arquivo, caso estiver, mude para "scram-sha-256" e tente acessar.
Recarregue as configurações:
$ sudo -u postgres18 /opt/postgres18/bin/pg_ctl -D /var/lib/postgres18/data reload
server signaled
Tente entrar no banco e pedirá senha:
$ /opt/postgres18/bin/psql -U postgres18 -d postgres
Password for user postgres18:
psql: error: connection to server on socket "/tmp/.s.PGSQL.5432" failed: fe_sendauth: no password supplied
Abra o arquivo novamente:
$ sudo vim /var/lib/postgres18/data/pg_hba.conf
Altere a linha
local all postgres18 scram-sha-256
de scram-sha-256 para
trust.
Salve e saia.
$ sudo -u postgres18 /opt/postgres18/bin/pg_ctl -D /var/lib/postgres18/data reload
server signaled
Entre sem senha:
$ /opt/postgres18/bin/psql -U postgres18 -d postgres
psql (18.3)
Type "help" for help.
Defina uma senha para o superusuário postgres18 (guarde bem a senha de acesso para não esquecer):
postgres=# ALTER USER postgres18 PASSWORD 'senha';
ALTER ROLE
postgres=# exit
Retorne ao arquivo /var/lib/postgres18/data/pg_hba.conf e altere a linha para scram-sha-256, salve, saia e recarregue.
Ao tentar entrar com psql -U postgres18 -d postgres, ele solicitará a senha que você definiu.
Agora basta criar um banco de dados e começar.
Para gerenciar pode instalar o Dbeaver, interface gráfica que é nativa dos repositórios Void e é mais performática do que o PgAdmin:
$ sudo xbps-install dbeaver
Para Remover
$ cd /opt
Removendo o link:
$ sudo rm /var/service/postgres18
Removendo o diretório /opt/postgres18:
$ sudo rm -rf postgres18
Faça uma busca por reminiscências (remova somente as referências que instalamos):
$ sudo find / | grep postgres18 | less
Obs.: Para navegar na busca use as setas de direção e "Page Up-Page Down", para sair digite q (tecla q).
Remova:
$ sudo rm -rf /home/usuario/postgres18-build
$ sudo rm -rf /home/postgres18
$ sudo rm -rf /etc/sv/postgres18
Remova usuário e grupo:
$ sudo userdel postgres18