Skip to content

Commit 5982508

Browse files
committed
feat: fase 1 — GLPI 11 com MariaDB, Redis, Caddy TLS e Backup
Stack production-grade com 6 containers Docker: - GLPI 11.0.7 + worker dedicado de cron - MariaDB 11.4 + Redis 7.4-alpine - Caddy 2.8 com TLS automático (Let's Encrypt / interno) - Backup agendado com restore testado - Healthchecks em todos os serviços - Hardening: cap_drop ALL, no-new-privileges, redes segregadas
0 parents  commit 5982508

26 files changed

Lines changed: 2494 additions & 0 deletions

.gitignore

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
# Cada fase tem seu próprio .gitignore — este cobre a raiz
2+
.DS_Store
3+
Thumbs.db
4+
*.swp
5+
*~
6+
sources/
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
# ==============================================================================
2+
# GLPI 11 Production Stack — Variáveis de Ambiente
3+
# ==============================================================================
4+
# Copie este arquivo para .env e ajuste os valores.
5+
# Permissões recomendadas: chmod 600 .env
6+
# NUNCA commite o arquivo .env real no Git.
7+
# ==============================================================================
8+
9+
# -----------------------------------------------------------------------------
10+
# Identificação do projeto (prefixo de containers, networks, volumes)
11+
# -----------------------------------------------------------------------------
12+
COMPOSE_PROJECT_NAME=glpi-prod
13+
14+
# -----------------------------------------------------------------------------
15+
# Domínio público e TLS (Caddy)
16+
# -----------------------------------------------------------------------------
17+
# Domínio FQDN apontado para o IP público do servidor.
18+
# Para teste local, use algo como "glpi.localhost" e o Caddy gerará cert interno.
19+
GLPI_DOMAIN=glpi.exemplo.com.br
20+
21+
# E-mail para o Let's Encrypt (avisos de expiração)
22+
ACME_EMAIL=admin@exemplo.com.br
23+
24+
# -----------------------------------------------------------------------------
25+
# Versões pinadas (NUNCA usar 'latest' em produção)
26+
# -----------------------------------------------------------------------------
27+
GLPI_IMAGE_TAG=11.0.7
28+
MARIADB_IMAGE_TAG=11.4
29+
REDIS_IMAGE_TAG=7.4-alpine
30+
CADDY_IMAGE_TAG=2.8-alpine
31+
32+
# -----------------------------------------------------------------------------
33+
# Banco de dados MariaDB
34+
# -----------------------------------------------------------------------------
35+
# IMPORTANTE: gere senhas fortes. Sugestão:
36+
# openssl rand -base64 32
37+
# Use sempre aspas duplas — senhas com @, #, $, espaço quebram o source do .env sem elas.
38+
MARIADB_ROOT_PASSWORD="TROCAR_root_senha_forte_aqui"
39+
MARIADB_DATABASE=glpi
40+
MARIADB_USER=glpi
41+
MARIADB_PASSWORD="TROCAR_glpi_senha_forte_aqui"
42+
43+
# -----------------------------------------------------------------------------
44+
# GLPI — auto-instalação
45+
# -----------------------------------------------------------------------------
46+
# A imagem oficial roda o instalador automaticamente na primeira subida.
47+
# Após primeira execução bem-sucedida, recomenda-se setar GLPI_SKIP_AUTOINSTALL=true.
48+
GLPI_SKIP_AUTOINSTALL=false
49+
GLPI_SKIP_AUTOUPDATE=false
50+
51+
# Cron interno do GLPI (mantemos desativado no container web e ligado no container dedicado)
52+
GLPI_CRONTAB_ENABLED=false
53+
54+
# Timezone usado pelo container GLPI (PHP)
55+
TZ=America/Sao_Paulo
56+
57+
# -----------------------------------------------------------------------------
58+
# Redis (cache e sessões)
59+
# -----------------------------------------------------------------------------
60+
# Senha do Redis (acessível apenas pela rede interna, mas adicionamos auth por defesa em profundidade)
61+
REDIS_PASSWORD="TROCAR_redis_senha_forte_aqui"
62+
63+
# -----------------------------------------------------------------------------
64+
# Backup
65+
# -----------------------------------------------------------------------------
66+
# Cron schedule para o backup automático (formato cron padrão).
67+
# Default: 03:00 todo dia.
68+
BACKUP_CRON_SCHEDULE="0 3 * * *"
69+
70+
# Quantos dias de backup manter (rotação)
71+
BACKUP_RETENTION_DAYS=14
72+
73+
# -----------------------------------------------------------------------------
74+
# Limites de recursos (ajuste conforme hardware do host)
75+
# -----------------------------------------------------------------------------
76+
GLPI_MEMORY_LIMIT=1G
77+
MARIADB_MEMORY_LIMIT=2G
78+
REDIS_MEMORY_LIMIT=256M
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
# ==============================================================================
2+
# .gitignore — GLPI 11 Production
3+
# Blindagem contra vazamento de credenciais e dados de produção.
4+
# ==============================================================================
5+
6+
# --- Segredos e configuração local ---
7+
.env
8+
.env.*
9+
!.env.example
10+
*.key
11+
*.pem
12+
*.crt
13+
*.p12
14+
*.pfx
15+
secrets/
16+
.secrets/
17+
18+
# --- Dados persistentes (jamais versionar) ---
19+
services/caddy/data/*
20+
!services/caddy/data/.gitkeep
21+
services/caddy/config/*.json
22+
backups/
23+
data/
24+
volumes/
25+
26+
# --- Logs ---
27+
*.log
28+
logs/
29+
services/*/logs/
30+
31+
# --- Arquivos temporários ---
32+
*.tmp
33+
*.swp
34+
*.bak
35+
*~
36+
.DS_Store
37+
Thumbs.db
38+
39+
# --- IDE / Editor ---
40+
.vscode/
41+
.idea/
42+
*.sublime-*
43+
44+
# --- Python (utilitários) ---
45+
__pycache__/
46+
*.pyc
47+
.venv/
48+
venv/
49+
50+
# --- Node (caso adicione frontend tooling) ---
51+
node_modules/
52+
53+
# --- Docker overrides locais ---
54+
docker-compose.override.yml
55+
docker-compose.local.yml
56+
57+
# --- Dumps de banco ---
58+
*.sql
59+
*.sql.gz
60+
*.dump
61+
62+
# --- Claude Code: settings locais com secrets de MCP ---
63+
.claude/settings.local.json
64+
.claude/settings.json
65+
CLAUDE.local.md
66+
CLAUDE.md
67+
.claude/
68+
69+
# --- Outros arquivos sensíveis ou específicos do ambiente ---
70+
docs/GIT-UPLOAD.md
71+
docs/AWS-DEPLOY.md
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
{
2+
"_comment_": "MCPs do projeto. Atualmente vazio (Fase 1 não usa MCPs). Ver docs/MCP-STRATEGY.md para análise.",
3+
"_when_to_add_": {
4+
"fase_3_terraform": "Descomentar bloco 'terraform' abaixo quando iniciar Fase 3 (AWS)",
5+
"ci_cd": "Descomentar bloco 'github' quando criar GitHub Actions para o projeto"
6+
},
7+
"mcpServers": {
8+
"_terraform_disabled_": {
9+
"_note_": "Renomear para 'terraform' (sem underscores) para ativar. Requer Docker no host.",
10+
"command": "docker",
11+
"args": [
12+
"run",
13+
"-i",
14+
"--rm",
15+
"hashicorp/terraform-mcp-server:0.3.0"
16+
]
17+
},
18+
"_github_disabled_": {
19+
"_note_": "Renomear para 'github' (sem underscores) para ativar. PAT vem de .claude/settings.local.json (gitignored).",
20+
"command": "docker",
21+
"args": [
22+
"run",
23+
"-i",
24+
"--rm",
25+
"-e",
26+
"GITHUB_PERSONAL_ACCESS_TOKEN",
27+
"ghcr.io/github/github-mcp-server"
28+
]
29+
}
30+
}
31+
}
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
# Contribuindo
2+
3+
Contribuições são bem-vindas - relatos de bugs, melhorias na documentação e pull requests com novas funcionalidades ou correções.
4+
5+
---
6+
7+
## Reportando um bug
8+
9+
Abra uma issue e inclua:
10+
11+
- O que você esperava que acontecesse
12+
- O que aconteceu de fato (mensagem de erro, logs do container)
13+
- Seu ambiente: SO, versão do Docker, `docker compose version`
14+
- Qual fase da stack você está executando
15+
16+
```bash
17+
# Informações úteis para anexar à issue
18+
docker compose version
19+
docker version --format '{{.Server.Version}}'
20+
docker compose ps
21+
docker compose logs --tail=50 <nome-do-serviço>
22+
```
23+
24+
---
25+
26+
## Sugerindo uma melhoria
27+
28+
Abra uma issue descrevendo:
29+
30+
- O problema que você quer resolver ou a lacuna que identificou
31+
- A abordagem que você propõe
32+
- Os trade-offs que você está ciente
33+
34+
Para mudanças arquiteturais (novo serviço, alteração de rede, reestruturação de volumes), abra uma issue antes de submeter o PR para alinharmos a abordagem primeiro.
35+
36+
---
37+
38+
## Submetendo um pull request
39+
40+
1. Faça um fork do repositório e crie uma branch a partir de `main`.
41+
2. Aplique suas mudanças seguindo as convenções abaixo.
42+
3. Teste localmente: `./scripts/bootstrap.sh` deve concluir sem erros.
43+
4. Abra o PR com uma descrição clara do quê e do porquê.
44+
45+
---
46+
47+
## Convenções
48+
49+
Estas regras se aplicam a todas as contribuições:
50+
51+
- **Sem tags `:latest` em imagens.** Sempre fixe uma versão específica (ex: `mariadb:11.4`).
52+
- **Um serviço por container.** Não agrupe múltiplos processos.
53+
- **Sem secrets hardcoded.** Todas as credenciais ficam no `.env`; referencie-as como `${VAR}` no `docker-compose.yml`.
54+
- **Todo serviço novo precisa de healthcheck**, política de `restart`, rotação de logs e `cap_drop: ALL`.
55+
- **Preserve os comentários existentes** no `docker-compose.yml` — eles documentam decisões arquiteturais, não apenas configuração.
56+
- **Scripts shell** devem começar com `set -euo pipefail` e ser compatíveis com Bash 4+.
57+
58+
Consulte [`.claude/rules/devops-standards.md`](.claude/rules/devops-standards.md) para o conjunto completo de padrões.
59+
60+
---
61+
62+
## Validação rápida antes de fazer push
63+
64+
```bash
65+
# Valida a config do Compose (detecta erros de sintaxe e variáveis ausentes)
66+
docker compose config
67+
68+
# Sobe a stack completa
69+
./scripts/bootstrap.sh
70+
71+
# Verifica se todos os containers estão saudáveis
72+
./scripts/healthcheck-all.sh
73+
74+
# Testa backup e restore
75+
./scripts/backup-now.sh
76+
./scripts/restore.sh
77+
```
78+
79+
---
80+
81+
## Licença
82+
83+
Ao contribuir, você concorda que suas contribuições serão licenciadas sob a [Licença MIT](LICENSE).

fase_01_glpi_mariadb_caddy/LICENSE

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
MIT License
2+
3+
Copyright (c) 2026 Nilo Lima
4+
5+
Permission is hereby granted, free of charge, to any person obtaining a copy
6+
of this software and associated documentation files (the "Software"), to deal
7+
in the Software without restriction, including without limitation the rights
8+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9+
copies of the Software, and to permit persons to whom the Software is
10+
furnished to do so, subject to the following conditions:
11+
12+
The above copyright notice and this permission notice shall be included in all
13+
copies or substantial portions of the Software.
14+
15+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21+
SOFTWARE.

0 commit comments

Comments
 (0)