This website uses cookies

Read our Privacy policy and Terms of use for more information.

Quando il tool che usi cambia sotto i tuoi piedi, non hai un problema tecnico — hai un problema di architettura.

Sabato 23 maggio, ore 16. Pipeline podcast in costruzione da cinque ore. Il workflow su n8n (la piattaforma open source di automazione su cui costruisco i miei sistemi) è configurato. Il parser di Snipd risponde in 462 millisecondi. Il router free-text con GPT-4o-mini classifica i podcast in 4 secondi. Tutto va.

Apro le note di rilascio di n8n 2.55 per un'altra ragione. Leggo una riga: Execute Command node removed for security reasons. Era il nodo che faceva girare ffmpeg sul server per scaricare, comprimere e caricare i file audio. Senza quel nodo, niente pipeline. Quattro ore di rifacimento imminenti, e il sabato sera non è più mio.

Cos'era la pipeline che stavo costruendo

L'obiettivo: trasformare un podcast in nota di conoscenza navigabile. Salvo in Obsidian (l'app per note interconnesse che uso come archivio personale) un file Markdown con titolo, ospite, entità estratte, transcript completo, e link a un Drive che contiene l'audio compresso. Ricerca semantica gestita da NotebookLM (il prodotto Google che indicizza i tuoi documenti e ti permette di interrogarli in linguaggio naturale).

Lo stack: n8n come orchestratore (decide quando e cosa), iTunes Search API per recuperare i metadati partendo dal titolo, ffmpeg per comprimere l'audio in mp3, NotebookLM per estrarre entità e transcript, Google Drive come storage organizzato con il metodo PARA, Obsidian come output finale.

Due pipeline parallele dentro lo stesso workflow. Pipeline A: lettura di snipd.com (la piattaforma dove condivido i miei highlight di podcast) per recuperare gli URL dei file audio originali. Pipeline B: input testuale libero, classificato da un LLM (large language model, in questo caso GPT-4o-mini) e poi associato alla feed RSS corretta.

Un podcast in input. Circa 150 entità estratte in output. Più transcript completo. Più estrazione opzionale dei frame video. Tutto in note di un'ora, prodotte mentre lavoro.

Il rifacimento dell'architettura

La rimozione di Execute Command non era un bug, era una scelta deliberata di n8n. Permettere l'esecuzione di comandi shell arbitrari dentro un nodo no-code è un rischio di sicurezza per le installazioni self-hosted condivise, dove un workflow malevolo può eseguire comandi sul server intero. Logica corretta. Ma per me significava: tutto il pezzo "scarica, comprimi, carica" doveva uscire da n8n.

Tre opzioni considerate in quindici minuti:

  1. Riscrivere con un nodo Bash alternativo. Anche quello è in dismissione, stessa logica di sicurezza. Scartata.

  2. Chiamata HTTP verso un servizio esterno (una funzione AWS Lambda, un container su Cloud Run). Funziona, ma aggiunge latenza, costo mensile, e una dipendenza esterna in più da monitorare. Scartata.

  3. Worker locale dentro CoWork. Uno scheduled task (un processo che parte da solo a intervalli regolari) che gira sul mio computer, controlla una Google Sheet di lavori in attesa, fa l'elaborazione pesante e aggiorna lo stato. Vinta.

Decisione operativa codificata in trenta minuti: podcast-pipeline-worker, cron */15min. Ogni quindici minuti il worker legge la coda dalla Sheet, prende il primo lavoro con stato pending, esegue scarica + comprimi + carica, scrive lo stato done insieme al link Drive. n8n resta orchestratore di metadati e routing. CoWork fa le operazioni rumorose.

Quattro ore dopo: worker in produzione, due podcast caricati live, anti-duplicato via state Sheet confermato, nomi dei file ripuliti per filesystem cross-OS (il pattern [/\:*?"<>|] sostituito con trattino). La pipeline gira.

La lezione che vale per chiunque automatizza

La regola codificata dopo quel sabato: non costruire pipeline che dipendano al cento per cento dal singolo tool.

Tre principi di disaccoppiamento emersi dal pomeriggio:

Logica e orchestrazione separate. n8n decide quando (cron, webhook, evento) e cosa (quale flusso parte). Il worker locale decide come (esegui questo comando, salva qui, aggiorna lì). Il giorno che cambi orchestratore (perché un nodo sparisce, perché il vendor cambia pricing, perché ti serve scalare) la logica resta. Migri solo lo strato sottile del routing.

Worker locali per operazioni rumorose. Tutto ciò che è scaricamento di file grandi, conversione ffmpeg, scraping con intestazioni HTTP personalizzate, parsing di formati binari: fuori dall'orchestratore. Dentro un worker che gira dove vuoi (la tua macchina, un VPS, un container). Vantaggio doppio: zero limiti di runtime imposti dal vendor, zero dipendenze da nodi specifici che possono sparire alla prossima release.

Stato esterno in un Sheet o database. La coda (cosa è "in attesa", cosa è "in elaborazione", cosa è "fatto") vive in un Google Sheet, non dentro le variabili di n8n. Cambi orchestratore domani, la coda è ancora lì. Cambi worker, idem. Lo stato è la verità, gli strumenti che lo manipolano sono intercambiabili.

Costo del rifacimento del 23 maggio: quattro ore in un sabato pomeriggio. Costo del non aver pensato al disaccoppiamento prima: zero al momento del cambiamento, ma anni di ricostruzioni ogni volta che il singolo tool muta.

Il controllo preventivo che da oggi faccio sempre

Regola operativa nuova, codificata nella riflessione del 23 maggio: prima di impegnarsi a un'architettura, fare test rapidi sui 3-5 punti più probabili di rottura.

Dieci minuti di curl e script bash per verificare che i nodi e le API critici esistano ancora, che gli ambiti OAuth necessari siano disponibili, che il dominio target non sia bloccato dal proxy, che la versione del tool sia ancora supportata. Nel mio caso, uno script di apertura sabato mattina avrebbe letto le note di rilascio di n8n 2.55 e visto Execute Command deprecato. Avrei riprogettato in trenta minuti, non in quattro ore di rifacimento sotto pressione.

Pratica entro 24 ore

Identifica un'automazione che hai in produzione. Chiediti: se il nodo centrale (quello che fa il lavoro pesante) sparisse domani, in quanto tempo la ricostruiresti?

Se la risposta è "settimane", hai un problema di accoppiamento, non un problema di automazione. Inizia a disaccoppiare prima che il vendor decida per te.

Pipeline podcast in produzione dal 24 maggio. n8n workflow ID a0asTPcdW19BjWHC, scheduled task podcast-pipeline-worker cron /15min, Google Drive come storage. Replication Playbook v1 (checklist di configurazione, decisioni architetturali, lezioni apprese) disponibile su richiesta. Impianto completo in sette ore, riproducibile su qualsiasi stack PMI.*

Se conosci qualcuno a cui questo può servire, inoltralo.

Vuoi il prossimo articolo? Iscriviti alla newsletter — 3 volte a settimana, lun/mer/ven.

Keep reading