Refactor: Standardized filenames to [Level] Title format and cleaned duplicates
This commit is contained in:
parent
cc767d0f08
commit
00d76a98e5
|
|
@ -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.
|
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).
|
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:**
|
**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):**
|
**Tabela Canônica de Pastas (Use estas):**
|
||||||
* `documentacao agendamento` (Cron, Task Scheduler)
|
* `documentacao agendamento` (Cron, Task Scheduler)
|
||||||
|
|
|
||||||
|
|
@ -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()
|
||||||
|
|
@ -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.
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
**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".
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
**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
|
|
@ -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.
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
**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.
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
**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
|
|
@ -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).
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
**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.
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
## 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
|
|
@ -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.
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
**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).
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
**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
|
|
@ -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.
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
**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).
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
## 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
|
|
@ -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?
|
|
||||||
Binary file not shown.
|
|
@ -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?
|
|
||||||
Binary file not shown.
|
|
@ -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"?
|
|
||||||
Binary file not shown.
|
|
@ -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)?
|
|
||||||
Binary file not shown.
|
|
@ -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)**)
|
|
||||||
Binary file not shown.
|
|
@ -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?
|
|
||||||
Binary file not shown.
|
|
@ -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)?
|
|
||||||
Binary file not shown.
|
|
@ -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?
|
|
||||||
Binary file not shown.
|
|
@ -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.
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
### 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`)?
|
|
||||||
Binary file not shown.
|
|
@ -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).
|
|
||||||
Binary file not shown.
|
|
@ -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ê)._
|
|
||||||
Binary file not shown.
|
|
@ -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.
|
|
||||||
Binary file not shown.
|
|
@ -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`
|
|
||||||
Binary file not shown.
|
|
@ -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.
|
|
||||||
Binary file not shown.
|
|
@ -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)}}
|
|
||||||
```
|
|
||||||
Binary file not shown.
|
|
@ -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
|
|
||||||
```
|
|
||||||
Binary file not shown.
|
|
@ -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._
|
|
||||||
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue