Este guia detalha o processo de instalação e configuração do MongoDB versão 7.0 como um serviço de sistema systemd, gerenciado por contêineres Podman. Abordaremos a criação de volumes persistentes, a implantação do contêiner MongoDB e a integração com o systemd para gerenciamento de ciclo de vida.
1. Configuração e Implantação do Contêiner
1.1. Criação de Volumes para Persistência
Para garantir a persistência dos dados e configurações do MongoDB, criaremos dois volumes Podman dedicados: um para os dados do banco de dados e outro para os arquivos de configuração.
Crie o volume para as cnofigurações:
podman volume create --label app=mongodb --label role=config mongodb-config-vol
Crie o volume para os dados do banco de dados:
podman volume create --label app=mongodb --label role=data mongodb-data-vol
Para inspecionar um volume e verificar seus detalhes, incluindo o ponto de montagem no host:
$ podman volume inspect mongodb-data-vol
[
{
"Name": "mongodb-data-vol",
"Driver": "local",
"Mountpoint": "/home/usuario/.local/share/containers/storage/volumes/mongodb-data-vol/_data",
"CreatedAt": "2024-03-10T10:00:00.000000000-03:00",
"Labels": {
"app": "mongodb",
"role": "data"
},
"Scope": "local",
"Options": {}
}
]
1.2. Preparação do Arquivo de Configuração
É uma boa prática fornecer um arquivo de configuração customizado para o MongoDB. Crie um arquivo mongod.conf no volume de configuração recém-criado. O caminho exato do ponto de montagem pode ser obtido usando podman volume inspect.
Primeiro, crie o diretório se ele não existir (embora podman volume create já o faça):
mkdir -p $(podman volume inspect --format '{{ .Mountpoint }}' mongodb-config-vol)
Agora, crie o arquivo mongod.conf. Inicialmente, ele pode estar vazio ou conter configurações básicas conforme sua necessidade. Por exemplo:
touch $(podman volume inspect --format '{{ .Mountpoint }}' mongodb-config-vol)/mongod.conf
Exemplo de conteúdo básico para mongod.conf (opcional, para mais controle):
# /home/usuario/.local/share/containers/storage/volumes/mongodb-config-vol/_data/mongod.conf
systemLog:
destination: file
logAppend: true
path: /var/log/mongodb/mongod.log
storage:
dbPath: /data/db
engine: wiredTiger
net:
port: 27017
bindIp: 0.0.0.0 # Permite conexões de qualquer IP (ajuste para segurança em produção)
security:
authorization: "enabled" # Habilita autenticação
processManagement:
fork: false # Contêineres devem rodar em primeiro plano
Para este exemplo, o contêiner será iniciado com o arquivo de configuração, mas os parâmetros de usuário e senha serão passados via variáveis de ambiente, simplificando a configuração inicial.
1.3. Criação do Contêiner MongoDB
Agora, vamos criar o contêiner Podman para o MongoDB 7.0, vinculando os volumes de dados e configuração, expondo a porta necessária e definindo as credenciais do usuário administrador inicial.
podman create \
--name mongodb-instance \
--restart=always \
--publish 27017:27017 \
--volume mongodb-config-vol:/etc/mongodb-conf:Z \
--volume mongodb-data-vol:/data/db:Z \
--volume /usr/share/zoneinfo/America/Sao_Paulo:/etc/localtime:ro \
--env MONGO_INITDB_ROOT_USERNAME=dbadmin \
--env MONGO_INITDB_ROOT_PASSWORD='SecureMongoDBPass!23' \
docker.io/library/mongo:7.0 \
--config /etc/mongodb-conf/mongod.conf
Note o uso de :Z nos volumes para aplicar os rótulos SELinux corretos, e :ro para o fuso horário (somente leitura). O caminho /etc/mongodb-conf/mongod.conf dentro do contêiner é onde o arquivo de configuração do volume mongodb-config-vol será montado.
2. Geranciamento do Serviço systemd
2.1. Geração da Unidade de Serviço systemd
O Podman pode gerar automaticamente um arquivo de unidade de serviço systemd para o contêiner criado. Isso permite gerenciar o contêiner como um serviço do sistema.
podman generate systemd --name mongodb-instance > ~/.config/systemd/user/mongodb-service.service
Este comando cria o arquivo mongodb-service.service no diretório de configuração de usuário do systemd.
2.2. Recarregando o Daemon do systemd
Após criar ou modificar um arquivo de unidade de serviço, é necessário recarregar o daemon do systemd para que ele reconheça as mudanças.
systemctl --user daemon-reload
2.3. Verificação do Status do Serviço
Verifique o status do serviço recém-criado. Inicialmente, ele estará inativo.
$ systemctl --user status mongodb-service
○ mongodb-service.service - Podman container-mongodb-instance.service
Loaded: loaded (/home/usuario/.config/systemd/user/mongodb-service.service; disabled; vendor preset: enabled)
Active: inactive (dead)
Docs: man:podman-generate-systemd(1)
2.4. Habilitando Inicialização Automática
Para que o serviço MongoDB inicie automaticamente no boot do sistema (para o usuário logado), habilite-o:
$ systemctl --user enable mongodb-service
Created symlink /home/usuario/.config/systemd/user/default.target.wants/mongodb-service.service → /home/usuario/.config/systemd/user/mongodb-service.service.
2.5. Iniciando o Serviço MongoDB
Agora, inicie o serviço MongoDB via systemd:
$ systemctl --user start mongodb-service
Verifique o status novamente para confirmar que o serviço está ativo e em execução:
$ systemctl --user status mongodb-service
● mongodb-service.service - Podman container-mongodb-instance.service
Loaded: loaded (/home/usuario/.config/systemd/user/mongodb-service.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2024-03-10 10:05:30 BRT; 10s ago
Docs: man:podman-generate-systemd(1)
Process: 12345 ExecStartPre=/bin/rm -f /run/user/1000/mongodb-service.service.ctr-id (code=exited, status=0/SUCCESS)
Main PID: 12456 (conmon)
Tasks: 20 (limit: 9234)
Memory: 15.5M
CPU: 250ms
CGroup: /user.slice/user-1000.slice/user@1000.service/app.slice/mongodb-service.service
├─12400 /usr/bin/slirp4netns --disable-host-loopback ...
├─12410 containers-rootlessport
├─12420 containers-rootlessport-child
└─12456 /usr/bin/conmon ...
Mar 10 10:05:33 host systemd[1000]: Started Podman container-mongodb-instance.service.
Mar 10 10:05:34 host conmon[12456]: {"t":{"$date":"2024-03-10T13:05:34.123+00:00"},"s":"I", "c":"CONTROL", "id":20698, "ctx":"main","msg":"***** SERVER RESTARTED *****"}
# ... (outros logs do MongoDB)
2.6. Acessando Logs do Serviço
Para visualizar os logs gerados pelo serviço systemd, utilize o journalctl:
$ journalctl --user --unit mongodb-service -f
3. Inspeção e Conexão ao Contêiner
3.1. Monitoramento de Logs do Contêiner via Podman
Além de journalctl, você pode visualizar os logs diretamente do contêiner usando o comando podman logs:
$ podman logs -f mongodb-instance
about to fork child process, waiting until server is ready for connections.
forked process: 23
{"t":{"$date":"2024-03-10T13:05:34.123+00:00"},"s":"I", "c":"CONTROL", "id":20698, "ctx":"main","msg":"***** SERVER RESTARTED *****"}
{"t":{"$date":"2024-03-10T13:05:34.130+00:00"},"s":"I", "c":"CONTROL", "id":23285, "ctx":"main","msg":"Automatically disabling TLS 1.0, to force-enable TLS 1.0 specify --sslDisabledProtocols 'none'"}
# ... (mais logs do MongoDB)
{"t":{"$date":"2024-03-10T13:05:35.000+00:00"},"s":"I", "c":"NETWORK", "id":23016, "ctx":"listener","msg":"Waiting for connections","attr":{"port":27017,"ssl":"off"}}
4. Interagindo com o Servidor MongoDB
Para testar a instalação, você pode usar um cliente MongoDB temporário, executando-o em outro contêiner Podman e conectando-o à instância recém-configurada.
4.1. Conexão Cliente Temporária
Utilize um contêiner cliente temporário para se conectar ao servidor MongoDB. Substitua 127.0.0.1 pelo IP do seu host se estiver conectando de outra máquina ou pelo IP do contêiner se eles estiverem na mesma rede bridge (neste caso, 127.0.0.1 funciona para localhost).
Conectando-se ao banco de dados meuapp_db com as credenciais de administrador:
podman run -it --rm docker.io/library/mongo:7.0 \
mongo \
--host 127.0.0.1 \
--port 27017 \
--username dbadmin \
--password 'SecureMongoDBPass!23' \
--authenticationDatabase admin \
meuapp_db
Exemplo de saída de uma sessão de shell do MongoDB:
$ podman run -it --rm docker.io/library/mongo:7.0 mongo \
--host 127.0.0.1 --port 27017 \
--username dbadmin --password 'SecureMongoDBPass!23' \
--authenticationDatabase admin \
meuapp_db
MongoDB shell version v7.0.6
connecting to: mongodb://127.0.0.1:27017/meuapp_db?authSource=admin&compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("a1b2c3d4-e5f6-7890-1234-567890abcdef") }
MongoDB server version: 7.0.6
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see
https://www.mongodb.com/docs/
Questions? Try the MongoDB Developer Community Forums
https://community.mongodb.com
---
The server generated these startup warnings when booting:
2024-03-10T10:05:34.123-03:00: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine. See http://dochub.mongodb.org/core/prodnotes-filesystem
---
> show dbs;
admin 0.000GB
config 0.000GB
local 0.000GB
meuapp_db 0.000GB
> exit
bye
4.2. Conexão Utilizando URI de Conexão
Outra forma de conectar é especificando a URI de conexão completa. Esta abordagem é mais concisa.
podman run -it --rm docker.io/library/mongo:7.0 \
mongo \
--username=dbadmin \
--password='SecureMongoDBPass!23' \
mongodb://127.0.0.1:27017/meuapp_db?authSource=admin
Exemplo de saída com URI:
$ podman run -it --rm docker.io/library/mongo:7.0 mongo \
--username=dbadmin --password='SecureMongoDBPass!23' \
mongodb://127.0.0.1:27017/meuapp_db?authSource=admin
MongoDB shell version v7.0.6
connecting to: mongodb://127.0.0.1:27017/meuapp_db?authSource=admin&compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("f1e2d3c4-b5a6-9870-1234-567890fedcba") }
MongoDB server version: 7.0.6
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see
https://www.mongodb.com/docs/
Questions? Try the MongoDB Developer Community Forums
https://community.mongodb.com
---
The server generated these startup warnings when booting:
2024-03-10T10:05:34.123-03:00: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine. See http://dochub.mongodb.org/core/prodnotes-filesystem
---
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
meuapp_db 0.000GB
> exit
bye