Configurando o MongoDB 7.0 como Serviço systemd Usando Podman

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

Tags: mongodb podman systemd Linux Containerization

Publicado em 9-11 23:36