Refactor: Standardized filenames to [Level] Title format and cleaned duplicates

This commit is contained in:
João Pedro Toledo Goncalves 2026-02-02 21:04:34 -03:00
parent cc767d0f08
commit 00d76a98e5
276 changed files with 145 additions and 6127 deletions

View File

@ -280,10 +280,12 @@ Após a validação do conteúdo em Markdown:
O Agente DEVE salvar o PDF **exatamente** na estrutura de pastas definida abaixo.
1. **Regra de Nomeação da Pasta Principal:** `documentacao [tema]` (tudo minúsculo, sem acentos).
2. **Estrutura Plana:** Todos os manuais devem ficar na raiz da pasta do tema. **NÃO crie subpastas de nível** (`Nivel_0`, etc).
2. **Estrutura Plana:** Todos os manuais devem ficar na raiz da pasta do tema.
3. **Nome do Arquivo:** DEVE seguir o padrão `[Nível X] Nome do Procedimento.md`.
* Exemplo: `[Nível 1] Criação de Usuário.md`
**Exemplo de Caminho Completo:**
`[RAIZ]/documentacao exchange/[Nome do Manual].pdf`
`[RAIZ]/documentacao exchange/[Nível 1] Criação de Usuário.pdf`
**Tabela Canônica de Pastas (Use estas):**
* `documentacao agendamento` (Cron, Task Scheduler)

View File

@ -0,0 +1,141 @@
import os
import re
import shutil
ROOT_DIR = os.getcwd()
# Mapping codes to levels
LEVEL_MAP = {
"ITGCLI": "Nível 0",
"ITGSUP": "Nível 1",
"ITGINF": "Nível 2",
"ITGENG": "Nível 3"
}
def sanitize_filename(name):
# Remove invalid chars for Windows filenames
return re.sub(r'[<>:"/\\|?*]', '', name).strip()
def get_metadata(filepath):
"""
Parses the markdown file to extract:
1. Title (H1)
2. Level Code (ITGxxx)
"""
title = None
level = None
with open(filepath, 'r', encoding='utf-8') as f:
content = f.read()
# Regex for Title: # MANUAL TÉCNICO - [TITLE] - [SYSTEM] or just # [TITLE]
# We want to capture the core title.
# Pattern 1: # MANUAL TÉCNICO - TITLE - SYSTEM
match_title_complex = re.search(r'^#\s*MANUAL TÉCNICO\s*-\s*(.*?)\s*-\s*', content, re.MULTILINE | re.IGNORECASE)
# Pattern 2: # TITLE
match_title_simple = re.search(r'^#\s*(.+)$', content, re.MULTILINE)
if match_title_complex:
title = match_title_complex.group(1).strip()
elif match_title_simple:
# If simple, we need to be careful not to include "MANUAL TÉCNICO" if it's there
raw_title = match_title_simple.group(1).strip()
if "MANUAL TÉCNICO" in raw_title.upper():
# Try to extract subpart if possible, or just use it as is but title case
parts = raw_title.split('-')
if len(parts) > 1:
title = parts[1].strip()
else:
title = raw_title
else:
title = raw_title
# Regex for Code: **Código:** ITGSUP 0001/26
match_code = re.search(r'\*\*Código:\*\*\s*(ITG[A-Z]{3})', content)
if match_code:
code = match_code.group(1).strip()
level = LEVEL_MAP.get(code, "Nível ?")
return title, level
def infer_level_from_filename(filename):
"""
Fallback: Extract level from filename prefixes like N1_, N2_, Nivel_1, etc.
"""
if re.match(r'^N1_', filename, re.IGNORECASE): return "Nível 1"
if re.match(r'^N2_', filename, re.IGNORECASE): return "Nível 2"
if re.match(r'^N3_', filename, re.IGNORECASE): return "Nível 3"
if re.match(r'^N0_', filename, re.IGNORECASE): return "Nível 0"
# Try Nivel_X_...
match = re.match(r'^Nivel_(\d+)_', filename, re.IGNORECASE)
if match:
return f"Nível {match.group(1)}"
return None
def standardize_filenames():
print("Starting Filename Standardization...")
count = 0
for item in os.listdir(ROOT_DIR):
theme_dir = os.path.join(ROOT_DIR, item)
# We only care about "documentacao *" folders
if os.path.isdir(theme_dir) and item.startswith("documentacao "):
print(f"Scanning: {item}")
for filename in os.listdir(theme_dir):
if not filename.endswith(".md") or filename.lower() == "readme.md":
continue
filepath = os.path.join(theme_dir, filename)
# Check if file is already normalized: Starts with [Nível
if filename.startswith("[Nível"):
continue
print(f" Processing: {filename}")
title, level = get_metadata(filepath)
# Fallback to filename inference if Metadata missing
if not level:
level = infer_level_from_filename(filename)
if level:
print(f" Inferred Level '{level}' from filename.")
if title and level:
# Construct new name: [Nível X] Title.md
# Title Case for better readability
title_clean = title.title()
new_filename = f"[{level}] {title_clean}.md"
new_filename = sanitize_filename(new_filename)
new_filepath = os.path.join(theme_dir, new_filename)
if filepath != new_filepath:
# Handle collision
if os.path.exists(new_filepath):
print(f" Collision! {new_filename} exists. Skipping rename.")
else:
try:
os.rename(filepath, new_filepath)
print(f" Renamed to: {new_filename}")
count += 1
# Also rename PDF if it exists
pdf_old = filepath.replace(".md", ".pdf")
pdf_new = new_filepath.replace(".md", ".pdf")
if os.path.exists(pdf_old):
if not os.path.exists(pdf_new):
os.rename(pdf_old, pdf_new)
except OSError as e:
print(f" Error renaming: {e}")
else:
print(f" Skipping {filename}: Could not extract Metadata (Title: {title}, Level: {level})")
print(f"Done. Renamed {count} files.")
if __name__ == "__main__":
standardize_filenames()

View File

@ -1,85 +0,0 @@
# MANUAL TÉCNICO - VERIFICAÇÃO DIÁRIA DE JOBS DE VM
**Código:** ITGSUP 0014/26 | **Classificação:** INTERNO
**Responsável:** João Pedro Toledo Gonçalves | **Data:** {{DATA_ATUAL}}
## 1. HISTÓRICO DE REVISÃO
| Data | Versão | Descrição | Autor |
| :--- | :--- | :--- | :--- |
| {{DATA_ATUAL}} | 1.0 | Criação Inicial | João Pedro Toledo Gonçalves |
## 2. OBJETIVO
Padronizar a rotina diária de verificação dos backups de infraestrutura virtual (Hyper-V/VMware) garantindo a detectabilidade imediata de falhas.
## 3. PRÉ-REQUISITOS
> O que é necessário para executar:
* [ ] Acesso ao console do **Veeam Backup & Replication** (Conta de Operador de Backup ou Admin).
* [ ] Planilha ou sistema de checklist diário aberto.
## 4. PASSO A PASSO (EXECUÇÃO)
**Etapa 1: Acesso ao Console Principal**
1. Faça login no servidor de backup (RDP ou Console Remoto).
2. Abra o **Veeam Backup & Replication Console**.
3. No menu inferior esquerdo, clique em **Home**.
4. Na árvore de navegação à esquerda, selecione **Jobs** > **Backup**.
!!! note "Nota"
Esta visão consolida todos os jobs configurados (VMs, Agentes Físicos, Shares).
**Etapa 2: Análise do Status "Last Result"**
1. Observe a coluna **Status** e **Last Result** na lista central.
2. Identifique os jobs com status diferente de **Success**.
!!! warning "LEGENDA DE CORES"
* 🟢 **Success:** Backup completado sem erros.
* 🟡 **Warning:** Backup completado, mas com avisos (ex: falha ao indexar guest OS, snapshot demorado).
* 🔴 **Failed:** O backup FALHOU. VM não protegida nesta rodada.
![Veeam Job List Status](assets/veeam_jobs_list.png)
**Etapa 3: Investigação de Falhas (Drill-down)**
1. Dê um **duplo-clique** sobre o job que apresentou falha ou warning.
2. Na janela de sessão que abrir, observe a lista de VMs à esquerda.
3. Clique na VM que está com ícone vermelho ou amarelo.
4. No painel da direita, leia o log de execução, buscando linhas em **vermelho**.
!!! tip "Dica"
Erros comuns incluem "VSS Writer failed", "RPC server unavailable" ou "Snapshot creation failed".
![Veeam Job Session Log](assets/veeam_job_log.png)
**Etapa 4: Registro de Incidente**
1. Se houver falha (🔴), abra imediatamente um ticket no Zammad para a equipe de Nível 2 (Infra).
2. No corpo do ticket, cole o erro exato encontrado no log (passo anterior).
3. Se for apenas Warning (🟡), registre na observação do checklist, mas não requer ticket urgente se houver pontos de restauração anteriores válidos recentes.
## 5. SOLUÇÃO DE PROBLEMAS (TROUBLESHOOTING)
**Problema 1: Job parado em "Running" há mais de 24h**
* **Causa:** Processo travado ou snapshot preso no hipervisor.
* **Solução:**
1. Tente parar o job com **Right-Click > Stop**.
2. Se não parar, verifique no vCenter/Hyper-V se há snapshots pendentes na VM e remova-os (Consolidate).
3. Reinicie os serviços do Veeam se necessário (escalonar para Nível 2).
**Problema 2: Erro "RPC Server Unavailable"**
* **Causa:** Falha de comunicação de rede ou firewall entre Veeam e VM Guest.
* **Solução:**
1. Teste ping do servidor Veeam para a VM.
2. Verifique se o serviço "Admin Share" (C$) está acessível.
## 6. DADOS TÉCNICOS
| Campo | Valor | Descrição |
| :--- | :--- | :--- |
| **Portas** | 9392, 10001 | Portas de Console e Serviço Veeam |
| **Logs** | `C:\ProgramData\Veeam\Backup` | Caminho de logs detalhados |
| **SLA** | 24 Horas | RPO Padrão (janela diária) |
## 7. VALIDAÇÃO FINAL (Definição de Pronto)
> O procedimento termina quando:
- [ ] Todos os jobs foram verificados visualmente.
- [ ] Falhas críticas (Failed) foram escalonadas via Ticket.
- [ ] Checklist diário foi preenchido com "Ok" ou "Incidente nº XXX".

File diff suppressed because one or more lines are too long

View File

@ -1,80 +0,0 @@
# MANUAL TÉCNICO - RESTAURAÇÃO DE ARQUIVOS GUEST (WINDOWS/LINUX)
**Código:** ITGINF 0022/26 | **Classificação:** INTERNO
**Responsável:** João Pedro Toledo Gonçalves | **Data:** {{DATA_ATUAL}}
## 1. HISTÓRICO DE REVISÃO
| Data | Versão | Descrição | Autor |
| :--- | :--- | :--- | :--- |
| {{DATA_ATUAL}} | 1.0 | Criação Inicial | João Pedro Toledo Gonçalves |
## 2. OBJETIVO
Executar a recuperação granular de arquivos e pastas individuais diretamente de um backup, sem a necessidade de restaurar a VM inteira.
## 3. PRÉ-REQUISITOS
* [ ] Acesso ao console do Veeam Backup & Replication.
* [ ] Credenciais administrativas da VM de origem (Guest OS) se necessário.
* [ ] Espaço em disco temporário no servidor Veeam (Mount Cache).
## 4. PASSO A PASSO (EXECUÇÃO)
**Etapa 1: Iniciar o Assistente de Restore**
1. No console Veeam, vá para **Home** > **Backups** > **Disk**.
2. Localize o job e expandan-o para ver as VMs.
3. Clique com o botão direito na VM desejada e selecione **Restore guest files** > **Microsoft Windows** (ou Linux).
!!! note "Nota"
Para Linux, o Veeam usará um "Helper Appliance" temporário se não conseguir montar diretamente.
![Veeam Restore Guest Files Menu](assets/veeam_restore_menu.png)
**Etapa 2: Seleção do Ponto de Restauração**
1. Na janela de wizard, selecione o Restore Point desejado.
2. Clique em **Next**.
3. (Opcional) Digite o motivo do restore ("Reason").
4. Clique em **Browse**.
!!! note "Aguarde"
O Veeam montará o backup como um disco virtual no servidor. Isso pode levar de 1 a 3 minutos.
**Etapa 3: "Veeam Backup Browser" (Explorador)**
1. Uma nova janela abrirá exibindo a estrutura de arquivos da VM (C:\, D:\, etc).
2. Navegue até a pasta onde os arquivos perdidos estavam.
![Veeam Backup Browser](assets/veeam_browser.png)
**Etapa 4: Executar a Restauração**
1. Selecione os arquivos ou pastas desejados.
2. Clique com o botão direito para ver as opções:
* **Restore > Overwrite:** Restaura para o local original, substituindo o atual.
* **Restore > Keep:** Restaura para o local original, renomeando o arquivo restaurado (ex: `File_RESTORED.txt`).
* **Copy To:** Salva em uma pasta local do seu PC ou rede (ex: `C:\Temp`).
!!! tip "Recomendação"
Use **Copy To** ou **Keep** para evitar sobrescrever dados válidos acidentalmente.
## 5. SOLUÇÃO DE PROBLEMAS (TROUBLESHOOTING)
**Problema 1: Erro "Access Denied" ao restaurar para o local original**
* **Causa:** O usuário do Veeam não tem permissão na pasta da VM Guest.
* **Solução:**
1. No Backup Browser, clique em "Mount (ou Explorer)" no topo para abrir opções avançadas.
2. Tente usar a opção **Copy To** para uma pasta pública (`C:\Temp` da VM) ou para o próprio servidor de backup.
**Problema 2: Lentidão extrema ao abrir pastas (Linux)**
* **Causa:** O *Helper Appliance* pode estar em host/datastore lento ou rede congestionada.
* **Solução:**
1. Aguarde pacientemente. O FLR (File Level Restore) monta blocos sob demanda.
2. Se falhar, use o *Instant VM Recovery* (desligado da rede) para montar a VM inteira e copiar os dados.
## 6. DADOS TÉCNICOS
| Campo | Valor | Descrição |
| :--- | :--- | :--- |
| **Mount Path** | `C:\VeeamFLR` | Local onde o disco é montado no Veeam Server |
| **Portas Linux** | 22 (SSH) | Necessário para Helper Appliance |
| **Limite FLR** | N/A | Depende apenas da rede e IOPS do repositório |
## 7. VALIDAÇÃO FINAL (Definição de Pronto)
- [ ] O arquivo solicitado foi recuperado íntegro?
- [ ] O Veeam Backup Browser foi fechado? (Crucial para desmontar o backup e liberar o arquivo de backup).

File diff suppressed because one or more lines are too long

View File

@ -1,84 +0,0 @@
# MANUAL TÉCNICO - INSTANT VM RECOVERY (RESTAURAÇÃO RÁPIDA)
**Código:** ITGINF 0023/26 | **Classificação:** INTERNO
**Responsável:** João Pedro Toledo Gonçalves | **Data:** {{DATA_ATUAL}}
## 1. HISTÓRICO DE REVISÃO
| Data | Versão | Descrição | Autor |
| :--- | :--- | :--- | :--- |
| {{DATA_ATUAL}} | 1.0 | Criação Inicial | João Pedro Toledo Gonçalves |
## 2. OBJETIVO
Recuperar o funcionamento de uma VM crítica em minutos (RTO < 2 min), executando-a diretamente a partir do arquivo de backup antes de mover os dados para o storage de produção.
## 3. PRÉ-REQUISITOS
* [ ] Servidor ESXi de destino ativo e acessível pelo Veeam Server.
* [ ] Espaço livre na reserva de RAM do Host ESXi.
* [ ] Porta NFS (111, 2049) liberada entre Veeam e ESXi.
## 4. PASSO A PASSO (EXECUÇÃO)
**Etapa 1: Iniciar o Instant Recovery**
1. No console Veeam, navegue até **Home** > **Backups** > **Disk**.
2. Clique com o botão direito na VM afetada.
3. Escolha **Instant recovery** > **VMware vSphere** (ou Hyper-V).
![Menu Instant Recovery](assets/veeam_instant_recovery_menu.png)
**Etapa 2: Definição do Modo de Restore**
1. Escolha o **Restore Point** mais recente (ou o último conhecido bom).
2. Em "Restore Mode":
* **Restore to original location:** Sobrescreve a VM original (cuidado!).
* **Restore to a new location...:** Cria uma cópia (Recomendado para testes ou se a original ainda existe para análise forense).
!!! warning "Importante"
Se restaurar para o original, marque "Power on VM automatically".
**Etapa 3: Validação do Boot**
1. O Veeam montará o datastore vPower NFS e ligará a VM.
2. Acesse o console do vCenter/Hyper-V e verifique se a VM iniciou.
3. Teste o acesso aos serviços (Ping, RDP, Web).
!!! note "Nota"
Nesta fase, a performance será reduzida pois o disco está lendo via rede do servidor de backup.
**Etapa 4: Finalização (Migrate to Production)**
!!! tip "Dica"
O processo NÃO acabou. A VM está rodando temporariamente no backup. Você DEVE migrá-la.
1. No console Veeam, vá para a view **Home** > **Instant Recovery** (menu inferior esquerdo, canto inferior da árvore).
2. Clique com o botão direito na sessão ativa da VM.
3. Selecione **Migrate to production**.
4. O *Quick Migration Wizard* abrirá. Siga o wizard para mover os discos para o Datastore definitivo.
![Migrate to Production](assets/veeam_migrate_production.png)
## 5. SOLUÇÃO DE PROBLEMAS (TROUBLESHOOTING)
**Problema 1: Erro "Failed to mount NFS Datastore"**
* **Causa:** Bloqueio de Firewall ou serviço vPower NFS parado no Veeam.
* **Solução:**
1. Verifique se o serviço `Veeam vPower NFS Service` está rodando no servidor de backup.
2. Check se o Host ESXi consegue pingar o IP do Veeam Server.
**Problema 2: Performance extremamente degradada após o boot**
* **Causa:** Gargalo na rede ou disco do repositório de backup.
* **Solução:**
1. É esperado. Inicie o "Migrate to production" IMEDIATAMENTE para mover para o Storage rápido (NVMe/SSD).
2. Se tiver vMotion de Storage licença (Enterprise Plus), o Veeam usará automaticamente para migrar sem desligar.
## 6. DADOS TÉCNICOS
| Campo | Valor | Descrição |
| :--- | :--- | :--- |
| **Protocolo** | NFS v3 | Usado para montar os discos no ESXi |
| **Datastore** | VeeamBackup_Host | Nome do datastore temporário criado no vCenter |
| **Write Cache** | Local (Veeam) | As alterações feitas na VM ficam em cache no servidor Veeam até a migração |
## 7. VALIDAÇÃO FINAL (Definição de Pronto)
- [ ] A VM está rodando a partir do Datastore de Produção (não mais do NFS)?
- [ ] A sessão de "Instant Recovery" sumiu do console do Veeam?
- [ ] O backup da noite seguinte rodou com sucesso (incremental)?

File diff suppressed because one or more lines are too long

View File

@ -1,78 +0,0 @@
# MANUAL TÉCNICO - CONFIGURAÇÃO DE REPOSITÓRIOS IMUTÁVEIS (HARDENED LINUX)
**Código:** ITGENG 0021/26 | **Classificação:** RESTRITO
**Responsável:** João Pedro Toledo Gonçalves | **Data:** {{DATA_ATUAL}}
## 1. HISTÓRICO DE REVISÃO
| Data | Versão | Descrição | Autor |
| :--- | :--- | :--- | :--- |
| {{DATA_ATUAL}} | 1.0 | Criação Inicial | João Pedro Toledo Gonçalves |
## 2. OBJETIVO
Implementar proteção contra ransomware tornando os backups imutáveis (WORM) por um período definido, utilizando um servidor Linux "Hardened" sem credenciais persistentes.
## 3. PRÉ-REQUISITOS
* [ ] Servidor Físico ou Virtual com Linux moderno (Ubuntu 20.04+ / RHEL 8+).
* [ ] Disco formatado em XFS com Reflink habilitado (`mkfs.xfs -m reflink=1,crc=1`).
* [ ] Conta de usuário **não-root** no Linux com permissão sudo temporária.
## 4. PASSO A PASSO (EXECUÇÃO)
**Etapa 1: Preparação do Linux (Shell)**
1. Garanta que o diretório do repositório pertence ao usuário do Veeam:
```bash
chown veeamuser:veeamuser /mnt/backup-repo
chmod 700 /mnt/backup-repo
```
**Etapa 2: Adicionar Servidor com "Single-Use Credentials"**
!!! warning "Crítico"
Nunca salve a senha do root/sudo no Veeam. Use credenciais de uso único para que, se o Veeam Server for hackeado, o hacker não consiga acessar o Linux.
1. No console Veeam, vá em **Backup Infrastructure** > **Managed Servers** > **Add Server** > **Linux**.
2. Digite o IP/DNS do servidor Linux.
3. Em **Credentials**, clique em **Add** e selecione **Single-use credentials for hardened repository**.
4. Insira o usuário e senha (com sudo temporário).
5. Finalize o wizard. O Veeam instalará os serviços e certificados.
6. **Segurança:** Após adicionar, remova o usuário do grupo `sudo` no Linux.
![Single Use Credentials](assets/veeam_single_use_creds.png)
**Etapa 3: Criar o Repositório Imutável**
1. Vá em **Backup Repositories** > **Add Repository** > **Direct attached storage** > **Linux**.
2. Selecione o servidor Linux adicionado.
3. Clique em **Populate** e escolha o caminho mountpoint XFS (`/mnt/backup-repo`).
4. Na tela de configurações do repositório, marque **OBRIGATORIAMENTE**:
* [x] **Use fast cloning on XFS volumes** (Economia de espaço massiva).
* [x] **Make recent backups immutable for:** `7` days (Mínimo recomendado).
![Immutable Settings](assets/veeam_immutable_checkbox.png)
**Etapa 4: Aplicação**
1. Finalize o wizard e aplique as configurações.
2. Crie ou edite um Backup Job para apontar para este novo repositório.
## 5. SOLUÇÃO DE PROBLEMAS (TROUBLESHOOTING)
**Problema 1: "Fast Clone is not supported"**
* **Causa:** O sistema de arquivos não foi formatado com `reflink=1`.
* **Solução:** É necessário reformatar a partição XFS corretamente (destrutivo para dados).
**Problema 2: Falha ao adicionar servidor (SSH handshake fail)**
* **Causa:** O usuário single-use não tem permissão de escrita ou sudo falhou.
* **Solução:** Verifique se o usuário tem permissão `chmod 700` na pasta home e no diretório de destino.
## 6. DADOS TÉCNICOS
| Campo | Valor | Descrição |
| :--- | :--- | :--- |
| **Filesystem** | XFS (Reflink) | Obrigatório para Fast Clone |
| **Porta** | 6162 | Veeam Data Mover (TCP) |
| **Imutabilidade** | `chattr +i` | Flag de sistema usada para bloquear arquivos |
## 7. VALIDAÇÃO FINAL (Definição de Pronto)
- [ ] Tente deletar manualmente um arquivo de backup (`.vbk`) via console. O Veeam deve retornar erro "Access Denied" ou "Immutable".
- [ ] O ícone do Job no Veeam possui um "escudo" ou indicativo de proteção?

File diff suppressed because one or more lines are too long

View File

@ -1,77 +0,0 @@
# MANUAL TÉCNICO - CRIAÇÃO DE ROTINAS DE TESTE DE RESTORE (SUREBACKUP)
**Código:** ITGENG 0022/26 | **Classificação:** INTERNO
**Responsável:** João Pedro Toledo Gonçalves | **Data:** {{DATA_ATUAL}}
## 1. HISTÓRICO DE REVISÃO
| Data | Versão | Descrição | Autor |
| :--- | :--- | :--- | :--- |
| {{DATA_ATUAL}} | 1.0 | Criação Inicial | João Pedro Toledo Gonçalves |
## 2. OBJETIVO
Automatizar a validação de backups ligando as VMs em um ambiente isolado (Virtual Lab) e testando os serviços (Ping, DNS, SQL) para garantir 100% de recuperabilidade.
## 3. PRÉ-REQUISITOS
* [ ] Licença Veeam Enterprise ou Enterprise Plus (ou VUL).
* [ ] Host ESXi com recursos sobrando (RAM/CPU) para ligar o Lab.
* [ ] DHCP habilitado na rede de produção ou IPs estáticos conhecidos.
## 4. PASSO A PASSO (EXECUÇÃO)
**Etapa 1: Criação do Virtual Lab**
1. Vá em **Backup Infrastructure** > **SureBackup Infrastructure** > **Virtual Labs** > **Add Virtual Lab**.
2. Escolha o Host ESXi.
3. **Networking:**
* **Basic Single-host:** Mais simples. O Veeam cria uma rede isolada mascarada.
* **Advanced:** Permite mapear múltiplas VLANs (Recomendado se o App depende de várias redes).
4. Configure o **Proxy Appliance** (Gateway entre Prod e Lab). Defina um IP livre na rede de produção.
5. Finalize o wizard.
![Virtual Lab Config](assets/veeam_virtual_lab.png)
**Etapa 2: Application Group (Dependências)**
!!! note "Importante"
Defina aqui as VMs que DEVEM ligar primeiro (ex: Domain Controller, DNS).
1. Vá em **Application Groups** > **Add Group**.
2. Adicione as VMs críticas (ex: SRV-DC01, SRV-DB01).
3. **Edit Startup Options:**
* **Memory:** % de RAM garantida.
* **Startup Time:** Tempo de espera para boot (Aumente para 600s ou mais para DCs lentos).
* **Test Scripts:** Habilite "DNS Test", "SQL Server Test", etc.
**Etapa 3: SureBackup Job**
1. Vá em **Home** > **Jobs** > **SureBackup Job**.
2. Selecione o **Virtual Lab** e o **Application Group** criados.
3. (Opcional) **Linked Jobs:** Adicione jobs de backup inteiros para testar TODAS as VMs daquele job sequencialmente.
4. **Schedule:** Agende para rodar fora do horário de backup (ex: Domingos às 08:00).
![SureBackup Job](assets/veeam_surebackup_job.png)
## 5. SOLUÇÃO DE PROBLEMAS (TROUBLESHOOTING)
**Problema 1: Erro "Masquerade IP address is not available"**
* **Causa:** Conflito de IP na rede de produção.
* **Solução:** No Virtual Lab settings, mude o prefixo de masquerade para uma faixa não usada (ex: 192.168.250.x).
**Problema 2: VM falha no teste de Ping**
* **Causa:** Firewall do Windows dentro da VM bloqueando ICMP ou VM demorou para ligar.
* **Solução:**
1. Aumente o "Maximum allowed boot time" no Application Group.
2. Garanta que o Firewall da VM permita "File and Printer Sharing (Echo Request)".
## 6. DADOS TÉCNICOS
| Campo | Valor | Descrição |
| :--- | :--- | :--- |
| **Proxy Appliance** | Linux (Tiny) | Roteador virtual criado pelo Veeam |
| **vSwitch** | vSwitch isolado | Criado automaticamente no ESXi (sem uplink físico) |
| **Relatório** | HTML/Email | Enviado ao fim do job com status de cada VM |
## 7. VALIDAÇÃO FINAL (Definição de Pronto)
- [ ] O Job SureBackup rodou com status "Success"?
- [ ] O relatório mostra "Heartbeat: OK, Ping: OK, Scripts: OK" para as VMs críticas?
- [ ] O Virtual Lab foi desligado automaticamente após o teste?

File diff suppressed because one or more lines are too long

View File

@ -1,68 +0,0 @@
# MANUAL TÉCNICO - ARQUITETURA DE PERSISTÊNCIA E TROUBLESHOOTING AVANÇADO
**Código:** ITGENG 0021/26 | **Classificação:** CONFIDENCIAL
**Responsável:** João Pedro Toledo Gonçalves | **Data:** {{DATA_ATUAL}}
## 1. HISTÓRICO DE REVISÃO
| Data | Versão | Descrição | Autor |
| :--- | :--- | :--- | :--- |
| {{DATA_ATUAL}} | 1.0 | Criação Inicial | João Pedro Toledo Gonçalves |
## 2. OBJETIVO
Definir políticas de persistência de dados (Trade-off Performance vs Segurança) e procedimentos de recuperação de desastres (Crash Recovery e OOM).
---
## 3. ESTRATÉGIAS DE PERSISTÊNCIA REDIS
O Redis pode ser apenas Cache (volátil) ou Banco (persistente).
| Modo | Descrição | Prós | Contras |
| :--- | :--- | :--- | :--- |
| **RDB (Snapshot)** | Salva o banco a cada X minutos. | Rápido restore, arquivo compacto. | Perde os dados desde o último snap. |
| **AOF (Append Only)** | Salva cada comando escrito. | Perda mínima (1s), Seguro. | Arquivo cresce muito, restore lento. |
| **Híbrido** | RDB + AOF. | Segurança do AOF + Rapidez do RDB. | Mais I/O de disco. |
**Recomendação iT Guys:** Use **Híbrido** para bancos críticos e **Apenas RDB** para Cache.
---
## 4. PERSISTÊNCIA SQL (WAL / BINLOG)
Se o servidor desligar da tomada, os dados no WAL/Binlog salvam o dia.
**PostgreSQL (WAL):**
* `fsync = on`: **OBRIGATÓRIO**. Garante que o dado foi pro disco físico. Desativar dá velocidade mas corrompe o banco em crash.
* `synchronous_commit`: Pode ser `off` se você aceita perder alguns milissegundos em troca de performance.
---
## 5. CENÁRIOS DE CRASH E SOLUÇÕES
### Cenário 1: OOM Killer (Out Of Memory)
O Linux mata o banco porque acabou a RAM.
* **Sintoma:** Log do sistema diz `Killed process 1234 (postgres)`.
* **Correção Imediata:** Aumente o Swap ou reduza os Buffers do banco.
* **Prevenção:** Ajuste o `oom_score_adj` no Systemd para -1000 (Imune) - *Use com cautela extrema*.
### Cenário 2: Arquivo Corrompido (.pid lock)
Após um crash elétrico, o serviço não sobe dizendo que "já está rodando".
* **Solução:** Verifique se o processo existe (`ps aux`). Se não existir, delete o arquivo `postmaster.pid` (PG) ou `mysql.pid`.
### Cenário 3: Redis em modo Read-Only
O Redis parou de aceitar escrita.
* **Causa provável:** O disco encheu ou o RDB falhou (`stop-writes-on-bgsave-error yes`).
* **Solução:** Libere espaço em disco ou corrija a permissão da pasta de dados.
## 6. POLÍTICA DE DISASTER RECOVERY (DR)
Em caso de corrupção total:
1. Não tente consertar a produção corrompida.
2. Suba uma nova instância (VM limpa).
3. Importe o Último Dump/Backup (Nível 1).
4. Reaplique os logs de transação (Point-in-Time Recovery) se disponíveis (Requer setup prévio de Archiving).
## 7. VALIDAÇÃO FINAL
- [ ] A persistência (fsync/AOF) está ativa conforme a criticidade?
- [ ] O servidor tem Swap configurado para segurar picos antes do OOM?

View File

@ -1,89 +0,0 @@
# MANUAL TÉCNICO - DOCKER PARA DESENVOLVEDORES E FERRAMENTAS PORTÁTEIS
**Código:** ITGCLI 0003/26 | **Classificação:** PÚBLICO
**Responsável:** João Pedro Toledo Gonçalves | **Data:** {{DATA_ATUAL}}
## 1. HISTÓRICO DE REVISÃO
> ⚠️ **REGRA DE OURO:**
> 1. **Autor:** João Pedro Toledo Gonçalves.
> 2. **Descrição:** Criação do documento.
| Data | Versão | Descrição | Autor |
| :--- | :--- | :--- | :--- |
| {{DATA_ATUAL}} | 1.0 | Criação Inicial | João Pedro Toledo Gonçalves |
## 2. OBJETIVO
Ensinar o desenvolvedor a usar o Docker para rodar ferramentas, bancos de dados e linguagens sem "sujar" o sistema operacional principal, resolvendo o problema de "Na minha máquina funciona".
## 3. PRÉ-REQUISITOS
- [ ] Docker Desktop (Windows/Mac) ou Engine (Linux) instalado.
## 4. CONCEITOS (POR QUE ISSO EXISTE?)
* **Efêmero (`--rm`):** O container nasce, executa e se autodestrói. Zero lixo no disco.
* **Portátil:** Se roda no seu Docker, roda no servidor de produção.
## 5. PASSO A PASSO (EXECUÇÃO)
**Cenário A: Rodando Ferramentas sem Instalar Nada**
> Imagine que você precisa testar um script Python ou Node.js, mas não quer instalar versões específicas na sua máquina.
1. Rode um script Python (One-off):
```bash
# Monta a pasta atual (.) em /app e roda o script
docker run --rm -v $(pwd):/app -w /app python:3.9 python meu_script.py
```
* `--rm`: Remove o container ao terminar.
* `-v`: Disponibiliza seus arquivos locais dentro do container.
2. Acesse um terminal Node.js limpo:
```bash
docker run --rm -it node:18 /bin/bash
```
**Cenário B: Banco de Dados de Desenvolvimento**
> Suba um banco Postgres em segundos, use, e destrua.
1. Comando rápido (Oneliner):
```bash
docker run --rm --name meupostgres -e POSTGRES_PASSWORD=secret -p 5432:5432 postgres:15
```
* Acesse via DBeaver/PgAdmin em `localhost:5432`.
**Cenário C: Ambiente Completo com Compose**
> A melhor forma de padronizar o time. Crie um `docker-compose.yaml` na raiz do projeto.
```yaml
version: '3.8'
services:
app:
build: .
ports: ["3000:3000"]
volumes:
- .:/code # Hot-reload: altera no host, reflete no container
db:
image: postgres:15
environment:
POSTGRES_PASSWORD: root
ports: ["5432:5432"]
```
1. Para iniciar tudo:
```bash
docker compose up
```
## 6. SOLUÇÃO DE PROBLEMAS (TROUBLESHOOTING)
**Problema 1: "Works on my machine" ainda acontece**
* **Causa:** Você está usando volumes (`-v`) que trazem arquivos de config do seu PC para dentro do container.
* **Solução:** Use `.dockerignore` para não copiar arquivos `node_modules` ou `.env` locais durante o build.
**Problema 2: Porta ocupada**
* **Causa:** Você já tem um Postgres instalado no Windows Services.
* **Solução:** Pare o serviço local ou mude a porta do container: `-p 5433:5432`.
## 7. VALIDAÇÃO FINAL
- [ ] Consegue rodar `docker run --rm hello-world` e ele some depois (`docker ps -a`)?
- [ ] Seu time consegue rodar `docker compose up` e ter o ambiente rodando sem configurar nada?

View File

@ -1,83 +0,0 @@
# MANUAL TÉCNICO - DEPLOY E ACESSO AO PORTAINER CE
**Código:** ITGSUP 0008/26 | **Classificação:** RESTRITO
**Responsável:** João Pedro Toledo Gonçalves | **Data:** {{DATA_ATUAL}}
## 1. HISTÓRICO DE REVISÃO
> ⚠️ **REGRA DE OURO:**
> 1. **Autor:** João Pedro Toledo Gonçalves.
> 2. **Descrição:** Criação do documento.
| Data | Versão | Descrição | Autor |
| :--- | :--- | :--- | :--- |
| {{DATA_ATUAL}} | 1.0 | Criação Inicial | João Pedro Toledo Gonçalves |
## 2. OBJETIVO
Instalar o Portainer CE (Community Edition) para gerenciamento visual de conteineres, imagens e redes, utilizando a instalação via Docker STANDALONE (Não Swarm).
## 3. PRÉ-REQUISITOS
- [ ] Docker Engine instalado e rodando.
- [ ] Porta 9443 liberada no Firewal do Host.
- [ ] Acesso root/sudo.
## 4. PASSO A PASSO (EXECUÇÃO)
**Etapa 1: Persistência de Dados**
1. Crie o volume para salvar as configurações do Portainer.
```bash
docker volume create portainer_data
```
**Etapa 2: Deploy do Container**
> 🚀 **DICA:** O Portainer precisa de acesso ao socket do Docker (`/var/run/docker.sock`) para controlar o host.
1. Execute o comando oficial de instalação:
```bash
docker run -d -p 8000:8000 -p 9443:9443 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:latest
```
**Etapa 3: Acesso e Configuração Inicial**
1. Abra o navegador e acesse: `https://{{IP_SERVIDOR}}:9443`.
2. A tela **"New Portainer Installation"** será exibida.
> [!IMPORTANT]
> Se você demorar mais de 5 minutos, o Portainer desativa o setup por segurança. Reinicie o container com `docker restart portainer` se isso ocorrer.
3. **Preencha os campos:**
* **Username:** `admin` (ou outro de sua escolha)
* **Password:** Crie uma senha forte (mínimo 12 caracteres).
* **Allow collection of anonymous statistics:** Opcional (Recomendado desmarcar em produção).
4. Clique em **Create user**.
**Etapa 4: Conectando ao Ambiente Local**
1. Após o login, clique em **"Get Started"** na opção **Local**.
2. Você verá a dashboard principal com a lista de Stacks, Containers e Imagens.
## 5. SOLUÇÃO DE PROBLEMAS (TROUBLESHOOTING)
**Problema 1: "Client sent an HTTP request to an HTTPS server"**
* **Causa:** Tentar acessar via `http://` na porta 9443.
* **Solução:** Sempre use `https://`. (Aceite o aviso de certificado auto-assinado).
**Problema 2: "Error response from daemon: bind: address already in use"**
* **Causa:** Porta 9443 ou 8000 já ocupada.
* **Solução:**
1. Verifique quem usa a porta: `sudo lsof -i :9443`.
2. Altere o mapeamento no run: `-p 9444:9443`.
## 6. DADOS TÉCNICOS
| Campo | Valor | Descrição |
| :--- | :--- | :--- |
| **Imagem Oficial** | `portainer/portainer-ce:latest` | Use sempre a CE, não a Business (salvo se tiver licença) |
| **Porta HTTPS** | `9443` | Acesso Web seguro |
| **Volume** | `portainer_data` | Dados do banco interno BoltDB |
## 7. VALIDAÇÃO FINAL
- [ ] A URL `https://IP:9443` abre a tela de login?
- [ ] O container `portainer` está com status "Up" (`docker ps`)?
- [ ] O login funciona e mostra o ambiente "local"?

View File

@ -1,77 +0,0 @@
# MANUAL TÉCNICO - GESTÃO DE STACKS NO PORTAINER
**Código:** ITGSUP 0009/26 | **Classificação:** RESTRITO
**Responsável:** João Pedro Toledo Gonçalves | **Data:** {{DATA_ATUAL}}
## 1. HISTÓRICO DE REVISÃO
> ⚠️ **REGRA DE OURO:**
> 1. **Autor:** João Pedro Toledo Gonçalves.
> 2. **Descrição:** Criação do documento.
| Data | Versão | Descrição | Autor |
| :--- | :--- | :--- | :--- |
| {{DATA_ATUAL}} | 1.0 | Criação Inicial | João Pedro Toledo Gonçalves |
## 2. OBJETIVO
Padronizar o deploy de aplicações (Stacks) no Portainer utilizando três métodos: Upload Manual, Templates de App e Repositório Git (GitOps Básico).
## 3. PRÉ-REQUISITOS
- [ ] Portainer instalado e acessível.
- [ ] Um arquivo `docker-compose.yml` válido E/OU Uma URL de repositório Git (GitHub/GitLab).
## 4. PASSO A PASSO (EXECUÇÃO)
**Etapa 1: Deploy via Web Editor (Rápido)**
1. No menu lateral, clique em **Stacks** -> **Add stack**.
2. Selecione a opção **Web editor**.
3. **Name:** Dê um nome único (ex: `meu-nginx`).
4. Cole o conteúdo do seu `docker-compose.yml` na área de texto.
5. Clique em **Deploy the stack**.
**Etapa 2: Deploy via App Templates (Iniciantes)**
1. No menu lateral, clique em **App Templates**.
2. Selecione uma aplicação pronta (ex: "Wordpress" ou "Nginx").
3. Preencha os campos (Nome, Senha do Banco).
4. Clique em **Deploy the stack**.
**Etapa 3: Deploy via Repositório Git (Recomendado/GitOps)**
> 🚀 **MELHOR PRÁTICA:** Permite versionamento e "Single Source of Truth".
1. Vá em **Stacks** -> **Add stack**.
2. Selecione **Git Repository**.
3. **Configuração:**
* **Repository URL:** `https://github.com/usuario/repo.git`
* **Repository Reference:** `main` (ou `refs/heads/main`).
* **Compose path:** `docker-compose.yml` (se estiver na raiz).
4. **Authentication (Se privado):**
* Ative "Authentication".
* Use seu Username e, preferencialmente, um **Personal Access Token** (não sua senha).
5. Ative **Automatic updates** (Opcional) para polling.
6. Clique em **Deploy the stack**.
**Etapa 4: Edição e Updates**
* **Web Editor:** Clique na stack -> Editor -> Update the stack.
* **Git:** Faça o commit no Git -> No Portainer, clique em **"Pull and redeploy"** (ou aguarde o Auto-update).
## 5. SOLUÇÃO DE PROBLEMAS (TROUBLESHOOTING)
**Problema 1: "Deployment error: Stack already exists"**
* **Causa:** Já existe uma stack com esse nome (mesmo que parada).
* **Solução:** Delete a stack antiga ou use outro nome.
**Problema 2: "Authentication failed" no Git**
* **Causa:** Senha incorreta ou uso de senha ao invés de Token (GitHub exige Token).
* **Solução:** Gere um PAT (Personal Access Token) no GitHub (Settings -> Developer Settings) e use como senha.
## 6. DADOS TÉCNICOS
| Campo | Valor | Descrição |
| :--- | :--- | :--- |
| **Padrão** | `docker-compose.yml` | Formato obrigatório |
| **Limit** | `Stack` | Equivalente a um projeto Docker Compose |
## 7. VALIDAÇÃO FINAL
- [ ] A stack aparece com status "Active"?
- [ ] Os conteineres subiram corretamente?
- [ ] Alterar o Git reflete no Portainer (se testado pull)?

View File

@ -1,122 +0,0 @@
# MANUAL TÉCNICO - INSTALAÇÃO E CONFIGURAÇÃO DO DOCKER E COMPOSE (LINUX)
**Código:** ITGSUP 0007/26 | **Classificação:** RESTRITO
**Responsável:** João Pedro Toledo Gonçalves | **Data:** {{DATA_ATUAL}}
## 1. HISTÓRICO DE REVISÃO
> ⚠️ **REGRA DE OURO:**
> 1. **Autor:** João Pedro Toledo Gonçalves.
> 2. **Descrição:** Criação do documento.
| Data | Versão | Descrição | Autor |
| :--- | :--- | :--- | :--- |
| {{DATA_ATUAL}} | 1.0 | Criação Inicial | João Pedro Toledo Gonçalves |
## 2. OBJETIVO
Padronizar a instalação do Docker Engine e Docker Compose em servidores Linux (Ubuntu/Debian), garantindo suporte oficial e atualizações seguras.
## 3. PRÉ-REQUISITOS
> Liste o que é necessário ANTES de começar.
* [ ] Acesso ao servidor via SSH.
* [ ] Usuário com privilégios de `sudo` ou `root`.
* [ ] Conexão com a internet liberada (Portas 80/443).
* [ ] Sistema Operacional compatível (Ubuntu 20.04+, Debian 11+).
## 4. PASSO A PASSO (EXECUÇÃO)
**Etapa 1: Preparação do Ambiente e Repositórios**
1. Atualize o índice de pacotes e instale as dependências essenciais para HTTPS.
```bash
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
```
2. Adicione a chave GPG oficial do Docker para garantir a autenticidade dos pacotes.
```bash
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
```
3. Configure o repositório estável.
> **NOTA:** O comando abaixo detecta automaticamente a versão do OS (`lsb_release`).
```bash
echo \
"deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
```
**Etapa 2: Instalação dos Pacotes**
1. Atualize novamente o índice (agora com o repo do Docker) e instale o Engine, CLI e plugins.
```bash
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
```
**Etapa 3: Pós-Instalação (Permissões)**
> ⚠️ **IMPORTANTE:** Execute isso para **não** precisar usar `sudo` em todo comando docker.
1. Adicione seu usuário atual ao grupo `docker`.
2. Aplique a mudança de grupo na sessão atual.
```bash
sudo usermod -aG docker $USER
newgrp docker
```
**Etapa 4: Validação (Hello World)**
1. Execute o container de teste para validar a instalação completa.
```bash
docker run hello-world
```
2. O resultado esperado deve ser idêntico ao bloco abaixo:
> [!NOTE]
> Sucesso na execução do Docker.
```text
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal.
```
## 5. SOLUÇÃO DE PROBLEMAS (TROUBLESHOOTING)
**Problema 1: "permission denied while trying to connect to the Docker daemon socket"**
* **Causa:** O usuário não está no grupo `docker` ou a sessão não foi atualizada.
* **Solução:**
1. Execute `sudo usermod -aG docker $USER`.
2. Faça **logoff** e login novamente ou use `newgrp docker`.
**Problema 2: Erro de GPG ou Repositório não encontrado**
* **Causa:** Chave expirada ou OS não suportado.
* **Solução:**
1. Verifique se o codename do OS em `/etc/os-release` é compatível (focal, jammy, bullseye, bookworm).
2. Remova o arquivo `/etc/apt/sources.list.d/docker.list` e refaça a **Etapa 1**.
## 6. DADOS TÉCNICOS
| Campo | Valor | Descrição |
| :--- | :--- | :--- |
| **Serviço** | `docker.service` | Nome do serviço no Systemd |
| **Config** | `/etc/docker/daemon.json` | Arquivo principal de configuração |
| **Dados** | `/var/lib/docker` | Local padrão de imagens e volumes |
| **Socket** | `/var/run/docker.sock` | Socket de comunicação da API |
## 7. VALIDAÇÃO FINAL (Definição de Pronto)
- [ ] O comando `docker run hello-world` funciona sem sudo?
- [ ] O comando `docker compose version` retorna a versão (ex: v2.x.x)?
- [ ] O serviço está ativo? (`sudo systemctl status docker` mostra **active (running)**)

View File

@ -1,97 +0,0 @@
# MANUAL TÉCNICO - HEALTHCHECKS E SCRIPTS AUTOMATIZADOS NO DOCKER
**Código:** ITGINF 0011/26 | **Classificação:** RESTRITO
**Responsável:** João Pedro Toledo Gonçalves | **Data:** {{DATA_ATUAL}}
## 1. HISTÓRICO DE REVISÃO
> ⚠️ **REGRA DE OURO:**
> 1. **Autor:** João Pedro Toledo Gonçalves.
> 2. **Descrição:** Criação do documento.
| Data | Versão | Descrição | Autor |
| :--- | :--- | :--- | :--- |
| {{DATA_ATUAL}} | 1.0 | Criação Inicial | João Pedro Toledo Gonçalves |
## 2. OBJETIVO
Implementar verificações de saúde (Healthchecks) para auto-cura de aplicações e configurar tarefas agendadas (Cron) de forma compatível com conteineres.
## 3. PRÉ-REQUISITOS
- [ ] Conhecimento de Dockerfile e Docker Compose.
## 4. PASSO A PASSO (EXECUÇÃO)
**Etapa 1: Definindo HEALTHCHECK no Dockerfile**
> **NOTA:** O Docker executa esse comando periodicamente. Se falhar X vezes, marca o container como `unhealthy`.
1. Edite seu `Dockerfile`.
2. Adicione a instrução (exemplo para web server):
```dockerfile
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
CMD curl -f http://localhost/ || exit 1
```
**Etapa 2: Definindo HEALTHCHECK no Compose**
1. No `docker-compose.yml`, você pode sobrescrever ou definir:
```yaml
version: '3.8'
services:
web:
image: nginx
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 1m30s
timeout: 10s
retries: 3
```
**Etapa 3: Scripts Agendados (Cron)**
> ⚠️ **IMPORTANTE:** Conteineres devem ter UM processo principal. Rodar `cron` junto com `apache` no mesmo container é má prática ("Fat Container").
**Abordagem A: Container Dedicado (Sidecar)**
1. Crie um container pequeno (Alpine) só para rodar o script e sair.
2. Agende a execução desse container pelo `cron` do **HOST**.
```bash
# No crontab do HOST (crontab -e)
# Roda backup do banco postgres todo dia as 03:00
0 3 * * * docker exec meu-postgres pg_dumpall > /backups/db.sql
```
**Abordagem B: Ofelia (Job Scheduler for Docker)**
1. Use uma imagem especializada que escuta events do Docker.
```yaml
services:
ofelia:
image: mcuadros/ofelia:latest
depends_on:
- web
command: daemon --docker
volumes:
- /var/run/docker.sock:/var/run/docker.sock
web:
image: my-app
labels:
ofelia.enabled: "true"
ofelia.job-exec.datecron.schedule: "@every 10s"
ofelia.job-exec.datecron.command: "echo 'Backup process...'"
```
## 5. SOLUÇÃO DE PROBLEMAS (TROUBLESHOOTING)
**Problema 1: Container sempre em `starting`**
* **Causa:** O healthcheck nunca passa com sucesso.
* **Solução:**
1. Rode o comando do healthcheck manualmente: `docker exec -it [ID] curl ...`.
2. Verifique se o `curl`/`wget` está instalado na imagem.
**Problema 2: Cron dentro do container não roda**
* **Causa:** Variáveis de ambiente não passam automaticamente para o cron.
* **Solução:** Sempre use caminhos absolutos nos scripts e carregue as variáveis se necessário.
## 6. VALIDAÇÃO FINAL
- [ ] `docker ps` mostra status `(healthy)`?
- [ ] O comando agendado foi executado no horário previsto?

View File

@ -1,94 +0,0 @@
# MANUAL TÉCNICO - DOCKER SWARM: INICIALIZAÇÃO E GERENCIAMENTO
**Código:** ITGENG 0014/26 | **Classificação:** RESTRITO
**Responsável:** João Pedro Toledo Gonçalves | **Data:** {{DATA_ATUAL}}
## 1. HISTÓRICO DE REVISÃO
> ⚠️ **REGRA DE OURO:**
> 1. **Autor:** João Pedro Toledo Gonçalves.
> 2. **Descrição:** Criação do documento.
| Data | Versão | Descrição | Autor |
| :--- | :--- | :--- | :--- |
| {{DATA_ATUAL}} | 1.0 | Criação Inicial | João Pedro Toledo Gonçalves |
## 2. OBJETIVO
Habilitar o o modo Swarm (Orquestração Nativa) para garantir alta disponibilidade, balanceamento de carga e escalabilidade horizontal de containers.
## 3. PRÉ-REQUISITOS
- [ ] Mínimo de 3 máquinas com Docker instalado (Recomendado para HA).
- [ ] Portas liberadas entre os nós:
* **TCP/2377** (Cluster Management)
* **TCP/UDP 7946** (Communication)
* **UDP 4789** (Overlay Network)
## 4. PASSO A PASSO (EXECUÇÃO)
**Etapa 1: Inicializando o Manager (Nó Principal)**
1. No servidor escolhido como líder, execute:
```bash
docker swarm init --advertise-addr {{IP_DO_MANAGER}}
```
2. O comando retornará um token. Copie-o. Exemplo:
`docker swarm join --token SWMTKN-1-xx... {{IP_DO_MANAGER}}:2377`
**Etapa 2: Adicionando Workers**
1. Nos outros servidores, cole o comando copiado na etapa anterior.
2. Confirme a entrada no cluster:
```bash
docker node ls
```
> O status deve ser **Ready** e **Active**.
**Etapa 3: Deploy de Serviços (Services vs Containers)**
> **NOTA:** No Swarm, não damos deploy em "Containers", mas sim em "Services". O Swarm decide onde o container vai rodar.
1. Crie um serviço replicado (3 réplicas do Nginx).
```bash
docker service create --name meu-site-ha --replicas 3 -p 80:80 nginx
```
2. Liste os serviços e verifique a distribuição.
```bash
docker service ls
docker service ps meu-site-ha
```
**Etapa 4: Escala e Atualização (Rolling Update)**
1. Aumente a capacidade para 5 containers.
```bash
docker service scale meu-site-ha=5
```
2. Atualize a imagem sem downtime (Rolling Update).
```bash
docker service update --image nginx:alpine meu-site-ha
```
## 5. SOLUÇÃO DE PROBLEMAS (TROUBLESHOOTING)
**Problema 1: Nós não conseguem se comunicar (Status Down)**
* **Causa:** Firewall bloqueando porta 7946 ou 4789.
* **Solução:** Verifique `telnet IP 2377` e libere as portas no Security Group/Firewall.
**Problema 2: Split Brain (Líderes perdidos)**
* **Causa:** Mais de 50% dos Managers caíram.
* **Solução:**
1. No manager sobrevivente: `docker swarm init --force-new-cluster`.
## 6. DADOS TÉCNICOS
| Campo | Valor | Descrição |
| :--- | :--- | :--- |
| **Driver Rede** | `overlay` | Rede criptografada multi-host |
| **Routing Mesh** | `Ingress` | Balanceador de carga interno (L4) |
## 7. VALIDAÇÃO FINAL
- [ ] `docker node ls` mostra todos os nós online?
- [ ] Ao desligar um nó worker, os containers migram para outro?
- [ ] Acessar o IP de QUALQUER nó na porta 80 carrega o site (Routing Mesh)?

View File

@ -1,108 +0,0 @@
# MANUAL TÉCNICO - KUBERNETES: VISÃO GERAL E FERRAMENTAS BÁSICAS
**Código:** ITGENG 0015/26 | **Classificação:** RESTRITO
**Responsável:** João Pedro Toledo Gonçalves | **Data:** {{DATA_ATUAL}}
## 1. HISTÓRICO DE REVISÃO
> ⚠️ **REGRA DE OURO:**
> 1. **Autor:** João Pedro Toledo Gonçalves.
> 2. **Descrição:** Criação do documento.
| Data | Versão | Descrição | Autor |
| :--- | :--- | :--- | :--- |
| {{DATA_ATUAL}} | 1.0 | Criação Inicial | João Pedro Toledo Gonçalves |
## 2. OBJETIVO
Introduzir os conceitos fundamentais do Kubernetes (K8s) e o uso da ferramenta de linha de comando `kubectl` para administração de clusters.
## 3. PRÉ-REQUISITOS
- [ ] Um cluster Kubernetes ativo (Pode ser Minikube, K3s, EKS, AKS).
- [ ] Ferramenta `kubectl` instalada localmente.
- [ ] Arquivo de configuração `~/.kube/config` (kubeconfig).
## 4. CONCEITOS CHAVE
> **NOTA:** O K8s é declarativo. Você define o estado desejado (YAML) e ele trabalha para manter esse estado.
| Componente | Função | Equivalente Docker |
| :--- | :--- | :--- |
| **Pod** | Menor unidade deployável. Pode ter 1+ containers. | Container "Grupo" |
| **Deployment** | Gerencia réplicas e updates de Pods. | Service (Swarm) |
| **Service** | Expõe o Deployment na rede (ClusterIP, NodePort). | Port Mapping |
| **Namespace** | Segregação virtual de recursos. | ~Stack Name |
## 5. PASSO A PASSO (EXECUÇÃO)
**Etapa 1: Verificação de Conexão**
1. Verifique se o `kubectl` consegue falar com o cluster.
```bash
kubectl cluster-info
kubectl get nodes
```
**Etapa 2: Deploy Imperativo (Rápido)**
1. Crie um deployment simples do Nginx.
```bash
kubectl create deployment demo-nginx --image=nginx
```
**Etapa 3: Deploy Declarativo (YAML - Recomendado)**
1. Crie um arquivo `app.yaml`:
```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: meu-app
spec:
replicas: 2
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: nginx
image: nginx:latest
```
2. Aplique o arquivo:
```bash
kubectl apply -f app.yaml
```
**Etapa 4: Debug e Logs**
1. Liste os pods para pegar o nome.
```bash
kubectl get pods
```
2. Veja os logs de um pod específico.
```bash
kubectl logs -f meu-app-xxxxx-xxxxx
```
3. Acesse o shell interativo.
```bash
kubectl exec -it meu-app-xxxxx-xxxxx -- /bin/bash
```
## 6. SOLUÇÃO DE PROBLEMAS (TROUBLESHOOTING)
**Problema 1: `ErrImagePull` ou `ImagePullBackOff`**
* **Causa:** Nome da imagem errado, tag inexistente ou falta de credenciais (Private Registry).
* **Solução:**
1. `kubectl describe pod [NOME_POD]` -> Veja a seção "Events".
**Problema 2: `CrashLoopBackOff`**
* **Causa:** O container iniciou e "morreu" imediatamente (Erro na aplicação).
* **Solução:**
1. `kubectl logs [NOME_POD] --previous` para ver o log antes do crash.
## 7. VALIDAÇÃO FINAL
- [ ] `kubectl get nodes` retorna status **Ready**?
- [ ] `kubectl get pods` mostra todos os pods como **Running**?
- [ ] É possível aplicar mudanças editando o YAML e rodando `apply` novamente?

View File

@ -1,76 +0,0 @@
# MANUAL TÉCNICO - ACESSO AO SERVIDOR WINDOWS CORE E POWERSHELL
**Código:** ITGENG 0001/26 | **Classificação:** RESTRITO
**Responsável:** João Pedro Toledo Gonçalves | **Data:** {{DATA_ATUAL}}
## 1. HISTÓRICO DE REVISÃO
| Data | Versão | Descrição | Autor |
| :--- | :--- | :--- | :--- |
| {{DATA_ATUAL}} | 1.0 | Revisão e Padronização (MTITG 002-23) | Agente iT Guys |
## 2. OBJETIVO
Orientar o acesso e a administração básica do servidor Exchange `SRVCGDVIEXCH001`, que opera em modo **Windows Server Core** (Sem Interface Gráfica), exigindo o uso de linha de comando para gerenciamento.
## 3. PRÉ-REQUISITOS
Antes de iniciar, garanta que:
* [ ] Você está conectado à VPN Corporativa.
* [ ] O seu usuário possui permissão de **Domain Admin**.
* [ ] O acesso RDP (Porta 3389) está liberado para o seu IP.
## 4. DADOS DO SERVIDOR
| Parâmetro | Valor |
| :--- | :--- |
| **Hostname** | `SRVCGDVIEXCH001` |
| **IP** | `172.16.150.150` |
| **SO** | Windows Server Core (GUI-less) |
## 5. PASSO A PASSO (EXECUÇÃO)
### Etapa 1: Conexão Remota (RDP)
1. Abra a **Conexão de Área de Trabalho Remota** (`mstsc`).
2. Conecte-se ao IP: `172.16.150.150`.
3. Autentique-se com credenciais administrativas (`DOMINIO\SeuUsuario`).
4. Ao logar, você verá apenas uma janela de **CMD**. **NÃO FECHE ESSA JANELA.**
### Etapa 2: Comandos Básicos do Sistema
Como não há Menu Iniciar, use os comandos abaixo:
* **`sconfig`**: Abre o menu de configuração (IP, Updates, Data/Hora).
* **`taskmgr`**: Abre o Gerenciador de Tarefas (Gráfico).
* **`logoff`**: Para sair da sessão corretamente.
* **`shutdown /r /t 0`**: Reiniciar o servidor imediatamente.
![Exemplo do Menu SConfig](assets/sconfig_menu.png)
### Etapa 3: Gerenciamento do Exchange (EMS)
Para administrar o Exchange, precisamos carregar os módulos (Snap-ins) no PowerShell.
1. No CMD padrão, digite `powershell` e tecle Enter.
2. O prompt mudará para `PS C:\Users\...>`.
3. Execute o comando para carregar o snap-in:
```powershell
Add-PSSnapin Microsoft.Exchange.Management.PowerShell.SnapIn
```
4. Teste se o módulo carregou listando o servidor:
```powershell
Get-ExchangeServer
```
## 6. SOLUÇÃO DE PROBLEMAS (TROUBLESHOOTING)
**Situação:** "Fechei a janela do CMD sem querer e a tela ficou preta."
* **Solução:**
1. Pressione `Ctrl` + `Shift` + `Esc` para abrir o **Task Manager**.
2. Clique em **Arquivo** > **Executar nova tarefa**.
3. Digite `cmd` e dê OK.
**Situação:** "O comando do Exchange não é reconhecido."
* **Solução:** Você esqueceu de rodar o comando `Add-PSSnapin` (Etapa 3.3). O PowerShell padrão do Windows não conhece comandos do Exchange.
## 7. VALIDAÇÃO FINAL
- [ ] Conseguiu conectar via RDP?
- [ ] O comando `Get-ExchangeServer` retornou o nome do servidor (`SRVCGDVIEXCH001`)?

View File

@ -1,31 +0,0 @@
# [Nível 3] Arquitetura Técnica e Mapeamento
**Público Alvo:** Engenharia / SysAdmin
**Confidencialidade:** Interna.
## 1. Identificação do Servidor
- **Hostname:** `SRVCGDVIEXCH001`
- **FQDN Interno:** `srvcgdviexch001.exch.local`
- **IP:** (Verificar no adaptador de rede)
## 2. Bases de Dados (Mailbox Databases)
| Nome | Status |
| :---------------------------------------------- | :------ |
| `ANATRAM`, `ENSEG - Local`, `ENSEG disco E` | Montado |
| `Ferreira Real`, `Grupo PraLog` | Montado |
| `IntegraMedBR`, `IronZoneBR disco G`, `iT Guys` | Montado |
| `Mailbox Database 0...` (Default) | Montado |
| `Oeste Pan`, `Trois Cents`, `Z Station` | Montado |
## 3. Certificados Digitais
- **Emissor:** Certify (Let's Encrypt / ACME).
- **Subject:** `mail.itguys.com.br`
- **Renovação:** Automática (verificar serviço do Certify no Windows).
## 4. Endereçamento Externo
- **OWA/ECP:** `https://webmail.itguys.com.br`
- **Autodiscover:** `autodiscover.itguys.com.br` (e demais domínios via CNAME/SRV).

View File

@ -1,51 +0,0 @@
# [Nível 3] Auditoria Administrativa e Logs de Segurança
**Público Alvo:** Segurança / Auditoria
**Objetivo:** Descobrir "Quem fez o que" no servidor.
## Introdução
O Exchange registra **cada comando PowerShell** executado, seja por um administrador via Shell ou via interface ECP (a interface web apenas roda comandos PowerShell por trás).
## Buscando Eventos (Search-AdminAuditLog)
### Exemplo 1: Quem mexeu na caixa do Diretor?
Procurar qualquer alteração feita na caixa "diretor@itguys.com.br" nos últimos 30 dias.
```powershell
Search-AdminAuditLog -StartDate (Get-Date).AddDays(-30) -ObjectIds "diretor"
```
### Exemplo 2: Quem deu permissão de "FullAccess"?
Procurar comandos específicos (`Add-MailboxPermission`).
```powershell
Search-AdminAuditLog -Cmdlets Add-MailboxPermission -StartDate (Get-Date).AddDays(-7)
```
### Exemplo 3: Quem apagou uma caixa?
Comandos de remoção (`Remove-Mailbox`).
```powershell
Search-AdminAuditLog -Cmdlets Remove-Mailbox
```
## Interpretando o Resultado
- **Caller:** O usuário (admin) que executou a ação.
- **CmdletName:** O comando rodado.
- **ObjectModified:** Qual objeto foi alterado.
- **CmdletParameters:** Os parâmetros usados (ex: qual permissão foi dada).
## Dica de Exportação
Para ler melhor, exporte para HTML ou CSV.
```powershell
Search-AdminAuditLog ... | New-AdminAuditLogSearch -Name "Auditoria_Diretor" -Emails "seu.email@itguys.com.br"
```
_(Isso enviará um relatório XML por e-mail para você)._

View File

@ -1,26 +0,0 @@
# [Nível 3] Checklist de Manutenção Diária e Semanal
**Público Alvo:** Operações (NOC) / SysAdmin
## Diárias (Daily Checks)
1. **Filas de E-mail (Queues)**
- PowerShell: `Get-Queue`
- _Esperado:_ `MessageCount` zerado ou baixo (<50). Se alto, investigar.
2. **Serviços do Windows**
- PowerShell: `Test-ServiceHealth` e `Get-Service *Exchange*`
- _Esperado:_ Todos `Running`.
3. **Cópia de Banco de Dados**
- PowerShell: `Get-MailboxDatabaseCopyStatus`
- _Esperado:_ `Healthy` ou `Mounted`.
## Mensais (Monthly Checks)
1. **Certificados SSL**
- PowerShell: `Get-ExchangeCertificate | Select Subject, NotAfter`
- _Ação:_ Garantir que a data de expiração esteja longe.
2. **Espaço em Disco**
- Verificar drives de LOGS. Se encherem, o banco desmonta.
3. **Windows Update**
- Aplicar patches de segurança do SO e Cumulative Updates (CUs) do Exchange.
- _Atenção:_ Sempre rodar backup antes de update de CU.

View File

@ -1,32 +0,0 @@
# [Nível 3] Disaster Recovery e Soft Restore
**Público Alvo:** Engenharia
**Situação:** Perda de dados ou falha de servidor.
## 1. Recuperação de Item Único (Soft Delete)
Se um usuário apagou um e-mail e limpou a Lixeira, o Exchange retém o item por **14 dias** (padrão).
1. No Outlook do usuário (ou via Webmail).
2. Clique com botão direito em **Itens Excluídos**.
3. **Recuperar Itens Excluídos**.
4. Selecione o e-mail e restaure.
## 2. Recuperação de Banco de Dados (Database Restore)
Se o arquivo `.edb` corromper.
1. **Dial Tone Recovery:**
- Criar um banco vazio para os usuários voltarem a trabalhar (enviar/receber novos).
- Restaurar o backup antigo em paralelo.
- Fazer o merge (RDB - Recovery Database).
2. **Ferramenta de Backup:**
- Utilize a ferramenta corporativa (Veeam/Backup Exec) para restaurar o arquivo `.edb` e logs.
- Use o `Eseutil /r` para "replay" dos logs se necessário.
## 3. Comandos Úteis de Emergência
- Verificar estado dos componentes: `Get-ServerComponentState -Identity SRVCGDVIEXCH001`
- Colocar servidor em manutenção: `Set-ServerComponentState ... -State Inactive`

View File

@ -1,37 +0,0 @@
# [Nível 3] Gestão de Conectores e Roteamento
**Público Alvo:** Engenharia / SysAdmin
**Impacto:** Parada total de fluxo de e-mails.
## 1. Conectores de Envio (Send Connectors)
Como o e-mail sai da organização.
### `365` (Smart Host)
Este conector força o envio de certos domínios parceiros para serem entregues via Microsoft 365, garantindo entregabilidade ou criptografia.
- **Rota:** `itguys-com-br.mail.protection.outlook.com`
- **Domínios Afetados:** `*.arteris.com.br`, `*.fraport-brasil.com`, `*.azulrio.com.br`, etc.
- **Custo:** 1 (Prioritário).
### `MX` (Internet Geral)
Rota padrão para todo o resto do mundo.
- **Método:** DNS MX Records.
- **Domínios:** `*` (Todos).
- **Custo:** 2.
## 2. Conectores de Recebimento (Receive Connectors)
Quem pode conectar no servidor.
- **Client Frontend (587):** Outlook, Celulares.
- **Default Frontend (25):** Entrada de e-mails da internet.
- **Relays de Aplicação:**
- `Conector ENSEG`: Permite IPs internos enviarem sem autenticação (Impressoras?).
- `Conector ITGUYS`: Similar ao acima.
- `NOC Op Manager`: Desabilitado.
**Segurança:** Antes de adicionar IPs nestes conectores, verifique se são estáticos e confiáveis.

View File

@ -1,126 +0,0 @@
# [Nível 3] Referência de Operações via PowerShell
**Contexto:** Este guia foca na administração do Exchange **sem interface gráfica**, essencial para o ambiente Windows Server Core (`172.16.150.150`).
**Pré-requisito:** Carregar o snap-in no CMD/PowerShell: `Add-PSSnapin Microsoft.Exchange.Management.PowerShell.SnapIn`
---
## 1. Gestão de Destinatários
### Criar Nova Caixa de Correio (Usuário já existe no AD)
```powershell
Enable-Mailbox -Identity "dominio\usuario" -Database "NOME_DO_BANCO"
```
### Criar Usuário + Caixa (Tudo de uma vez)
```powershell
New-Mailbox -UserPrincipalName "fulano@itguys.com.br" -Alias "fulano" -Name "Fulano da Silva" -OrganizationalUnit "ITGUYS/Users" -Database "iT Guys" -Password (ConvertTo-SecureString -String 'Senha123' -AsPlainText -Force)
```
### Ajustar Cotas (Exceção)
```powershell
Set-Mailbox -Identity "fulano" -IssueWarningQuota 4.5GB -ProhibitSendQuota 4.75GB -ProhibitSendReceiveQuota 5GB -UseDatabaseQuotaDefaults $false
```
### Ver Tamanho da Caixa
```powershell
Get-MailboxStatistics -Identity "fulano" | Select DisplayName, TotalItemSize, ItemCount
```
---
## 2. Permissões e Delegação
### Dar Acesso Total (Full Access)
```powershell
Add-MailboxPermission -Identity "CaixaAlvo" -User "UsuarioQueAcessa" -AccessRights FullAccess -InheritanceType All
```
### Dar Permissão de Enviar Como (Send As)
_Nota: Este comando é de AD, não de Mailbox._
```powershell
Add-ADPermission -Identity "CaixaAlvo" -User "UsuarioQueAcessa" -ExtendedRights "Send-As"
```
---
## 3. Rastreamento e Troubleshooting (Message Trace)
O `Get-MessageTrackingLog` é mais poderoso que a busca do ECP.
### Rastrear e-mail específico (Remetente -> Destinatário)
Visualizar status, data e EventID (Deliver, Fail, Defer).
```powershell
Get-MessageTrackingLog -Start "12/20/2025 08:00" -Sender "remetente@externo.com" -Recipients "usuario@itguys.com.br" | Select Timestamp,EventId,Source,MessageSubject
```
### Ver por que falhou (Detalhe do erro)
Se o EventID for `FAIL`, adicione `RecipientsStatus` e `RecipientStatus` para ver o erro.
```powershell
... | Select Timestamp,EventId,Recipients,RecipientStatus
```
### Ver e-mails enviados por um usuário hoje
```powershell
Get-MessageTrackingLog -ResultSize Unlimited -Start (Get-Date).AddHours(-24) -Sender "usuario@itguys.com.br" -EventId SEND
```
---
## 4. Diagnóstico de Filas e Fluxo
### Ver Filas de Envio (Queues)
Se `MessageCount` estiver alto, há congestionamento.
```powershell
Get-Queue | Select Identity, DeliveryType, Status, MessageCount, LastError
```
### Ver mensagens presas em uma fila específica
```powershell
Get-Message -Queue "SRVCGDVIEXCH001\365" | Select Subject,FromAddress,Status
```
### Forçar nova tentativa de envio (Retry)
```powershell
Retry-Queue -Identity "SRVCGDVIEXCH001\365" -Resubmit $true
```
---
## 5. Manutenção e Saúde do Servidor
### Checar status dos Bancos de Dados
Verifica se estão Montados e Saudáveis.
```powershell
Get-MailboxDatabaseCopyStatus *
```
### Checar Serviços do Exchange
```powershell
Test-ServiceHealth
```
### Espaço em Disco (Via WMI/CIM - já que não tem Explorer)
```powershell
Get-CimInstance Win32_LogicalDisk | Select DeviceID, @{N='FreeGB';E={"{0:N2}" -f ($_.FreeSpace/1GB)}}, @{N='TotalGB';E={"{0:N2}" -f ($_.Size/1GB)}}
```

View File

@ -1,127 +0,0 @@
# [Nível 3] Relatórios Avançados e Manutenção de Banco de Dados
**Público Alvo:** SysAdmin / Gestão
**Ferramenta:** PowerShell (EMS)
---
## 1. Relatórios de Uso e População
### Contagem de Usuários por Banco de Dados (Cliente)
Como o ambiente é multi-tenant separado por Database, este comando mostra quantos usuários cada cliente tem.
```powershell
Get-Mailbox -ResultSize Unlimited | Group-Object -Property Database | Select-Object Name, Count, @{n='Size(GB)';e={"{0:N2}" -f ($_.Group | ForEach-Object {(Get-MailboxStatistics $_.Identity).TotalItemSize.Value.ToGB()} | Measure-Object -Sum).Sum}} | Sort-Object Count -Descending
```
_Este comando pode demorar um pouco pois calcula o tamanho total._
### Contagem de Usuários por Domínio de E-mail
Se você mistura clientes no mesmo banco, agrupe pelo domínio do e-mail:
```powershell
Get-Mailbox -ResultSize Unlimited | Group-Object -Property @{E={$_.EmailAddresses | Where-Object {$_ -like "SMTP:*"} | ForEach-Object {$_.Split("@")[1]} | Select-Object -First 1}} | Select-Object Name, Count | Sort-Object Count -Descending
```
### Relatório de Caixas "Gigantes" (Top 20)
Identificar quem está consumindo mais espaço.
```powershell
Get-Mailbox -ResultSize Unlimited | Get-MailboxStatistics | Sort-Object TotalItemSize -Descending | Select-Object -First 20 DisplayName, @{n='Size(GB)';e={$_.TotalItemSize.Value.ToGB()}}, Database
```
---
## 2. Manutenção de Logs e Espaço em Disco
### Truncamento de Logs (Log Truncation)
Os logs de transação (`.log`) do Exchange crescem infinitamente até que um **Backup Full** seja realizado.
**NUNCA APAGUE ARQUIVOS .LOG MANUALMENTE.** Isso corrompe o banco.
**Procedimento Correto:**
1. Execute sua ferramenta de backup (Veeam, Windows Server Backup) com suporte a VSS/Exchange.
2. Ao finalizar o backup com sucesso, o Exchange apaga os logs antigos automaticamente.
**Procedimento de Emergência (Disco Cheio): Habilitar Circular Logging**
Se o disco de logs encher e o banco desmontar:
1. Hablite o Circular Logging (apaga logs assim que escritos no DB).
```powershell
Set-MailboxDatabase "NOME_DO_BANCO" -CircularLoggingEnabled $true
```
2. Desmonte e Monte o banco para aplicar (Gera downtime de segundos/minutos).
```powershell
Dismount-Database "NOME_DO_BANCO" -Confirm:$false
Mount-Database "NOME_DO_BANCO"
```
3. **Importante:** Desabilite assim que resolver o espaço e fizer backup, pois o Circular Logging impede recuperação "point-in-time".
### Backup Manual via Linha de Comando (Wbadmin)
Como o servidor é Core, não há "wbadmin.msc". Use o comando abaixo para realizar um Backup Full (VSS Real) que trunca os logs corretamente.
1. **Instalar o Recurso (se não tiver):**
```powershell
Install-WindowsFeature Windows-Server-Backup
```
2. **Identificar os Volumes:**
Use `Get-Volume` para saber onde estão seus Logs (ex: E:) e onde salvará o backup (ex: F: ou Share de Rede).
3. **Executar Backup VSS Full:**
Este comando faz backup do volume E: (Logs/DB), salva em F: (Backup), e marca como VSS Full para limpar os logs.
```cmd
wbadmin start backup -backupTarget:F: -include:E: -vssFull -quiet
```
_Nota: Substitua E: e F: pelas letras corretas._
**Se falhar:** Verifique se o disco de destino tem espaço ou se o serviço `Volume Shadow Copy` está rodando.
---
## 3. Importação e Exportação (PST)
### Pré-requisitos
1. O usuário que roda o comando precisa de permissão explicita:
```powershell
New-ManagementRoleAssignment -Role "Mailbox Import Export" -User "DOMINIO\Administrador"
```
_Feche e abra o PowerShell após rodar isso._
2. É obrigatório usar um caminho de rede (UNC) compartilhado (ex: `\\SRVCGDVIEXCH001\PSTs`), mesmo que esteja no próprio servidor. O serviço `Exchange Trusted Subsystem` precisa de permissão de Leitura/Gravação nessa pasta.
### Exportar Caixa para PST
```powershell
New-MailboxExportRequest -Mailbox "usuario" -FilePath "\\172.16.150.150\share\usuario.pst"
```
### Importar PST para Caixa
```powershell
New-MailboxImportRequest -Mailbox "usuario" -FilePath "\\172.16.150.150\share\backup_antigo.pst"
```
### Acompanhar o Andamento
```powershell
Get-MailboxExportRequest | Get-MailboxExportRequestStatistics
# ou
Get-MailboxImportRequest | Get-MailboxImportRequestStatistics
```
### Limpar Requisições Concluídas
O Exchange não limpa o histórico sozinho.
```powershell
Get-MailboxExportRequest -Status Completed | Remove-MailboxExportRequest -Confirm:$false
```

View File

@ -1,45 +0,0 @@
# [Nível 3] Renovação de Certificado SSL e Integração com IIS
**Público Alvo:** Infraestrutura
**Criticidade:** Alta (Se expirar, ninguém acessa o Webmail/Outlook).
## Cenário
Usamos o **Certify The Web** (cliente a) para renovar o certificado `mail.itguys.com.br` automaticamente a cada 60-90 dias.
## 1. Verificando o Erro
Se o navegador diz "Sua conexão não é particular":
1. Abra o aplicativo **Certify The Web** no servidor.
2. Veja o status do domínio. Se estiver vermelho, clique em **Request Certificate** para tentar forçar.
3. Se der erro de "Challenge", verifique se a porta 80 está liberada no Firewall para o mundo (o Let's Encrypt precisa validar).
## 2. Aplicando o Certificado no IIS (Manual)
Se o Certify renovou, mas o Exchange continua servindo o certificado velho:
1. Abra o **IIS Manager**.
2. Clique em **Default Web Site**.
3. No painel direito, clique em **Bindings...** (Associações).
4. Selecione a linha `https` (porta 443) e clique em **Edit**.
5. No campo **SSL Certificate**, selecione o certificado mais novo (verifique a data clicando em View).
6. Repita para o site **Exchange Back End** (porta 444).
7. Abra o CMD e reinicie o IIS:
```cmd
iisreset
```
## 3. Aplicando nos Serviços de SMTP/IMAP (PowerShell)
Além do IIS, o backend do Exchange precisa saber do certificado novo.
1. Pegue o Thumbprint do novo certificado:
```powershell
Get-ExchangeCertificate | Select Thumbprint, Subject, NotAfter
```
2. Ative os serviços:
```powershell
Enable-ExchangeCertificate -Thumbprint "COLE_O_THUMBPRINT_AQUI" -Services "IIS,SMTP,IMAP,POP"
```
_Responda "Não" se ele perguntar sobre substituir o certificado padrão, a menos que saiba o que está fazendo._

Some files were not shown because too many files have changed in this diff Show More