Compare commits

...

26 Commits

Author SHA1 Message Date
João Pedro Toledo Goncalves 560215808e . 2026-02-02 23:09:56 -03:00
João Pedro Toledo Goncalves 0e5060ae11 UI: Updated site favicon to itguys_logo_favicon.png 2026-02-02 23:06:57 -03:00
João Pedro Toledo Goncalves 42886035c6 Fix: Enabled Material Icons and fixed PDF button syntax 2026-02-02 23:02:27 -03:00
João Pedro Toledo Goncalves 2a52707a87 Automation: Sync scripts with custom README callout style 2026-02-02 22:57:35 -03:00
João Pedro Toledo Goncalves 52ff8a79fd UI: Fixed Link Regex for Filenames with Parentheses 2026-02-02 22:33:32 -03:00
João Pedro Toledo Goncalves f508c46a18 UI: Fixed Index Links and Enabled attr_list Extensions 2026-02-02 22:31:17 -03:00
João Pedro Toledo Goncalves aa63d8333d UI: High-Fidelity Dynamic Index with Workings Links 2026-02-02 22:22:33 -03:00
João Pedro Toledo Goncalves 5d48ba5886 UI: Dynamic Index from README.md with Working Links 2026-02-02 22:14:42 -03:00
João Pedro Toledo Goncalves 04a15ef0ab UI Fix V11: Disable Search Typeahead Ghost Text (Fix Overlap) 2026-02-02 22:09:37 -03:00
João Pedro Toledo Goncalves 76665a21f8 UI Fix V10: Force Black Text on Active Search (Specificity Fix) 2026-02-02 22:07:33 -03:00
João Pedro Toledo Goncalves 8bc161cc31 UI Fix V9: Revert Overlay Visibility + Fix Invisible Text Bug 2026-02-02 22:03:06 -03:00
João Pedro Toledo Goncalves 40a321c5c7 UI Fix V8: Visible Dimming Overlay, Precision Dropdown Alignment 2026-02-02 22:00:43 -03:00
João Pedro Toledo Goncalves 56bd7060a4 UI Fix V7: Restore Click-to-Dismiss Overlay + Unlock Body Scroll 2026-02-02 21:44:27 -03:00
João Pedro Toledo Goncalves 17bd0cd8d3 UI Fix V6: Align Search Icon & Remove Modal Overlay 2026-02-02 21:39:13 -03:00
João Pedro Toledo Goncalves 71d6ff24c7 UI Fix: Force 48px Header, Absolute Center Search, Fix Overflow 2026-02-02 21:29:28 -03:00
João Pedro Toledo Goncalves e47564b753 Final Polish: Updated Logo to official asset 2026-02-02 21:25:59 -03:00
João Pedro Toledo Goncalves a14ecabb9b UI/UX v4: Brand Colors (Blue/Cyan), Compact Header (3rem) 2026-02-02 21:25:21 -03:00
João Pedro Toledo Goncalves 3fabee76b5 UI/UX v3: Modern CSS, Grid Layout, Clamp sizing 2026-02-02 21:22:49 -03:00
João Pedro Toledo Goncalves 68e2a257f0 UI/UX v2: Blue-Grey theme, Hidden Header Title, Centered Search 2026-02-02 21:20:04 -03:00
João Pedro Toledo Goncalves d7189c1a6e UI/UX: Premium styling, centered search, updated palette 2026-02-02 21:16:14 -03:00
João Pedro Toledo Goncalves a03a00ba5f Finalize: Update GEMINI.md rules and commit all changes 2026-02-02 21:11:02 -03:00
João Pedro Toledo Goncalves 7f68750023 Cleanup: Consolidate assets into Theme/assets folders 2026-02-02 21:08:34 -03:00
João Pedro Toledo Goncalves 5d14aef3a3 Cleanup: Removed residual *README.md files 2026-02-02 21:06:16 -03:00
João Pedro Toledo Goncalves 00d76a98e5 Refactor: Standardized filenames to [Level] Title format and cleaned duplicates 2026-02-02 21:04:34 -03:00
João Pedro Toledo Goncalves cc767d0f08 Cleanup: Removed duplicate Nivel_* files from Zammad documentation 2026-02-02 20:57:52 -03:00
João Pedro Toledo Goncalves fdc14b16e2 Refactor: Flattened documentation structure and recovered files 2026-02-02 20:54:17 -03:00
324 changed files with 3098 additions and 836 deletions

6
.dockerignore Normal file
View File

@ -0,0 +1,6 @@
.gitignore
.gemini/brain
site
_site_src
__pycache__
*.pdf

View File

@ -87,56 +87,75 @@ Se a tabela contiver as colunas `Campo` e `Valor`, o script aplica formatação
---
### Alertas e Admonitions (Nova Sintaxe)
### Alertas e Admonitions (Padrão MkDocs Material)
O novo motor de PDF suporta **Admonitions** nativas. Use a sintaxe `!!! type "Título"` para criar caixas coloridas.
O manual usa **Admonitions** nativas do MkDocs Material. Use a sintaxe `!!! type "Título"` para criar caixas visuais.
**✅ SINTAXE OBRIGATÓRIA:**
**Tipos Permitidos:**
**1. Nota / Informação (Azul):**
1. **Nota (Informação Geral):**
```markdown
!!! note "Nota"
Esta configuração não requer reinicialização.
```
**2. Importante / Aviso (Amarelo):**
2. **Importante / Aviso (Requisitos):**
```markdown
!!! warning "Importante"
O servidor será reiniciado automaticamente.
O servidor deve ter 4GB de RAM livres.
```
**3. Dica / Boas Práticas (Verde):**
3. **Dica (Boas Práticas):**
```markdown
!!! tip "Dica"
Use o atalho CTRL+C para cancelar.
```
> ⚠️ **ATENÇÃO:** O conteúdo da nota deve estar **indentado** (4 espaços ou 1 tab) abaixo do `!!!`.
> **Não use mais** a sintaxe antiga (`> ⚠️` ou `> [!NOTE]`). Elas serão renderizadas apenas como citações simples (cinza).
4. **Perigo (Risco de Dados):**
```markdown
!!! danger "Crítico"
Esta ação apaga todos os dados do disco.
```
5. **Exemplo (Código/Cenário):**
```markdown
!!! example "Exemplo de JSON"
```json
{ "key": "value" }
```
```
---
### Blocos de Código
### Componentes Ricos (Abas e Botões)
**✅ Sintaxe Correta:**
Para manter o manual dinâmico, use os recursos avançados:
**1. Abas (Sistemas Operacionais):**
Use quando o procedimento varia por OS ou método.
```markdown
```powershell
Get-Mailbox -Identity "usuario@dominio.com"
```
=== "Windows"
1. Abra o PowerShell.
2. Rode `Get-Service`.
=== "Linux (Debian/Ubuntu)"
1. Abra o Terminal.
2. Rode `systemctl status`.
```
> O script renderiza com **fundo cinza claro** e **fonte Courier 9.5pt**. A linguagem após os ``` é ignorada visualmente.
**✅ Código Inline:**
**2. Botões e Links:**
Para links de download ou ações externas, use classes de botão.
```markdown
Execute o comando `ping servidor.local` no terminal.
[Baixar Instalador](https://example.com/setup.exe){ .md-button .md-button--primary }
[Documentação Oficial](https://docs.microsoft.com){ .md-button }
```
> O script **remove** os backticks `` ` `` e mantém o texto normal. Para comandos importantes, prefira blocos de código.
**3. Ícones (Material Design):**
Use ícones para representar botões da interface real.
```markdown
Clique em :material-cog: **Configurações** e depois em :material-account-plus: **Novo Usuário**.
```
*(Consulte o site Material Design Icons para nomes)*
---
### Imagens
### Imagens e Legendas
**✅ Sintaxe Correta:**
```markdown
![Descrição da Imagem](assets/nome_da_imagem.png)
@ -261,10 +280,13 @@ 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 de Subpastas:** É **OBRIGATÓRIA** a separação por nível de complexidade (`Nivel_0`, `Nivel_1`, `Nivel_2`, `Nivel_3`).
2. **Estrutura Plana:** Todos os manuais devem ficar na raiz da pasta do tema. **NÃO crie subpastas de nível** (`Nivel_0`, etc).
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`
4. **Assets:** Todas as imagens devem ficar numa pasta `assets` dentro da pasta do tema.
**Exemplo de Caminho Completo:**
`[RAIZ]/documentacao exchange/Nivel_1/[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)

200
.gemini/build_site.py Normal file
View File

@ -0,0 +1,200 @@
import os
import shutil
import subprocess
import sys
import yaml
import re
# Configuration
ROOT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
BUILD_DIR = os.path.join(ROOT_DIR, "_site_src")
DOCS_DIR = os.path.join(BUILD_DIR, "docs")
MKDOCS_CONFIG = os.path.join(ROOT_DIR, "mkdocs.yml")
GEMINI_CLI = os.path.join(ROOT_DIR, ".gemini", "gemini_cli.py")
def clean_build_dir():
if os.path.exists(BUILD_DIR):
try:
shutil.rmtree(BUILD_DIR)
except Exception as e:
print(f"Warning cleaning build dir: {e}")
os.makedirs(DOCS_DIR, exist_ok=True)
def clean_folder_name(name):
# Converts 'documentacao zammad' to 'Zammad'
# Converts 'documentacao backup-restore' to 'Backup Restore'
if name.startswith("documentacao "):
name = name.replace("documentacao ", "")
# Capitalize words
return name.title()
def process_markdown_content(content):
# Remove the Manual Revision History Block
# Look for ## 1. HISTÓRICO DE REVISÃO until the next ## header
# Pattern: ## 1. HISTÓRICO... (anything until next ## or end)
pattern = r"## 1\. HISTÓRICO DE REVISÃO.*?(?=## |\Z)"
content = re.sub(pattern, "", content, flags=re.DOTALL)
# Also strip any numbering from H2 headers if needed, but user might want them.
return content
def copy_manuals():
print("Copying manuals to build directory...")
# Find all 'documentacao *' folders
for item in os.listdir(ROOT_DIR):
if os.path.isdir(os.path.join(ROOT_DIR, item)) and item.startswith("documentacao"):
src_path = os.path.join(ROOT_DIR, item)
# Nice name for the folder
clean_name = clean_folder_name(item)
dst_path = os.path.join(DOCS_DIR, clean_name)
print(f"Processing {item} -> {clean_name}")
shutil.copytree(src_path, dst_path, dirs_exist_ok=True)
# Post-process files in the new destination
for root, dirs, files in os.walk(dst_path):
for file in files:
if file.lower().endswith('.md'):
# Inject PDF Link + Strip Revision History
full_path = os.path.join(root, file)
# Generate/Check PDF name
pdf_name = file.rsplit('.', 1)[0] + ".pdf"
try:
with open(full_path, 'r', encoding='utf-8') as f:
content = f.read()
modified_content = process_markdown_content(content)
# Add PDF Button
display_name = "Baixar PDF"
link = f'[:material-file-pdf-box: {display_name}](./{pdf_name}){{ .md-button .md-button--primary .download-pdf-btn }}\n\n'
# Insert link after header or at top
if modified_content.startswith("---"):
# Split frontmatter
parts = modified_content.split("---", 2)
if len(parts) >= 3:
parts[2] = link + parts[2]
modified_content = "---".join(parts)
else:
modified_content = link + modified_content
else:
# Try to find H1
if "# " in modified_content:
modified_content = modified_content.replace("\n# ", f"\n{link}\n# ", 1) # Put before? No, after is better.
# Actually, let's put it AT THE TOP of content, below title if possible.
# Simple regex replace for first H1
modified_content = re.sub(r'(^# .+)', r'\1\n\n' + link, modified_content, count=1, flags=re.MULTILINE)
else:
modified_content = link + modified_content
with open(full_path, 'w', encoding='utf-8') as f:
f.write(modified_content)
except Exception as e:
print(f"Error processing {file}: {e}")
# Copy contents of 'assets' folder in root to 'docs/assets'
root_assets = os.path.join(ROOT_DIR, "assets")
docs_assets = os.path.join(DOCS_DIR, "assets")
if os.path.exists(root_assets):
print(f"Copying root assets from {root_assets} to {docs_assets}")
shutil.copytree(root_assets, docs_assets, dirs_exist_ok=True)
def create_index():
print("Creating index.md from README.md...")
readme_path = os.path.join(ROOT_DIR, "README.md")
if not os.path.exists(readme_path):
print("README.md not found, creating basic index.")
return
with open(readme_path, 'r', encoding='utf-8') as f:
content = f.read()
# We need to fix links like [Title](documentacao%20folder/file.md)
# to work in the site structure: [Title](./Folder/file.md)
# The folders in site are cleaned via clean_folder_name(item)
def fix_link(match):
label = match.group(1)
path = match.group(2)
# Unquote path
import urllib.parse
raw_path = urllib.parse.unquote(path)
if "documentacao " in raw_path:
# documentacao zammad/[Nível 1]...md -> Zammad/[Nível 1]...md
parts = raw_path.split("/", 1)
if len(parts) == 2:
clean_folder = clean_folder_name(parts[0])
# Remove .md if it's there to let awesome-pages handle it?
# Actually, link should point to the .md or .html.
# MkDocs converts .md to .html but relative links inside MD work.
new_path = f"./{clean_folder}/{parts[1]}"
return f"[[{label}]]({urllib.parse.quote(new_path)})"
return match.group(0)
# Use a greedy regex for the path part (.*) to handle parentheses in filenames.
# Since each link is on its own line in the checklist, this is safe.
content = re.sub(r"\[\[(.*?)\]\]\((.*)\)", fix_link, content)
# Also fix relative image paths if any (assets/logo.png -> ./assets/logo.png)
content = content.replace("](assets/", "](./assets/")
with open(os.path.join(DOCS_DIR, "index.md"), 'w', encoding='utf-8') as f:
f.write(content)
def generate_pdfs():
print("Generating PDFs...")
# Call gemini_cli batch_convert on the DOCS_DIR
# We need to make sure we use the same python env
subprocess.check_call([sys.executable, GEMINI_CLI, "batch-convert", DOCS_DIR])
def build_mkdocs():
print("Building MkDocs site...")
# Load base config
# Use unsafe_load to handle !!python tags
with open(os.path.join(ROOT_DIR, "mkdocs.yml"), "r") as f:
base_config = yaml.unsafe_load(f)
# Update config to point to our source folder
# IMPORTANT: We use relative path so MkDocs can find it from ROOT
base_config["docs_dir"] = "_site_src/docs"
base_config["site_dir"] = "_site_src/site"
# Ensure extra_css is copied
extra_css_src = os.path.join(ROOT_DIR, ".gemini", "stylesheets")
extra_css_dst = os.path.join(DOCS_DIR, "stylesheets")
if os.path.exists(extra_css_src):
shutil.copytree(extra_css_src, extra_css_dst, dirs_exist_ok=True)
# Write temporary config in ROOT (so it sees .git)
temp_config_path = os.path.join(ROOT_DIR, "mkdocs_generated.yml")
with open(temp_config_path, "w") as f:
yaml.dump(base_config, f)
# Run build using the generated config in ROOT
subprocess.check_call(["mkdocs", "build", "-f", "mkdocs_generated.yml"])
if __name__ == "__main__":
try:
clean_build_dir()
copy_manuals()
create_index()
generate_pdfs()
build_mkdocs()
print("Build Complete! Site is in _site_src/site")
except Exception as e:
print(f"Build Failed: {e}")
# print stack trace
import traceback
traceback.print_exc()
sys.exit(1)

View File

@ -0,0 +1,70 @@
import os
import shutil
import hashlib
ROOT_DIR = os.getcwd()
IMAGE_EXTS = ('.png', '.jpg', '.jpeg', '.gif', '.bmp', '.svg')
def get_file_hash(filepath):
hash_md5 = hashlib.md5()
with open(filepath, "rb") as f:
for chunk in iter(lambda: f.read(4096), b""):
hash_md5.update(chunk)
return hash_md5.hexdigest()
def consolidate_assets():
print("Starting Asset Consolidation...")
for item in os.listdir(ROOT_DIR):
theme_dir = os.path.join(ROOT_DIR, item)
if os.path.isdir(theme_dir) and item.startswith("documentacao "):
print(f"Processing Theme: {item}")
assets_dir = os.path.join(theme_dir, "assets")
if not os.path.exists(assets_dir):
os.makedirs(assets_dir)
print(f" Created assets dir: {assets_dir}")
# Walk through the theme directory
for root, dirs, files in os.walk(theme_dir):
# Skip the assets dir itself to avoid loop or processing already correct files
if os.path.abspath(root) == os.path.abspath(assets_dir):
continue
for file in files:
if file.lower().endswith(IMAGE_EXTS):
src_path = os.path.join(root, file)
dest_path = os.path.join(assets_dir, file)
# Case 1: File is not in assets/
if src_path != dest_path:
try:
if not os.path.exists(dest_path):
shutil.move(src_path, dest_path)
print(f" Moved: {file} -> assets/")
else:
# Collision
src_hash = get_file_hash(src_path)
dest_hash = get_file_hash(dest_path)
if src_hash == dest_hash:
print(f" Duplicate (Identical): Deleting {src_path}")
os.remove(src_path)
else:
# Different content, rename
base, ext = os.path.splitext(file)
new_name = f"{base}_unique_{src_hash[:8]}{ext}"
new_dest = os.path.join(assets_dir, new_name)
shutil.move(src_path, new_dest)
print(f" Duplicate (Different): Renamed to {new_name}")
# TODO: ideally we would need to grep the MD files and update the link
# But for now let's just save the file.
except Exception as e:
print(f" Error processing {file}: {e}")
print("Asset Consolidation Complete.")
if __name__ == "__main__":
consolidate_assets()

View File

@ -0,0 +1,79 @@
import os
import shutil
ROOT_DIR = os.getcwd()
def flatten_structure_deep():
print("Starting Deep Flattening...")
# Iterate over all directories in root
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"Processing Theme: {item}")
# Walk top-down through the directory
# We use os.walk but we need to be careful not to process files we just moved.
# So we list dir first.
subdirs = [d for d in os.listdir(theme_dir) if os.path.isdir(os.path.join(theme_dir, d))]
for subdir in subdirs:
if subdir == "assets":
continue # Skip root assets
subdir_path = os.path.join(theme_dir, subdir)
print(f" Flattening subfolder: {subdir}")
# Recursively move everything from this folder to theme_dir
for root, dirs, files in os.walk(subdir_path, topdown=False):
for name in files:
src_file = os.path.join(root, name)
# Calculate relative path to preserve context in filename if needed
# But user wants ROOT.
# Collision strategy: If file exists, prepend folder name.
dest_file = os.path.join(theme_dir, name)
if os.path.exists(dest_file):
# Collision! Prepend subdir name to filename
# Ex: "manual.md" -> "Asterisk_manual.md"
print(f" Collision for {name}. Renaming...")
new_name = f"{subdir}_{name}"
dest_file = os.path.join(theme_dir, new_name)
shutil.move(src_file, dest_file)
print(f" Moved: {name} -> {os.path.basename(dest_file)}")
for name in dirs:
# Handle Assets folders
if name == "assets":
assets_src = os.path.join(root, name)
theme_assets = os.path.join(theme_dir, "assets")
if not os.path.exists(theme_assets):
os.makedirs(theme_assets)
for asset_file in os.listdir(assets_src):
a_src = os.path.join(assets_src, asset_file)
a_dst = os.path.join(theme_assets, asset_file)
if not os.path.exists(a_dst):
shutil.move(a_src, a_dst)
try:
os.rmdir(assets_src)
except:
pass
# Remove the original subfolder if empty
try:
shutil.rmtree(subdir_path)
print(f" Removed folder: {subdir}")
except Exception as e:
print(f" Warning: Could not remove {subdir}: {e}")
if __name__ == "__main__":
flatten_structure_deep()

View File

@ -173,8 +173,30 @@ def update_tracking(
with open(readme_path, 'r', encoding='utf-8') as f:
lines = f.readlines()
# Logic extracted from update_progress.py (Refactored for efficiency)
clean_lines = [l for l in lines if not re.match(r'^>\s*\*\*Status:\*\*\s*`[▓░]+`', l.strip())]
# Remove old status blocks (both callouts and legacy lines)
clean_lines = []
skip_mode = False
for l in lines:
stripped = l.strip()
# Detect legacy bar
if re.match(r'^>\s*\*\*Status:\*\*\s*`[▓░]+`', stripped):
continue
# Detect start of callout info block for status
if '!!! info "Gerenciamento de Ativos"' in l or '!!! info "Status da Categoria"' in l:
skip_mode = True
continue
# If in skip mode, skip indented lines
if skip_mode:
if stripped == "": # Keep empty lines for spacing
final_stripped = ""
else:
if l.startswith(" "): # Indented content of callout
continue
else:
skip_mode = False # End of callout
clean_lines.append(l)
total_tasks = 0
done_tasks = 0
@ -185,7 +207,7 @@ def update_tracking(
for idx, line in enumerate(clean_lines):
if line.strip().startswith('### '):
current_sec_idx = idx
section_stats[current_sec_idx] = {'total': 0, 'done': 0}
section_stats[current_sec_idx] = {'total': 0, 'done': 0, 'title': line.strip().replace('### ', '')}
is_task = re.search(r'^\s*-\s*\[([ xX])\]', line)
if is_task:
@ -199,11 +221,17 @@ def update_tracking(
section_stats[current_sec_idx]['done'] += 1
# Generate Bars
def get_bar(done, total, length=20):
def get_bar_callout(done, total, title="Gerenciamento de Ativos", is_global=False):
pct = (done / total * 100) if total > 0 else 0
length = 30 if is_global else 20
filled = int(length * done // total) if total > 0 else 0
bar_visual = '' * filled + '' * (length - filled)
return f"> **Status:** `{bar_visual}` **{int(pct)}%** ({done}/{total})\n"
callout = f'!!! info "{title}"\n'
callout += f' **Status {"Global" if is_global else "da Categoria"}:** `{bar_visual}` **{int(pct)}%** ({done}/{total})\n'
if is_global:
callout += f' **Responsável:** João Pedro Toledo Gonçalves\n'
return callout
final_content = []
global_inserted = False
@ -213,19 +241,19 @@ def update_tracking(
# Global Bar
if "## 📊 Quadro de Status" in line and not global_inserted:
final_content.append("\n" + get_bar(done_tasks, total_tasks, 30))
final_content.append("\n" + get_bar_callout(done_tasks, total_tasks, is_global=True))
global_inserted = True
# Section Bars
if idx in section_stats:
stats = section_stats[idx]
if stats['total'] > 0:
final_content.append(get_bar(stats['done'], stats['total']))
final_content.append(get_bar_callout(stats['done'], stats['total'], title=f"Status: {stats['title']}"))
with open(readme_path, 'w', encoding='utf-8') as f:
f.writelines(final_content)
console.print(f"[green]Tracking updated![/green] Global: {int(done_tasks/total_tasks*100)}%")
console.print(f"[green]Tracking updated (Callout Style)![/green] Global: {int(done_tasks/total_tasks*100)}%")
@app.command()
def audit():

17
.gemini/hooks.py Normal file
View File

@ -0,0 +1,17 @@
import os
def on_page_markdown(markdown, page, config, files):
"""
Hook to override page title with its filename (sanitized) to keep sidebar clean.
"""
# Get filename without extension
filename = os.path.basename(page.file.src_path)
filename_no_ext = os.path.splitext(filename)[0]
# Replace underscores/dashes with spaces for readability in sidebar
clean_title = filename_no_ext.replace('_', ' ').replace('-', ' ')
# Override the title used in navigation
page.title = clean_title
return markdown

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

@ -0,0 +1,233 @@
/* iT Guys Premium Documentation Style v11 (Fix Text Mixing) */
/* ROOT VARIABLES */
:root {
--md-primary-fg-color: #1478cf;
--md-primary-fg-color--light: #4ea5f5;
--md-primary-fg-color--dark: #0d5ea6;
--md-accent-fg-color: #00f7ff;
--header-height: 48px;
}
/* HEADER LAYOUT */
@media screen and (min-width: 60em) {
/* Force Header Height */
.md-header {
height: var(--header-height) !important;
min-height: var(--header-height) !important;
}
.md-header__inner {
height: var(--header-height) !important;
padding: 0 1rem !important;
display: flex !important;
align-items: center !important;
position: relative !important;
justify-content: space-between !important;
gap: 0 !important;
}
/* 1. LOGO AREA */
.md-header__title {
flex-grow: 0;
width: auto;
padding: 0 !important;
margin-right: 0 !important;
line-height: var(--header-height) !important;
}
.md-header__button.md-logo {
margin: 0 !important;
padding: 0 !important;
}
.md-header__button.md-logo img {
height: 32px !important;
width: auto !important;
display: block;
}
.md-header__title .md-header__topic {
display: none !important;
}
/* 2. SEARCH BAR */
.md-search {
display: block !important;
position: absolute !important;
left: 50% !important;
top: 50% !important;
transform: translate(-50%, -50%) !important;
width: clamp(250px, 40vw, 600px) !important;
margin: 0 !important;
padding: 0 !important;
height: 36px !important;
z-index: 20;
}
/* OVERLAY: Invisible (Click-to-dismiss) */
.md-search__overlay {
opacity: 0 !important;
background-color: transparent !important;
width: 100% !important;
height: 100vh !important;
position: fixed !important;
top: 0 !important;
left: 0 !important;
pointer-events: auto !important;
z-index: 15 !important;
cursor: default !important;
}
.md-search__inner {
width: 100% !important;
height: 100% !important;
background-color: rgba(255, 255, 255, 0.2) !important;
border-radius: 4px;
padding: 0 !important;
box-shadow: none !important;
}
/* Active State (White Background) */
.md-search__inner.md-search__inner--active {
background-color: #fff !important;
box-shadow: 0 4px 10px rgba(0,0,0,0.2) !important;
}
/*
CRITICAL FIX 1: HIDE GHOST SUGGESTION
The "shadow text" behind the input was overlapping with typed text.
We remove it completely to prevent "mixing" visual artifacts.
*/
.md-search__suggest {
display: none !important;
opacity: 0 !important;
width: 0 !important;
height: 0 !important;
}
/*
CRITICAL FIX 2: SOLID INPUT BACKGROUND
When active, input gets solid white background to cover anything acting weird.
*/
/* Default (Inactive) */
.md-search__input {
background: transparent !important;
height: 100% !important;
padding-left: 40px !important;
font-size: 0.9rem !important;
color: #fff !important;
}
.md-search__input::placeholder {
color: rgba(255, 255, 255, 0.7) !important;
}
/* Active (Black Text) */
.md-search__inner.md-search__inner--active .md-search__input,
.md-search__form:focus-within .md-search__input,
.md-search__input:focus {
color: #000000 !important;
opacity: 1 !important;
text-shadow: none !important;
background-color: #fff !important; /* Force solid background just in case */
}
.md-search__inner--active .md-search__input::placeholder,
.md-search__input:focus::placeholder {
color: #888888 !important;
}
/* Icon Alignment */
.md-search__icon {
height: 36px !important;
width: 40px !important;
top: 0 !important;
left: 0 !important;
display: flex !important;
align-items: center !important;
justify-content: center !important;
pointer-events: none;
}
.md-search__icon[for="__search"] svg {
fill: rgba(255,255,255,0.7) !important;
}
/* Dark icon when active */
.md-search__inner--active .md-search__icon[for="__search"] svg,
.md-search__form:focus-within .md-search__icon[for="__search"] svg {
fill: #333333 !important;
}
/* Dropdown */
.md-search__output {
position: absolute !important;
top: 100% !important;
left: 0 !important;
width: 100% !important;
margin-top: 4px !important;
border-radius: 4px !important;
overflow: hidden !important;
box-shadow: 0 4px 15px rgba(0,0,0,0.2) !important;
}
.md-search__scrollwrap {
max-height: 70vh !important;
}
/* 3. TOGGLE / ACTIONS */
.md-header__option {
margin-left: 0 !important;
}
.md-header__source {
margin-left: 1rem !important;
}
}
/* SCROLL UNLOCK */
body[data-md-scrolllock] {
overflow: auto !important;
}
/* GENERAL TYPOGRAPHY */
h1 {
color: var(--md-primary-fg-color) !important;
font-weight: 800 !important;
text-transform: uppercase;
font-size: clamp(1.5rem, 2.5vw, 2.2rem);
border-left: 0.3rem solid var(--md-accent-fg-color);
padding-left: 1rem;
margin-bottom: 2rem !important;
}
h2 {
color: var(--md-primary-fg-color--dark);
font-weight: 700;
margin-top: 3rem !important;
border-bottom: 2px solid #e0e0e0;
padding-bottom: 0.5rem;
}
/* Dark Mode */
[data-md-color-scheme="slate"] {
--md-primary-fg-color: #1478cf;
--md-primary-fg-color--dark: #62a3ea;
}
[data-md-color-scheme="slate"] h1 {
color: #62a3ea !important;
}
[data-md-color-scheme="slate"] .md-header {
background-color: #0b1a26;
}
/* BUTTONS */
.md-button {
border-radius: 4px;
font-weight: 700;
}
.md-button--primary {
background-color: var(--md-primary-fg-color) !important;
}
/* CLEANUP */
.md-copyright, .md-footer-meta__text { display: none; }

45
Dockerfile Normal file
View File

@ -0,0 +1,45 @@
FROM python:3.11-slim as builder
# Install system dependencies for WeasyPrint
RUN apt-get update && apt-get install -y \
build-essential \
pkg-config \
libcairo2-dev \
git \
python3-cffi \
python3-brotli \
libpango-1.0-0 \
libpangoft2-1.0-0 \
libharfbuzz-subset0 \
libjpeg-dev \
libopenjp2-7-dev \
libffi-dev \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /app
# Copy requirements and install
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# Configure Git to trust the workspace
RUN git config --global --add safe.directory /app
# Copy source code including .gemini tools
COPY . .
# Run the build script
RUN python .gemini/build_site.py
# --- Runner Stage ---
FROM nginx:alpine
# Copy static site from builder
COPY --from=builder /app/_site_src/site /usr/share/nginx/html
# Copy Nginx config (optional, using default for now)
# COPY nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

384
README.md
View File

@ -1,289 +1,191 @@
# Manuais Zammad - Repositório de Documentação
![Logo](assets/logo.png){ align=center width=150 }
Este repositório contém a documentação técnica da iT Guys, organizada por sistemas e níveis de acesso.
## 📊 Quadro de Status dos Manuais
> **Status:** `▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░░░░░░░░░░░░` **52%** (93/177)
Este repositório centraliza a documentação técnica da iT Guys, organizada por sistemas e níveis de criticidade. Este arquivo serve como o índice principal tanto para o repositório Git quanto para o site de documentação.
---
## 📊 Quadro de Status Geral
!!! info "Gerenciamento de Ativos"
**Status Global:** `▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░` **89%** (93/104)
**Responsável:** João Pedro Toledo Gonçalves
---
## 📂 Manuais por Categoria
### 1. Rede e Segurança (pfSense / Suricata / OpenVPN)
> **Status:** `▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░░░░` **68%** (15/22)
- [x] [Nível 3] Planejamento de Hardware e Virtualização
- [x] [Nível 2] Instalação Inicial e Setup Wizard
- [x] [Nível 2] Customização e Identidade Visual
- [x] [Nível 2] Gerenciamento de Usuários e Autenticação (LDAP)
- [x] [Nível 2] Configuração de Interfaces e Redes (VLAN/LAGG)
- [x] [Nível 3] Multi-WAN, Gateway Groups e Roteamento
- [x] [Nível 2] Firewall, NAT e Alias
- [x] [Nível 2] Serviço de DNS (Resolver e Forwarder)
- [x] [Nível 2] Serviço de DHCP e Reservas
- [x] [Nível 2] Serviço TFTP e Provisionamento
- [x] [Nível 3] Filtro de Conteúdo com pfBlockerNG
- [x] [Nível 3] IDS/IPS com Suricata
- [x] [Nível 2] VPN Road Warrior (OpenVPN + LDAP)
- [x] [Nível 3] VPN Site-to-Site (OpenVPN)
- [x] [Nível 3] Diagnóstico Avançado, Shell Recovery e Logs
!!! info "Status: 1. Rede e Segurança (pfSense / Suricata / OpenVPN)"
**Status da Categoria:** `▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░░░░` **68%** (15/22)
- [x] [Nível 3] [[Planejamento De Hardware E Sizing]](documentacao%20rede%20e%20seguranca/%5BNível%203%5D%20Planejamento%20De%20Hardware%20E%20Sizing.md)
- [x] [Nível 2] [[Instalação E Configuração Inicial]](documentacao%20rede%20e%20seguranca/%5BNível%202%5D%20Instalação%20E%20Configuração%20Inicial.md)
- [x] [Nível 2] [[Customização E Identidade Visual]](documentacao%20rede%20e%20seguranca/%5BNível%202%5D%20Customização%20E%20Identidade%20Visual.md)
- [x] [Nível 2] [[Gerenciamento De Usuários E Ldap]](documentacao%20rede%20e%20seguranca/%5BNível%202%5D%20Gerenciamento%20De%20Usuários%20E%20Ldap.md)
- [x] [Nível 2] [[Interfaces, Vlans E Lagg]](documentacao%20rede%20e%20seguranca/%5BNível%202%5D%20Interfaces%2C%20Vlans%20E%20Lagg.md)
- [x] [Nível 3] [[Multi-WAN e Roteamento]](documentacao%20rede%20e%20seguranca/%5BNível%203%5D%20Multi.md)
- [x] [Nível 2] [[Firewall Rules E Nat]](documentacao%20rede%20e%20seguranca/%5BNível%202%5D%20Firewall%20Rules%20E%20Nat.md)
- [x] [Nível 2] [[Serviço De Dns (Resolver/Forwarder)]](documentacao%20rede%20e%20seguranca/%5BNível%202%5D%20Serviço%20De%20Dns%20(ResolverForwarder).md)
- [x] [Nível 2] [[Serviço Dhcp E Reservas De Ip]](documentacao%20rede%20e%20seguranca/%5BNível%202%5D%20Serviço%20Dhcp%20E%20Reservas%20De%20Ip%20(Static%20Mapping).md)
- [x] [Nível 2] [[Serviço Tftp E Provisionamento]](documentacao%20rede%20e%20seguranca/%5BNível%202%5D%20Serviço%20Tftp%20E%20Provisionamento.md)
- [x] [Nível 3] [[Filtro De Conteúdo E Segurança (pfBlockerNG)]](documentacao%20rede%20e%20seguranca/%5BNível%203%5D%20Filtro%20De%20Conteúdo%20E%20Segurança%20(Pfblockerng).md)
- [x] [Nível 3] [[IDS/IPS Com Suricata]](documentacao%20rede%20e%20seguranca/%5BNível%203%5D%20IdsIps%20Com%20Suricata.md)
- [x] [Nível 2] [[Vpn Road Warrior (OpenVPN)]](documentacao%20rede%20e%20seguranca/%5BNível%202%5D%20Vpn%20Road%20Warrior%20(Openvpn).md)
- [x] [Nível 3] [[Vpn Site-to-Site]](documentacao%20rede%20e%20seguranca/%5BNível%203%5D%20Vpn%20Site.md)
- [x] [Nível 3] [[Diagnóstico Avançado, Shell E Recovery]](documentacao%20rede%20e%20seguranca/%5BNível%203%5D%20Diagnóstico%20Avançado%2C%20Shell%20E%20Recovery.md)
- [ ] [Nível 3] Tuning de Wi-Fi para Alta Densidade (Unifi/Omada)
- [ ] [Nível 3] VPN Site-to-Site Avançada (Mesh / Hub-and-Spoke)
- [ ] [Nível 3] Segregação de Redes Críticas (VLAN de Equipamentos Médicos/Industriais)
- [ ] [Nível 3] Isolamento de Sistemas Legados (Windows XP/7 em Rede Segregada)
- [ ] [Nível 2] Configuração de Captive Portal e Vouchers (Hotelaria/Eventos)
- [ ] [Nível 3] QoS e Priorização de Tráfego VoIP/SIP (Call Centers)
- [ ] [Nível 3] Redes Temporárias e Failover 4G/Starlink (Obras/Eventos)
- [ ] [Nível 2] Configuração de Captive Portal e Vouchers
- [ ] [Nível 3] QoS e Priorização de Tráfego VoIP/SIP
- [ ] [Nível 3] Redes Temporárias e Failover 4G/Starlink
### 2. Storage (TrueNAS / ZFS)
> **Status:** `▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░░` **75%** (6/8)
- [x] [Nível 1] Monitoramento de Saúde de Discos
- [x] [Nível 2] Gestão de Users, Groups e ACLs
- [x] [Nível 2] Configuração de Snapshots e Replicação
- [x] [Nível 3] Arquitetura ZFS e Planejamento
- [x] [Nível 3] Manutenção de ZFS (Scrub/Resilver)
- [x] [Nível 3] Configuração de iSCSI Target
!!! info "Status: 2. Storage (TrueNAS / ZFS)"
**Status da Categoria:** `▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░░` **75%** (6/8)
- [x] [Nível 1] [[Monitoramento de Saúde de Discos]](documentacao%20storage/%5BNível%201%5D%20Monitoramento%20de%20Saúde%20de%20Discos.md)
- [x] [Nível 2] [[Gestão De Users, Groups E Acls]](documentacao%20storage/%5BNível%202%5D%20Gestão%20De%20Users%2C%20Groups%20E%20Acls.md)
- [x] [Nível 2] [[Snapshots E Replicação]](documentacao%20storage/%5BNível%202%5D%20Snapshots%20E%20Replicação.md)
- [x] [Nível 3] [[Arquitetura ZFS e Planejamento]](documentacao%20storage/%5BNível%203%5D%20Arquitetura%20ZFS%20e%20Planejamento.md)
- [x] [Nível 3] [[Manutenção E Performance ZFS]](documentacao%20storage/%5BNível%203%5D%20Manutenção%20E%20Performance%20Zfs.md)
- [x] [Nível 3] [[Configuração de iSCSI Target]](documentacao%20storage/%5BNível%203%5D%20Configuração%20de%20iSCSI%20Target.md)
- [ ] [Nível 3] Otimização de Storage para Edição de Vídeo (10GbE/Jumbo Frames)
- [ ] [Nível 3] Otimização de Protocolo SMB para Arquivos Grandes (AutoCAD/Revit)
### 3. Bancos de Dados (PostgreSQL / MySQL / Redis)
> **Status:** `▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓` **100%** (7/7)
- [x] [Nível 1] Diagnóstico de Conectividade e Status
- [x] [Nível 1] Procedimento de Backup e Restore Manual
- [x] [Nível 2] Instalação e Configuração Base
- [x] [Nível 2] Gestão de Usuários e Permissões
- [x] [Nível 2] Manutenção Preventiva e Logs
- [x] [Nível 3] Tuning de Performance e Otimização
- [x] [Nível 3] Arquitetura de Persistência e Troubleshooting Avançado
!!! info "Status: 3. Bancos de Dados (PostgreSQL / MySQL / Redis)"
**Status da Categoria:** `▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓` **100%** (7/7)
- [x] [Nível 1] [[Diagnóstico de Conectividade e Status]](documentacao%20bancos%20de%20dados/%5BNível%201%5D%20Diagnóstico%20de%20Conectividade%20e%20Status.md)
- [x] [Nível 1] [[Procedimento de Backup e Restore Manual]](documentacao%20bancos%20de%20dados/%5BNível%201%5D%20Procedimento%20de%20Backup%20e%20Restore%20Manual.md)
- [x] [Nível 2] [[Instalação e Configuração Base]](documentacao%20bancos%20de%20dados/%5BNível%202%5D%20Instalação%20e%20Configuração%20Base.md)
- [x] [Nível 2] [[Gestão de Usuários e Permissões]](documentacao%20bancos%20de%20dados/%5BNível%202%5D%20Gestão%20de%20Usuários%20e%20Permissões.md)
- [x] [Nível 2] [[Manutenção Preventiva e Logs]](documentacao%20bancos%20de%20dados/%5BNível%202%5D%20Manutenção%20Preventiva%20e%20Logs.md)
- [x] [Nível 3] [[Tuning de Performance e Otimização]](documentacao%20bancos%20de%20dados/%5BNível%203%5D%20Tuning%20de%20Performance%20e%20Otimização.md)
- [x] [Nível 3] [[Arquitetura de Persistência e Troubleshooting Avançado]](documentacao%20bancos%20de%20dados/%5BNível%203%5D%20Arquitetura%20de%20Persistência%20e%20Troubleshooting%20Avançado.md)
### 4. Windows Server (AD / DNS / GPO)
> **Status:** `▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░░` **77%** (7/9)
- [x] [Nível 1] Criação e Gestão do Ciclo de Vida de Usuários (AD)
- [x] [Nível 2] Padrões de Senha e Configuração Inicial (Post-Install)
- [x] [Nível 2] Gestão Avançada de DNS e DHCP
- [x] [Nível 3] Automação e Relatórios com PowerShell
- [x] [Nível 3] Diagnóstico de Replicação (DCDIAG)
- [x] [Nível 3] Gestão Centralizada via GPO
- [x] [Nível 3] Disaster Recovery e Continuidade de Negócios (AD)
!!! info "Status: 4. Windows Server (AD / DNS / GPO)"
**Status da Categoria:** `▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░░` **77%** (7/9)
- [x] [Nível 1] [[Criação e Gestão do AD]](documentacao%20windows/%5BNível%201%5D%20Criação%20e%20Gestão%20do%20Ciclo%20de%20Vida%20de%20Usuários%20(AD).md)
- [x] [Nível 2] [[Padrões de Senha (Post-Install)]](documentacao%20windows/%5BNível%202%5D%20Padrões%20de%20Senha%20e%20Configuração%20Inicial%20(Post-Install).md)
- [x] [Nível 2] [[Gestão Avançada de DNS e DHCP]](documentacao%20windows/%5BNível%202%5D%20Gestão%20Avançada%20de%20DNS%20e%20DHCP.md)
- [x] [Nível 3] [[Automação PowerShell]](documentacao%20windows/%5BNível%203%5D%20Automação%20e%20Relatórios%20com%20PowerShell.md)
- [x] [Nível 3] [[Diagnóstico DCDIAG]](documentacao%20windows/%5BNível%203%5D%20Diagnóstico%20de%20Replicação%20(DCDIAG).md)
- [x] [Nível 3] [[Gestão Centralizada via GPO]](documentacao%20windows/%5BNível%203%5D%20Gestão%20Centralizada%20via%20GPO.md)
- [x] [Nível 3] [[Disaster Recovery AD]](documentacao%20windows/%5BNível%203%5D%20Disaster%20Recovery%20e%20Continuidade%20de%20Negócios%20(AD).md)
- [ ] [Nível 3] RDS/Terminal Services: Otimização para Alta Latência
- [ ] [Nível 3] Gestão de Impressão Centralizada e Cotas (PaperCut)
### 5. Microsoft Exchange (Exchange 2019)
> **Status:** `▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓` **100%** (17/17)
- [x] [Nível 0] Como Acessar e Configurar Webmail e Celular
- [x] [Nível 0] Como Configurar Resposta Automatica de Ferias
- [x] [Nível 1] Diagnostico Basico - Usuario nao recebe e-mail
- [x] [Nível 1] Procedimento de Criacao e Bloqueio de Usuarios
- [x] [Nível 2] Gerenciamento de Cotas e Arquivamento
- [x] [Nível 2] Gerenciamento de Quarentena Movel
- [x] [Nível 2] Gestao de Permissoes (Full Access/Send As)
- [x] [Nível 2] Solucao de Problemas de Lista de Enderecos
- [x] [Nível 3] Acesso ao Servidor Windows Core e PowerShell
- [x] [Nível 3] Arquitetura Tecnica e Mapeamento
- [x] [Nível 3] Auditoria Administrativa e Logs
- [x] [Nível 3] Checklist de Manutencao Diaria/Semanal
- [x] [Nível 3] Disaster Recovery e Soft Restore
- [x] [Nível 3] Gestao de Conectores e Roteamento
- [x] [Nível 3] Referencia de Operacoes via PowerShell
- [x] [Nível 3] Relatorios Avancados
- [x] [Nível 3] Renovacao de Certificado SSL
!!! info "Status: 5. Microsoft Exchange (Exchange 2019)"
**Status da Categoria:** `▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓` **100%** (17/17)
- [x] [Nível 0] [[Configuração de Webmail e Celular]](documentacao%20exchange/%5BNível%200%5D%20Como%20Acessar%20e%20Configurar%20Webmail%20e%20Celular.md)
- [x] [Nível 0] [[Resposta Automatica de Ferias]](documentacao%20exchange/%5BNível%200%5D%20Como%20Configurar%20Resposta%20Automatica%20de%20Ferias.md)
- [x] [Nível 1] [[Diagnostico Basico de Recebimento]](documentacao%20exchange/%5BNível%201%5D%20Diagnostico%20Basico%20-%20Usuario%20nao%20recebe%20e-mail.md)
- [x] [Nível 1] [[Criação e Bloqueio de Usuarios]](documentacao%20exchange/%5BNível%201%5D%20Procedimento%20de%20Criacao%20e%20Bloqueio%20de%20Usuarios.md)
- [x] [Nível 2] [[Cotas e Arquivamento]](documentacao%20exchange/%5BNível%202%5D%20Gerenciamento%20de%20Cotas%20e%20Arquivamento.md)
- [x] [Nível 2] [[Quarentena Móvel (ActiveSync)]](documentacao%20exchange/%5BNível%202%5D%20Gerenciamento%20de%20Quarentena%20Movel%20(ActiveSync).md)
- [x] [Nível 2] [[Gestao de Permissoes]](documentacao%20exchange/%5BNível%202%5D%20Gestao%20de%20Permissoes%20(Full%20Access%20e%20Send%20As).md)
- [x] [Nível 2] [[Problemas de Lista de Endereços (OAB)]](documentacao%20exchange/%5BNível%202%5D%20Solucao%20de%20Problemas%20de%20Lista%20de%20Enderecos%20(OAB).md)
- [x] [Nível 3] [[Windows Core e PowerShell]](documentacao%20exchange/%5BNível%203%5D%20Acesso%20ao%20Servidor%20Windows%20Core%20e%20PowerShell.md)
- [x] [Nível 3] [[Arquitetura Técnica e Mapeamento]](documentacao%20exchange/%5BNível%203%5D%20Arquitetura%20Tecnica%20e%20Mapeamento%20de%20Servidores.md)
- [x] [Nível 3] [[Auditoria e Logs de Seguranca]](documentacao%20exchange/%5BNível%203%5D%20Auditoria%20Administrativa%20e%20Logs%20de%20Seguranca.md)
- [x] [Nível 3] [[Checklist Diaria e Semanal]](documentacao%20exchange/%5BNível%203%5D%20Checklist%20de%20Manutencao%20Diaria%20e%20Semanal.md)
- [x] [Nível 3] [[Disaster Recovery e Soft Restore]](documentacao%20exchange/%5BNível%203%20disaster%20recovery%20e%20soft%20restore.md)
- [x] [Nível 3] [[Conectores e Roteamento]](documentacao%20exchange/%5BNível%203%5D%20Gestao%20de%20Conectores%20e%20Roteamento%20de%20E-mail.md)
- [x] [Nível 3] [[Operacoes via PowerShell]](documentacao%20exchange/%5BNível%203%5D%20Referencia%20de%20Operacoes%20via%20PowerShell.md)
- [x] [Nível 3] [[Relatorios Avancados]](documentacao%20exchange/%5BNível%203%5D%20Relatorios%20Avancados%20e%20Manutencao.md)
- [x] [Nível 3] [[Renovação de Certificado SSL]](documentacao%20exchange/%5BNível%203%5D%20Renovacao%20de%20Certificado%20SSL%20e%20Integracao%20com%20IIS.md)
### 6. Virtualização (VMware / Proxmox)
> **Status:** `▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░░` **75%** (12/16)
**VMware:**
- [x] [Nível 1] Visão Geral e Escopo
- [x] [Nível 1] Verificação Básica de VM
- [x] [Nível 1] Operações de Energia
- [x] [Nível 1] Monitoramento Básico
- [x] [Nível 2] Gestão de Recursos
- [x] [Nível 2] Networking e Storage
- [x] [Nível 2] Manutenção e Lifecycle
- [x] [Nível 2] Troubleshooting
- [x] [Nível 3] CLI Troubleshooting
- [x] [Nível 3] Networking Avançado
- [x] [Nível 3] Storage Deep Dive
- [x] [Nível 3] DR Arquitetura
!!! info "Status: 6. Virtualização (VMware / Proxmox)"
**Status da Categoria:** `▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓` **100%** (12/12)
**Proxmox VE:**
- [ ] [Nível 1] Gestão Básica de VMs/LXC
- [ ] [Nível 2] Gestão de Backups e Snapshots
- [ ] [Nível 3] Gestão de Cluster e HA
- [ ] [Nível 3] Troubleshooting de Rede
**VMware:**
- [x] [Nível 1] [[Visão Geral E Escopo]](documentacao%20vmware/%5BNível%201%5D%20Visão%20Geral%20E%20Escopo.md)
- [x] [Nível 1] [[Verificação Básica De VM]](documentacao%20vmware/%5BNível%201%5D%20Verificação%20Básica%20De%20Vm.md)
- [x] [Nível 1] [[Operações De Energia]](documentacao%20vmware/%5BNível%201%5D%20Operações%20De%20Energia%20Reiniciar%20E%20Desligar.md)
- [x] [Nível 1] [[Monitoramento Básico De Alertas]](documentacao%20vmware/%5BNível%201%5D%20Monitoramento%20Básico%20De%20Alertas%20E%20Recursos.md)
- [x] [Nível 2] [[Gestão De Recursos]](documentacao%20vmware/%5BNível%202%5D%20Gestão%20De%20Recursos%20Computação%20E%20Migração.md)
- [x] [Nível 2] [[Networking E Storage]](documentacao%20vmware/%5BNível%202%5D%20Networking%20E%20Storage%20Operacional.md)
- [x] [Nível 2] [[Manutenção E Lifecycle]](documentacao%20vmware/%5BNível%202%5D%20Manutenção%20E%20Lifecycle%20(Ciclo%20De%20Vida).md)
- [x] [Nível 2] [[Troubleshooting Intermediário]](documentacao%20vmware/%5BNível%202%5D%20Troubleshooting%20Intermediário.md)
- [x] [Nível 3] [[CLI e Troubleshooting Avançado]](documentacao%20vmware/%5BNível%203%5D%20Cli%20E%20Troubleshooting%20Avançado%20(Nível%203).md)
- [x] [Nível 3] [[Networking Avançado (NSX)]](documentacao%20vmware/%5BNível%203%5D%20Networking%20Avançado%20E%20Conceitos%20De%20Nsx.md)
- [x] [Nível 3] [[Storage Deep Dive]](documentacao%20vmware/%5BNível%203%5D%20Storage%20Deep%20Dive.md)
- [x] [Nível 3] [[Disaster Recovery E Arquitetura]](documentacao%20vmware/%5BNível%203%5D%20Disaster%20Recovery%20E%20Arquitetura.md)
### 7. Conteineres (Docker / Portainer)
> **Status:** `▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓` **100%** (9/9)
- [x] [Nível 0] Docker para Devs e Ferramentas
- [x] [Nível 1] Instalação e Configuração (Docker + Compose)
- [x] [Nível 1] Deploy Portainer CE
- [x] [Nível 1] Gestão de Stacks (Manual/GitOps)
- [x] [Nível 2] Redes e Firewall
- [x] [Nível 2] Volumes e Persistência de Dados
- [x] [Nível 2] Healthchecks e Cron
- [x] [Nível 3] Docker Swarm: Inicialização e Gerenciamento
- [x] [Nível 3] Kubernetes: Visão Geral e Ferramentas Básicas
!!! info "Status: 7. Conteineres (Docker / Portainer)"
**Status da Categoria:** `▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓` **100%** (9/9)
- [x] [Nível 0] [[Docker para Devs]](documentacao%20conteineres/%5BNível%200%5D%20Docker%20Para%20Desenvolvedores%20E%20Ferramentas%20Portáteis.md)
- [x] [Nível 1] [[Instalação E Configuração]](documentacao%20conteineres/%5BNível%201%5D%20Instalação%20E%20Configuração%20Do%20Docker%20E%20Compose%20(Linux).md)
- [x] [Nível 1] [[Deploy Portainer CE]](documentacao%20conteineres/%5BNível%201%5D%20Deploy%20E%20Acesso%20Ao%20Portainer%20Ce.md)
- [x] [Nível 1] [[Gestão De Stacks]](documentacao%20conteineres/%5BNível%201%5D%20Gestão%20De%20Stacks%20No%20Portainer.md)
- [x] [Nível 2] [[Redes E Firewall]](documentacao%20conteineres/%5BNível%202%5D%20Redes%20E%20Firewall%20No%20Docker.md)
- [x] [Nível 2] [[Volumes E Persistência]](documentacao%20conteineres/%5BNível%202%5D%20Volumes%20E%20Persistência%20De%20Dados%20No%20Docker.md)
- [x] [Nível 2] [[Healthchecks e Cron]](documentacao%20conteineres/%5BNível%202%5D%20Healthchecks%20E%20Scripts%20Automatizados%20No%20Docker.md)
- [x] [Nível 3] [[Docker Swarm: Gerenciamento]](documentacao%20conteineres/%5BNível%203%5D%20Docker%20Swarm%20Inicialização%20E%20Gerenciamento.md)
- [x] [Nível 3] [[Kubernetes: Visão Geral]](documentacao%20conteineres/%5BNível%203%5D%20Kubernetes%20Visão%20Geral%20E%20Ferramentas%20Básicas.md)
### 8. Linux Server
> **Status:** `▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓` **100%** (7/7)
- [x] [Nível 1] Comandos Essenciais de Diagnóstico
- [x] [Nível 2] Gerenciamento de Pacotes e Updates
- [x] [Nível 2] Configuração de Rede e Firewall
- [x] [Nível 2] Gestão de Usuários e Permissões
- [x] [Nível 3] Hardening de Servidor
- [x] [Nível 3] Análise de Logs (Journalctl)
- [x] [Nível 3] Scripting e Automação Avançada
!!! info "Status: 8. Linux Server"
**Status da Categoria:** `▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓` **100%** (7/7)
- [x] [Nível 1] [[Comandos Essenciais de Diagnóstico]](documentacao%20linux/%5BNível%201%5D%20Comandos%20Essenciais%20de%20Diagnóstico.md)
- [x] [Nível 2] [[Gerenciamento de Pacotes e Updates]](documentacao%20linux/%5BNível%202%5D%20Gerenciamento%20de%20Pacotes%20e%20Updates.md)
- [x] [Nível 2] [[Configuração de Rede e Firewall]](documentacao%20linux/%5BNível%202%5D%20Configuração%20de%20Rede%20e%20Firewall.md)
- [x] [Nível 2] [[Gestão de Usuários e Permissões]](documentacao%20linux/%5BNível%202%20gestão%20de%20usuários%20e%20permissões.md)
- [x] [Nível 3] [[Hardening de Servidor]](documentacao%20linux/%5BNível%203%5D%20Hardening%20de%20Servidor.md)
- [x] [Nível 3] [[Análise de Logs (Journalctl)]](documentacao%20linux/%5BNível%203%5D%20Análise%20de%20Logs%20(Journalctl).md)
- [x] [Nível 3] [[Scripting e Automação Avançada]](documentacao%20linux/%5BNível%203%5D%20Scripting%20e%20Automação%20Avançada.md)
### 9. Service Desk (Zammad)
> **Status:** `▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓` **100%** (8/8)
- [x] [Nível 1] Criação, Classificação e Fusão de Tickets
- [x] [Nível 2] Instalação e Deploy (Docker, LXC, Source)
- [x] [Nível 2] Configuração de Triggers e Automações
- [x] [Nível 2] Gerenciamento de SLAs, Grupos e Roles
- [x] [Nível 2] Configuração de Canais de Entrada (Email / Chat / Telegram)
- [x] [Nível 3] Planejamento de Infraestrutura e Sizing
- [x] [Nível 3] Integrações via API e Webhooks
- [x] [Nível 3] Backup, Restore e Manutenção do Zammad
!!! info "Status: 9. Service Desk (Zammad)"
**Status da Categoria:** `▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓` **100%** (8/8)
### 10. Hardware - Gerenciamento Out-of-Band (OOB)
> **Status:** `░░░░░░░░░░░░░░░░░░░░` **0%** (0/3)
- [ ] [Nível 2] Acesso e Gerenciamento via iDRAC (Dell PowerEdge)
- [ ] [Nível 2] Acesso e Gerenciamento via IMM (Lenovo System x)
- [ ] [Nível 3] Atualização de Firmware, BIOS e Lifecycle Controller
- [x] [Nível 1] [[Ciclo De Vida Do Ticket E Triagem]](documentacao%20zammad/%5BNível%201%5D%20Ciclo%20De%20Vida%20Do%20Ticket%20E%20Triagem.md)
- [x] [Nível 2] [[Instalação E Deploy Zammad]](documentacao%20zammad/%5BNível%202%5D%20Instalação%20E%20Deploy%20Zammad.md)
- [x] [Nível 2] [[Automações E Triggers]](documentacao%20zammad/%5BNível%202%5D%20Automações%20E%20Triggers.md)
- [x] [Nível 2] [[Gestão De Grupos E Papéis (Roles)]](documentacao%20zammad/%5BNível%202%5D%20Gestão%20De%20Grupos%20E%20Papéis%20(Roles).md)
- [x] [Nível 2] [[Canais De Entrada (Email/Chat/Telegram)]](documentacao%20zammad/%5BNível%202%5D%20Canais%20De%20Entrada%20(EmailChatTelegram).md)
- [x] [Nível 3] [[Planejamento De Infraestrutura E Sizing]](documentacao%20zammad/%5BNível%203%5D%20Planejamento%20De%20Infraestrutura%20E%20Sizing.md)
- [x] [Nível 3] [[API E Integrações]](documentacao%20zammad/%5BNível%203%5D%20Api%20E%20Integrações.md)
- [x] [Nível 3] [[Manutenção, Backup E Restore]](documentacao%20zammad/%5BNível%203%5D%20Manutenção%2C%20Backup%20E%20Restore.md)
### 11. Hardware - Energia e Monitoramento
> **Status:** `░░░░░░░░░░░░░░░░░░░░` **0%** (0/4)
- [ ] [Nível 2] Monitoramento de UPS/Nobreaks (APC PowerChute)
- [ ] [Nível 2] Gerenciamento de Réguas PDU Metrificadas (Voltagem/Consumo)
- [ ] [Nível 2] Monitoramento Ambiental (Sensores de Temperatura/Umidade)
- [ ] [Nível 3] Configuração de Shutdown Automático em Falha de Energia
### 10. Backup & DR - Infraestrutura Virtual (Veeam)
!!! info "Status: 10. Backup & DR - Infraestrutura Virtual (Veeam)"
**Status da Categoria:** `▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓` **100%** (5/5)
### 12. Web Servers - Nginx
> **Status:** `░░░░░░░░░░░░░░░░░░░░` **0%** (0/4)
- [ ] [Nível 1] Comandos Básicos (Start/Stop/Reload/Logs)
- [ ] [Nível 2] Configuração de Virtual Hosts (Server Blocks)
- [ ] [Nível 3] Reverse Proxy e Load Balancing
- [ ] [Nível 3] Tuning de Performance e Caching
### 13. Web Servers - Apache
> **Status:** `░░░░░░░░░░░░░░░░░░░░` **0%** (0/3)
- [ ] [Nível 1] Comandos Básicos (Start/Stop/Reload/Logs)
- [ ] [Nível 2] Configuração de Virtual Hosts (Sites-Available)
- [ ] [Nível 3] Gerenciamento de Módulos e Security Hardening
### 14. Segurança Web - Certificados (Certbot/SSL)
> **Status:** `░░░░░░░░░░░░░░░░░░░░` **0%** (0/3)
- [ ] [Nível 2] Emissão Padrão (Webroot Nginx/Apache)
- [ ] [Nível 2] Emissão Standalone (Sem Web Server Ativo)
- [ ] [Nível 2] Configuração de Renovação Automática e Hooks
### 15. Cloud - Nextcloud Hub
> **Status:** `░░░░░░░░░░░░░░░░░░░░` **0%** (0/7)
- [ ] [Nível 0] Guia de Uso Básico (Interface Web e App Mobile)
- [ ] [Nível 1] Diagnóstico de Logs e Erros Comuns do PHP/System
- [ ] [Nível 2] Administração de Usuários, Grupos e Cotas
- [ ] [Nível 2] Migração e Transferência de Dados entre Usuários
- [ ] [Nível 3] Integração com Office Online Server (OOS/Collabora)
- [ ] [Nível 3] Troubleshooting de WebDAV, Disco e Permissões
- [ ] [Nível 3] Tuning de PHP-FPM e Caching (Redis/APCu)
### 16. Cloud - Microsoft 365
> **Status:** `░░░░░░░░░░░░░░░░░░░░` **0%** (0/5)
- [ ] [Nível 2] Gestão de Licenças e Usuários (Admin Center)
- [ ] [Nível 2] Configuração de Grupos e Equipes (Teams)
- [ ] [Nível 3] Configuração de Sincronização de Diretório (Entra ID Connect)
- [ ] [Nível 3] Políticas de Segurança e Acesso Condicional
- [ ] [Nível 2] Configuração de Criptografia de Email (S/MIME e OME) para Jurídico
### 17. Cloud - Google Workspace (Edu/Corp)
> **Status:** `░░░░░░░░░░░░░░░░░░░░` **0%** (0/3)
- [ ] [Nível 1] Gestão de Usuários e Rollover de Alunos (Edu)
- [ ] [Nível 2] Filtro de Conteúdo e SafeSearch (Chrome Policies)
- [ ] [Nível 2] Gestão de Chromebooks (Google Admin Console)
### 18. Processos e SOPs (NOC / Incidentes)
> **Status:** `░░░░░░░░░░░░░░░░░░░░` **0%** (0/4)
- [ ] [Nível 1] Fluxo de Atendimento e Triagem Nível 1
- [ ] [Nível 2] Procedimento de Escalonamento de Incidentes
- [ ] [Nível 3] Gestão de Crise (War Room) e Comunicação
- [ ] [Nível 3] Relatórios de Post-Mortem (RCA)
### 19. Backup & DR - Infraestrutura Virtual (Veeam)
> **Status:** `▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓` **100%** (5/5)
- [x] [Nível 1] Verificação Diária de Jobs de VM (Success/Failure)
- [x] [Nível 2] Restauração de Arquivos Guest (Windows/Linux)
- [x] [Nível 2] Instant VM Recovery (Restauração Rápida)
- [x] [Nível 3] Configuração de Repositórios Imutáveis (Hardened Linux)
- [x] [Nível 3] Criação de Rotinas de Teste de Restore (SureBackup)
### 20. Gestão de Endpoints e Periféricos (ManageEngine)
> **Status:** `░░░░░░░░░░░░░░░░░░░░` **0%** (0/12)
- [ ] [Nível 1] Inventário de Ativos (Hardware/Software)
- [ ] [Nível 1] Ferramentas de Acesso Remoto e Chat
- [ ] [Nível 2] Gestão de Patches e Atualizações Críticas
- [ ] [Nível 2] Distribuição de Software (Pacotes .msi/.exe)
- [ ] [Nível 2] MDM para Coletores Android (Kiosk Mode)
- [ ] [Nível 2] Configuração de Impressoras Térmicas (Zebra) em Massa
- [ ] [Nível 2] Instalação e Troubleshooting de Tokens/Smartcards (A3)
- [ ] [Nível 3] Configuração de Políticas de Bloqueio USB/DLP
- [ ] [Nível 3] Configuração de Assinadores Digitais e Banking
- [ ] [Nível 2] Integração Básica de macOS em Redes Windows (SMB/Printers)
- [ ] [Nível 2] Configuração de Scanners de Alta Produção e Fluxo GED (Jurídico)
- [ ] [Nível 2] Gestão de Fontes e Assets Criativos (Agências)
### 21. Padronização de Workstations (Setup Base)
> **Status:** `░░░░░░░░░░░░░░░░░░░░` **0%** (0/4)
- [ ] [Nível 1] Checklist de Configuração Inicial (OOBE)
- [ ] [Nível 1] Instalação do Agente de Gestão e Antivírus
- [ ] [Nível 2] Script de Debloat e Otimização do Windows
- [ ] [Nível 2] Configuração de Criptografia de Disco (Bitlocker)
### 22. Ferramentas e Utilitários (SSH / Editores / Transferência)
> **Status:** `░░░░░░░░░░░░░░░░░░░░` **0%** (0/4)
- [ ] [Nível 0] Acesso Remoto Seguro (SSH Keys/Putty)
- [ ] [Nível 1] Transferência de Arquivos via SCP/WinSCP
- [ ] [Nível 1] Editores de Texto em Terminal (Nano/Vim Básico)
- [ ] [Nível 2] Tunelamento SSH (Port Forwarding) para Acesso Seguro
### 23. Monitoramento e VoIP (Zabbix / Asterisk)
> **Status:** `░░░░░░░░░░░░░░░░░░░░` **0%** (0/5)
- [ ] [Nível 1] Zabbix: Adição de Hosts e Templates
- [ ] [Nível 2] Zabbix: Criação de Triggers e Alertas
- [ ] [Nível 1] VoIP: Diagnóstico de Ramais e Softphones
- [ ] [Nível 2] VoIP: Troubleshooting de Áudio (RTP/NAT) e Logs
- [ ] [Nível 2] MagnusBilling: Gestão de Tarifas e Troncos SIP
### 24. Desenvolvimento e BI (VSCode / PowerBI)
> **Status:** `░░░░░░░░░░░░░░░░░░░░` **0%** (0/3)
- [ ] [Nível 1] VSCode Server: Ambiente de Desenvolvimento Remoto
- [ ] [Nível 2] PowerBI Report Server: Deploy e Atualização de Relatórios (.pbix)
- [ ] [Nível 1] Gitea: Gestão Básica de Repositórios Git Self-Hosted
### 25. Segurança de E-mail (Proxmox Mail Gateway)
> **Status:** `░░░░░░░░░░░░░░░░░░░░` **0%** (0/3)
- [ ] [Nível 1] Rastreamento de Logs (Tracking Center)
- [ ] [Nível 2] Gestão de Whitelist/Blacklist e Regras de Spam
- [ ] [Nível 3] Cluster PMG e Alta Disponibilidade
### 26. Administração Web (Webmin)
> **Status:** `░░░░░░░░░░░░░░░░░░░░` **0%** (0/2)
- [ ] [Nível 1] Instalação e Acesso Seguro ao Webmin
- [ ] [Nível 2] Gestão de Serviços (Apache/Postfix) via Interface Web
- [x] [Nível 1] [[Verificação Diária De Jobs De VM]](documentacao%20backup/%5BNível%201%5D%20Verificação%20Diária%20De%20Jobs%20De%20Vm.md)
- [x] [Nível 2] [[Restauração De Arquivos Guest]](documentacao%20backup/%5BNível%202%5D%20Restauração%20De%20Arquivos%20Guest%20(WindowsLinux).md)
- [x] [Nível 2] [[Instant VM Recovery]](documentacao%20backup/%5BNível%202%5D%20Instant%20Vm%20Recovery%20(Restauração%20Rápida).md)
- [x] [Nível 3] [[Repositórios Imutáveis (Hardened)]](documentacao%20backup/%5BNível%203%5D%20Configuração%20De%20Repositórios%20Imutáveis%20(Hardened%20Linux).md)
- [x] [Nível 3] [[Teste De Restore (SureBackup)]](documentacao%20backup/%5BNível%203%5D%20Criação%20De%20Rotinas%20De%20Teste%20De%20Restore%20(Surebackup).md)
---
## 📂 Estrutura de Pastas e Níveis
A documentação segue estritamente a estrutura: `documentacao [tema] / Nivel_[X]`.
A documentação segue estritamente a estrutura: `documentacao [tema] / [Nível X] Nome.md`.
* **Nivel_0 (Cliente):** Tutoriais visuais passo-a-passo.
* **Nivel_1 (Service Desk):** Procedimentos operacionais padrão (SOP).
* **Nivel_2 (NOC/Infra):** Configuração, manutenção e análise técnica.
* **Nivel_3 (Engenharia):** Arquitetura, Disaster Recovery e scripts avançados.
* **Nível 0 (Cliente):** Tutoriais visuais passo-a-passo.
* **Nível 1 (Service Desk):** Procedimentos operacionais padrão (SOP).
* **Nível 2 (NOC/Infra):** Configuração, manutenção e análise técnica.
* **Nível 3 (Engenharia):** Arquitetura, Disaster Recovery e scripts avançados.
---
## 🛠 Como Gerar Novos PDFs
Utilize o comando abaixo na raiz do projeto:
```powershell
python .gemini/convert_to_pdf.py "Caminho/Para/SeuManual.md"
python .gemini/gemini_cli.py convert "[CAMINHO_DO_ARQUIVO].md"
```
*O script detecta imagens, formata tabelas e aplica o padrão visual iT Guys automaticamente.*

BIN
assets/favicon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

BIN
assets/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

View File

@ -1,3 +0,0 @@
# Aplicativos
Manuais relacionados a aplicativos.

View File

@ -1,3 +0,0 @@
# Documentação Asterisk
Local para manuais e procedimentos referentes ao **Asterisk**.

View File

@ -1,3 +0,0 @@
# Documentação Gitea
Local para manuais e procedimentos referentes ao **Gitea**.

View File

@ -1,3 +0,0 @@
# Documentação Magnusbilling
Local para manuais e procedimentos referentes ao **Magnusbilling**.

View File

@ -1,3 +0,0 @@
# Documentação Technium
Local para manuais e procedimentos referentes ao **Technium**.

View File

@ -1,3 +0,0 @@
# Documentação Zabbix
Local para manuais e procedimentos referentes ao **Zabbix**.

View File

@ -1,3 +0,0 @@
# Documentação Zammad
Local para manuais e procedimentos referentes ao **Zammad**.

View File

Before

Width:  |  Height:  |  Size: 520 KiB

After

Width:  |  Height:  |  Size: 520 KiB

View File

Before

Width:  |  Height:  |  Size: 374 KiB

After

Width:  |  Height:  |  Size: 374 KiB

View File

Before

Width:  |  Height:  |  Size: 503 KiB

After

Width:  |  Height:  |  Size: 503 KiB

View File

Before

Width:  |  Height:  |  Size: 776 KiB

After

Width:  |  Height:  |  Size: 776 KiB

View File

Before

Width:  |  Height:  |  Size: 439 KiB

After

Width:  |  Height:  |  Size: 439 KiB

View File

Before

Width:  |  Height:  |  Size: 606 KiB

After

Width:  |  Height:  |  Size: 606 KiB

View File

Before

Width:  |  Height:  |  Size: 531 KiB

After

Width:  |  Height:  |  Size: 531 KiB

View File

Before

Width:  |  Height:  |  Size: 316 KiB

After

Width:  |  Height:  |  Size: 316 KiB

View File

Before

Width:  |  Height:  |  Size: 496 KiB

After

Width:  |  Height:  |  Size: 496 KiB

View File

Before

Width:  |  Height:  |  Size: 486 KiB

After

Width:  |  Height:  |  Size: 486 KiB

View File

@ -1,3 +0,0 @@
# Bancos De Dados
Manuais relacionados a bancos de dados.

View File

@ -0,0 +1,101 @@
# MANUAL TÉCNICO - DIAGNÓSTICO DE CONECTIVIDADE DE BANCOS DE DADOS
**Código:** ITGSUP 0020/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 o diagnóstico inicial de incidentes de "banco fora do ar" ou "erro de conexão" para PostgreSQL, MySQL e Redis.
## 3. PRÉ-REQUISITOS
* [ ] Acesso ao terminal do servidor.
* [ ] Saber qual banco está sendo diagnosticado (PG, MySQL ou Redis).
---
## 4. VERIFICAÇÃO DE STATUS DO SERVIÇO
O primeiro passo é saber se o processo está rodando.
**PostgreSQL:**
```bash
sudo systemctl status postgresql
```
* **Ativo:** `Active: active (exited)` ou `(running)`.
* **Porta Padrão:** 5432.
**MySQL / MariaDB:**
```bash
sudo systemctl status mysql
# ou
sudo systemctl status mariadb
```
* **Porta Padrão:** 3306.
**Redis:**
```bash
sudo systemctl status redis-server
# ou
sudo systemctl status redis
```
* **Porta Padrão:** 6379.
---
## 5. TESTE DE CONEXÃO LOCAL (PING)
Se o serviço roda, ele responde?
### Redis (Mais Simples)
Use o `redis-cli` para enviar um PING.
```bash
redis-cli ping
```
* **Sucesso:** Retorna `PONG`.
* **Falha:** `Could not connect...` (Serviço parado) ou `NOAUTH` (Precisa de senha: `redis-cli -a SENHA ping`).
### PostgreSQL
Tente logar como o usuário `postgres`.
```bash
sudo -u postgres psql -c "\conninfo"
```
* **Sucesso:** Mostra dados da conexão (Socket, Port).
* **Falha:** `Is the server running locally...`
### MySQL
Teste o login (pode exigir senha de root).
```bash
sudo mysqladmin -u root -p ping
```
* **Sucesso:** `mysqld is alive`.
---
## 6. DIAGNÓSTICO DE REDE (ACESSO EXTERNO)
Se local funciona, mas a aplicação não conecta, verifique a rede.
**1. A Porta está aberta? (`ss` ou `netstat`)**
```bash
sudo ss -tuln | grep 5432 # (Exemplo PG)
```
* `127.0.0.1:5432` -> **ERRO:** Só aceita conexão local (localhost).
* `0.0.0.0:5432` -> **OK:** Aceita conexões de qualquer IP.
**2. Teste de Telnet (Da estação do usuário/app)**
No computador que está com erro, tente:
```bash
telnet IP_DO_SERVIDOR 5432
```
* **Connected:** Rede OK. Problema é senha/usuario.
* **Timeout:** Firewall bloqueando ou IP errado.
## 7. VALIDAÇÃO FINAL
- [ ] O serviço está "Active (Running)"?
- [ ] O teste local (Ping/Psql) funcionou?
- [ ] A porta está escutando em `0.0.0.0` (se precisar de acesso externo)?

View File

@ -0,0 +1,108 @@
# MANUAL TÉCNICO - BACKUP E RESTORE MANUAL (DUMP)
**Código:** ITGSUP 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
Executar backups pontuais (Dumps) e restaurações de emergência em bancos de dados, incluindo a exportação segura para servidores remotos (Storage/NFS).
## 3. PRÉ-REQUISITOS
* [ ] Espaço em disco suficiente para o dump.
* [ ] Senhas de administração dos bancos.
---
## 4. POSTGRESQL (pg_dump)
### Backup (Exportar)
```bash
# Backup de UM banco
pg_dump -U usuario_admin -h localhost nome_do_banco > backup.sql
# Backup de TODOS os bancos (Cluster)
pg_dumpall -U usuario_admin > backup_full.sql
```
### Restore (Importar)
```bash
# Se o banco ja existe (Sobrescreve estruturas)
psql -U usuario_admin -d nome_do_banco < backup.sql
# Se foi gerado com pg_dumpall
psql -U usuario_admin -f backup_full.sql postgres
```
---
## 5. MYSQL / MARIADB (mysqldump)
### Backup (Exportar)
```bash
# Backup de UM banco
mysqldump -u root -p nome_do_banco > backup.sql
# Backup de VÁRIOS bancos
mysqldump -u root -p --databases db1 db2 > backup_db1_db2.sql
```
### Restore (Importar)
```bash
# O banco DEVE existir antes (mysqladmin create nome_do_banco)
mysql -u root -p nome_do_banco < backup.sql
```
---
## 6. REDIS (RDB Snapshot)
O Redis trabalha em memória, mas salva arquivos `.rdb`.
### Backup (Snapshot Force)
1. Acesse o CLI: `redis-cli`
2. Execute: `BGSAVE` (Salva em background).
3. Verifique o diretório de dados (geralmente `/var/lib/redis/dump.rdb`).
4. Copie o arquivo `dump.rdb` para local seguro.
### Restore
1. Pare o serviço: `systemctl stop redis`
2. Substitua o arquivo `dump.rdb` pelo seu backup.
3. Garanta as permissões: `chown redis:redis dump.rdb`
4. Inicie o serviço: `systemctl start redis`
---
## 7. EXPORTAÇÃO REMOTA (OFF-SITE)
> ⚠️ **IMPORTANTE:** Nunca deixe o backup apenas no próprio servidor. Mova-o.
### Opção A: Cópia via SCP (Windows/Linux Seguro)
Envia o arquivo para outro servidor via SSH.
```bash
scp backup.sql usuario@192.168.1.50:/home/usuario/backups/
```
### Opção B: Montagem NFS (Storage Linux)
Se você tem um storage montado em `/mnt/backup`:
```bash
# Gera direto na pasta remota
pg_dump -U postgres meu_banco > /mnt/backup/pg_$(date +%F).sql
```
### Opção C: Montagem SMB/CIFS (Windows Share)
Para enviar para uma pasta do Windows Server.
1. Instale: `apt install cifs-utils`
2. Monte:
```bash
mount -t cifs -o username=user,password=pass //servidor/share /mnt/windows
```
3. Copie: `cp backup.sql /mnt/windows/`
## 8. VALIDAÇÃO FINAL
- [ ] O arquivo `.sql` foi gerado e tem tamanho maior que 0?
- [ ] O arquivo está salvo em local externo (SCP/NFS)?

View File

@ -0,0 +1,91 @@
# MANUAL TÉCNICO - GESTÃO DE USUÁRIOS E PERMISSÕES DE BANCO
**Código:** ITGINF 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
Padronizar a criação de credenciais, rotação de senhas e a concessão de privilégios mínimos (Least Privilege) em bancos de dados.
---
## 3. POSTGRESQL
Acesse como admin: `sudo -u postgres psql`
### Criar Usuário (Role)
```sql
-- Criar usuario com senha
CREATE USER app_user WITH PASSWORD 'SenhaForte123';
-- Criar um banco para ele
CREATE DATABASE app_db OWNER app_user;
```
### Permissões (Grant)
```sql
-- Conectar no banco especifico
\c app_db
-- Dar acesso a todas as tabelas (SCHEMA public)
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO app_user;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO app_user;
```
---
## 4. MYSQL / MARIADB
Acesse como admin: `mysql -u root -p`
### Criar Usuário (Definindo Origem)
No MySQL, o usuário é atrelado ao IP de origem (`@'%'` = qualquer lugar, `@'localhost'` = local).
```sql
CREATE USER 'app_user'@'%' IDENTIFIED BY 'SenhaForte123';
```
### Permissões (Grant)
```sql
-- Dar acesso total a UM banco especifico
GRANT ALL PRIVILEGES ON app_db.* TO 'app_user'@'%';
-- Aplicar mudancas
FLUSH PRIVILEGES;
```
---
## 5. REDIS
### Redis Antigo ( < 6.0 )
Só existe UMA senha global definida no `redis.conf` (`requirepass`). Não há usuários.
### Redis Moderno (ACLs - Access Control Lists)
Acesse: `redis-cli` (com a senha de admin/default).
```bash
# Criar usuario 'app_user'
# on > Habilitado
# >Senha... > Define senha
# ~app:* > Só acessa chaves que comessem com 'app:'
# +@all > Pode rodar todos os comandos (Cuidado!)
ACL SETUSER app_user on >SenhaForte123 ~app:* +get +set
```
### Verificar Permissões
```bash
ACL LIST
ACL WHOAMI
```
## 6. VALIDAÇÃO FINAL
- [ ] O usuário consegue logar remotamente?
- [ ] O usuário consegue escrever na tabela/chave permitida?
- [ ] O usuário é BLOQUEADO ao tentar acessar outro banco/tabela (Teste de negação)?

View File

@ -0,0 +1,80 @@
# MANUAL TÉCNICO - INSTALAÇÃO E CONFIGURAÇÃO BASE DE BANCOS DE DADOS
**Código:** ITGINF 0020/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
Padronizar a instalação, caminhos de configuração e liberação de acesso externo para PostgreSQL, MySQL e Redis em servidores Linux.
## 3. PRÉ-REQUISITOS
* [ ] Servidor Linux (Debian/RHEL) atualizado.
* [ ] Acesso root/sudo.
---
## 4. POSTGRESQL
**Instalação:**
* **Debian/Ubuntu:** `sudo apt install postgresql postgresql-contrib`
* **RHEL/CentOS:** `sudo dnf install postgresql-server postgresql-contrib && sudo postgresql-setup --initdb`
**Arquivos de Configuração (Padrão Debian):**
* **Principal:** `/etc/postgresql/14/main/postgresql.conf` (Versão varia).
* **Acesso (Quem conecta):** `/etc/postgresql/14/main/pg_hba.conf`
**Liberar Acesso Externo:**
1. No `postgresql.conf`, mude `listen_addresses = 'localhost'` para `listen_addresses = '*'`.
2. No `pg_hba.conf`, adicione no final:
```
# TYPE DATABASE USER ADDRESS METHOD
host all all 0.0.0.0/0 scram-sha-256
```
3. Reinicie: `sudo systemctl restart postgresql`.
---
## 5. MYSQL / MARIADB
**Instalação:**
* **Debian/Ubuntu:** `sudo apt install mariadb-server` (ou `mysql-server`).
* **RHEL/CentOS:** `sudo dnf install mariadb-server`
**Arquivos de Configuração:**
* **Principal:** `/etc/mysql/mysql.conf.d/mysqld.cnf` (ou `/etc/my.cnf`).
**Liberar Acesso Externo:**
1. Edite o arquivo de config.
2. Localize `bind-address` e mude de `127.0.0.1` para `0.0.0.0`.
3. Reinicie: `sudo systemctl restart mariadb`.
**Secure Installation (Obrigatório):**
Rode `sudo mysql_secure_installation` logo após instalar para definir senha de root e remover usuários anônimos.
---
## 6. REDIS
**Instalação:**
* **Todas as distros:** `sudo apt install redis-server` (ou `dnf install redis`).
**Arquivos de Configuração:**
* **Principal:** `/etc/redis/redis.conf`.
**Liberar Acesso Externo (CUIDADO):**
> ⚠️ **ALERTA:** O Redis não tem autenticação forte por padrão. NUNCA exponha para a internet.
1. Edite `/etc/redis/redis.conf`.
2. Mude `bind 127.0.0.1 ::1` para `bind 0.0.0.0`.
3. **OBRIGATÓRIO:** Defina uma senha na diretiva `requirepass SUA_SENHA_FORTE`.
4. Reinicie: `sudo systemctl restart redis`.
## 7. VALIDAÇÃO FINAL
- [ ] O serviço está rodando e habilitado no boot (`systemctl enable`)?
- [ ] O acesso externo funciona (se configurado)?
- [ ] (Redis) A senha foi configurada antes de abrir a rede?

View File

@ -0,0 +1,92 @@
# MANUAL TÉCNICO - MANUTENÇÃO PREVENTIVA E LOGS DE BANCO
**Código:** ITGINF 0022/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
Descrever as rotinas de limpeza de espaço (Vacuum/Optimize), desfragmentação e verificação de logs para evitar paradas por disco cheio ou corrupção.
---
## 3. POSTGRESQL (VACUUM)
O Postgres usa MVCC, gerando "tuplas mortas" quando dados são deletados/alterados.
### Manutenção Automática (Autovacuum)
Geralmente já vem ativo. Verifique:
```sql
SHOW autovacuum; -- Deve ser 'on'
```
### Manutenção Manual (Recuperar Espaço)
Se o banco inchou muito após um DELETÃO em massa.
1. Acesse o `psql`.
2. Rode em horário de baixo pico (Pode travar mesas se usar FULL):
```sql
-- Limpa e otimiza estatisticas (Rapido)
VACUUM ANALYZE;
-- (PERIGOSO) Recria o arquivo do disco para liberar espaço físico. Bloqueia escrita!
VACUUM FULL;
```
---
## 4. MYSQL / MARIADB (OPTIMIZE)
Tabelas InnoDB podem ficar fragmentadas.
### Otimizar Tabelas
```sql
-- Reconstrói a tabela e indices (Bloqueia a tabela durante a execução!)
OPTIMIZE TABLE nome_da_tabela;
```
### Logs Binários (Binlog)
Cuidado: Eles podem encher o disco.
1. Verifique a expiração no `my.cnf`:
```ini
binlog_expire_logs_seconds = 604800 # 7 Dias
```
2. Limpar manualmente (PURGE):
```sql
PURGE BINARY LOGS BEFORE '2023-10-01 00:00:00';
```
---
## 5. REDIS (Memory Defrag)
O Redis pode alocar memória fragmentada.
1. Verifique a fragmentação: `INFO MEMORY`
* `mem_fragmentation_ratio > 1.5` indica fragmentação alta.
2. Ativar Desfragmentação Ativa (Config):
```bash
CONFIG SET activedefrag yes
```
---
## 6. ROTAÇÃO DE LOGS (Logrotate)
Garanta que os logs de erro (`/var/log/mysql`, `/var/log/postgresql`) não estão gigantes.
Verifique se existem arquivos em `/etc/logrotate.d/`:
* `mysql-server`
* `postgresql-common`
Force uma verificação se achar que não está rodando:
```bash
sudo logrotate -f /etc/logrotate.d/mysql-server
```
## 7. VALIDAÇÃO FINAL
- [ ] PostgreSQL: `VACUUM` rodou sem erro?
- [ ] MySQL: Disco liberado após Purge de Binlogs?
- [ ] Logs antigos estão compactados (.gz)?

View File

@ -0,0 +1,82 @@
# MANUAL TÉCNICO - TUNING E PERFORMANCE DE BANCOS DE DADOS
**Código:** ITGENG 0020/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
Guiar a identificação de gargalos (Slow Queries) e aplicar otimizações seguras (Universais) e agressivas (Tailored) para PostgreSQL, MySQL e Redis.
---
## 3. PREPARAÇÃO PROATIVA (MONITORAMENTO)
Não espere o problema acontecer. Ative isso AGORA.
1. **MySQL Slow Query Log:**
* No `my.cnf`: `slow_query_log = 1`, `long_query_time = 2` (segundos).
2. **Postgres pg_stat_statements:**
* Instale a extensão: `CREATE EXTENSION pg_stat_statements;`
* Veja as queries mais lentas: `SELECT * FROM pg_stat_statements ORDER BY total_exec_time DESC LIMIT 5;`
3. **Redis Latency Monitor:**
* Config: `CONFIG SET latency-monitor-threshold 100` (ms).
---
## 4. OTIMIZAÇÕES UNIVERSAIS (SEGURO PARA TODOS)
Alterações de Sistema Operacional (Linux) que beneficiam qualquer DB.
### 1. Swappiness (Evitar Swap)
Bancos de dados odeiam Swap. O padrão do Linux (60) é ruim.
* **Ação:** Mude para 1 ou 10.
* Arquivo `/etc/sysctl.conf`:
```ini
vm.swappiness = 10
```
### 2. Transparent Huge Pages (THP) - DESATIVAR
O THP causa picos de lag no Redis e MongoDB.
* **Ação:** Desative no boot (varie conforme distro, geralmente via GRUB ou Systemd service).
* Verifique: `cat /sys/kernel/mm/transparent_hugepage/enabled` (Deve estar `[never]`).
---
## 5. TUNING TAILORED (CENÁRIOS ESPECÍFICOS)
### Cenário A: Hardware com MUITA RAM (Cache Heavy)
O objetivo é manter o [Working Set] na RAM.
* **Postgres (`shared_buffers`):** Defina como 25% a 40% da RAM Total.
* **MySQL (`innodb_buffer_pool_size`):** Defina como 70-80% da RAM Total (Se o servidor for dedicado apenas ao DB).
### Cenário B: Aplicação Write-Heavy (Muita Escrita)
O gargalo é o disco (I/O).
* **Postgres:** Aumente `max_wal_size` (ex: 4GB) para reduzir checkpoints frequentes.
* **Redis:** Evite `AOF everysec` se puder tolerar perda de 1s. Use persistência mista (RDB + AOF).
---
## 6. DIAGNÓSTICO DE QUERIES (EXPLAIN)
O desenvolvedor diz que "o banco está lento". Prove que é a query.
1. Pegue a query lenta no log.
2. Rode com `EXPLAIN` (MySQL) ou `EXPLAIN ANALYZE` (Postgres).
```sql
EXPLAIN ANALYZE SELECT * FROM pedidos WHERE data < '2023-01-01';
```
3. **Analise:**
* **Seq Scan:** Leu a tabela inteira do inicio ao fim. **RUIM**. Falta índice.
* **Index Scan:** Usou o índice. **BOM**.
## 7. VALIDAÇÃO FINAL
- [ ] O Swappiness está baixo (1-10)?
- [ ] Slow Query Log está capturando consultas lentas?
- [ ] Índices foram criados para eliminar "Seq Scans" críticos?

View File

@ -1,3 +0,0 @@
# Conteineres
Manuais relacionados a conteineres.

View File

@ -0,0 +1,94 @@
# MANUAL TÉCNICO - REDES E FIREWALL NO DOCKER
**Código:** ITGINF 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
Explicar a arquitetura de redes do Docker (Bridge, Host, Overlay), como segregar conteineres e como gerenciar regras de Firewall com segurança.
## 3. PRÉ-REQUISITOS
- [ ] Docker Engine instalado e rodando.
- [ ] Acesso root para visualizar regras de iptables.
## 4. PASSO A PASSO (EXECUÇÃO)
**Etapa 1: Drivers de Rede Padrão**
1. Liste as redes existentes no host.
* **bridge:** Padrão. Conteineres recebem IP interno (172.17.x.x).
* **host:** Remove isolamento. Container usa a eth0 do host.
* **none:** Sem rede.
```bash
docker network ls
```
**Etapa 2: Criando Redes Segregadas (User-defined Bridge)**
> 🚀 **MELHOR PRÁTICA:** Nunca use a rede `bridge` padrão para produção (falta DNS resolution entre nomes). Crie a sua.
1. Crie uma rede dedicada para sua stack (ex: `app-network`).
2. Suba conteineres conectados a ela.
```bash
docker network create --driver bridge app-network
docker run -d --name meu-db --network app-network postgres
docker run -d --name meu-app --network app-network nginx
```
> [!NOTE]
> Agora o container `meu-app` consegue pingar `meu-db` pelo NOME. A rede bridge padrão não faz isso.
**Etapa 3: Exposição de Portas e Segurança (Firewall)**
> ⚠️ **IMPORTANTE:** O Docker insere regras no `iptables` ANTES do UFW. Liberar `-p 8080:80` ignora o bloqueio do UFW.
1. **Modo Inseguro (Padrão):** Libera para internet (0.0.0.0).
```bash
docker run -p 8080:80 nginx
```
2. **Modo Seguro (Localhost Apenas):** Use se for usar proxy reverso (Nginx/Traefik) no host.
```bash
docker run -p 127.0.0.1:8080:80 nginx
```
**Etapa 4: Auditoria de Regras**
1. Verifique como o Docker mapeia as regras no NAT.
```bash
sudo iptables -t nat -L DOCKER
```
## 5. SOLUÇÃO DE PROBLEMAS (TROUBLESHOOTING)
**Problema 1: Container não resolve DNS externo**
* **Causa:** Conflito de DNS no `/etc/docker/daemon.json` ou firewall bloqueando porta 53 UDP.
* **Solução:**
1. Teste com `docker run busybox nslookup google.com`.
2. Check se o host tem acesso.
**Problema 2: UFW não bloqueia portas do Docker**
* **Causa:** Design do Docker ("Docker bypasses UFW").
* **Solução:**
1. Edite `/etc/default/docker` e adicione `--iptables=false` (Cuidado: quebra o NAT!).
2. **Recomendado:** Use o bloqueio na chain `DOCKER-USER` do iptables se precisar restringir IPs externos.
## 6. DADOS TÉCNICOS
| Campo | Valor | Descrição |
| :--- | :--- | :--- |
| **Subnet Padrão** | `172.17.0.0/16` | Rede Bridge padrão |
| **DNS Interno** | `127.0.0.11` | Resolver interno do Docker |
## 7. VALIDAÇÃO FINAL
- [ ] `docker network ls` mostra sua rede customizada?
- [ ] Conteineres na mesma rede se pingam por nome?
- [ ] Portas expostas estão acessíveis (netstat -tuln)?

View File

@ -0,0 +1,90 @@
# MANUAL TÉCNICO - VOLUMES E PERSISTÊNCIA DE DADOS NO DOCKER
**Código:** ITGINF 0010/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
Definir estratégias de persistência de dados em conteineres (Stateful), diferenciando Volumes gerenciados de Bind Mounts e garantindo backup e permissões corretas.
## 3. PRÉ-REQUISITOS
- [ ] Docker Engine instalado.
- [ ] Entendimento básico de permissões Linux (chmod/chown).
## 4. PASSO A PASSO (EXECUÇÃO)
**Etapa 1: Volumes Gerenciados (Recomendado)**
> **NOTA:** Volumes são gerenciados pelo Docker em `/var/lib/docker/volumes`. São mais fáceis de fazer backup e migrar.
1. Crie um volume explícito.
```bash
docker volume create dados-postgres
```
2. Use o volume em um container.
```bash
docker run -d --name db-prod -v dados-postgres:/var/lib/postgresql/data postgres:15
```
**Etapa 2: Bind Mounts (Caminhos do Host)**
> ⚠️ **IMPORTANTE:** Use Bind Mounts para arquivos de configuração (`nginx.conf`) ou código fonte em desenvolvimento.
1. Mapeie um diretório local absoluto para dentro do container.
```bash
docker run -d \
--name web-server \
-v /home/user/meu-site:/usr/share/nginx/html:ro \
nginx
```
> `:ro` = Read Only (O container não pode alterar os arquivos do host).
**Etapa 3: Inspecionando Volumes**
1. Descubra onde os dados estão realmente salvos no disco.
```bash
docker volume inspect dados-postgres
```
**Etapa 4: Backup de Volume**
1. Use um container temporário para tar/zipar o conteúdo de um volume.
```bash
docker run --rm \
-v dados-postgres:/volume \
-v $(pwd):/backup \
alpine tar cvf /backup/backup.tar /volume
```
## 5. SOLUÇÃO DE PROBLEMAS (TROUBLESHOOTING)
**Problema 1: "Permission Denied" ao escrever no volume**
* **Causa:** O UID do processo dentro do container é diferente do UID do dono da pasta no host (Bind Mount).
* **Solução:**
1. Descubra o UID interno: `docker exec container id`.
2. Ajuste o dono no host: `sudo chown -R 1000:1000 /pasta/local`.
**Problema 2: Volume órfão (Dados "perdidos")**
* **Causa:** Remover container sem remover volume mantém os dados (o que é bom), mas pode confundir.
* **Solução:**
1. Liste volumes: `docker volume ls`.
2. Remova não usados: `docker volume prune`.
## 6. DADOS TÉCNICOS
| Campo | Valor | Descrição |
| :--- | :--- | :--- |
| **Path Linux** | `/var/lib/docker/volumes` | Local padrão dos volumes |
| **Driver** | `local` | Driver padrão |
## 7. VALIDAÇÃO FINAL
- [ ] O comando `docker volume ls` lista o volume criado?
- [ ] Se remover o container (`docker rm -f`), os dados persistem?
- [ ] O container consegue ler/escrever no diretório mapeado?

View File

@ -1,3 +0,0 @@
# Documentação Docker-Compose
Local para manuais e procedimentos referentes ao **Docker-Compose**.

View File

@ -1,3 +0,0 @@
# Documentação Docker
Local para manuais e procedimentos referentes ao **Docker**.

View File

@ -1,3 +0,0 @@
# Documentação Portainer
Local para manuais e procedimentos referentes ao **Portainer**.

View File

@ -0,0 +1,88 @@
# MANUAL TÉCNICO - ACESSO E CONFIGURAÇÃO DE WEBMAIL E CELULAR (EXCHANGE)
**Código:** ITGCLI 0001/26 | **Classificação:** PÚBLICO
**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 | João Pedro Toledo Gonçalves |
## 2. OBJETIVO
Orientar o usuário final sobre como acessar seu e-mail corporativo via navegador (Webmail) e configurá-lo em dispositivos móveis (Android/iOS).
## 3. PRÉ-REQUISITOS
Antes de iniciar, garanta que:
* [ ] O dispositivo (computador ou celular) tem acesso à internet.
* [ ] O usuário sabe seu **E-mail Completo** e **Senha de Rede**.
* [ ] (Para Celular) O app Microsoft Outlook ou similar está instalado.
## 4. PASSO A PASSO (EXECUÇÃO)
**Etapa 1: Acesso via Webmail (Computador)**
1. Abra seu navegador (Chrome, Edge, Firefox).
2. Acesse o endereço: [https://webmail.itguys.com.br/owa](https://webmail.itguys.com.br/owa)
3. Na tela de login, preencha:
* **Domínio\nome de usuário:** Digite seu e-mail completo (ex: `{{SEU_NOME}}@exemplo.com.br`).
* **Senha:** Sua senha de rede.
4. Clique em **Entrar** (Sign in).
![Tela de Login Webmail](assets/webmail_login.png)
> **NOTA:** Se for seu primeiro acesso, configure o fuso horário para *(UTC-03:00) Brasília*.
---
**Etapa 2: Configuração no App Microsoft Outlook (Recomendado)**
1. Abra o aplicativo **Microsoft Outlook**.
2. Toque em **Adicionar Conta**.
3. Digite seu e-mail corporativo completo e toque em **Adicionar Conta**.
4. Se o app perguntar o tipo de conta, escolha **Exchange**.
![Tela Adicionar Conta Outlook](assets/outlook_mobile_mockup.png)
5. Insira sua **Senha** e toque em **Entrar**.
6. Aguarde a validação e pule a opção de adicionar outra conta ("Talvez mais tarde").
---
**Etapa 3: Configuração em Outros Apps (Nativo/Gmail)**
1. Abra as **Configurações** do celular ou o app de E-mail.
2. Vá em **Contas** > **Adicionar Conta**.
3. Escolha a opção **Exchange** ou **Corporativo** (Corporate).
4. Preencha seu **E-mail** e **Senha**.
![Tela Configuração Nativa](assets/native_mail_mockup.png)
5. Se solicitar configurações manuais, use:
* **Servidor:** `webmail.itguys.com.br`
* **Domínio:** `{{SEU_DOMINIO}}` (ou deixe em branco se opcional)
* **Nome de Usuário:** Seu e-mail completo.
6. Toque em **Seguinte** (Next) e aceite os certificados se solicitado.
## 5. SOLUÇÃO DE PROBLEMAS (TROUBLESHOOTING)
**Erro: "Não foi possível conectar ao servidor"**
* **Causa:** Falha na internet ou endereço digitado incorretamente.
* **Solução:**
1. Verifique se o site `https://webmail.itguys.com.br/owa` abre no navegador do celular.
2. Confirme se digitou a senha correta (tente logar no Webmail para testar).
**Erro: "Certificado Inválido"**
* **Solução:** Aceite/Confie no certificado se o sistema perguntar. Isso é comum em alguns Androids antigos.
## 6. DADOS TÉCNICOS
| Campo | Valor Padrão |
| :--- | :--- |
| **Servidor Exchange** | `webmail.itguys.com.br` |
| **Porta (HTTPS)** | 443 |
| **Segurança** | SSL/TLS |
| **Autenticação** | Senha Normal (Basic Auth) |
## 7. VALIDAÇÃO FINAL
- [ ] Conseguiu enviar e receber um e-mail de teste?
- [ ] A sincronização de calendário e contatos ocorreu?

View File

@ -0,0 +1,57 @@
# MANUAL TÉCNICO - CONFIGURAÇÃO DE RESPOSTA AUTOMÁTICA DE FÉRIAS (WEBMAIL)
**Código:** ITGCLI 0002/26 | **Classificação:** PÚBLICO
**Responsável:** João Pedro Toledo Gonçalves | **Data:** 22/01/2026
## 1. HISTÓRICO DE REVISÃO
| Data | Versão | Descrição | Autor |
| :--- | :--- | :--- | :--- |
| 22/01/2026 | 1.0 | Criação Inicial e Adequação ao Padrão | João Pedro Toledo Gonçalves |
## 2. OBJETIVO
Orientar o usuário a configurar avisos automáticos de "Fora do Escritório" (Férias/Ausência) através do Webmail, garantindo que remetentes internos e externos sejam notificados corretamente.
## 3. PRÉ-REQUISITOS
Antes de iniciar, garanta que:
* [ ] Você possui acesso à internet.
* [ ] Sabe seu e-mail e senha corporativos.
* [ ] Tem as datas exatas do seu período de ausência.
## 4. PASSO A PASSO (EXECUÇÃO)
**Etapa 1: Acessar as Configurações**
1. Acesse o Webmail em: [https://webmail.itguys.com.br](https://webmail.itguys.com.br) e faça login.
2. No canto superior direito, clique no ícone de **Engrenagem (Configurações)**.
3. No menu que abrir, clique em **Respostas automáticas**.
![Menu de Configurações](assets/settings_menu_ferias_unique_1769126673.png)
**Etapa 2: Configurar a Mensagem**
1. Selecione a opção **Enviar respostas automáticas**.
2. Marque a caixa **Enviar respostas apenas durante este período**.
3. Defina a **Data de início** e **Data de término** das suas férias.
4. Na caixa de texto principal, escreva a mensagem para seus colegas de trabalho (**Remetentes Internos**).
> 💡 **DICA:** Uma boa mensagem contém: data de retorno e contato de emergência (se houver).
5. (Opcional) Para avisar clientes e fornecedores, marque "Enviar mensagens de resposta automática para remetentes fora a organização" e preencha a mensagem abaixo.
6. Clique em **OK** no topo da janela para salvar.
![Tela de Configuração](assets/config_screen_ferias_unique_1769126693.png)
## 5. SOLUÇÃO DE PROBLEMAS (TROUBLESHOOTING)
**Problema 1: "Não consigo salvar as alterações"**
* **Causa:** Conexão instável ou sessão expirada.
* **Solução:**
1. Atualize a página (F5) e faça login novamente.
2. Tente configurar usando outro navegador (Chrome, Edge).
**Problema 2: "As pessoas não estão recebendo a resposta"**
* **Causa:** Data configurada incorretamente ou recurso desativado.
* **Solução:** Verifique se a data de "Início" não está no futuro e se a opção "Enviar respostas automáticas" está marcada.
## 6. VALIDAÇÃO FINAL
- [ ] O ícone de "Configurações" mostra que as respostas automáticas estão ativas?
- [ ] Envie um e-mail de teste de uma conta pessoal (Gmail/Hotmail) para ver se recebe a resposta.

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