Instalando e configurando o MongoDB no Ubuntu
Tags: ptbr, braziliandevs, mongodb, database
Published: 2021-02-20 18:44:22

- [Instalando o MongoDB](#instalando-o-mongodb)
- [Criando usuários e definindo que queremos usar autenticação](#criando-usuários-e-definindo-que-queremos-usar-autenticação)
  - [Definindo que queremos usar autenticação](#definindo-que-queremos-usar-autenticação)
  - [Criando um usuário mais restrito](#criando-um-usuário-mais-restrito)
  - [Alterando a senha de um usuário MongoDB](#alterando-a-senha-de-um-usuário-mongodb)

Para instalar o MongoDB em um servidor linux é muito fácil, porem precisamos configurar alguns itens de segurança antes de começar utiliza-lo em nossas aplicações.  
Para seguir os passos abaixo vamos considerar que você já tenha uma maquina em execução com Ubuntu rodando.

## Instalando o MongoDB

Vamos seguir uma sequencia de comandos para realizar a instalação seguindo a [documentação oficial](https://docs.mongodb.com/manual/administration/install-community/). Nos Links abaixo a versão do MongoDB fica explicita na URL utilizada, certifique-se de consultar a documentação acima pra copiar esses links sempre com a ultima versão disponível.

1 - Importe a chave pública usada pelo sistema de gerenciamento de pacotes.

```sh
wget -qO - https://www.mongodb.org/static/pgp/server-4.4.asc | sudo apt-key add -
```

2 - Crie um arquivo de lista para MongoDB.

```sh
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/4.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list
```

3 - Recarregue o banco de dados do pacote local.

```sh
sudo apt-get update
```

4 - Instale o pacote MongoDB.

```sh
sudo apt-get install -y mongodb-org
```

5 - Iniciar o serviço do MongoDB

```sh
sudo service mongod start
```

6 - Verifique se a instalação foi concluída e se o serviço ficou executando

```sh
sudo service mongod status
# Output
mongod.service - MongoDB Database Server
  Loaded: loaded (/lib/systemd/system/mongod.service; disabled; vendor preset: enabled)
  Active: active (running) since Sat 2021-02-20 11:14:01 -03; 39s ago
  Docs: https://docs.mongodb.org/manual
  Main PID: 14819 (mongod)
  Memory: 64.5M
```

7 - Você pode opcionalmente garantir que o MongoDB iniciará após uma reinicialização do sistema, emitindo o seguinte comando:

```sh
sudo systemctl enable mongod
```


Pronto, já temos nosso MongoDB rodando em nossa maquina, mas ainda está sem senha e sem usuários para autenticação. Caso essa instalação seja em uma maquina de desenvolvimento até aqui já é o suficiente para conectar nosso _Robomongo_ (Client Desktop) ou nossa aplicação a ele. Mas caso essa instalação vai ser utilizada pra um ambiente de servidor (produção ou homologação) vamos precisar permitir acesso externo a ele e também cadastrar usuários para autenticação, que veremos logo em seguida.

## Criando usuários e definindo que queremos usar autenticação

Na maquina que instalamos o MongoDB vamos abrir o terminal e executar `mongo` para acessar a interface de linha de comando do interna do MongoDB onde vai aparecer um prefixo `>`. Quando quiser sair deste terminal digite `> exit`.

Dentro da linha de comando do MongoDB vamos executar o comando abaixo para dizer em qual banco de dados queremos executar nossos comandos.

```sh
> use admin
# Output
switched to db admin
```

Agora vamos criar um usuário que chamado `root` com a senha `root` que tenha permissão total para realizar qualquer operação dentro do MongoDB.

```js
> db.createUser({
    user: "root",
    pwd: "root",
    roles:[{ "role" : "root", "db" : "admin" }]
  });
// Output
Successfully added user: {...}
```

### Definindo que queremos usar autenticação

Apenas criar o usuário não vai exigir que ele seja utilizado para acessar o MongoDB, precisamos alterar o arquivo de configuração para sinalizar que queremos utilizar autenticação.

```sh
# sair no terminal do mongo
> exit
# editar o arquivo de configuração no mongo
sudo nano /etc/mongod.conf
```

encontre a linha

```
#security:
```

e troque por

```
security:
  authorization: enabled
```

Caso queira acessar o MongoDB de outras maquinas já aproveite e troque a linha

```
  bindIp: 127.0.0.1
```

por

```
  bindIp: 0.0.0.0
```

Agora vamos reiniciar o serviço do MongoDB para considerar essas novas configurações

```sh
sudo service mongod restart
```

A partir de agora quando for conectar no nosso banco de dados `mongodb://localhost:27017` sem passar usuário e senha não vamos mais conseguir. Mas caso utilize nosso usuário e senha vamos conseguir `mongodb://root:root@localhost:27017/admin`.
Note que uma string de conexão com MongoDB é composta da seguinte maneira `mongodb://<usuario>:<senha>@localhost:27017/<banco-usado-na-criacao-usuario>`

### Criando um usuário mais restrito

Não queremos um usuário com permissão total ao MongoDB para utilizar-lo em nossa aplicação, então vamos criar um usuário que tenha acesso apenas a um determinado banco e que tenha apenas permissão de escrita e leitura. Leia mais sobre outras [roles de acesso](https://docs.mongodb.com/manual/reference/built-in-roles/).

Vamos criar um usuário chamado `app` com a senha `app.senha.123` que vai ter acesso apenas ao banco de dados `meu-banco-1`.

O primeiro passo vai ser autenticar-se em nosso usuário root (acesso completo)

```sh
> use admin
> db.auth("root","root");
```

Depois de autenticados dentro do banco `admin` devemos identificar qual o banco de dados queremos criar um novo usuário.

```sh
> use meu-banco-1
```

Agora sim podemos criar nosso usuário

```sh
> db.createUser({
    user: "app",
    pwd: "app.senha.123",
    roles : [{"role" : "readWrite", "db" : "meu-banco-1"}]
  });
```

Pronto, agora temos um usuário que tem acesso apenas pra leitura e gravação em apenas um determinado banco.

### Alterando a senha de um usuário MongoDB

Para alterar a senha de um usuário MongoDB basta acessar o banco de dados qual ele pertence e executar `db.changeUserPassword(<usuario>,<nova-senha>)`

```sh
> use meu-banco-1
> db.changeUserPassword("app", "app.senha.456");
```

Por hoje é isso, em breve teremos mais posts sobre MongoDB, de como criar um backup automatizado do nosso banco e salvar esse backup em um _bucket s3_ da aws.