- Sobre o Projeto
- Características
- Arquitetura
- Requisitos
- Instalação
- Configuração
- Uso
- Manutenção
- Monitoramento
- Backup e Restore
- Troubleshooting
- Segurança
- Performance
- Contribuindo
- Licença
Este projeto fornece uma stack completa e otimizada para produção do GLPI (Gestionnaire Libre de Parc Informatique), utilizando as melhores práticas de DevOps e containerização.
GLPI é uma solução open-source de gerenciamento de ativos de TI e service desk que ajuda a gerenciar:
- 📦 Inventário de hardware e software
- 🎫 Sistema de tickets (helpdesk)
- 📊 Gestão de projetos
- 💰 Gestão financeira e contratos
- 📈 Relatórios e dashboards
Esta implementação foi projetada para ambientes de produção profissionais, oferecendo:
- ⚡ Alta Performance: Otimizações em MySQL, PHP e cache Redis
- 🔒 Segurança Avançada: SSL automático, headers de segurança, rate limiting
- 📊 Monitoramento Integrado: Dashboard Traefik e logs estruturados
- 🔄 Alta Disponibilidade: Health checks e restart automático
- 📦 Backup Automático: Backups diários com retenção configurável
- 🚀 Deploy Simples: Scripts automatizados para deploy e manutenção
- ✅ GLPI Latest: Sempre atualizado com a versão oficial
- ✅ Traefik v2.11: Reverse proxy moderno com SSL automático
- ✅ MySQL 8.0: Banco de dados otimizado para alta performance
- ✅ Redis Cache: Cache de sessões e dados para máxima velocidade
- ✅ Let's Encrypt: Certificados SSL gratuitos e renovação automática
- ✅ Security headers (HSTS, CSP, X-Frame-Options)
- ✅ Rate limiting por IP
- ✅ TLS 1.2+ com ciphers modernos
- ✅ Network isolation com Docker networks
- ✅ Resource limits por container
- ✅ Credenciais em variáveis de ambiente
- ✅ PHP OPcache habilitado
- ✅ MySQL InnoDB otimizado (2GB buffer pool)
- ✅ Redis para cache de sessões
- ✅ Gzip compression no Traefik
- ✅ Sticky sessions
- ✅ Connection pooling
- ✅ Docker Compose para orquestração
- ✅ Health checks em todos os serviços
- ✅ Logs centralizados
- ✅ Scripts de deploy automatizados
- ✅ Backup automático diário
- ✅ Watchtower para auto-update (opcional)
┌─────────────────────────────────────────────────────────────┐
│ Internet │
└────────────────────────┬────────────────────────────────────┘
│
│ HTTPS (443)
│
┌────▼─────┐
│ │
│ Traefik │ ← SSL/TLS, Load Balancer
│ │ Rate Limiting, Compression
└────┬─────┘
│
┌──────────────┼──────────────┐
│ │ │
┌────▼─────┐ ┌───▼────┐ ┌────▼─────┐
│ │ │ │ │ │
│ GLPI │───│ MySQL │ │ Redis │
│ (PHP) │ │ 8.0 │ │ Cache │
│ │ │ │ │ │
└──────────┘ └───┬────┘ └──────────┘
│
┌────▼─────┐
│ Backup │
│ Cron │
└──────────┘
| Componente | Versão | Porta | Função |
|---|---|---|---|
| Traefik | v2.11 | 80, 443, 8080 | Reverse proxy, SSL/TLS, Load balancer |
| GLPI | Latest | 80 (interno) | Aplicação principal |
| MySQL | 8.0 | 3306 (interno) | Banco de dados |
| Redis | 7 Alpine | 6379 (interno) | Cache de sessões |
| Backup | Latest | - | Backup automático MySQL |
| Watchtower | Latest | - | Auto-update containers (opcional) |
| Recurso | Mínimo | Recomendado | Enterprise |
|---|---|---|---|
| CPU | 2 cores | 4 cores | 8+ cores |
| RAM | 4 GB | 8 GB | 16+ GB |
| Disco | 20 GB | 50 GB | 100+ GB SSD |
| Swap | 2 GB | 4 GB | 8 GB |
- Docker: 20.10 ou superior
- Docker Compose: 2.0 ou superior
- Git: Para clonar o repositório
- Bash: Para executar os scripts
- ✅ Ubuntu 20.04 LTS / 22.04 LTS
- ✅ Debian 11 / 12
- ✅ CentOS Stream 8+
- ✅ Rocky Linux 8+
- ✅ Red Hat Enterprise Linux 8+
| Porta | Protocolo | Uso | Público? |
|---|---|---|---|
| 80 | TCP | HTTP (redirect para HTTPS) | ✅ Sim |
| 443 | TCP | HTTPS | ✅ Sim |
| 8080 | TCP | Dashboard Traefik |
git clone https://github.com/Alxdelira/glpi-production-stack.git
cd glpi-production-stack# Copiar arquivo de exemplo
cp .env.example .env
# Editar com suas configurações
nano .envImportante: Altere TODAS as senhas e o domínio no arquivo .env!
# Executar script de setup
chmod +x scripts/*.sh
./scripts/setup.shOu manualmente:
mkdir -p logs/{glpi,mysql,traefik,redis}
mkdir -p backups/{mysql,manual}
mkdir -p traefik/dynamic
mkdir -p config/{glpi,mysql}
touch traefik/acme.json
chmod 600 traefik/acme.jsonEdite o arquivo traefik/traefik.yml e altere:
certificatesResolvers:
letsencrypt:
acme:
email: seu-email@exemplo.com # ← ALTERE AQUI# Fazer deploy completo
./scripts/deploy.shApós alguns minutos, acesse:
- GLPI:
https://seu-dominio.com - Dashboard Traefik:
https://traefik.seu-dominio.com
Credenciais padrão do GLPI:
- Usuário:
glpi - Senha:
glpi
# Domain
DOMAIN=glpi.exemplo.com
# MySQL
MYSQL_ROOT_PASSWORD=senha_root_forte_aqui
GLPI_DB_NAME=glpidb
GLPI_DB_USER=glpi_user
GLPI_DB_PASSWORD=senha_glpi_forte_aqui
# Timezone
TZ=America/Manaus
# Performance
PHP_MEMORY_LIMIT=1024M
PHP_MAX_EXECUTION_TIME=600# Instalar apache2-utils (se necessário)
sudo apt-get install apache2-utils
# Gerar hash (substitua 'admin' e 'sua_senha')
echo $(htpasswd -nb admin sua_senha) | sed -e s/\\$/\\$\\$/g
# Adicionar ao .env
TRAEFIK_DASHBOARD_AUTH=admin:$$apr1$$xyz123abcEdite o arquivo .env:
GLPI_SMTP_HOST=smtp.gmail.com
GLPI_SMTP_PORT=587
GLPI_SMTP_USER=seu-email@gmail.com
GLPI_SMTP_PASSWORD=sua-senha-app
GLPI_SMTP_ENCRYPTION=tlsPara certificados wildcard, edite .env:
CLOUDFLARE_EMAIL=seu-email@exemplo.com
CLOUDFLARE_API_KEY=sua-api-keyE descomente no traefik/traefik.yml:
certificatesResolvers:
letsencrypt:
acme:
dnsChallenge:
provider: cloudflare
delayBeforeCheck: 30
resolvers:
- "1.1.1.1:53"# Iniciar todos os serviços
docker-compose up -d
# Parar todos os serviços
docker-compose down
# Reiniciar um serviço específico
docker-compose restart glpi
# Ver logs em tempo real
docker-compose logs -f
# Ver logs de um serviço específico
docker-compose logs -f glpi
# Ver status dos containers
docker-compose ps
# Atualizar imagens
docker-compose pull
docker-compose up -d| Script | Descrição |
|---|---|
./scripts/deploy.sh |
Deploy completo da stack |
./scripts/backup.sh |
Criar backup manual |
./scripts/restore.sh |
Restaurar backup |
./scripts/monitor.sh |
Monitorar sistema |
./scripts/setup.sh |
Configuração inicial |
# Entrar no container GLPI
docker-compose exec glpi bash
# Executar comando MySQL
docker-compose exec db mysql -u root -p
# Ver informações do Redis
docker-compose exec redis redis-cli INFO
# Ver logs do PHP
docker-compose exec glpi tail -f /var/log/glpi/php-errors.log# 1. Fazer backup
./scripts/backup.sh
# 2. Baixar nova imagem
docker-compose pull glpi
# 3. Recriar container
docker-compose up -d glpi
# 4. Verificar logs
docker-compose logs -f glpi# Usando script de deploy
./scripts/deploy.sh
# Ou manualmente
docker-compose pull
docker-compose up -d# Remover imagens não utilizadas
docker image prune -a
# Remover volumes órfãos
docker volume prune
# Limpeza completa (cuidado!)
docker system prune -a --volumes# Ver tamanho dos logs
du -sh logs/*
# Limpar logs antigos (exemplo: +30 dias)
find logs/ -name "*.log" -mtime +30 -delete
# Configurar logrotate (criar /etc/logrotate.d/glpi)
cat > /etc/logrotate.d/glpi << EOF
/caminho/para/glpi-production/logs/*/*.log {
daily
rotate 14
compress
delaycompress
notifempty
create 0640 root root
sharedscripts
}
EOF# Executar monitoramento
./scripts/monitor.sh# Verificar saúde dos containers
docker-compose ps
docker inspect --format='{{.State.Health.Status}}' glpi_app# Conexões ativas
docker-compose exec db mysql -u root -p -e "SHOW STATUS LIKE 'Threads_connected';"
# Queries lentas
docker-compose exec db mysql -u root -p -e "SHOW STATUS LIKE 'Slow_queries';"
# Uso de buffer pool
docker-compose exec db mysql -u root -p -e "SHOW STATUS LIKE 'Innodb_buffer_pool%';"# Estatísticas
docker-compose exec redis redis-cli INFO stats
# Memória
docker-compose exec redis redis-cli INFO memory
# Número de chaves
docker-compose exec redis redis-cli DBSIZEAcesse: https://traefik.seu-dominio.com
Métricas disponíveis:
- Routers ativos
- Services e backends
- Middlewares aplicados
- Certificados SSL
- Taxa de requisições
Adicione ao docker-compose.yml:
prometheus:
image: prom/prometheus:latest
container_name: glpi_prometheus
restart: unless-stopped
volumes:
- ./config/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
- prometheus_data:/prometheus
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
ports:
- "9090:9090"
networks:
- glpi_networkO backup automático está configurado para rodar diariamente às 3h da manhã.
Configuração: Serviço backup no docker-compose.yml
environment:
- CRON_TIME=0 3 * * * # Diário às 3h
- MAX_BACKUPS=14 # Manter últimos 14 dias# Executar backup completo
./scripts/backup.shO backup inclui:
- ✅ Banco de dados MySQL (dump comprimido)
- ✅ Arquivos do GLPI (
glpi_files) - ✅ Configurações (
glpi_config) - ✅ Plugins (
glpi_plugins) - ✅ Arquivo de metadados com informações do backup
# Executar restore interativo
./scripts/restore.shO script irá:
- Listar backups disponíveis
- Solicitar confirmação
- Parar o GLPI
- Restaurar banco de dados
- Restaurar arquivos
- Reiniciar serviços
# Instalar AWS CLI
pip install awscli
# Configurar credenciais
aws configure
# Adicionar ao crontab
0 4 * * * cd /caminho/para/glpi-production && \
./scripts/backup.sh && \
aws s3 sync ./backups/manual/ s3://seu-bucket/glpi-backups/# Adicionar ao crontab
0 5 * * * rsync -avz --delete \
/caminho/para/glpi-production/backups/ \
usuario@servidor-backup:/backups/glpi/# Ver logs detalhados
docker-compose logs glpi
# Verificar erros de configuração
docker-compose config
# Reiniciar container específico
docker-compose restart glpi# Corrigir permissões
chmod 600 traefik/acme.json
docker-compose restart traefik# Verificar se MySQL está rodando
docker-compose ps db
# Testar conexão
docker-compose exec glpi ping -c 3 db
# Verificar logs do MySQL
docker-compose logs db
# Verificar credenciais no .env
cat .env | grep GLPI_DB# Verificar logs do Traefik
docker-compose logs traefik | grep acme
# Verificar DNS (deve apontar para seu servidor)
dig seu-dominio.com
# Testar em staging primeiro
# Edite traefik/traefik.yml:
# caServer: https://acme-staging-v02.api.letsencrypt.org/directory# Verificar uso de recursos
docker stats
# Verificar queries lentas no MySQL
docker-compose exec db cat /var/log/mysql/slow.log
# Limpar cache do Redis
docker-compose exec redis redis-cli FLUSHALL
# Verificar OPcache
docker-compose exec glpi php -i | grep opcache# Verificar se GLPI está rodando
docker-compose ps glpi
# Verificar logs do Traefik
docker-compose logs traefik
# Reiniciar GLPI
docker-compose restart glpi
# Verificar health check
docker inspect glpi_app | grep -A 10 Health# Todos os logs
docker-compose logs
# Últimas 100 linhas
docker-compose logs --tail=100
# Logs de erro do GLPI
docker-compose exec glpi tail -f /var/log/glpi/php-errors.log
# Logs do Traefik
tail -f logs/traefik/traefik.log
# Logs do MySQL
tail -f logs/mysql/slow.logAtivar debug no GLPI:
# Entrar no container
docker-compose exec glpi bash
# Editar config
cd /var/www/html/glpi/config
echo "<?php define('GLPI_LOG_LEVEL', 4);" > local_define.php- Alterar todas as senhas padrão
- Configurar firewall (UFW/iptables)
- Limitar acesso ao dashboard do Traefik
- Configurar fail2ban
- Habilitar 2FA no GLPI
- Revisar logs regularmente
- Manter sistema atualizado
- Configurar backups automáticos
- Testar restore de backups
- Monitorar uso de recursos
# Instalar UFW
sudo apt-get install ufw
# Configurar regras básicas
sudo ufw default deny incoming
sudo ufw default allow outgoing
# Permitir SSH
sudo ufw allow ssh
# Permitir HTTP/HTTPS
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
# Ativar firewall
sudo ufw enable
# Verificar status
sudo ufw status verbose# Instalar
sudo apt-get install fail2ban
# Criar jail customizado
sudo nano /etc/fail2ban/jail.d/glpi.conf[glpi]
enabled = true
port = 80,443
filter = glpi
logpath = /caminho/para/glpi-production/logs/traefik/access.log
maxretry = 5
bantime = 3600
findtime = 600# Executar script de segurança
docker-compose exec db mysql_secure_installation# Verificar portas abertas
sudo netstat -tulpn | grep LISTEN
# Verificar processos
docker-compose top
# Scan de vulnerabilidades (opcional)
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \
aquasec/trivy image glpi/glpi:latest- ✅ OPcache habilitado (256MB)
- ✅ Memory limit: 1024MB
- ✅ Max execution time: 600s
- ✅ Upload max: 200MB
- ✅ InnoDB buffer pool: 2GB
- ✅ Query cache desabilitado (MySQL 8.0)
- ✅ Slow query log habilitado
- ✅ Performance Schema ativo
- ✅ MaxMemory: 512MB
- ✅ Eviction policy: allkeys-lru
- ✅ AOF persistence habilitado
- ✅ Gzip compression
- ✅ Connection pooling
- ✅ Sticky sessions
- ✅ Rate limiting
# docker-compose.yml
services:
db:
command: >
--innodb_buffer_pool_size=4G # Aumentar para 4GB# .env
PHP_MEMORY_LIMIT=2048M # Aumentar para 2GB# docker-compose.yml
services:
glpi:
deploy:
replicas: 3 # 3 instâncias do GLPI# Instalar Apache Bench
sudo apt-get install apache2-utils
# Teste de carga
ab -n 1000 -c 10 https://seu-dominio.com/glpi-production-stack/
├── docker-compose.yml # Orquestração principal
├── .env # Variáveis de ambiente
├── .env.example # Exemplo de configuração
├── .gitignore # Arquivos ignorados
├── LICENSE # Licença MIT
├── README.md # Este arquivo
│
├── traefik/ # Configuração Traefik
│ ├── traefik.yml # Config estática
│ ├── acme.json # Certificados SSL
│ └── dynamic/ # Configurações dinâmicas
│ └── middlewares.yml # Middlewares customizados
│
├── config/ # Configurações personalizadas
│ ├── glpi/ # Config GLPI
│ └── mysql/ # Config MySQL
│
├── logs/ # Logs dos serviços
│ ├── glpi/ # Logs GLPI
│ ├── mysql/ # Logs MySQL
│ ├── traefik/ # Logs Traefik
│ └── redis/ # Logs Redis
│
├── backups/ # Backups
│ ├── mysql/ # Backups automáticos
│ └── manual/ # Backups manuais
│
├── scripts/ # Scripts utilitários
│ ├── deploy.sh # Script de deploy
│ ├── backup.sh # Script de backup
│ ├── restore.sh # Script de restore
│ ├── monitor.sh # Script de monitoramento
│ └── setup.sh # Setup inicial
│
└── docs/ # Documentação adicional
├── INSTALLATION.md # Guia de instalação
├── CONFIGURATION.md # Guia de configuração
├── MAINTENANCE.md # Guia de manutenção
└── ARCHITECTURE.md # Arquitetura detalhada
Contribuições são bem-vindas! Por favor, siga estas diretrizes:
- Fork o repositório
- Clone seu fork:
git clone https://github.com/Alxdelira/glpi-production-stack.git - Crie uma branch:
git checkout -b feature/minha-feature - Commit suas mudanças:
git commit -am 'Adiciona nova feature' - Push para a branch:
git push origin feature/minha-feature - Abra um Pull Request
- Use 2 espaços para indentação em YAML
- Comente código complexo
- Siga as convenções de nomenclatura existentes
- Teste suas mudanças antes de submeter
Ao reportar bugs, inclua:
- Descrição detalhada do problema
- Passos para reproduzir
- Comportamento esperado vs atual
- Logs relevantes
- Versões (Docker, Docker Compose, SO)
Ao sugerir features:
- Descreva o caso de uso
- Explique o benefício
- Forneça exemplos se possível
- Suporte a múltiplas instâncias GLPI (clustering)
- Integração com Grafana/Prometheus
- Scripts de migração de versões
- Suporte a S3 para backups
- Helm chart para Kubernetes
- CI/CD com GitHub Actions
- Testes automatizados
- Multi-language support
Este projeto está licenciado sob a Licença MIT - veja o arquivo LICENSE para detalhes.
MIT License
Copyright (c) 2024 GLPI Production Stack
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
- Alexandre Nogueira - Trabalho Inicial - Alxdelira
Veja também a lista de contribuidores que participaram deste projeto.
- GLPI Project - Pela excelente ferramenta de ITSM
- Traefik - Pelo incrível reverse proxy
- Docker - Pela tecnologia de containerização
- Comunidade Open Source - Por todo o suporte e contribuições
- 📧 Email: alx.delira@gmail.com
- 🐛 Issues: GitHub Issues
- 📖 Docs: Wiki
Made with ❤️ for the GLPI community
