# Relatório Técnico — Webprojects (fuzzalab.pt Ecosystem)

---

## Visão Geral

O ecossistema de sub-projectos web alojados no servidor OVH (37.187.127.161), organizados por subdomínios de `fuzzalab.pt`. Cada subdomínio serve um propósito específico, desde ferramentas estáticas (Apache) até aplicações Node.js/Flask com proxy reverso.

---

## 1. tools.fuzzalab.pt — Ferramentas

### Descrição Geral

Diretória de ferramentas e templates, servida diretamente pelo Apache (sem Node.js). Inclui templates HTML/CSS/JS, documentação do ElvenStats scrapper, páginas fancy, templates de health check, e testes de webcloner.

### Stack Tecnológico

| Componente | Tecnologia |
|---|---|
| Servidor Web | **Apache 2.4** |
| SSL | Let's Encrypt (Auto-Renew) |
| Directory Listing | Apache Fancy Indexing (kristuff style) |
| Templates | HTML/CSS/JS Vanilla |
| Ícones | SVG icons (fancy-pages) |

### Estrutura de Pastas

```
/var/www/tools.fuzzalab.pt/
│
├── _TEMPLATES/               # Templates HTML/CSS/JS
│   ├── FUZZACLOUD.html/      # Template FUZZACLOUD
│   ├── FUZZALABv2.html/      # Template FUZZALAB v2
│   ├── Homepage.v1/          # Template homepage v1
│   ├── KB.html/              # Template Knowledge Base
│   ├── MATRIX.html/          # Template MATRIX
│   ├── STFU.html/            # Template STFU
│   └── smoke.js              # Script de teste/smoke (5.5KB)
│
├── backups/                  # Backups diversos (protegido por .htpasswd)
│   (Acesso: Basic Auth)
│
├── elvenstats_scrapper/      # Documentação do ElvenStats Scrapper
│   ├── elvenstats_scraper-v3.py  # Scraper Python v3 (~13KB)
│   ├── chromedriver              # ChromeDriver (~15MB)
│   └── README                    # Documentação
│
├── fancy-pages/              # Páginas HTML com design fancy
│   ├── index.html             # Landing page (4.8KB)
│   ├── tpl1-metrics.html      # Template métricas (10KB)
│   ├── tpl2-sidebar.html      # Template sidebar (4.5KB)
│   ├── tpl3-tabs.html         # Template tabs (6KB)
│   ├── tpl4-widgets.html      # Template widgets (5KB)
│   └── tpl5-terminal.html     # Template terminal (8KB)
│
├── health-tpls/              # Templates de health check
│   └── index.html             # Template health check (4.8KB)
│
├── imagesbak/                # Backup de imagens
│   (12KB de imagens diversas)
│
├── webcloner-testing/        # Testes de web cloner
│   ├── clone_website.py       # Script Python web cloner (2KB)
│   └── www.elvenstats.com/    # Site clonado para teste
│
├── .htaccess                 # Config Apache (rewrite, deny node_modules, etc.)
├── HEADER.html               # Cabeçalho fancy-pages (1.8KB)
├── FOOTER.html               # Rodapé fancy-pages (232B)
├── test-nav.html             # Teste navegação
├── test-nav2.html            # Teste navegação v2
└── test-slide.html           # Teste slideshow
```

### Apache Config (destaques)

- **SSL:** Let's Encrypt com HSTS
- **Directory Listing:** FancyIndexing com ícones SVG (kristuff)
- **Proteção:** `backups/` com Basic Auth (.htpasswd)
- **Proxy:** `/elvenxcel/` → `localhost:4000`
- **CSP restrito:** `default-src 'self'`
- **Negação:** node_modules, .env, package.json, README.md (LocationMatch)

### Acesso

```
https://tools.fuzzalab.pt/
```

---

## 2. dl.fuzzalab.pt — Downloads

### Descrição Geral

Página de downloads que serve ficheiros da diretoria de downloads do Transmission (cliente BitTorrent). Servido diretamente pelo Apache com FancyIndexing, protegido por autenticação Basic Auth.

### Stack Tecnológico

| Componente | Tecnologia |
|---|---|
| Servidor | **Apache 2.4** |
| Autenticação | Basic Auth (.htpasswd-transmission) |
| Directory Listing | Apache FancyIndexing (kristuff style) |
| SSL | Let's Encrypt |

### Estrutura

```
/var/lib/transmission-daemon/downloads/
```
(Diretoria de downloads do Transmission, servida via DocumentRoot do Apache)

### Apache Config (destaques)

- **DocumentRoot:** `/var/lib/transmission-daemon/downloads/`
- **Autenticação:** Basic Auth com ficheiro `.htpasswd-transmission`
- **FancyIndexing:** Ícones SVG estilo kristuff
- **SSL:** Let's Encrypt com HSTS

### Acesso

```
https://dl.fuzzalab.pt/
```
(protegido por password)

---

## 3. torrents.fuzzalab.pt — Torrents

### Descrição Geral

Interface web do Transmission BitTorrent client, servida via proxy reverso Apache para a web UI do Transmission (porta 9091).

### Stack Tecnológico

| Componente | Tecnologia |
|---|---|
| Cliente Torrent | **Transmission** (daemon) |
| Web UI | Transmission Web Interface (porta 9091) |
| Proxy | Apache ProxyPass |
| SSL | Let's Encrypt |
| CSP | Restrito (`default-src 'self'`) |

### Apache Config

```
ProxyPass / → http://127.0.0.1:9091/
ProxyPass /transmission → http://127.0.0.1:9091/transmission
ProxyPass /web → http://127.0.0.1:9091/web
```

### Acesso

```
https://torrents.fuzzalab.pt/
```

---

## 4. dev.fuzzalab.pt — Desenvolvimento

### Descrição Geral

Domínio de desenvolvimento que aloja o **ElvenStats Scrapper** (ELVENARCHY), documentado detalhadamente no `RELATORIO_TECNICO.md`. Servido via Apache proxy reverso para Node.js na porta 3010.

### Stack Tecnológico

| Componente | Tecnologia |
|---|---|
| Backend | Node.js + Express 4 |
| BD | SQLite (~675MB) |
| Frontend | Vanilla HTML/CSS/JS SPA |
| Proxy | Apache → localhost:3010 |
| SSL | Let's Encrypt |

### Estrutura

```
/var/www/dev.fuzzalab.pt/elvenstats/
├── data/elvenstats.db         # SQLite (~675MB)
├── src/                       # Código fonte
│   ├── index.js               # Servidor (porta 3010)
│   ├── enrichment.js          # Daemon enriquecimento
│   ├── routes/                # 30+ endpoints REST
│   ├── bot/                   # Scrapers (GameAPI + ElvenStats)
│   └── public/                # SPA frontend
└── deploy.sh                  # Script de deploy
```

### Acesso

```
https://dev.fuzzalab.pt/elvenstats/
```

---

## 5. Auth Central (fuzzalab.pt/auth/)

### Descrição Geral

Sistema de autenticação centralizado, desenvolvido em Python/Flask, que serve como backend de autenticação para todos os projectos do ecossistema fuzzalab. Partilha a mesma base de dados SQLite (`fuzzalab.db`) com o Node.js.

### Stack

| Componente | Tecnologia |
|---|---|
| Framework | **Python/Flask** |
| BD | SQLite (partilhada com Node.js) |
| CSRF | Flask-WTF CSRFProtect |
| Porta | 5050 |
| Path | `/var/www/fuzzalab.pt/auth-central/` |

### Proxy

`/auth/*` → Apache → `http://127.0.0.1:5100/auth/` (ou 5050, conforme config)

---

## 6. Sub-projectos com Proxy Interno

Estes projectos correm em portas internas e são servidos via proxy reverso no fuzzalab.pt:

| Path | Porta | Descrição |
|---|---|---|
| `/chatai/` | 8000 | Chat AI (sub-projecto) |
| `/security-scanner/` | 5050 | Scanner de segurança |
| `/lnes/` | 7070 | LNES (sub-projecto) |
| `/elvenxcel/` | 4000 | Elvenxcel (também em tools.fuzzalab.pt) |
| `/grafana/` | 3001 | Grafana monitoring |

Cada um destes projectos tem o seu próprio `maintenanceCheck()` via middleware que bloqueia o acesso se o projecto estiver em manutenção na tabela `projects` da BD SQLite.

---

## 7. tl-rss-manager (Apache Static)

**Path:** `/home/slackie/webprojects/tl-rss-manager`
**Acesso:** `https://fuzzalab.pt/tl-rss-manager/`

Servido diretamente pelo Apache (Alias), com `JWT_SECRET` definido no VirtualHost como variável de ambiente. Não passa pelo Node.js.

---

## 8. Resumo de Portas

| Porta | Serviço | Domínio/Path |
|---|---|---|
| 80 | Apache HTTP | Todos os domínios (redirect → HTTPS) |
| 443 | Apache HTTPS | Todos os domínios |
| 3000 | Node.js (fuzzalab.pt) | Portal principal |
| 3010 | Node.js (dev.fuzzalab.pt) | ElvenStats |
| 4000 | Elvenxcel | fuzzalab.pt/elvenxcel/ |
| 5050 | Security Scanner | fuzzalab.pt/security-scanner/ |
| 5100 | Auth Central (Flask) | fuzzalab.pt/auth/ |
| 7070 | LNES | fuzzalab.pt/lnes/ |
| 8000 | Chat AI | fuzzalab.pt/chatai/ |
| 3001 | Grafana | fuzzalab.pt/grafana/ |
| 9091 | Transmission Web UI | torrents.fuzzalab.pt |

---

## 9. Guia de Manutenção

### 9.1. Apache

```bash
# Verificar configuração
apachectl configtest

# Recarregar após alterações
systemctl reload apache2

# Ver logs de erro
tail -f /var/log/apache2/*-error.log

# Verificar sites enabled
ls -la /etc/apache2/sites-enabled/
```

### 9.2. SSL (Let's Encrypt)

```bash
# Verificar renovação automática
certbot renew --dry-run

# Forçar renovação
certbot renew
```

### 9.3. Sub-projectos

Cada sub-projecto com proxy interno corre como serviço systemd ou processo nohup:

```bash
# Verificar processos nas portas relevantes
ss -tlnp | grep -E ':(3000|3010|4000|5050|5100|7070|8000|9091)'

# Reiniciar serviço específico (exemplo)
systemctl restart fuzzalab
```

### 9.4. Downloads (dl.fuzzalab.pt)

Os ficheiros em `/var/lib/transmission-daemon/downloads/` são geridos pelo Transmission. Para adicionar ficheiros manualmente:

```bash
# Copiar ficheiro para a diretoria de downloads
cp /caminho/ficheiro.zip /var/lib/transmission-daemon/downloads/
chown debian-transmission:debian-transmission /var/lib/transmission-daemon/downloads/ficheiro.zip
```

### 9.5. Tools (tools.fuzzalab.pt)

Adicionar novos templates/páginas:
```bash
# Criar nova página na diretoria apropriada
touch /var/www/tools.fuzzalab.pt/fancy-pages/nova-pagina.html

# Verificar que fica visível
curl -k https://tools.fuzzalab.pt/fancy-pages/nova-pagina.html
```

---

## 10. Segurança

| Medida | Descrição |
|---|---|
| HTTPS | Todos os subdomínios com Let's Encrypt + HSTS |
| HSTS | `max-age=31536000; includeSubDomains; preload` |
| Auth básica | dl.fuzzalab.pt com .htpasswd |
| Restrição backups | tools.fuzzalab.pt/backups/ com Basic Auth |
| Negação ficheiros | node_modules, .env, package.json bloqueados |
| CSP | Políticas restritas por subdomínio |
| Headers segurança | X-Frame-Options, X-Content-Type-Options, X-XSS-Protection, Referrer-Policy, Permissions-Policy |
| Maintenance check | Projectos com middleware de manutenção na BD |

---
