# MCL Discover CMS — Guida Completa

## Server e Pannello Admin

---

## 1. Informazioni Server

**Server:** Hetzner CPX22
**IP:** 128.140.55.211
**OS:** Ubuntu 24.04
**PHP:** 8.3
**Web Server:** Nginx 1.24.0
**Database:** SQLite (WAL mode)
**Pannello Admin:** https://cms.mclmedia.eu (password: mcl2026)

### Accesso SSH

```bash
ssh root@128.140.55.211
```

Autenticazione via chiave ed25519 di Luca (già configurata).

---

## 2. Struttura File

```
/var/www/cms/                     ← CMS engine + admin
  /admin/                         ← Pannello web (PHP-FPM)
    index.php                     ← Router principale
    /pages/
      dashboard.php               ← Panoramica siti e statistiche
      sites.php                   ← Gestione siti (aggiungi/elimina/deploy)
      site-detail.php             ← Dettaglio sito (infrastruttura, log, articoli)
      generate.php                ← Generazione articoli via OpenAI
      recycler.php                ← Gestione riciclo articoli
      deploy-status.php           ← Stato deploy/SSL di tutti i siti
      settings.php                ← Impostazioni (API keys)
      login.php                   ← Autenticazione
      layout.php                  ← Template sidebar + layout
  /engine/
    builder.php      (v6)         ← Genera HTML statico, 3 formati URL
    generator.php    (v2)         ← Genera articoli OpenAI + Immich
    recycler.php                  ← Riciclo date articoli
    schedule.php                  ← Schedule giornaliera
    immich.php                    ← Modulo immagini standalone
    cloudflare.php                ← API Cloudflare
    deploy.php       (v2)         ← Deploy Nginx + Origin Certificate
    hbagency.php                  ← HB Agency API + ads.txt
    brand.php                     ← Colori, Plausible, HB script
  /config/
    config.php                    ← Configurazione globale
    init_db.php                   ← Schema DB + migrazioni
  /data/
    cms.db                        ← Database SQLite
/var/www/sites/                   ← Siti generati
  /dominio.it/public/             ← Document root Nginx
    index.html                    ← Homepage
    /29-42-slug/index.html        ← Articolo (formato archedfo)
    /slug/index.html              ← Articolo (formato postname)
    /notizia/index.html           ← Pagina categoria
    /autore/nome/index.html       ← Pagina autore
    /note-legali/index.html       ← Note legali
    /contatto/index.html          ← Contatto
    /pubblicazioni/index.html     ← Lista articoli
    /img/                         ← Immagini articoli
    sitemap.xml                   ← Sitemap standard
    sitemap-news.xml              ← Google News sitemap (48h)
    feed.xml                      ← RSS 2.0
    robots.txt                    ← Robots con sitemap
    favicon.svg                   ← Favicon auto-generato
    ads.txt                       ← HB Agency ads.txt
/etc/ssl/cloudflare/              ← Origin Certificate SSL
/etc/nginx/sites-enabled/         ← Config Nginx per dominio
```

---

## 3. Pannello Admin (cms.mclmedia.eu)

### 3.1 Dashboard
Panoramica con: siti totali, articoli totali, riciclati oggi, stato sistema (OpenAI/Immich).

### 3.2 Gestione Siti
**Aggiungi Sito** — form con:
- Dominio (senza www, senza https://)
- Nome sito (auto dal dominio se vuoto)
- Topic / Nicchia (es: salute, cucina, animali)
- Nome autore
- Formato permalink:
  - `/%postname%/` — URL fisse (/slug/)
  - `/%Y/%m/%d/%slug%/` — URL con data
  - `/%giorno%-ID-%slug%/` — Stile archedfo, URL cambia ogni riciclo
- Formato URL: con www o senza www
- Deploy automatico (checkbox) — Cloudflare + Nginx + SSL + HB Agency

**Tabella siti** mostra: dominio, URL, topic, articoli, Cloudflare, SSL, stato, pulsanti Deploy/SSL Retry/Elimina.

### 3.3 Genera Articoli
- Seleziona sito
- Numero articoli (consigliato 100+ per primo batch)
- Topic opzionale (usa quello del sito se vuoto)
- La generazione parte in background

### 3.4 Deploy / SSL Status
Panoramica di tutti i siti con stato: Cloudflare, nameservers, DNS propagato, SSL, Nginx config. Mostra anche la coda SSL e il log cron.

### 3.5 Dettaglio Sito
Per ogni sito mostra: statistiche, infrastruttura (Cloudflare zone ID, SSL, nameservers), deploy log, storico ricicli, lista articoli.

---

## 4. Flusso Operativo: Nuovo Sito

### Passo 1: Aggiungi dal pannello
Su cms.mclmedia.eu → Siti → + Aggiungi Sito. Compila il form con deploy automatico attivo.

Il sistema esegue automaticamente:
1. Crea zona Cloudflare + record DNS A (proxied) + CNAME www
2. Page rule redirect 301 (www ↔ non-www)
3. Security Level High + Browser Integrity Check + Minify
4. Crea cartella sito + placeholder
5. Genera favicon.svg + logo.svg
6. Origin Certificate SSL (15 anni) via API Cloudflare
7. Config Nginx + reload
8. Registra sito su HB Agency + tenta download ads.txt

### Passo 2: Nameservers (manuale)
Imposta i nameservers Cloudflare nel registrar del dominio (Match.it o altro). I nameservers sono mostrati nel pannello e nel deploy log. Propagazione: 1-24 ore.

### Passo 3: Genera articoli
Vai su Genera Articoli, seleziona il sito, imposta numero e topic, clicca Avvia.

### Passo 4: Verifica
Apri il sito e controlla: articoli, immagini, SSL, header colorato.

---

## 5. Comandi CLI Utili

### Builder (rebuild sito statico)
```bash
# Rebuild singolo sito (per ID)
php8.3 -r "require '/var/www/cms/engine/builder.php'; rebuild_site(1);"

# Rebuild tutti i siti
php8.3 -r "require '/var/www/cms/engine/builder.php';
\$pdo = mcl_db();
\$sites = \$pdo->query('SELECT id FROM sites')->fetchAll();
foreach (\$sites as \$s) rebuild_site(\$s['id']);"
```

### Generator (genera articoli)
```bash
# Genera 100 articoli per sito ID 2
php8.3 /var/www/cms/engine/generator.php --site-id=2 --count=100 --topic="salute"

# Monitora progresso
tail -f /tmp/mcl_gen_2.log
```

### Cloudflare
```bash
# Setup completo dominio
php8.3 /var/www/cms/engine/cloudflare.php --domain=esempio.it --www

# Solo info zona esistente
php8.3 /var/www/cms/engine/cloudflare.php --domain=esempio.it --info

# Elimina zona
php8.3 /var/www/cms/engine/cloudflare.php --domain=esempio.it --delete
```

### Deploy
```bash
# Setup completo: Cloudflare + Nginx + SSL
php8.3 /var/www/cms/engine/deploy.php --domain=esempio.it --name="Nome Sito" --www --full

# Solo deploy server (senza Cloudflare)
php8.3 /var/www/cms/engine/deploy.php --domain=esempio.it --name="Nome Sito" --deploy-only

# Solo SSL
php8.3 /var/www/cms/engine/deploy.php --domain=esempio.it --ssl-only
```

### HB Agency
```bash
# Registra sito su HB Agency
php8.3 /var/www/cms/engine/hbagency.php --domain=esempio.it --name="Nome" --www

# Download ads.txt manuale
php8.3 /var/www/cms/engine/hbagency.php --domain=esempio.it --download-ads

# Info sito HB
php8.3 /var/www/cms/engine/hbagency.php --domain=esempio.it --info

# Cron: check ads.txt tutti i siti
php8.3 /var/www/cms/engine/hbagency.php --cron-ads
```

### Immich (standalone)
```bash
# Assegna immagini a sito
php8.3 /var/www/cms/engine/immich.php --site-id=2
```

---

## 6. Crontab

Attualmente attivo:
```
*/10 * * * * php8.3 /var/www/cms/engine/hbagency.php --cron-ads >> /var/log/mcl-hb-cron.log 2>&1
```

Da attivare quando il recycler è pronto:
```
# Schedule giornaliera (genera programma riciclo alle 6:00)
0 6 * * * php8.3 /var/www/cms/engine/schedule.php >> /var/log/mcl-schedule.log 2>&1

# Recycler (esegue ricicli ogni 15 min dalle 7 alle 23)
*/15 7-23 * * * php8.3 /var/www/cms/engine/recycler.php >> /var/log/mcl-recycler.log 2>&1
```

---

## 7. Credenziali e API

| Servizio | Credenziale | Dove è salvata |
|----------|-------------|----------------|
| Cloudflare | Email: info@mclmedia.it, Global API Key | /var/www/cms/config/config.php |
| OpenAI | API Key | Pannello admin → Impostazioni |
| Immich | URL: immaginimcl.it, API Key | Pannello admin → Impostazioni |
| HB Agency | API Key, Secret, User ID 11797 | /var/www/cms/engine/hbagency.php |
| CMS Admin | Password: mcl2026 | Pannello admin → Impostazioni |

---

## 8. Formati URL

| Formato | Esempio URL | Quando cambia |
|---------|-------------|---------------|
| postname | /titolo-articolo/ | Mai (URL fissa) |
| date | /2026/03/29/titolo/ | Mai (URL fissa con data) |
| archedfo | /29-42-titolo/ | Ogni riciclo (giorno cambia) |

Il formato archedfo replica la strategia di archedfo.it: ogni riciclo genera una nuova URL perché il prefisso giorno cambia. L'ID articolo resta fisso.

---

## 9. SEO e Structured Data

Ogni pagina articolo include:
- NewsArticle schema JSON-LD (headline, description, image, dates, author con URL, publisher con logo)
- BreadcrumbList schema JSON-LD (Home > Notizia > Titolo)
- Meta OG completi (type, title, description, url, site_name, image 1200x675, locale, article:published_time, article:tag)
- Twitter card summary_large_image
- max-image-preview:large
- Canonical URL
- RSS alternate link

Homepage include:
- WebSite + Organization schema JSON-LD
- og:image (dal primo articolo)

Pagina autore:
- ProfilePage schema JSON-LD con Person, jobTitle, worksFor
- index, follow (indicizzabile)
- Meta description con conteggio articoli

---

## 10. Troubleshooting

**Database locked:**
```bash
fuser -k /var/www/cms/data/cms.db
```

**Nginx non ricarica:**
```bash
nginx -t    # Verifica config
systemctl reload nginx
```

**SSL non funziona con Cloudflare:**
Usare Origin Certificate, non certbot. Certbot fallisce con proxy arancione.
```bash
# Verifica certificato
ls -la /etc/ssl/cloudflare/dominio.it.*
```

**Immagini mancanti:**
```bash
php8.3 /var/www/cms/engine/immich.php --site-id=ID_SITO
php8.3 -r "require '/var/www/cms/engine/builder.php'; rebuild_site(ID_SITO);"
```

**Verificare structured data:**
Usa https://search.google.com/test/rich-results con l'URL di un articolo.

---

## 11. Siti Attivi

| ID | Dominio | Formato | WWW | Topic | Articoli | HB Site ID |
|----|---------|---------|-----|-------|----------|------------|
| 1 | sitotest.mclmedia.eu | postname | No | Salute | 10 | — |
| 2 | villagranbruro.it | archedfo | Sì | Salute e Cucina | 60 | 39551 |

---

*Ultimo aggiornamento: 29 Marzo 2026*
