Compare commits
26 Commits
1e35369adb
...
560215808e
|
|
@ -0,0 +1,6 @@
|
||||||
|
.gitignore
|
||||||
|
.gemini/brain
|
||||||
|
site
|
||||||
|
_site_src
|
||||||
|
__pycache__
|
||||||
|
*.pdf
|
||||||
|
|
@ -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
|
```markdown
|
||||||
!!! note "Nota"
|
!!! note "Nota"
|
||||||
Esta configuração não requer reinicialização.
|
Esta configuração não requer reinicialização.
|
||||||
```
|
```
|
||||||
|
2. **Importante / Aviso (Requisitos):**
|
||||||
**2. Importante / Aviso (Amarelo):**
|
|
||||||
```markdown
|
```markdown
|
||||||
!!! warning "Importante"
|
!!! warning "Importante"
|
||||||
O servidor será reiniciado automaticamente.
|
O servidor deve ter 4GB de RAM livres.
|
||||||
```
|
```
|
||||||
|
3. **Dica (Boas Práticas):**
|
||||||
**3. Dica / Boas Práticas (Verde):**
|
|
||||||
```markdown
|
```markdown
|
||||||
!!! tip "Dica"
|
!!! tip "Dica"
|
||||||
Use o atalho CTRL+C para cancelar.
|
Use o atalho CTRL+C para cancelar.
|
||||||
```
|
```
|
||||||
|
4. **Perigo (Risco de Dados):**
|
||||||
> ⚠️ **ATENÇÃO:** O conteúdo da nota deve estar **indentado** (4 espaços ou 1 tab) abaixo do `!!!`.
|
```markdown
|
||||||
> **Não use mais** a sintaxe antiga (`> ⚠️` ou `> [!NOTE]`). Elas serão renderizadas apenas como citações simples (cinza).
|
!!! 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
|
```markdown
|
||||||
```powershell
|
=== "Windows"
|
||||||
Get-Mailbox -Identity "usuario@dominio.com"
|
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.
|
**2. Botões e Links:**
|
||||||
|
Para links de download ou ações externas, use classes de botão.
|
||||||
**✅ Código Inline:**
|
|
||||||
```markdown
|
```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:**
|
**✅ Sintaxe Correta:**
|
||||||
```markdown
|
```markdown
|
||||||

|

|
||||||
|
|
@ -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.
|
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 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:**
|
**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):**
|
**Tabela Canônica de Pastas (Use estas):**
|
||||||
* `documentacao agendamento` (Cron, Task Scheduler)
|
* `documentacao agendamento` (Cron, Task Scheduler)
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
@ -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()
|
||||||
|
|
@ -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()
|
||||||
|
|
@ -173,8 +173,30 @@ def update_tracking(
|
||||||
with open(readme_path, 'r', encoding='utf-8') as f:
|
with open(readme_path, 'r', encoding='utf-8') as f:
|
||||||
lines = f.readlines()
|
lines = f.readlines()
|
||||||
|
|
||||||
# Logic extracted from update_progress.py (Refactored for efficiency)
|
# Remove old status blocks (both callouts and legacy lines)
|
||||||
clean_lines = [l for l in lines if not re.match(r'^>\s*\*\*Status:\*\*\s*`[▓░]+`', l.strip())]
|
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
|
total_tasks = 0
|
||||||
done_tasks = 0
|
done_tasks = 0
|
||||||
|
|
@ -185,7 +207,7 @@ def update_tracking(
|
||||||
for idx, line in enumerate(clean_lines):
|
for idx, line in enumerate(clean_lines):
|
||||||
if line.strip().startswith('### '):
|
if line.strip().startswith('### '):
|
||||||
current_sec_idx = idx
|
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)
|
is_task = re.search(r'^\s*-\s*\[([ xX])\]', line)
|
||||||
if is_task:
|
if is_task:
|
||||||
|
|
@ -199,11 +221,17 @@ def update_tracking(
|
||||||
section_stats[current_sec_idx]['done'] += 1
|
section_stats[current_sec_idx]['done'] += 1
|
||||||
|
|
||||||
# Generate Bars
|
# 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
|
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
|
filled = int(length * done // total) if total > 0 else 0
|
||||||
bar_visual = '▓' * filled + '░' * (length - filled)
|
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 = []
|
final_content = []
|
||||||
global_inserted = False
|
global_inserted = False
|
||||||
|
|
@ -213,19 +241,19 @@ def update_tracking(
|
||||||
|
|
||||||
# Global Bar
|
# Global Bar
|
||||||
if "## 📊 Quadro de Status" in line and not global_inserted:
|
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
|
global_inserted = True
|
||||||
|
|
||||||
# Section Bars
|
# Section Bars
|
||||||
if idx in section_stats:
|
if idx in section_stats:
|
||||||
stats = section_stats[idx]
|
stats = section_stats[idx]
|
||||||
if stats['total'] > 0:
|
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:
|
with open(readme_path, 'w', encoding='utf-8') as f:
|
||||||
f.writelines(final_content)
|
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()
|
@app.command()
|
||||||
def audit():
|
def audit():
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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()
|
||||||
|
|
@ -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; }
|
||||||
|
|
@ -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
|
|
@ -1,289 +1,191 @@
|
||||||
# Manuais Zammad - Repositório de Documentação
|
{ 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.
|
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 dos Manuais
|
|
||||||
|
|
||||||
> **Status:** `▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░░░░░░░░░░░░` **52%** (93/177)
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📊 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)
|
### 1. Rede e Segurança (pfSense / Suricata / OpenVPN)
|
||||||
> **Status:** `▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░░░░` **68%** (15/22)
|
!!! info "Status: 1. Rede e Segurança (pfSense / Suricata / OpenVPN)"
|
||||||
- [x] [Nível 3] Planejamento de Hardware e Virtualização
|
**Status da Categoria:** `▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░░░░` **68%** (15/22)
|
||||||
- [x] [Nível 2] Instalação Inicial e Setup Wizard
|
|
||||||
- [x] [Nível 2] Customização e Identidade Visual
|
- [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] Gerenciamento de Usuários e Autenticação (LDAP)
|
- [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] Configuração de Interfaces e Redes (VLAN/LAGG)
|
- [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 3] Multi-WAN, Gateway Groups e Roteamento
|
- [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] Firewall, NAT e Alias
|
- [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 2] Serviço de DNS (Resolver e Forwarder)
|
- [x] [Nível 3] [[Multi-WAN e Roteamento]](documentacao%20rede%20e%20seguranca/%5BNível%203%5D%20Multi.md)
|
||||||
- [x] [Nível 2] Serviço de DHCP e Reservas
|
- [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 TFTP e Provisionamento
|
- [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 3] Filtro de Conteúdo com pfBlockerNG
|
- [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 3] IDS/IPS com Suricata
|
- [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 2] VPN Road Warrior (OpenVPN + LDAP)
|
- [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] VPN Site-to-Site (OpenVPN)
|
- [x] [Nível 3] [[IDS/IPS Com Suricata]](documentacao%20rede%20e%20seguranca/%5BNível%203%5D%20IdsIps%20Com%20Suricata.md)
|
||||||
- [x] [Nível 3] Diagnóstico Avançado, Shell Recovery e Logs
|
- [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] 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] 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] 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 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 2] Configuração de Captive Portal e Vouchers
|
||||||
- [ ] [Nível 3] QoS e Priorização de Tráfego VoIP/SIP (Call Centers)
|
- [ ] [Nível 3] QoS e Priorização de Tráfego VoIP/SIP
|
||||||
- [ ] [Nível 3] Redes Temporárias e Failover 4G/Starlink (Obras/Eventos)
|
- [ ] [Nível 3] Redes Temporárias e Failover 4G/Starlink
|
||||||
|
|
||||||
### 2. Storage (TrueNAS / ZFS)
|
### 2. Storage (TrueNAS / ZFS)
|
||||||
> **Status:** `▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░░` **75%** (6/8)
|
!!! info "Status: 2. Storage (TrueNAS / ZFS)"
|
||||||
- [x] [Nível 1] Monitoramento de Saúde de Discos
|
**Status da Categoria:** `▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░░` **75%** (6/8)
|
||||||
- [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 1] [[Monitoramento de Saúde de Discos]](documentacao%20storage/%5BNível%201%5D%20Monitoramento%20de%20Saúde%20de%20Discos.md)
|
||||||
- [x] [Nível 3] Arquitetura ZFS e Planejamento
|
- [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 3] Manutenção de ZFS (Scrub/Resilver)
|
- [x] [Nível 2] [[Snapshots E Replicação]](documentacao%20storage/%5BNível%202%5D%20Snapshots%20E%20Replicação.md)
|
||||||
- [x] [Nível 3] Configuração de iSCSI Target
|
- [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 Storage para Edição de Vídeo (10GbE/Jumbo Frames)
|
||||||
- [ ] [Nível 3] Otimização de Protocolo SMB para Arquivos Grandes (AutoCAD/Revit)
|
- [ ] [Nível 3] Otimização de Protocolo SMB para Arquivos Grandes (AutoCAD/Revit)
|
||||||
|
|
||||||
### 3. Bancos de Dados (PostgreSQL / MySQL / Redis)
|
### 3. Bancos de Dados (PostgreSQL / MySQL / Redis)
|
||||||
> **Status:** `▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓` **100%** (7/7)
|
!!! info "Status: 3. Bancos de Dados (PostgreSQL / MySQL / Redis)"
|
||||||
- [x] [Nível 1] Diagnóstico de Conectividade e Status
|
**Status da Categoria:** `▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓` **100%** (7/7)
|
||||||
- [x] [Nível 1] Procedimento de Backup e Restore Manual
|
|
||||||
- [x] [Nível 2] Instalação e Configuração Base
|
- [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 2] Gestão de Usuários e Permissões
|
- [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] Manutenção Preventiva e Logs
|
- [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 3] Tuning de Performance e Otimização
|
- [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 3] Arquitetura de Persistência e Troubleshooting Avançado
|
- [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)
|
### 4. Windows Server (AD / DNS / GPO)
|
||||||
> **Status:** `▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░░` **77%** (7/9)
|
!!! info "Status: 4. Windows Server (AD / DNS / GPO)"
|
||||||
- [x] [Nível 1] Criação e Gestão do Ciclo de Vida de Usuários (AD)
|
**Status da Categoria:** `▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░░` **77%** (7/9)
|
||||||
- [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 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 3] Automação e Relatórios com PowerShell
|
- [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 3] Diagnóstico de Replicação (DCDIAG)
|
- [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] Gestão Centralizada via GPO
|
- [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] Disaster Recovery e Continuidade de Negócios (AD)
|
- [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] RDS/Terminal Services: Otimização para Alta Latência
|
||||||
- [ ] [Nível 3] Gestão de Impressão Centralizada e Cotas (PaperCut)
|
- [ ] [Nível 3] Gestão de Impressão Centralizada e Cotas (PaperCut)
|
||||||
|
|
||||||
### 5. Microsoft Exchange (Exchange 2019)
|
### 5. Microsoft Exchange (Exchange 2019)
|
||||||
> **Status:** `▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓` **100%** (17/17)
|
!!! info "Status: 5. Microsoft Exchange (Exchange 2019)"
|
||||||
- [x] [Nível 0] Como Acessar e Configurar Webmail e Celular
|
**Status da Categoria:** `▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓` **100%** (17/17)
|
||||||
- [x] [Nível 0] Como Configurar Resposta Automatica de Ferias
|
|
||||||
- [x] [Nível 1] Diagnostico Basico - Usuario nao recebe e-mail
|
- [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 1] Procedimento de Criacao e Bloqueio de Usuarios
|
- [x] [Nível 0] [[Resposta Automatica de Ferias]](documentacao%20exchange/%5BNível%200%5D%20Como%20Configurar%20Resposta%20Automatica%20de%20Ferias.md)
|
||||||
- [x] [Nível 2] Gerenciamento de Cotas e Arquivamento
|
- [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 2] Gerenciamento de Quarentena Movel
|
- [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] Gestao de Permissoes (Full Access/Send As)
|
- [x] [Nível 2] [[Cotas e Arquivamento]](documentacao%20exchange/%5BNível%202%5D%20Gerenciamento%20de%20Cotas%20e%20Arquivamento.md)
|
||||||
- [x] [Nível 2] Solucao de Problemas de Lista de Enderecos
|
- [x] [Nível 2] [[Quarentena Móvel (ActiveSync)]](documentacao%20exchange/%5BNível%202%5D%20Gerenciamento%20de%20Quarentena%20Movel%20(ActiveSync).md)
|
||||||
- [x] [Nível 3] Acesso ao Servidor Windows Core e PowerShell
|
- [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 3] Arquitetura Tecnica e Mapeamento
|
- [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] Auditoria Administrativa e Logs
|
- [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] Checklist de Manutencao Diaria/Semanal
|
- [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] Disaster Recovery e Soft Restore
|
- [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] Gestao de Conectores e Roteamento
|
- [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] Referencia de Operacoes via PowerShell
|
- [x] [Nível 3] [[Disaster Recovery e Soft Restore]](documentacao%20exchange/%5BNível%203%20disaster%20recovery%20e%20soft%20restore.md)
|
||||||
- [x] [Nível 3] Relatorios Avancados
|
- [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] Renovacao de Certificado SSL
|
- [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)
|
### 6. Virtualização (VMware / Proxmox)
|
||||||
> **Status:** `▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░░` **75%** (12/16)
|
!!! info "Status: 6. Virtualização (VMware / Proxmox)"
|
||||||
**VMware:**
|
**Status da Categoria:** `▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓` **100%** (12/12)
|
||||||
- [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
|
|
||||||
|
|
||||||
**Proxmox VE:**
|
**VMware:**
|
||||||
- [ ] [Nível 1] Gestão Básica de VMs/LXC
|
- [x] [Nível 1] [[Visão Geral E Escopo]](documentacao%20vmware/%5BNível%201%5D%20Visão%20Geral%20E%20Escopo.md)
|
||||||
- [ ] [Nível 2] Gestão de Backups e Snapshots
|
- [x] [Nível 1] [[Verificação Básica De VM]](documentacao%20vmware/%5BNível%201%5D%20Verificação%20Básica%20De%20Vm.md)
|
||||||
- [ ] [Nível 3] Gestão de Cluster e HA
|
- [x] [Nível 1] [[Operações De Energia]](documentacao%20vmware/%5BNível%201%5D%20Operações%20De%20Energia%20Reiniciar%20E%20Desligar.md)
|
||||||
- [ ] [Nível 3] Troubleshooting de Rede
|
- [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)
|
### 7. Conteineres (Docker / Portainer)
|
||||||
> **Status:** `▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓` **100%** (9/9)
|
!!! info "Status: 7. Conteineres (Docker / Portainer)"
|
||||||
- [x] [Nível 0] Docker para Devs e Ferramentas
|
**Status da Categoria:** `▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓` **100%** (9/9)
|
||||||
- [x] [Nível 1] Instalação e Configuração (Docker + Compose)
|
|
||||||
- [x] [Nível 1] Deploy Portainer CE
|
- [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] Gestão de Stacks (Manual/GitOps)
|
- [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 2] Redes e Firewall
|
- [x] [Nível 1] [[Deploy Portainer CE]](documentacao%20conteineres/%5BNível%201%5D%20Deploy%20E%20Acesso%20Ao%20Portainer%20Ce.md)
|
||||||
- [x] [Nível 2] Volumes e Persistência de Dados
|
- [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] Healthchecks e Cron
|
- [x] [Nível 2] [[Redes E Firewall]](documentacao%20conteineres/%5BNível%202%5D%20Redes%20E%20Firewall%20No%20Docker.md)
|
||||||
- [x] [Nível 3] Docker Swarm: Inicialização e Gerenciamento
|
- [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 3] Kubernetes: Visão Geral e Ferramentas Básicas
|
- [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
|
### 8. Linux Server
|
||||||
> **Status:** `▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓` **100%** (7/7)
|
!!! info "Status: 8. Linux Server"
|
||||||
- [x] [Nível 1] Comandos Essenciais de Diagnóstico
|
**Status da Categoria:** `▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓` **100%** (7/7)
|
||||||
- [x] [Nível 2] Gerenciamento de Pacotes e Updates
|
|
||||||
- [x] [Nível 2] Configuração de Rede e Firewall
|
- [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] Gestão de Usuários e Permissões
|
- [x] [Nível 2] [[Gerenciamento de Pacotes e Updates]](documentacao%20linux/%5BNível%202%5D%20Gerenciamento%20de%20Pacotes%20e%20Updates.md)
|
||||||
- [x] [Nível 3] Hardening de Servidor
|
- [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 3] Análise de Logs (Journalctl)
|
- [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] Scripting e Automação Avançada
|
- [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)
|
### 9. Service Desk (Zammad)
|
||||||
> **Status:** `▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓` **100%** (8/8)
|
!!! info "Status: 9. Service Desk (Zammad)"
|
||||||
- [x] [Nível 1] Criação, Classificação e Fusão de Tickets
|
**Status da Categoria:** `▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓` **100%** (8/8)
|
||||||
- [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
|
|
||||||
|
|
||||||
### 10. Hardware - Gerenciamento Out-of-Band (OOB)
|
- [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)
|
||||||
> **Status:** `░░░░░░░░░░░░░░░░░░░░` **0%** (0/3)
|
- [x] [Nível 2] [[Instalação E Deploy Zammad]](documentacao%20zammad/%5BNível%202%5D%20Instalação%20E%20Deploy%20Zammad.md)
|
||||||
- [ ] [Nível 2] Acesso e Gerenciamento via iDRAC (Dell PowerEdge)
|
- [x] [Nível 2] [[Automações E Triggers]](documentacao%20zammad/%5BNível%202%5D%20Automações%20E%20Triggers.md)
|
||||||
- [ ] [Nível 2] Acesso e Gerenciamento via IMM (Lenovo System x)
|
- [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)
|
||||||
- [ ] [Nível 3] Atualização de Firmware, BIOS e Lifecycle Controller
|
- [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
|
### 10. Backup & DR - Infraestrutura Virtual (Veeam)
|
||||||
> **Status:** `░░░░░░░░░░░░░░░░░░░░` **0%** (0/4)
|
!!! info "Status: 10. Backup & DR - Infraestrutura Virtual (Veeam)"
|
||||||
- [ ] [Nível 2] Monitoramento de UPS/Nobreaks (APC PowerChute)
|
**Status da Categoria:** `▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓` **100%** (5/5)
|
||||||
- [ ] [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
|
|
||||||
|
|
||||||
### 12. Web Servers - Nginx
|
- [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)
|
||||||
> **Status:** `░░░░░░░░░░░░░░░░░░░░` **0%** (0/4)
|
- [x] [Nível 2] [[Restauração De Arquivos Guest]](documentacao%20backup/%5BNível%202%5D%20Restauração%20De%20Arquivos%20Guest%20(WindowsLinux).md)
|
||||||
- [ ] [Nível 1] Comandos Básicos (Start/Stop/Reload/Logs)
|
- [x] [Nível 2] [[Instant VM Recovery]](documentacao%20backup/%5BNível%202%5D%20Instant%20Vm%20Recovery%20(Restauração%20Rápida).md)
|
||||||
- [ ] [Nível 2] Configuração de Virtual Hosts (Server Blocks)
|
- [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)
|
||||||
- [ ] [Nível 3] Reverse Proxy e Load Balancing
|
- [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)
|
||||||
- [ ] [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
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 📂 Estrutura de Pastas e Níveis
|
## 📂 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.
|
* **Nível 0 (Cliente):** Tutoriais visuais passo-a-passo.
|
||||||
* **Nivel_1 (Service Desk):** Procedimentos operacionais padrão (SOP).
|
* **Nível 1 (Service Desk):** Procedimentos operacionais padrão (SOP).
|
||||||
* **Nivel_2 (NOC/Infra):** Configuração, manutenção e análise técnica.
|
* **Nível 2 (NOC/Infra):** Configuração, manutenção e análise técnica.
|
||||||
* **Nivel_3 (Engenharia):** Arquitetura, Disaster Recovery e scripts avançados.
|
* **Nível 3 (Engenharia):** Arquitetura, Disaster Recovery e scripts avançados.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## 🛠 Como Gerar Novos PDFs
|
## 🛠 Como Gerar Novos PDFs
|
||||||
Utilize o comando abaixo na raiz do projeto:
|
Utilize o comando abaixo na raiz do projeto:
|
||||||
|
|
||||||
```powershell
|
```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.*
|
|
||||||
|
|
|
||||||
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
|
@ -1,3 +0,0 @@
|
||||||
# Aplicativos
|
|
||||||
|
|
||||||
Manuais relacionados a aplicativos.
|
|
||||||
|
|
@ -1,3 +0,0 @@
|
||||||
# Documentação Asterisk
|
|
||||||
|
|
||||||
Local para manuais e procedimentos referentes ao **Asterisk**.
|
|
||||||
|
|
@ -1,3 +0,0 @@
|
||||||
# Documentação Gitea
|
|
||||||
|
|
||||||
Local para manuais e procedimentos referentes ao **Gitea**.
|
|
||||||
|
|
@ -1,3 +0,0 @@
|
||||||
# Documentação Magnusbilling
|
|
||||||
|
|
||||||
Local para manuais e procedimentos referentes ao **Magnusbilling**.
|
|
||||||
|
|
@ -1,3 +0,0 @@
|
||||||
# Documentação Technium
|
|
||||||
|
|
||||||
Local para manuais e procedimentos referentes ao **Technium**.
|
|
||||||
|
|
@ -1,3 +0,0 @@
|
||||||
# Documentação Zabbix
|
|
||||||
|
|
||||||
Local para manuais e procedimentos referentes ao **Zabbix**.
|
|
||||||
|
|
@ -1,3 +0,0 @@
|
||||||
# Documentação Zammad
|
|
||||||
|
|
||||||
Local para manuais e procedimentos referentes ao **Zammad**.
|
|
||||||
|
Before Width: | Height: | Size: 520 KiB After Width: | Height: | Size: 520 KiB |
|
Before Width: | Height: | Size: 374 KiB After Width: | Height: | Size: 374 KiB |
|
Before Width: | Height: | Size: 503 KiB After Width: | Height: | Size: 503 KiB |
|
Before Width: | Height: | Size: 776 KiB After Width: | Height: | Size: 776 KiB |
|
Before Width: | Height: | Size: 439 KiB After Width: | Height: | Size: 439 KiB |
|
Before Width: | Height: | Size: 606 KiB After Width: | Height: | Size: 606 KiB |
|
Before Width: | Height: | Size: 531 KiB After Width: | Height: | Size: 531 KiB |
|
Before Width: | Height: | Size: 316 KiB After Width: | Height: | Size: 316 KiB |
|
Before Width: | Height: | Size: 496 KiB After Width: | Height: | Size: 496 KiB |
|
Before Width: | Height: | Size: 486 KiB After Width: | Height: | Size: 486 KiB |
|
|
@ -1,3 +0,0 @@
|
||||||
# Bancos De Dados
|
|
||||||
|
|
||||||
Manuais relacionados a bancos de dados.
|
|
||||||
|
|
@ -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)?
|
||||||
|
|
@ -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)?
|
||||||
|
|
@ -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)?
|
||||||
|
|
@ -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?
|
||||||
|
|
@ -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)?
|
||||||
|
|
@ -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?
|
||||||
|
|
@ -1,3 +0,0 @@
|
||||||
# Conteineres
|
|
||||||
|
|
||||||
Manuais relacionados a conteineres.
|
|
||||||
|
|
@ -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)?
|
||||||
|
|
@ -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?
|
||||||
|
|
@ -1,3 +0,0 @@
|
||||||
# Documentação Docker-Compose
|
|
||||||
|
|
||||||
Local para manuais e procedimentos referentes ao **Docker-Compose**.
|
|
||||||
|
|
@ -1,3 +0,0 @@
|
||||||
# Documentação Docker
|
|
||||||
|
|
||||||
Local para manuais e procedimentos referentes ao **Docker**.
|
|
||||||
|
|
@ -1,3 +0,0 @@
|
||||||
# Documentação Portainer
|
|
||||||
|
|
||||||
Local para manuais e procedimentos referentes ao **Portainer**.
|
|
||||||
|
|
@ -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).
|
||||||
|
|
||||||
|

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

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

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

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

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