Read this article in English.
Olá, comunidade! Neste artigo, compartilho um projeto que desenvolvi para criar um laboratório completo e isolado de monitoramento com Zabbix. O ambiente roda em um cluster Docker Swarm dentro de uma máquina virtual local. O Vagrant provisiona a VM, o Ansible automatiza a configuração, o Traefik publica os serviços com TLS, o PostgreSQL utiliza TimescaleDB e o Grafana complementa a visualização das métricas.
O laboratório cobre o caminho desde a coleta dos dados até sua apresentação em dashboards, dentro de uma estrutura controlada e reproduzível. A seguir, mostro como cada componente participa dessa arquitetura.
Stack e Tecnologias
O laboratório integra várias tecnologias open source, cada uma com uma responsabilidade específica na arquitetura:
Vagrant + VirtualBox
O Vagrant automatiza a criação e a configuração da máquina virtual como código. No laboratório, ele provisiona uma VM no VirtualBox com recursos como 2 CPUs e 4 GB de RAM, ajustáveis no settings.yaml. Isso isola o ambiente de monitoramento do host e facilita sua recriação. O VirtualBox atua como hypervisor e expõe as portas necessárias, como 80 e 443 para web e 10050 a 10052 para o Zabbix.
Ansible
O Ansible cuida de tudo o que acontece depois da criação da VM. Ele instala o Docker, configura o Swarm, implanta as stacks e gera certificados TLS autoassinados. A idempotência limita a execução às mudanças necessárias e mantém os deployments reproduzíveis. Playbooks como deploy-full-zabbix.yml coordenam essas tarefas.
Docker Swarm
O Swarm orquestra os containers em um cluster leve. Ele gerencia a stack do Zabbix como services replicáveis, com balanceamento interno e descoberta automática. Componentes como proxies podem ser escalados para simular um ambiente distribuído, enquanto os volumes persistentes em /data/zabbix-prod mantêm os dados após reinicializações.
Zabbix (Server, Frontend, Proxies)
Este é o núcleo da stack de monitoramento. O server coleta e processa métricas por agents ou proxies; o frontend fornece a interface de configuração e visualização; e os proxies distribuem a carga e monitoram redes remotas. A quantidade é controlada por proxy_count.
PostgreSQL + TimescaleDB
O PostgreSQL armazena configurações e metadados do Zabbix. A extensão TimescaleDB otimiza a escrita e as consultas das métricas históricas, além de comprimir dados antigos.
Traefik
O Traefik funciona como reverse proxy e descobre serviços automaticamente pelas labels do Docker. No laboratório, ele roteia o tráfego para o frontend do Zabbix, o Grafana e as APIs, aplicando TLS com certificados autoassinados gerados pelo Ansible. Isso cria um gateway com redirecionamento HTTPS e balanceamento de carga.
Grafana
O Grafana se integra ao Zabbix por meio de um plugin e transforma as métricas históricas em dashboards interativos, alertas e painéis personalizados. A combinação fecha o fluxo do laboratório: Vagrant e Ansible preparam a base, Docker Swarm orquestra os serviços, Zabbix coleta e processa os dados, PostgreSQL e TimescaleDB armazenam o histórico, Traefik protege e roteia o tráfego, e Grafana apresenta as informações.
Como utilizar o laboratório
Suba o ambiente:
make deployPare a VM mantendo o estado:
make stop
Destrua todo o ambiente, incluindo VM e dados:
make destroy
Configurações principaisPersonalize o laboratório editando o main.yml:
- zabbix_image_version e grafana_image_version: controlam as versões das imagens.
- zabbix_domain: define as URLs, o roteamento do Traefik e os certificados.
- zabbix_stack_name: define o nome da stack no Swarm.
- timescaledb_image: seleciona a imagem otimizada para séries temporais.
- proxy_count, proxy_base_port e proxy_hostname_prefix: controlam a quantidade e a exposição dos proxies.
- db_max_connections: limita as conexões com o banco.
- firewall_zone e docker_min_version: ajudam a manter segurança e compatibilidade.
O IP da VM é configurado no settings.yaml por network.control_ip (padrão: 10.0.2.15).
Arquivos importantes
- Vagrantfile: define a VM, seus recursos e as portas expostas, como 2377/tcp para o Swarm.
- Scripts (
deploy.sh,stop.sh,destroy.sh): encapsulam os comandos do Vagrant e do Ansible. - main.yml: contém as variáveis do Ansible.
- docker-compose.prod.yaml.j2: template Jinja2 da stack do Zabbix.
- docker-compose.traefik.yaml: configuração do Traefik com labels para descoberta dos serviços.
Recursos adicionais
- TLS automatizado: o Ansible gera certificados com OpenSSL e os monta no Traefik.
- Idempotência: o deployment recria as stacks apenas quando o hash muda, utilizando
force_hash_check. - Persistência: os volumes do Docker preservam os dados e as configurações.
- Escalabilidade: ajuste
proxy_countpara testar o balanceamento de carga.
Problemas comuns e soluções
- Versão antiga do Docker: atualize pelo Ansible ou ajuste
docker_min_version. - Conflito de portas: verifique com
netstatno host e ajustedocker_swarm_tcp_ports. - Firewall bloqueando o tráfego: execute
firewall-cmd --zone=public --add-port=...manualmente. - Falha na conexão com o banco: valide as credenciais em
dbzbx_prod.enve a rede do Swarm. - Traefik não resolve o endereço: confirme o domínio em
zabbix_domaine gere novamente os certificados.
Considerações finais
Este laboratório nasceu para aprofundar conhecimentos em DevOps, monitoramento e containers sem depender de infraestrutura externa. Explore o código, adapte o ambiente e compartilhe o que encontrar pelo caminho.
Repositório
Acesse o repositório: Zabbix LAB
Este material tem finalidade educacional e precisa dos ajustes e das boas práticas adequadas antes de qualquer uso em produção.
Referências
- Documentação oficial do Zabbix
- Guia do Docker Swarm
- Documentação do Vagrant
- Guia do Ansible
- Documentação do Traefik
- Documentação do TimescaleDB
- Documentação do Grafana
💡 Quem sou eu?
Sou Gabriel Carmo, CNCF Kubestronaut, com certificações CKA, CKAD, CKS, KCNA e KCSA, além de Red Hat Certified OpenShift Administrator.
Atuo em DevOps Engineering, construindo e evoluindo plataformas Kubernetes multi-cloud. Meu trabalho tem como foco reduzir a carga cognitiva das equipes de engenharia por meio de platform engineering, automação, GitOps e experiências self-service.
No dia a dia, conecto infraestrutura como código, cloud networking, governança, segurança, observabilidade e práticas de SRE para criar plataformas mais padronizadas, resilientes e fáceis de operar.