Instalando Zabbix Server com MySQL, Grafana e Traefik em Docker
Tags: zabbix, docker, grafana, traefik
Published: 2023-11-13 11:42:04

<div style='text-align: justify;'>
O monitoramento eficaz da infraestrutura de TI é uma necessidade crítica para qualquer organização que deseje manter o desempenho e a disponibilidade de seus sistemas. O Zabbix é uma plataforma Open Source amplamente utilizada para monitorar servidores, redes e serviços, oferecendo recursos poderosos de coleta de dados e geração de alertas. Além disso, a combinação do Zabbix com outras ferramentas, como MySQL para armazenamento dos dados, Grafana para visualização de métricas e Traefik para gerenciamento de tráfego, pode criar um ambiente de monitoramento completo e altamente escalável.

Neste tutorial, irei guiá-lo pelo processo de instalação do Zabbix Server utilizando o MySQL como Banco de Dados, o Grafana para criação de Dashboards robustos para analisar métricas geradas pelo Zabbix Server, e o Traefik para gerenciar o tráfego das URLs para os respectivos serviços, além da geração do certificado utilizando o Let's Encrypt, tudo dentro de contêineres Docker. Essa abordagem facilita a implantação e a manutenção do sistema de monitoramento, permitindo que você tenha um ambiente configurado rapidamente. Vamos abordar cada etapa do processo, desde a configuração do Docker até a integração das ferramentas, garantindo que você tenha uma solução robusta de monitoramento em funcionamento. Prepare-se para explorar o mundo do monitoramento de sistemas de forma eficaz e eficiente.

## Ambiente
Para está implementação, estou utilizando um servidor Linux com a distribuição Ubuntu na versão 22.04.

O servidor que utilizei possui a seguinte configuração: 2 vCPUs, 2GB RAM e um disco SSD de 30GB.

Para que nosso servidor seja acessível pela internet, e para que o nosso Traefik gere o certificado via Let's Encrypt, precisamos possuir um endereço IP público e precisamos liberar as portas 80 e 443 para a internet.

Também é necessário possuirmos um registro DNS para criarmos as URLs para o Zabbix Server Web e para o nosso Grafana.

Disponibilizei o Docker Compose no seguinte repositório do GitHub: https://github.com/alfredotavio/zabbix-grafana-docker

Imagens utilizadas:
* [mysql](https://hub.docker.com/_/mysql/) - Versão 8.0
* [zabbix-server-mysql](https://hub.docker.com/r/zabbix/zabbix-server-mysql/) - Versão 6.0
* [zabbix-web-apache-mysql](https://hub.docker.com/r/zabbix/zabbix-web-apache-mysql/) - Versão 6.0
* [zabbix-web-service](https://hub.docker.com/r/zabbix/zabbix-web-service/) - Versão 6.0
* [grafana](https://hub.docker.com/r/grafana/grafana/) - Versão 9.5.3
* [traefik](https://hub.docker.com/_/traefik/) - Versão latest

Estrutura:
```
.
├── env
│   ├── db.env
│   ├── grafana.env
│   ├── traefik.env
│   ├── zbx-rpt.env
│   ├── zbx-srv.env
│   └── zbx-web.env
├── .env
└── docker-compose.yml
```

Não irei abordar a instalação do Docker Engine, caso ainda não saiba realizar a instalação, consulte este outro post:

https://dev.to/alfredotavio/como-instalar-o-docker-engine-no-linux-5092
</div>

## Etapa 01 - Criando os registro DNS
Antes de tudo, vamos definir e criar as URLs que iremos utilizar para o Zabbix Server Web e para o nosso Grafana.

Irei utilizar o domínio alfredocastro.com.br, defini a URL zabbix.alfredocastro.com.br para o Zabbix Server e a URL grafana.alfredocastro.com.br para o Grafana.

Acesse o seu gerenciador de registros DNS do seu domínio e crie dois registro do tipo A colocando como valor o endereço IP público do seu servidor.

Veja um exemplo:
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8m0ov7o2cialdfrhs4pp.png)

Para consultar a propagação do registro criado, consulte o site: [WhatsMyDNS](https://www.whatsmydns.net/)
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1f3fx615iirjdr47vsi5.png)
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/n1za8rtew3gxs2fthst9.png)

## Etapa 02 - Clonando o repositório do Docker Compose
Após realizar a instalação do Docker Engine, vamos dar seguimento com a nossa implementação.
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/spbp6rfc0jhxypbyyc7a.png)

Execute os seguintes comandos para clonar nosso Docker Compose para dentro do nosso servidor:
```bash
cd /opt
git clone https://github.com/alfredotavio/zabbix-grafana-docker.git
cd /opt/zabbix-grafana-docker
```
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/f04ceakighj5obsxvv2a.png)

>NOTA: Utilizei o diretório /opt do Linux, caso queira você pode alterar para outro diretório de sua escolha.

## Etapa 03 - Definindo as variáveis
Primeiro vamos definir as variáveis com as URLs de acesso, edite o arquivo .env na raiz do projeto e altere as variáveis ZABBIX_URL para a URL do Zabbix Server e a GRAFANA_URL para a URL do Grafana, altere a variável ACME_EMAIL para um endereço de e-mail seu:
```bash
vim /opt/zabbix-grafana-docker/.env
```
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gqu6vb6sz4b13uvqh962.png)

Agora devemos definir as variáveis do Banco de Dados MySQL. Edite o arquivo db.env dentro do diretório env. Irei alterar apenas as variáveis MYSQL_ROOT_PASSWORD e MYSQL_PASSWORD, essas variáveis define a senha para o usuário root e a senha para o usuário da variável MYSQL_USER.
```bash
vim /opt/zabbix-grafana-docker/env/db.env
```
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/updkyz1ycpum05leogtl.png)

>NOTA: Não irei alterar as demais variáveis pois irei subir apenas para demonstração. Recomendo você ler a documentação do Zabbix para definir as variáveis de acordo com o cenário do seu ambiente a ser monitorado.

## Etapa 04 - Executando o Docker Compose
Para subirmos nosso ambiente, basta executarmos o seguinte comando dentro do diretório raiz onde está nosso docker-compose.yml:
```bash
docker compose up -d
```
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5bm8l0c67y0r84jawfsj.png)

>NOTA: O Docker irá fazer o download e o provisionamento de todas as imagens. Aguarde alguns minutos até que as imagens concluam a primeira configuração.

## Etapa 05 - Acessando o ambiente
Acesse a URL do Zabbix Server que definimos na primeira etapa, será solicitado um usuário e senha para acessar, por padrão o usuário é o "Admin" e a senha é "zabbix".
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/icvt4nwzrb8byw9iwjsj.png)
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2d7cu1br89so22xyaeoa.png)

Após o primeiro login, altere a senha do usuário Admin o quanto antes para evitar qualquer acesso indevido, para isso, clique em "User settings > Profile" no campo inferior esquerdo.
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/92bjfzqcaujglsq7yi4x.png)

Clique em "Change password".
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jbnwj75t96ciovo55q6w.png)

Digite a nova senha em "Password" e repita em "Password (once again)", em seguida clique em "Update".
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d8a65i52dxdapw8xbhco.png)
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fvjknvnekexbv04nauwd.png)

Agora acesse a URL do Grafana que definimos na primeira etapa, será solicitado um usuário e senha para acessar, por padrão o usuário é o "admin" e a senha é "admin".
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zdl115ucsz0gqnulwat9.png)

Em seguida será solicitado a alteração da senha, digite a senha no campo "New password" e repita em "Confirm new password", em seguida clique em "Submit".
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/w3xenbhqlcpzt42wuu0s.png)
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ch9armnpfepqdqybpvy4.png)

## Etapa 06 - Integrando o Grafana com o Zabbix Server
Para realizar a integração do Grafana com o Zabbix Server, é necessário a instalação de um plugin, em nosso arquivo Docker Compose está configurado para realizar a instalação automaticamente.

Antes de configurar o plugin, devemos acessar o Zabbix Server e criar um usuário para realizar a integração, toda a comunicação entre o Grafana e o Zabbix Server é feita por API e o Grafana irá utilizar esse usuário para acessar a API.

Clique em "Administration > Users" na barra lateral esquerda.
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sitr6xwenq0samzkhhdh.png)

Clique em "Create user" no canto superior direito.
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d4zwnghxowxnf1xtk1k1.png)

Preencha as informações para a criação do usuário:

Username: grafana

Name: Grafana

Last name: User

Groups: Zabbix administrators

Password: DEFINA-UMA-SENHA

Password (once again): DEFINA-UMA-SENHA

Altere para a aba "Permissions".
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rxeh8d74e8gi5kd15hmn.png)

Role: Admin role

Em seguida, clique em "Add".
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cq4bxzlwh7zxzs844m4o.png)
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/v2gkiaevih6cgkkgxcja.png)

Acesse o Grafana, clique nos três tracinhos no canto superior esquerdo, clique em "Administration > Plugins".
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/k61wo9y2o89jcqmzw0ip.png)

Pesquise por "zabbix", ele irá mostrar o plugin "Zabbix - By Alexander Zobnin" já instalado, clique no plugin.
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yp319hp78cb3e7jbdb0n.png)

No canto superior direito, clique no botão "Enable".
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bv8pwy6m1pngmx6n1by7.png)

No menu lateral esquerdo, clique em "Data sources".
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/l5pvj80kluwgihzwmaf6.png)

Clique no botão "Add data source".
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/z5rmp8g74rjxoziajoz0.png)

Filtre por "zabbix", em seguida clique no plugin do "Zabbix".
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5tu6k9driy8475c2agnc.png)

Faça as seguintes configurações:

URL: https://zabbix.alfredocastro.com.br/api_jsonrpc.php
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/p52x90198hmi031i08xy.png)

Username: grafana

Password: SENHA-DEFINIDA-PARA-O-USUÁRIO-GRAFANA

Clique em "Save & test".
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xv6lipqpu7hnuplouogk.png)

Se tudo ocorreu conforme o esperado, o Grafana exibirá uma mensagem contendo a versão do Zabbix API.
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/s8h7n24dohmj20kti777.png)

## Etapa 06 - Instalando o Zabbix Agent no próprio servidor
Ao logar no Zabbix Server Web, você pode perceber que possui um alerta falando que o Zabbix Agent no host Zabbix server não está disponível.
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tqk1p85urri2kk3t6xdj.png)

Para corrigir esse alerta, devemos instalar o Zabbix Agent em nosso servidor, onde o nosso Docker está. Acesse o servidor via SSH e siga os procedimentos abaixo:

Adicione o repositório do Zabbix Release 6.0, execute os seguintes comandos:
```bash
cd /tmp
wget https://repo.zabbix.com/zabbix/6.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_latest%2Bubuntu22.04_all.deb
dpkg -i zabbix-release_latest+ubuntu22.04_all.deb
apt-get update
apt-get install zabbix-agent -y
```
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xrw692he48bv1li9qdsh.png)

Execute os comandos abaixo para realizarmos a configuração do arquivo zabbix_agentd.conf:
```bash
cd /etc/zabbix/
mv zabbix_agentd.conf zabbix_agentd.conf.original
echo "##### Zabbix Agent #####" >> /etc/zabbix/zabbix_agentd.conf
cat zabbix_agentd.conf.original | grep -Ev '^#|^$' >> zabbix_agentd.conf
sed -i 's/127.0.0.1/10.10.0.11/g' /etc/zabbix/zabbix_agentd.conf
sed -i 's/Zabbix server/Zabbix server/g' /etc/zabbix/zabbix_agentd.conf
echo "Timeout=15" >> /etc/zabbix/zabbix_agentd.conf
echo "DebugLevel=3" >> /etc/zabbix/zabbix_agentd.conf
systemctl enable zabbix-agent
service zabbix-agent restart
```
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ycigw226y88k4nmltn1t.png)

>NOTA: Para o Zabbix Agent do servidor Docker, devemos adicionar o IP privado do container chamado zabbix-server, de acordo com o nosso docker-compose.yml esse IP é o 10.10.0.11.

Agora devemos alterar o IP dentro do Zabbix Server Web, acesse a URL, faça login e clique em "Configuration > Hosts" na barra lateral esquerda.
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d9x94jodkuemnacldboy.png)

Clique no nome do host "Zabbix server".
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/khtthoeear3s1y3qq8he.png)

Altere o "IP address" de "127.0.0.1" para o endereço IP privado do servidor Docker, você pode visualizar o endereço IP privado executando o comando "ifconfig" ou "ip addr", em seguida clique em "Update".
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9ekg81d6nzzpp6wg5rxb.png)
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/v4160clpiniwszpu49mh.png)

Após alguns instantes o alerta será marcado com o Status "RESOLVED".
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/u9n5rbf69fcihrcvdhyg.png)

## Troubleshooting - Docker Logs
Se por algum motivo você está enfrentado algum problema para subir o ambiente em Docker, você pode utilizar o comando abaixo para verificar os logs dos containers e com isso encontrar um norte para a resolução.
```bash
cd /opt/zabbix-grafana-docker/
docker compose logs -f
```
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4iupxm6jnafemmixd1g8.png)

Espero tê-lo ajudado! Se houver alguma dúvida, não hesite em entrar em contato.