ControlCenter
➕ Nuovo 📝 Aggiorna 📘 Docs 07/05/2026 09:00
← Tutti i progetti
🎛️
Gestionale WF
Pannello di controllo centralizzato per la gestione, generazione AI e deploy automatico dei siti affiliate Worldfilia del network MCL Media. Architettura multi-tenant con SQLite, deploy rsync/SSH, integrazione GSC e Worldfilia API.
● Attivo Priorità Alta 👤 Luca
🤖 Sincronizza con Claude
🚀 Copia Brief + ToDo = per iniziare una nuova conversazione  |  📋 JSON Completo = per aggiornare a fine sessione
📖 Brief Progetto
Il Gestionale WF è il pannello di comando centralizzato per l'intero network di siti affiliate Worldfilia di MCL Media. È un'applicazione PHP custom (senza framework) con architettura multi-tenant basata su SQLite: un master.db globale che registra gli 81 siti attivi e le impostazioni condivise, più un database SQLite dedicato per ciascun sito nella cartella database/sites/. Risiede sul VPS OVH 54.36.100.203 con Plesk, sotto il path /var/www/vhosts/mclmedia.eu/gestionale-wf.mclmedia.eu/. Da qui si gestisce tutto il ciclo di vita dei siti affiliate: creazione tramite wizard AI (ajax_wizard.php che genera contenuti con GPT-4o, scarica immagini, costruisce schema markup e blog contestuali), deploy automatico via rsync/SSH verso il server 141.95.0.71, monitoraggio Google Search Console con auto-detect del formato proprietà (sc-domain vs https), e tracking revenue Worldfilia via API GraphQL e REST.
Ad oggi il sistema è pienamente operativo e stabile. Il cron di auto-deploy gira ogni ora al minuto 35, il cron analytics alle 06:00, il cron network alle 22:38. I tre tipi di sito supportati — funnel monoprodotto, multiblog, monotematico v2 (con template premium parametrico) — vengono tutti generati e deployati dal wizard. Il DB prodotti centralizzato su db-wf.mclmedia.eu è completamente automatizzato dall'11 marzo 2026: il cron notturno alle 3:00 esegue sync delle 1078 campagne attive Worldfilia via GraphQL e scraping delle 1050 landing page. I dati sono esposti al gestionale tramite tre API (api_product.php con tracker_urls, api_export_ads.php per il feed catalogo, api_new_products.php per le notifiche nuovi prodotti).
Il lavoro più recente e significativo (17 marzo 2026) ha riguardato la centralizzazione dei tracker URL Worldfilia: la configurazione WF_TRACKER_BASE + WF_PUB_ID è stata consolidata in config.php di db-wf, con funzioni buildTrackerUrl() e extractLandingInfo() che distinguono modulo iframe da landing page. L'API api_product.php ora restituisce tracker_urls pronti all'uso. Il wizard è stato aggiornato per usare questi URL nei nuovi siti, e fix_iframe_urls.php ha corretto retroattivamente tutti i 77 siti esistenti con re-deploy. Nello stesso giorno, GSCManager.php è stato riscritto con auto-detect del formato proprietà GSC e cache statica per evitare chiamate ripetute durante il batch deploy. Su base.mclmedia.eu sono state aggiunte le colonne GSC per i siti affiliate, generando 83 task per Alessandro: 74 siti devono ancora ricevere il service account discover-mcl@ come proprietario in Search Console.
Le decisioni architetturali chiave sono state: mantenere SQLite multi-tenant anziché migrare a MariaDB (sufficiente per il volume attuale), centralizzare tutta la logica tracker URL in db-wf anziché replicarla nei singoli siti, e utilizzare un modello API per separare nettamente il DB prodotti dal gestionale. I due cron mancanti identificati il 13 marzo (cron_worldfilia.php per il sync transazioni/revenue e cron_job_worker.php per la coda lavori) devono ancora essere aggiunti in Plesk.
Il prossimo step concreto è duplice: (1) Alessandro deve completare l'aggiunta del service account GSC sui 74 siti affiliate mancanti, task già visibili nella sua dashboard su base.mclmedia.eu; (2) bisogna configurare i due cron mancanti in Plesk — 0 3 * * * php /var/www/vhosts/mclmedia.eu/gestionale-wf.mclmedia.eu/cron_worldfilia.php e */5 * * * * php /var/www/vhosts/mclmedia.eu/gestionale-wf.mclmedia.eu/cron_job_worker.php — per attivare il sync automatico delle revenue Worldfilia e il worker della coda lavori asincroni.
📁 File Progetto 0 file
Max 64M · zip, pdf, docx, xlsx, immagini, codice…
📊 Avanzamento
0%
✅ To Do List 0/0
Nessuna task
📝 Note
Il Gestionale WF è il cuore operativo del network siti affiliate Worldfilia di MCL Media. Risiede su VPS OVH 54.36.100.203 con Plesk. PATH SERVER: /var/www/vhosts/mclmedia.eu/gestionale-wf.mclmedia.eu/ (è un sottodominio sotto mclmedia.eu, NON un vhost autonomo). Anche gestionale-amazon.mclmedia.eu è sullo stesso server con lo stesso pattern. ARCHITETTURA: PHP custom procedurale + OOP, senza framework. Database SQLite multi-tenant: un master.db globale (registro siti, global_settings, job_queue, wf_transactions) + un DB SQLite dedicato per ogni sito in database/sites/. Tre tipologie di sito supportate: funnel (monoprodotto), multiblog, monotematico_v2. Attualmente 81 siti attivi. DB PRODOTTI (db-wf.mclmedia.eu): Completamente automatizzato dall'11/03/2026. Il file test-db.php è il cuore operativo: scarica tutte le campagne attive Worldfilia via API GraphQL (readCampaigns con campo Landing[]), popola prodotti.json con URL landing, preview, prezzo, commissione. Lo scraper scarica HTML e immagini da ogni landing con deep follow (redirect, meta refresh, JS redirect). Il cron notturno (3:00) esegue sync + scrape dei nuovi prodotti. I dati sono esposti via api_product.php (dettagli + testo scrapato + tracker_urls) e api_export_ads.php (feed catalogo) al gestionale. L'endpoint api_new_products.php notifica il gestionale di nuovi prodotti con log rolling di 7 giorni. TRACKER URL WORLDFILIA: Configurazione centralizzata in config.php di db-wf: WF_TRACKER_BASE='https://offerte2019.info/affiliateproject/tracker/click/' e WF_PUB_ID='0f089a3bcf38'. La funzione buildTrackerUrl(land_id) costruisce l'URL completo dal campo 'id' delle landing nell'API GraphQL. extractLandingInfo() distingue modulo iframe (prima landing con URL contenente 'iframe.affiliatenetwork', non Small) dalla landing page (prima landing non-iframe). L'API api_product.php restituisce tracker_urls.modulo_url pronto all'uso. Il wizard ajax_wizard.php usa questo URL per l'iframe nei nuovi siti. Il 17/03/2026 sono stati fixati tutti i 77 siti esistenti con fix_iframe_urls.php + re-deploy. DATABASE.PHP (db-wf): Riscritta il 17/03/2026 come vista read-only. Niente più import CSV, sync manuale o motore scraping (tutto gestito dal cron). Interfaccia: 7 stat tiles, toolbar filtri (stato A/P/I, scrape status, ricerca), tabella ordinabile con 4 colonne landing (URL Modulo + Preview + URL Landing + Preview, tutti con tracker URL costruito da land_id). Modal dettagli con dati campagna, tutte le landing (tag MODULO/LANDING + URL tracker + URL raw), immagini scrapate, testo estratto. Sezione editing nel modal: nome_prodotto_pulito, sito web, note custom, upload immagini custom (AJAX save/upload/delete in database/custom_images/{id}/). I campi custom sono preservati dal sync cron (syncAllCampaigns aggiorna solo campi API). DEPLOY: Pipeline unificata via DeployEngine. Modalità primaria: rsync via SSH verso server target 141.95.0.71. Deploy incrementale basato su hash manifest (evita upload ridondanti). Fallback: HTTP via mcl_receiver.php. I siti target sono HTML statico generato — non eseguono PHP. Il cron auto-deploy gira ogni ora al minuto :35 sotto l'utente Plesk di sistema. CONTENUTI AI: Integrazione OpenAI GPT-4o per generazione homepage, pagine prodotto (hero, pros/cons, FAQ, schema JSON-LD), articoli blog contestualizzati. AI Strategist v9 analizza keyword GSC reali per proporre nuovi contenuti con anti-cannibalizzazione. Il contesto per OpenAI viene ora alimentato automaticamente dal testo scrapato delle landing Worldfilia. SERVICE ACCOUNT GSC: discover-mcl@test-c4a5c.iam.gserviceaccount.com. GSCManager.php nel gestionale-wf ora auto-rileva il formato proprietà GSC (sc-domain: vs https://) con cache statica della lista siti (una sola chiamata listSites() per sessione/processo). NOTA: 74 siti affiliate non hanno ancora il service account come proprietario in Search Console — task assegnati ad Alessandro nella dashboard base.mclmedia.eu. INTEGRAZIONE BASE.MCLMEDIA.EU: Il 17/03/2026 è stata aggiunta la verifica GSC per i siti affiliate (tabella affiliate_sites in MariaDB). Colonne gsc_verified/gsc_property_url/gsc_permission/gsc_last_check aggiunte. gsc-api.php (gscVerifyAllSites) e auto-tasks.php (syncAutoTasks) estesi per coprire affiliate_sites. La dashboard gestore unisce sites + affiliate_sites nella sezione SEO & Search Console. I task usano auto_ref='gsc_aff:{id}' con site_id NULL (affiliate_sites non è referenziata da FK su tasks). WIZARD SETUP SITI: Il modal 'Configurazione Sito Verticale' in system_vps.php permette di configurare nuovi siti dalla lista domini Plesk. Il flusso: cerca prodotto su db-wf.mclmedia.eu → auto-fill → Alessandro compila campi manuali assistito da Claude → salva in coda → batch processor genera tutto con AI. L'iframe del prodotto ora usa tracker_urls.modulo_url dall'API (URL tracker Worldfilia con land_id corretto), con fallback su url_info legacy. TOOL DI AUDIT: audit_iframe.php su gestionale-wf mostra tabella tutti i siti con status iframe (OK_TRACKER/LANDING_REF/IFRAME_RAW/NO_REF/NO_IFRAME), link diretto alla pagina acquisto per verifica visuale. fix_iframe_urls.php è lo script one-shot per aggiornare landing_html nel SQLite (dry-run + apply). REVENUE: Tutte le revenue Discover/affiliate passano da Hb Agency, NON da Amazon Associates/Worldfilia direttamente. Il tracking Worldfilia serve per monitoraggio e ottimizzazione. SEO: Integrazione completa GSC con fetch analytics, keyword tracking, inspect URL, e Indexing API. Il cron_network.php è stateful: quando riceve 429 (quota limit) salva lo stato e riprende dal punto esatto al run successivo. CRON db-wf.mclmedia.eu: Sync Worldfilia + scrape landing ogni notte alle 3:00 (test-db.php --cron). Richiede php8.2-curl, php8.2-xml, php8.2-mbstring installati. CRON gestionale-wf (Plesk, utente sistema): cron_auto_deploy.php ogni ora al :35, cron_analytics.php alle 06:00, cron_network.php alle 22:38. MANCANTI: cron_worldfilia.php (da aggiungere 0 3 * * *) e cron_job_worker.php (da aggiungere */5 * * * *). Anche gestionale-amazon ha il suo cron_auto_deploy al :06. MODULI PHP RICHIESTI (CLI): php8.2-sqlite3, php8.2-gd, php8.2-curl, php8.2-xml, php8.2-mbstring (tutti installati al 13/03/2026). PLESK API: Il PleskClient.php si autentica via Basic Auth con credenziali salvate in global_settings (plesk_host, plesk_user, plesk_pass). L'IP del gestionale (54.36.100.203) è whitelistato in Fail2Ban su jail.local del server WF per evitare ban accidentali dopo errori di autenticazione. MIGRATIONS: Il sistema usa ALTER TABLE con try/catch in init_expert_database() per aggiungere colonne mancanti ai DB esistenti: context_data (products), content_status e content_reviewed_at (products + blog_posts). PIANO FUTURO: Il gestionale resterà su questo server. Quando tutti i siti travel saranno deployati, si prenderà un OVH dedicato e si migrerà tutto con Claude. Il server Hetzner (AMD EPYC, 256GB RAM) è destinato ai siti WordPress/Discover, non a questo gestionale.
📜 Changelog
Patch GSC affiliate su base.mclmedia.eu: aggiunte colonne gsc_verified/gsc_property_url/gsc_permission/gsc_last_check a affiliate_sites (MariaDB). gsc-api.php esteso per verificare anche affiliate_sites. auto-tasks.php genera task gsc_aff:{id} con site_id NULL (fix foreign key constraint su tasks.site_id → sites.id). gestore.php unisce query sites + affiliate_sites nella sezione SEO. 83 task creati, 74 siti affiliate non verificati visibili nella dashboard di Alessandro.
2026-03-17 15:30 · claude
GSCManager.php riscritto con auto-detect formato proprietà GSC: prova prima sc-domain:{domain} poi https://{domain}/ dalla lista proprietà. Cache statica $registeredSitesCache per evitare chiamate listSites() ripetute durante batch deploy. Risolto errore 403 su submitSitemap per siti registrati come sc-domain.
2026-03-17 12:00 · claude
Fix iframe URL su tutti i 77 siti esistenti: fix_iframe_urls.php chiama api_product.php per ogni prodotto, recupera tracker_urls.modulo_url e aggiorna landing_html nel SQLite. Re-deploy completato con cron_auto_deploy.php. Verificato con curl: Slimique (era backend.worldfilia.net senza ref) ora ha offerte2019.info tracker corretto. audit_iframe.php creato per verifica visuale.
2026-03-17 11:00 · claude
ajax_wizard.php aggiornato: usa tracker_urls.modulo_url dall'API db-wf per costruire l'iframe nei nuovi siti. Fallback su url_info legacy se tracker_urls non disponibile. Tutti i nuovi siti avranno l'URL tracker Worldfilia corretto automaticamente.
2026-03-17 10:00 · claude
Tracker URL Worldfilia centralizzato in config.php (db-wf): WF_TRACKER_BASE=offerte2019.info, WF_PUB_ID=0f089a3bcf38, funzioni buildTrackerUrl() e extractLandingInfo() disponibili globalmente. api_product.php ora restituisce tracker_urls con modulo_url, landing_url, all_tracker_urls[] costruiti dal land_id delle landing API. Analisi CSV Worldfilia ha confermato dominio tracker corretto (offerte2019.info) e corrispondenza land_id con campo id nei landing_data.
2026-03-17 09:30 · claude
database.php (db-wf) riscritta completamente: rimossi import CSV, sync manuale, motore scraping. Nuova vista read-only con 7 stat tiles, toolbar filtri (stato A/P/I, scrape done/pending/error, ricerca nome/ID), tabella ordinabile (ID, prezzo, commissione), 4 colonne landing (URL Modulo, Preview Modulo, URL Landing, Preview Landing) con URL tracker costruito da land_id. Modal dettagli con dati campagna, landing pages (tag MODULO/LANDING), immagini scrapate, testo estratto. Sezione editing: nome_prodotto_pulito, sito web, note custom, upload immagini con AJAX save/upload/delete. Campi custom preservati dal sync cron (verificato in test-db.php syncAllCampaigns).
2026-03-17 08:00 · claude
Analisi completa db-wf.mclmedia.eu (17 file PHP): mappato architettura JSON-based (prodotti.json), sync API GraphQL Worldfilia, motore scraping con deep follow, 4 endpoint API (api_product, api_export_ads, api_stats, api_new_products). Analisi landing_data API: tutti type=O, distinzione iframe (iframe.affiliatenetwork.link) vs landing page (backend.worldfilia.net/landing) basata su URL pattern. Audit iframe nei siti deployati: 3 formati diversi trovati, Slimique senza ref (tracking rotto), solo 4/77 con tracker URL corretto.
2026-03-17 07:00 · claude
Test completo cron_auto_deploy.php via CLI: tutti 81 siti processati con successo. Fix 5 problemi bloccanti: (1) php8.2-sqlite3 mancante (could not find driver), (2) php8.2-gd mancante (imagecreatetruecolor crash in LogoGenerator), (3) $bannerHtml undefined in page_blog_single.php, (4) renderStars() redeclare in page_home.php e page_recensione.php v2 (wrappate con function_exists), (5) service account GSC aggiornato da search-console-manager@ a discover-mcl@test-c4a5c.iam.gserviceaccount.com (allineato a base.mclmedia.eu). Identificati 2 cron mancanti da aggiungere in Plesk: cron_worldfilia.php e cron_job_worker.php. Path corretto server: /var/www/vhosts/mclmedia.eu/gestionale-wf.mclmedia.eu/
2026-03-13 17:00 · claude
Banner avviso nuovi prodotti Worldfilia aggiunto su sites_manager.php (home gestionale) e dashboard sito. API api_new_products.php creata su db-wf con autenticazione token. Fetch lato client JavaScript, nessun cron necessario sul gestionale.
2026-03-11 07:30 · claude
Patch test-db.php: aggiunto logging nuovi prodotti in database/sync_new_products.json (rolling 7 giorni) per alimentare api_new_products.php. Install_patch.php creato come installer automatico one-click.
2026-03-11 07:15 · claude
Cron notturno configurato su db-wf (0 3 * * * test-db.php --cron). Fix ref affiliato: str_replace ref=[[pubid]] → ref=0f089a3bcf38 applicato a 1011 URL esistenti e integrato nel sync per futuri run.
2026-03-11 07:00 · claude
Analisi completa gestionale-wf: mappato flusso WorldfiliaClient.php → ajax_wizard.php → core_build_site(). Confermato che api_product.php e api_export_ads.php sono compatibili al 100% con il nuovo DB auto-generato. Il campo url_info viene usato per l'iframe (prima URL della lista).
2026-03-11 06:50 · claude
Auto-scrape completato: 1050 prodotti scrapati con 0 errori in ~10 minuti. Fix moduli PHP CLI mancanti (php8.2-curl, php8.2-xml, php8.2-mbstring) e fix funzione rel2abs wrappata in if(!function_exists()) non caricata al compile time.
2026-03-11 06:42 · claude
test-db.php v2 operativo: dashboard browser con Sync Campagne + Scrape All Pending + scrape singolo + modal dettagli + ricerca. Modalità cron (php test-db.php --cron) per sync+scrape completo in background. Primo sync: 1078 campagne attive, 463 nuove, 615 aggiornate.
2026-03-11 06:31 · claude
test-db.php v1 creato su db-wf.mclmedia.eu: API Explorer che scarica campagne attive con Landing pages via GraphQL, mostra campi recuperabili, preview immagini, test scrape singola landing. Fix endpoint GraphQL: migrato da portal.worldfilia.net/api/graphql a portal-api.worldfilia.net/graphql.
2026-03-11 06:13 · claude
Scoperta struttura API Worldfilia tramite error-probing GraphQL (introspezione disabilitata): Campaign ha campo Landing (JSON array con id, name, url, preview_url, status, type, created, modified). UserLink ha Landing, landing_id, cloaking_url. Endpoint corretto: portal-api.worldfilia.net/graphql.
2026-03-11 05:45 · claude
Analisi completa DB prodotti Worldfilia (db-wf.mclmedia.eu): mappato flusso manuale CSV → sync API → scrape → api_product.php. Identificato collo di bottiglia nel passo CSV manuale per le landing URL. Confermato che readCampaigns con campo Landing può eliminare completamente il flusso manuale.
2026-03-11 05:30 · claude
Fix critico: aggiunta migration automatica per colonne content_status (TEXT DEFAULT 'current') e content_reviewed_at (DATETIME) su tabelle products e blog_posts in db_config.php. Le pagine Prodotti e Blog SEO crashavano con 'no such column: content_status' su tutti i siti esistenti.
2026-03-10 13:00 · claude
Analisi completa flusso wizard setup sito: mappato il percorso search_remote → selectProd → save_pending_config → build_from_pending. Identificato che il campo Nicchia (turbo_niche) dipende da category_name del DB remoto db-wf.mclmedia.eu, spesso vuoto. Definito workflow assistito con Claude per fornire ad Alessandro i 3 campi manuali (Nome Pubblico Brand, Descrizione Title, Nicchia) per ogni prodotto Worldfilia.
2026-03-10 12:30 · claude
Fix connessione Plesk API: aggiornata password in Master Settings dopo cambio password root server WF + sblocco IP 54.36.100.203 bannato da Fail2Ban dopo tentativi 401. Rimosso blocco duplicato [DEFAULT] in jail.local che causava crash Fail2Ban.
2026-03-10 11:10 · claude
ℹ️ Info
Server VPS OVH 54.36.100.203 (Plesk 8443)
URL https://gestionale-wf.mclmedia.eu
Tipo PHP custom + SQLite multi-tenant
Siti gestiti 81 siti WF (funnel, multiblog, monotematico v2)
Deploy target 141.95.0.71 via rsync SSH
Revenue source Worldfilia (Hb Agency)
DB Prodotti Remoto db-wf.mclmedia.eu (api_export_ads.php + api_product.php con tracker_urls + api_new_products.php)
DB Prodotti Sync test-db.php — Auto-sync API Worldfilia + scrape landing (cron 3:00)
DB Prodotti UI db-wf.mclmedia.eu/database.php — Vista read-only con filtri, 4 colonne landing (modulo+landing con tracker URL), editing modal (nome pulito, sito web, note, upload immagini)
API Worldfilia Endpoint https://portal-api.worldfilia.net/graphql (GraphQL) + /performance + /read-transactions (REST)
Tracker URL Base https://offerte2019.info/affiliateproject/tracker/click/?pub_id=0f089a3bcf38&land_id={ID}
Tracker Config config.php — WF_TRACKER_BASE + WF_PUB_ID (centralizzate)
Campagne attive 1078 (auto-sync)
Landing scrapate 1050 (auto-scrape)
Service Account GSC discover-mcl@test-c4a5c.iam.gserviceaccount.com
GSC Auto-detect GSCManager.php — rileva automaticamente sc-domain: vs https:// con cache statica listSites()
Cron auto-deploy Ogni ora al :35 (Plesk, utente sistema)
Cron analytics Ogni giorno alle 06:00
Cron network Ogni giorno alle 22:38
Cron worldfilia DA AGGIUNGERE — 0 3 * * *
Cron job_worker DA AGGIUNGERE — */5 * * * *
Path server /var/www/vhosts/mclmedia.eu/gestionale-wf.mclmedia.eu/
Prossimo step Alessandro deve aggiungere discover-mcl@ come proprietario GSC sui 74 siti affiliate mancanti (task visibili nella sua dashboard)
🛠 Tech Stack
PHP 8.2 SQLite Bootstrap 5 OpenAI GPT-4o Google Search Console API Google Indexing API Worldfilia API (GraphQL + REST) Amazon PA API Immich Plesk API Rsync/SSH Chart.js Composer google/apiclient
📘 README
# Gestionale WF — MCL Media Network Manager **gestionale-wf.mclmedia.eu** — Pannello di controllo centralizzato per la gestione, generazione e deploy di siti web affiliate del network MCL Media. --- ## Panoramica Il Gestionale WF è una piattaforma PHP custom che orchestra l'intero ciclo di vita dei siti affiliate del network: dalla creazione del sito, alla generazione dei contenuti via AI, fino al deploy automatico su server remoti e al monitoraggio SEO tramite Google Search Console. L'applicazione gestisce un network multi-sito basato su database SQLite (un master DB globale + un DB dedicato per ogni sito), con supporto per diverse tipologie di sito (funnel monoprodotto, multiblog, monotematico v2) e integrazione con le principali piattaforme di affiliazione e analytics. --- ## Stack Tecnologico - **Backend:** PHP 8.x (procedurale + classi OOP) - **Database:** SQLite — un `master.db` globale + un DB per sito in `database/sites/` - **Frontend:** HTML/CSS/JS con Bootstrap 5, Font Awesome, Chart.js - **Deploy:** Rsync via SSH (primario) oppure HTTP via `mcl_receiver.php` (legacy) - **AI:** OpenAI API (GPT-4o / GPT-4o-mini) per generazione contenuti - **SEO:** Google Search Console API + Google Indexing API - **Immagini:** Immich (self-hosted) per ricerca e gestione immagini - **Affiliazione:** Worldfilia (GraphQL + REST API), Amazon Product Advertising API - **Server Management:** Integrazione Plesk API per gestione domini VPS - **Dipendenze PHP:** `google/apiclient` (via Composer) --- ## Architettura ``` gestionale-wf.mclmedia.eu/ │ ├── index.php # Router principale con whitelist pagine ├── login.php # Autenticazione ├── .env # Credenziali (non in repo) │ ├── config/ │ ├── db_config.php # Connessione Master DB + sito attivo (multi-tenant) │ ├── config_deploy.php # Configurazione SSH/Rsync per deploy │ ├── config_site.php # Impostazioni sito target │ ├── config_api.php # Chiavi API (Amazon, OpenAI) │ └── service-account.json # Credenziali Google Service Account (GSC) │ ├── core/ # Classi di business logic │ ├── Auth.php # Autenticazione, sessioni, CSRF, brute force protection │ ├── ContentGenerator.php # Wrapper OpenAI API (testo + JSON) │ ├── DeployEngine.php # Pipeline di deploy unificata (step interattivo + batch) │ ├── Deployer.php # Transport layer (rsync o HTTP) con deploy incrementale │ ├── GSCManager.php # Google Search Console + Indexing API │ ├── ImmichManager.php # Ricerca e download immagini da Immich │ ├── ImageManager.php # Gestione immagini locali │ ├── JobQueue.php # Coda asincrona per task AI in background │ ├── LogoGenerator.php # Generazione loghi │ ├── PleskClient.php # Client API Plesk per gestione domini VPS │ ├── SchedulerEngine.php # Algoritmo di schedulazione pubblicazioni (ratio 3:1 prodotti/blog) │ ├── SitemapGenerator.php # Generazione sitemap XML con supporto immagini │ ├── Utils.php # Helper (settings get/save) │ ├── WorldfiliaAPI.php # Client API Worldfilia (stats, transazioni, campagne) │ └── WorldfiliaClient.php # Client Worldfilia semplificato │ ├── pages/ # Pagine del pannello di controllo │ ├── dashboard.php # Dashboard sito con KPI, grafici GSC, content lifecycle │ ├── sites_manager.php # Control Room: lista siti network con sparkline e health │ ├── network_dashboard.php # Dashboard direzionale aggregata (tutti i siti) │ ├── network_gsc.php # GSC network-wide │ ├── deploy_manager.php # Interfaccia deploy interattivo con pre-flight checklist │ ├── wizard_setup.php # Wizard setup sito (homepage, FAQ, schema) │ ├── ai_strategist.php # AI Strategist: genera proposte blog da keyword GSC │ ├── blog_list.php # Lista articoli blog │ ├── blog_editor.php # Editor articoli blog │ ├── editor_article.php # Editor articoli prodotto │ ├── products_list.php # Lista prodotti │ ├── products_search.php # Ricerca prodotti (Amazon API) │ ├── categories.php # Gestione categorie/silos │ ├── search_console.php # Dashboard GSC per sito (keyword, pagine, inspect) │ ├── scheduler.php # Programmazione pubblicazioni │ ├── scheduled_summary.php # Riepilogo contenuti schedulati │ ├── revenue_wf.php # Dashboard revenue Worldfilia (globale) │ ├── settings_prompts.php # Configurazione prompt AI │ ├── master_settings.php # Impostazioni globali (API keys, credenziali) │ ├── system_vps.php # Gestione domini VPS Plesk + batch processing │ ├── job_queue.php # Monitor coda job AI │ ├── analysis.php # Analisi dati │ ├── debug_niche.php # Debug nicchia sito │ ├── test_prompt.php # Test prompt AI │ ├── test_sc.php # Test Search Console │ ├── product_dashboard.php # Controller monoprodotto │ └── guida_howto.php # Guida operativa e How To │ ├── templates_render/ # Template HTML per i siti target (generati e deployati) │ ├── admin_layout.php # Layout admin del gestionale │ ├── page_home.php # Template homepage sito target │ ├── page_product.php # Template pagina prodotto │ ├── page_product_multi.php # Template prodotto (variante multi) │ ├── page_blog_single.php # Template articolo blog │ ├── page_blog_index.php # Template indice blog │ ├── page_category.php # Template pagina categoria │ ├── page_checkout.php # Template pagina acquisto │ ├── page_search.php # Template pagina ricerca │ ├── page_faq.php # Template pagina FAQ │ ├── page_reviews.php # Template pagina recensioni │ ├── page_multiproducts.php # Template multi-prodotto │ ├── page_multiblog_home.php# Template home multiblog │ ├── page_static.php # Template pagine statiche │ ├── feed_rss.php # Template feed RSS │ ├── parts/ # Componenti riutilizzabili (header, footer) │ └── v2/ # Template "Monotematico v2" (home, blog, recensione, etc.) │ ├── multiblog/ │ └── ajax_creation.php # Backend creazione siti multiblog con AI auto-discovery │ ├── ajax_api.php # Endpoint AJAX unificato (content lifecycle, analytics, job queue) ├── ajax_deploy.php # Endpoint AJAX per deploy interattivo step-by-step ├── ajax_wizard.php # Backend wizard: setup DB, AI content, immagini, schema ├── ajax_gsc_network.php # API AJAX per dati GSC network-wide ├── endpoint.php # Monitoring Agent v4.0 (espone dati per pannelli esterni) ├── mcl_receiver.php # Receiver HTTP per deploy legacy (va sui siti target) ├── indexing_proxy.php # Proxy per richieste indicizzazione │ ├── cron_analytics.php # Cron: fetch dati GSC + snapshot giornaliero per trend ├── cron_network.php # Cron: indicizzazione GSC stateful (gestione quota 429) ├── cron_auto_deploy.php # Cron: deploy automatico batch di tutti i siti ├── cron_worldfilia.php # Cron: sync transazioni e statistiche Worldfilia ├── cron_job_worker.php # Cron: processamento coda job AI in background │ ├── deploy_manifests/ # Hash manifest per deploy incrementali (JSON per sito) ├── deploy_staging/ # Directory staging locale per rsync │ ├── apply_security_patch.php # Script una-tantum per applicare patch di sicurezza ├── migrate_v4.php # Script migrazione database v4 ├── setup.php # Setup iniziale ├── patch.php # Patch DB │ ├── assets/ │ ├── admin.css # Stylesheet design system gestionale │ ├── logo.png # Logo MCL Media │ └── favicon.png # Favicon │ ├── composer.json # Dipendenza: google/apiclient ├── composer.lock └── composer.phar ``` --- ## Funzionalità Principali ### 1. Gestione Multi-Sito Il sistema gestisce un network di siti con architettura multi-tenant. Ogni sito ha il proprio database SQLite e può essere di tipo **funnel** (monoprodotto), **multiblog** o **monotematico v2**. Il `master.db` contiene il registro dei siti, le impostazioni globali, la coda job e le transazioni Worldfilia. ### 2. Generazione Contenuti AI Tramite l'integrazione con OpenAI (GPT-4o), il sistema genera automaticamente contenuti per homepage, pagine prodotto (hero, pros/cons, FAQ, schema JSON-LD), articoli blog contestualizzati ai prodotti, e meta tag SEO. L'**AI Strategist** analizza le keyword GSC reali per proporre nuovi articoli con anti-cannibalizzazione. ### 3. Pipeline di Deploy Il `DeployEngine` orchestra un deploy in step sequenziali — schedulazione automatica, init, immagini, home, blog, categorie, prodotti, pagine statiche, sitemap, e submit GSC — sia in modalità interattiva (via AJAX dal browser) che batch (via cron). Il `Deployer` supporta due transport: **rsync via SSH** (primario, con deploy incrementale basato su hash manifest) e **HTTP** (legacy, via `mcl_receiver.php`). ### 4. Monitoraggio SEO (Google Search Console) Integrazione completa con GSC: fetch analytics per pagina (click, impression, CTR, posizione), verifica stato indicizzazione, richiesta indicizzazione via Indexing API, e tracking keyword con trend storico. Il `cron_network.php` gestisce le quote API con un sistema stateful che salva il progresso e riprende al run successivo. ### 5. Revenue Tracking (Worldfilia) Dashboard dedicata per monitorare le revenue da affiliazione Worldfilia: statistiche live via API (GraphQL + REST), sync automatico transazioni, aggregazione per sito e per giorno, e grafici trend. Mapping automatico transazioni → siti tramite campaign_id e referer URL. ### 6. Coda Job Asincrona Sistema di job queue con priorità per operazioni AI intensive (generazione blog, riscrittura contenuti, generazioni bulk). I job vengono accodati nel master DB ed elaborati dal `cron_job_worker.php` con gestione stati (pending → running → completed/failed). ### 7. Gestione VPS e Domini Integrazione con Plesk API per la gestione dei domini sulla VPS target. Batch processing per il setup automatico di nuovi siti (creazione DB, configurazione, deploy iniziale). --- ## Sicurezza - **Autenticazione:** Password hash (`password_verify`), sessioni con hardening (httponly, secure, samesite=strict), timeout 2h - **Protezione brute force:** Max 5 tentativi login, lockout 15 minuti, stato persistito in JSON - **CSRF:** Token generato per sessione, verificato su tutte le POST - **Credenziali:** File `.env` con caricamento via `mcl_load_env()`, mai hardcoded nel codice - **Deploy receiver:** Whitelist estensioni file, blocco estensioni eseguibili (PHP, SH, etc.), validazione path anti-traversal - **Cron:** Protezione via chiave segreta (`CRON_ACCESS_KEY`) o accesso CLI --- ## Cron Jobs | Cron | Frequenza consigliata | Descrizione | |------|-----------------------|-------------| | `cron_analytics.php` | Ogni 24h | Fetch dati GSC per tutti i siti + snapshot storico | | `cron_network.php` | Ogni 6-12h | Indicizzazione GSC con gestione quota (stateful) | | `cron_auto_deploy.php` | Ogni 24h | Deploy automatico batch di tutti i siti attivi | | `cron_worldfilia.php` | Ogni 6h | Sync transazioni e statistiche Worldfilia | | `cron_job_worker.php` | Ogni 2-5 min | Processamento coda job AI (max 5 job per run) | Tutti i cron accettano il parametro `?key=CRON_ACCESS_KEY` oppure l'esecuzione via CLI. --- ## Tipologie di Sito | Tipo | Descrizione | Template | |------|-------------|----------| | **funnel** | Sito monoprodotto con homepage, pagina prodotto, blog e checkout | `templates_render/page_*.php` | | **multiblog** | Blog multi-categoria con più prodotti e silos tematici | `templates_render/page_multiblog_home.php` + categorie | | **monotematico_v2** | Template v2 premium con pagine dedicate (chi siamo, esperienza, offerta, etc.) | `templates_render/v2/page_*.php` | --- ## API ed Endpoint | Endpoint | Metodo | Descrizione | |----------|--------|-------------| | `ajax_api.php` | POST/GET | AJAX unificato: content lifecycle, analytics history, job queue | | `ajax_deploy.php` | POST | Deploy interattivo step-by-step | | `ajax_wizard.php` | POST | Wizard: creazione DB, AI content, immagini, schema | | `ajax_gsc_network.php` | POST/GET | Dati GSC aggregati per il network | | `endpoint.php` | GET | Monitoring Agent (dati strutturati per pannelli esterni) | | `api_content_review.php` | POST | API revisione contenuti | | `api_discover_feed.php` | GET | Feed Discover per distribuzione contenuti | --- ## Requisiti - PHP 8.0+ con estensioni: PDO, SQLite3, cURL, JSON, mbstring - Composer (per `google/apiclient`) - Accesso SSH al server target (per deploy rsync) - Google Cloud Service Account con API Search Console e Indexing abilitate - Chiave API OpenAI - (Opzionale) Istanza Immich per gestione immagini - (Opzionale) Account Worldfilia per tracking revenue - (Opzionale) Credenziali Amazon Product Advertising API --- ## Setup 1. Posizionare i file nella document root del server Plesk 2. Copiare `.env.example` in `.env` e configurare tutte le credenziali 3. Eseguire `composer install` per installare le dipendenze Google 4. Creare la directory `database/sites/` con permessi di scrittura 5. Accedere al pannello e configurare le impostazioni globali in **Master Settings** 6. Creare il primo sito tramite **Sites Manager** o **VPS Plesk** 7. Configurare i cron job nel pannello Plesk --- ## Note - Il progetto è un gestionale interno, non destinato a distribuzione pubblica. - I template renderizzati vengono generati come file HTML statici e deployati sui siti target — i siti finali non eseguono PHP. - Il deploy incrementale confronta gli hash dei file per evitare upload ridondanti; i manifest sono salvati in `deploy_manifests/`. - Il file `inspector+.php` è uno strumento di debug che consente di visualizzare il codice sorgente e scaricare uno ZIP del progetto — **eliminare dopo l'uso** in produzione.
⚠️ Zona Pericolosa clicca per espandere