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:
$ pg_config --sysconfdir
/etc/postgresql-common
No RedHat:
$ /usr/pgsql-14/bin/pg_config --sysconfdir
/etc/sysconfig/pgsql
No Windows:
& '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):
$ 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:
[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:
[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:
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:
$ 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:
Então, é só acessar o psql da mesma forma que a demonstrada para Debian:
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!