Gerenciando conexões com o arquivo pg_service

Introdução

O arquivo pg_service.conf oferece uma maneira conveniente de definir informações de conexão para o PostgreSQL, permitindo acesso a diferentes instâncias do banco de dados sem a necessidade de especificar manualmente os detalhes de conexão toda vez. Essa ferramenta é especialmente útil em ambientes onde você precisa administrar várias instâncias do PostgreSQL ou quando você deseja ocultar informações de conexão em scripts ou aplicativos. A documentação completa desse recurso pode ser encontrada no site oficial do PostgreSQL.

Roteiro:

  • O que é o pg_service.conf?
  • Localização do arquivo pg_service.conf
  • Configuração e exemplo

O que é o pg_service.conf?

O pg_service.conf é um arquivo de configuração usado pelo PostgreSQL para definir serviços e suas informações de conexão correspondentes. Cada serviço é identificado por um nome e contém detalhes como endereço, porta, banco de dados, usuário e outras opções de conexão (a lista completa de palavras-chave disponíveis está na documentação da libpq). 
A documentação oficial pode ser conferida no site do PostgreSQL, nesta página.

Localização do pg_service.conf

Este arquivo pode ser encontrado no diretório home do usuário (assim como no arquivo pgpass.conf) e é utilizado pelo cliente psql para determinar as configurações de conexão.  Você pode verificar qual é o diretório home olhando o arquivo `/etc/passwd`, conferindo o conteúdo da variável de ambiente `$HOME` ou simplesmente criando o arquivo com o atalho ~/. 
Ao centralizar todas as configurações em um único arquivo, facilita-se a manutenção e o gerenciamento das conexões, especialmente em cenários complexos com vários bancos de dados e servidores para se conectar. Além disso, há duas variáveis de ambiente relevantes relacionadas ao pg_service.conf, chamadas $PGSERVICEFILE e $PGSERVICE:

  • $PGSERVICEFILE: esta variável é utilizada para especificar o caminho para o arquivo pg_service.conf, permitindo que você indique um arquivo específico que seja o padrão. Isso é útil quando você deseja aumentar um pouco a segurança do arquivo ou compartilhá-lo com outros usuários no mesmo servidor;
  • $PGSERVICE: é usada para especificar o nome do serviço de conexão desejado. Quando definida, o psql tentará conectar-se ao serviço correspondente ao nome especificado no seu arquivo pg_service.conf. Trata-se apenas de um atalho para entrar por padrão em um serviço específico que você utiliza com mais frequência, sem precisar citar o nome dele.

Se você tiver um servidor PostgreSQL rodando na máquina, você pode utilizar um .pg_service.conf compartilhado com vários usuários. Logo, ele ficará armazenado em um local diferente do diretório home do seu usuário. O local varia de acordo com a instalação do PostgreSQL, podendo ser verificado das seguintes formas:

No Debian:

Debian shell: verificando local do arquivo pg_service.conf
$ pg_config --sysconfdir
/etc/postgresql-common

No RedHat:

RedHat shell: verificando local do arquivo pg_service.conf
$ /usr/pgsql-14/bin/pg_config --sysconfdir
/etc/sysconfig/pgsql

No Windows:

Windows shell: verificando local do arquivo pg_service.conf
& 'C:\Program Files\PostgreSQL\16\bin\pg_config.exe' --sysconfdir
C:/Program Files/PostgreSQL/16/etc

Configuração e exemplo

Linux Debian

Crie o arquivo pg_service.conf em um editor de texto no diretório inicial do usuário (o ponto no início demonstra se tratar de um arquivo oculto, o que aprimora sua segurança). Como utilizamos o editor nano, ficou assim (rodando com usuário postgres do sistema):

Linux shell: criando o arquivo pg_service.conf
$ nano ~/.pg_service.conf

Dentro desse arquivo, você deve adicionar as seguintes informações, referentes ao nome que deseja dar ao serviço: o endereço do hospedeiro do servidor, o número de porta para conexão, o usuário que vai acessar o banco e o nome do banco:

Linux shell: slavando informações do serviço no arquivo pg_service.conf
[meu-servico]
host=localhost
port=5432
user=usuario_ex1
dbname=meu_banco

É ainda possível ter mais de um serviço definido aqui, separando um do outro por uma linha pulada e que deve se iniciar com o nome do outro serviço entre colchetes novamente, conforme exemplo:

Linux shell: adicionando mais um serviço no arquivo pg_service.conf
[meu-servico]
host=localhost
port=5432
user=usuario_ex1
dbname=meu_banco

[meu-outro-servico]
host=127.0.0.1
port=5433
user-usuario_ex2
dbname=meu_outro_banco
password=minha_senha

Após configurar o arquivo, ao conectar-se ao PostgreSQL, você pode usar os serviços definidos usando o utilitário psql. Por exemplo:

Linux shell: utilizando o arquivo pg_service.conf para conexão ao psql
psql service=meu-servico

Isso fará com que o psql utilize as informações de conexão do serviço meu-servico definido no arquivo pg_service.conf. Se a senha não estiver especificada no arquivo de serviço, o psql solicitará a senha durante a conexão. Você pode ainda utilizar o pg_service.conf para armazenar a maioria das informações da conexão e deixar apenas as senhas em outro arquivo, o .pgpass, se quiser aumentar um pouco a segurança do ambiente.
No entanto, se você for armazenar as senhas dos usuário no pg_service.conf, recomendamos mudar as permissões de acesso do arquivo para 600, como fazemos no pgpass:

Linux shell: definindo permissões do arquivo pg_service.conf
$ chmod 600 ~/.pg_service.conf
$ ls -lha ~/.pg_service.conf
-rw-r--r--. 1 postgres postgres 181 Apr  5 11:25 .pg_service.conf

Windows

Aqui, vamos criar o arquivo com o mesmo nome .pg_service.conf, porém com um local específico: na pasta de dados de aplicações do usuário, que é oculta, mas pode ser encontrada com o atalho “Windows + R” > digite “%APPDATA%” > clique no botão Enter. Dentro dessa pasta, deve-se procurar por uma chamada “postgresql”, e caso ela não exista, é só criar, pois esse será o local onde vamos guardar nosso arquivo: C:\Users\<usuário>\AppData\Roaming\postgresql
Iremos inserir os mesmos dados que inserimos para o arquivo no Debian:

Edição do arquivo .pg_service.conf no Windows

Então, é só acessar o psql da mesma forma que a demonstrada para Debian:

Windows shell: acessando o psql com o serviço do .pg_service.conf
psql service=meu-servico

Conclusão

O pg_service é provavelmente a forma mais prática de gerenciar várias conexões com o PostgreSQL no modo texto. Gostaríamos, no entanto, de fazer aqui algumas considerações bem objetivas:

  • Se você utiliza apenas ferramentas gráficas, isso pode não fazer muito sentido para você. Ferramentas, como o pgAdmin4, têm seu próprio mecanismo para gerenciar conexões de forma gráfica;
  • Se você precisa que a sua aplicação acesse diferentes ambientes e necessita apenas guardar a senha de acesso fora da sua aplicação, o .pgpass pode ser uma solução simples e elegante para isso;
  • Se você precisa administrar apenas um ou dois servidores Postgres em um ambiente isolado, as variáveis de ambiente podem ser mais simples de se utilizar, além de serem uma solução mais direta e objetiva;
  • Se você, como nós, tem que lidar com diversos servidores, acessando diretamente via linha de comando, o pg_service.conf vai certamente facilitar a sua vida.

Particularmente, recomendamos que você utilize uma combinação com as três soluções: 

  • Organize os dados das suas conexões com o .pg_service.conf, mas sem guardar as senhas nele;
  • Armazene as suas senhas no .pgpass, é uma forma elegante de ter um pouquinho mais de segurança ao lidar com senhas;
  • Utilize as variáveis de ambiente, como o $PGSERVICE, para configurar no seu shell o serviço padrão que você mais utiliza no dia a dia e agilize um pouco mais o seu trabalho.

Claro, se você compartilha o mesmo ambiente com outras pessoas, convém combinar e documentar tudo isso para ninguém ficar confuso no meio de tantos recursos. 
Na verdade, gostamos muito de utilizar usuários isolados (tanto no SO como no banco) em cada ambiente que acessamos, para garantir a privacidade, a segurança, a rastreabilidade e, claro, a conveniência para configurar o ambiente de trabalho de forma ágil, eficiente e personalizada. 
Achamos que com esse conjunto de ferramentas as coisas vão começar a ficar mais fáceis. Só tome cuidado para não se perder no meio disso tudo. 

Boa diversão!

Compartilhe

Você pode gostar

Tipos de cargas dos bancos de dados

Introdução Cargas de dados referem-se aos diferentes tipos de operações e transações que um banco de dados deve processar. Essas cargas variam conforme o tipo

Catálogo do sistema (pg_catalog)

Introdução O pg_catalog é um schema especial no PostgreSQL que guarda todos os segredos do seu banco de dados. Quer saber como suas tabelas são

Arquivos, diretórios e processos

Introdução No PostgreSQL, a organização de arquivos e diretórios, bem como a gestão de processos, são componentes fundamentais para entender o seu funcionamento. Este artigo

plugins premium WordPress