{"id":80224,"date":"2020-05-04T13:42:20","date_gmt":"2020-05-04T11:42:20","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/storacle-deczentralizovannoe-hranilishhe-fajlov"},"modified":"2020-05-04T13:42:20","modified_gmt":"2020-05-04T11:42:20","slug":"storacle-deczentralizovannoe-hranilishhe-fajlov","status":"publish","type":"post","link":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/storacle-deczentralizovannoe-hranilishhe-fajlov","title":{"rendered":"Storacle - un archivio file decentralizzato","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Storacle - un archivio file decentralizzato\" src=\"\/wp-content\/uploads\/2020\/05\/333f7b998e00ce32367d97f7ccd05bef.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Prima di iniziare, devo lasciare <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/495058\/\">un link all'articolo precedente<\/a><\/noindex>, cos\u00ec sar\u00e0 chiaro di cosa stiamo parlando.<\/p>\n<p><\/p>\n<p>In questo articolo vorrei esaminare il livello che si occupa della memorizzazione dei file e come questo possa essere utilizzato da chiunque. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/ortexx\/storacle\/\">Storacle \u00e8 una libreria autonoma<\/a><\/noindex>, senza alcun legame diretto con la musica. Pu\u00f2 organizzare la memorizzazione di qualsiasi file.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Nell'articolo precedente ho un po' \"parlato male\" di <strong>ipfs<\/strong>, ma ci\u00f2 \u00e8 avvenuto proprio nel contesto del compito che stavo affrontando. In generale, considero questo progetto interessante. Mi piace semplicemente di pi\u00f9 la possibilit\u00e0 di creare diverse reti per diversi compiti. Questo permette di organizzare meglio la struttura e ridurre il carico sui singoli nodi e sulla rete nel suo insieme. \u00c8 possibile addirittura, nell'ambito di un certo progetto, suddividere la rete in parti secondo determinati criteri, riducendo il carico complessivo.<\/p>\n<p><\/p>\n<p>Quindi, storacle utilizza un meccanismo <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/ortexx\/spreadable\">spreadable<\/a><\/noindex> per organizzare la rete. Le principali caratteristiche sono:<\/p>\n<p><\/p>\n<ul>\n<li>I file possono essere aggiunti allo storage attraverso qualsiasi nodo.<\/li>\n<li>I file vengono salvati interamente, non a blocchi.<\/li>\n<li>Ogni file ha un proprio hash unico basato sul contenuto per ulteriori operazioni.<\/li>\n<li>I file possono essere duplicati per maggiore affidabilit\u00e0<\/li>\n<li>Il numero di file su un nodo \u00e8 limitato solo dal file system (c'\u00e8 un'eccezione, di cui parler\u00f2 pi\u00f9 avanti)<\/li>\n<li>Il numero di file nella rete \u00e8 limitato dalle capacit\u00e0 di spreadable in base al numero di nodi consentiti nella rete, che nella seconda versione potranno permettere di lavorare con un numero infinito di nodi (di questo parler\u00f2 in un altro articolo)<\/li>\n<\/ul>\n<p><\/p>\n<p>Un semplice esempio di come funziona il tutto dal programma:<\/p>\n<p><\/p>\n<p>Server:<\/p>\n<p><\/p>\n<pre><code class=\"javascript\">const Node = require('storacle').Node;\n\n(async () =&gt; {\n\u00a0\u00a0try {\n\u00a0\u00a0\u00a0\u00a0const node = new Node({\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0port: 4000,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0hostname: 'localhost'\n\u00a0\u00a0\u00a0\u00a0});\n\u00a0\u00a0\u00a0\u00a0await node.init();\n\u00a0\u00a0}\n\u00a0\u00a0catch(err) {\n\u00a0\u00a0\u00a0\u00a0console.error(err.stack);\n\u00a0\u00a0\u00a0\u00a0process.exit(1);\n\u00a0\u00a0}\n})();<\/code><\/pre>\n<p><\/p>\n<p>Cliente:<\/p>\n<p><\/p>\n<pre><code class=\"javascript\">const Client = require('storacle').Client;\n\n(async () =&gt; {\n\u00a0\u00a0try {\n\u00a0\u00a0\u00a0\u00a0const client = new Client({\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0address: 'localhost:4000'\n\u00a0\u00a0\u00a0\u00a0});\n\u00a0\u00a0\u00a0\u00a0await client.init();\n\u00a0\u00a0\u00a0\u00a0const hash = await client.storeFile('.\/my-file');\n\u00a0\u00a0\u00a0\u00a0const link = await client.getFileLink(hash);\n\u00a0\u00a0\u00a0\u00a0await client.removeFile(hash);\n\u00a0\u00a0}\n\u00a0\u00a0catch(err) {\n\u00a0\u00a0\u00a0\u00a0console.error(err.stack);\n\u00a0\u00a0\u00a0\u00a0process.exit(1);\n\u00a0\u00a0}\n})();<\/code><\/pre>\n<p><\/p>\n<p><strong>Uno sguardo dall'interno<\/strong><\/p>\n<p><\/p>\n<p>Sotto il cofano non c'\u00e8 nulla di soprannaturale. Le informazioni sul numero di file, la loro dimensione totale e altri dettagli sono memorizzate in un database in-memory e vengono aggiornate quando si eliminano o aggiungono file, quindi non c'\u00e8 bisogno di accedere frequentemente al file system. L'eccezione \u00e8 l'attivazione del garbage collector, quando \u00e8 necessaria la circolazione dei file al raggiungimento di determinate dimensioni di archiviazione, piuttosto che un divieto di aggiunta di nuovi file. In questo caso, bisogna esaminare l'archivio, e lavorare con un gran numero di file (&gt; un milione, diciamo) pu\u00f2 comportare carichi significativi. \u00c8 meglio mantenere meno file e avviare pi\u00f9 nodi. Se il \"pulitore\" \u00e8 disattivato, non c'\u00e8 questo problema.<\/p>\n<p><\/p>\n<p>Lo storage dei file \u00e8 costituito da 256 cartelle e 2 livelli di annidamento. I file sono memorizzati nelle cartelle di secondo livello. Pertanto, con 1 milione di file, in ogni cartella ci saranno circa 62500 file (1000000 \/ sqrt(256)).<\/p>\n<p><\/p>\n<p>I nomi delle cartelle sono formati dall'hash del file, in modo da poter accedere rapidamente conoscendo l'hash.<\/p>\n<p><\/p>\n<p>Questa struttura \u00e8 stata scelta in base a un gran numero di requisiti diversi per lo storage: supporto per file system deboli, dove non \u00e8 consigliabile avere molti file in una cartella, veloce attraversamento di tutte le cartelle se necessario, ecc. Una sorta di compromesso.<\/p>\n<p><\/p>\n<p><strong>Caching<\/strong><\/p>\n<p><\/p>\n<p>Durante l'aggiunta di file, cos\u00ec come durante il loro recupero, le referenze ai file vengono scritte nella cache.<br \/>\nGrazie a ci\u00f2, non \u00e8 spesso necessario attraversare tutta la rete alla ricerca di un file. Questo accelera il recupero dei link e riduce il carico sulla rete. Inoltre, il caching avviene tramite intestazioni http.<\/p>\n<p><\/p>\n<p><strong>Isomorfismo<\/strong><\/p>\n<p><\/p>\n<p>Il client \u00e8 scritto in javascript ed \u00e8 isomorfo, pu\u00f2 essere utilizzato direttamente dal browser.\u00a0<br \/>\n\u00c8 possibile caricare un file <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/ortexx\/storacle\/blob\/master\/dist\/storacle.client.js\">https:\/\/github.com\/ortexx\/storacle\/blob\/master\/dist\/storacle.client.js<\/a><\/noindex> come script e ottenere accesso a <strong>window.ClientStoracle <\/strong>oppure importarlo tramite il sistema di build, ecc.<\/p>\n<p><\/p>\n<p><strong>Link differiti<\/strong><\/p>\n<p><\/p>\n<p>Una caratteristica interessante \u00e8 anche il \"link posticipato\". Questo \u00e8 un link a un file che pu\u00f2 essere ottenuto in modo sincrono, qui e ora, mentre il file verr\u00e0 recuperato non appena sar\u00e0 trovato nell'archivio. \u00c8 molto comodo quando, ad esempio, \u00e8 necessario mostrare alcune immagini sul sito. Basta inserire il link posticipato in src e il gioco \u00e8 fatto. Se ne possono inventare tanti di casi.<\/p>\n<p><\/p>\n<p><strong>Api del client<\/strong><\/p>\n<p><\/p>\n<ul>\n<li>async <strong>Client.prototype.storeFile()<\/strong> \u2014 salvataggio del file<\/li>\n<li>async <strong>Client.prototype.getFileLink()<\/strong> \u2014 ottenimento di un link diretto al file<\/li>\n<li>async <strong>Client.prototype.getFileLinks()<\/strong> \u2014 ottenere un elenco di collegamenti diretti al file da tutti i nodi in cui si trova<\/li>\n<li>async <strong>Client.prototype.getFileToBuffer()<\/strong> \u2014 ottenere il file nel buffer<\/li>\n<li>async <strong>Client.prototype.getFileToPath()<\/strong> \u2014 ottenere il file nel file system<\/li>\n<li>async <strong>Client.prototype.getFileToBlob()<\/strong> \u2014 ottenere il file in blob (per la versione browser)<\/li>\n<li>async <strong>Client.prototype.removeFile()<\/strong> \u2014 rimuovere il file<\/li>\n<li><strong>Client.prototype.createRequestedFileLink()<\/strong> \u2014 creare un collegamento posticipato<\/li>\n<\/ul>\n<p><\/p>\n<p><strong>Esportazione di file su un altro server<\/strong><\/p>\n<p><\/p>\n<p>Per trasferire file su un altro nodo \u00e8 possibile:<\/p>\n<p><\/p>\n<ul>\n<li>Basta copiare l'intera cartella di archiviazione insieme alle impostazioni. (in futuro questo potrebbe non funzionare)<\/li>\n<li>Copiare solo la cartella con i file. Ma in questo caso, sar\u00e0 necessario eseguire una volta la funzione <strong>node.normalizeFilesInfo()<\/strong>, per ricalcolare tutti i dati e inserirli nel database.<\/li>\n<li>Utilizzare la funzione <strong>node.exportFiles()<\/strong>, che inizier\u00e0 a copiare i file.<\/li>\n<\/ul>\n<p><\/p>\n<p><strong>Impostazioni principali del nodo<\/strong><br \/>\nAvviando un nodo di archiviazione, \u00e8 possibile specificare tutte le impostazioni necessarie.<br \/>\nDescriver\u00f2 le principali, il resto pu\u00f2 essere trovato su GitHub.<\/p>\n<p><\/p>\n<ul>\n<li><strong>storage.dataSize<\/strong> \u2014 dimensione della cartella con i file<\/li>\n<li><strong>storage.tempSize<\/strong> \u2014 dimensione della cartella temporanea<\/li>\n<li><strong>storage.autoCleanSize<\/strong> \u2014 dimensione minima dell'archiviazione da mantenere. Se si specifica questa impostazione, non appena lo spazio inizia a scarseggiare, i file meno utilizzati verranno eliminati.<\/li>\n<li><strong>file.maxSize<\/strong> \u2014 dimensione massima del file<\/li>\n<li><strong>file.minSize<\/strong> \u2014 dimensione minima del file<\/li>\n<li><strong>file.preferredDuplicates<\/strong> \u2014 numero preferito di duplicati del file nella rete<\/li>\n<li><strong>file.mimeWhitelist<\/strong> \u2014 tipi di file consentiti<\/li>\n<li><strong>file.mimeBlacklist<\/strong> \u2014 tipi di file non consentiti<\/li>\n<li><strong>file.extWhitelist<\/strong> \u2014 estensioni di file consentite<\/li>\n<li><strong>file.extBlacklist<\/strong> \u2014 estensioni di file non consentite<\/li>\n<li><strong>file.linkCache<\/strong> \u2014 varie impostazioni di caching dei collegamenti<\/li>\n<\/ul>\n<p><\/p>\n<p>Quasi tutte le impostazioni relative alle dimensioni possono essere impostate sia in unit\u00e0 assolute che relative.<\/p>\n<p><\/p>\n<p><strong>Operazioni tramite linea di comando<\/strong><br \/>\nLa libreria pu\u00f2 essere utilizzata tramite linea di comando. Per farlo, \u00e8 necessario installarla globalmente: <strong>npm i -g storacle<\/strong>. Dopo di che, \u00e8 possibile eseguire le azioni necessarie dalla directory del progetto, dove si trova il nodo. Ad esempio, <strong>storacle -a storeFile -f .\/file.txt -c .\/config.js<\/strong>, per aggiungere un file. Tutte le azioni possono essere trovate in <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/ortexx\/storacle\/blob\/master\/bin\/actions.js\">https:\/\/github.com\/ortexx\/storacle\/blob\/master\/bin\/actions.js<\/a><\/noindex><\/p>\n<p><\/p>\n<p><strong>Perch\u00e9 potrebbe esserti utile<\/strong><\/p>\n<p><\/p>\n<ul>\n<li>Se desideri creare un qualche tipo di progetto decentralizzato in cui si prevede di archiviare e gestire file in modo pratico. Ad esempio, il progetto musicale descritto nel link all'inizio dell'articolo utilizza <strong>storacle<\/strong>.<\/li>\n<li>Se stai lavorando ad altri progetti in cui \u00e8 necessario memorizzare file in modo distribuito. Puoi facilmente costruire la tua rete privata, configurare i nodi in modo flessibile e aggiungere nuovi nodi quando necessario.<\/li>\n<li>Se hai semplicemente bisogno di un luogo dove memorizzare i file del tuo sito e non vuoi scrivere tutto da solo. Forse questa libreria \u00e8 pi\u00f9 adatta alle tue esigenze nel tuo caso.<\/li>\n<li>Se hai un progetto in cui lavori con file, ma vuoi eseguire tutte le operazioni dal browser. Puoi evitare di scrivere codice server.<\/li>\n<\/ul>\n<p><\/p>\n<p>I miei contatti:<\/p>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/t.me\/ortex\">@ortex<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"mailto:mywebstreet@gmail.com\">mywebstreet@gmail.com<\/a><\/noindex><\/li>\n<\/ul>\n<p>Fonte: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/499954\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043d\u0430\u0447\u043d\u0443, \u0434\u043e\u043b\u0436\u0435\u043d \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0443\u044e \u0441\u0442\u0430\u0442\u044c\u044e, \u0447\u0442\u043e\u0431\u044b \u0431\u044b\u043b\u043e \u043f\u043e\u043d\u044f\u0442\u043d\u043e \u043e \u0447\u0435\u043c \u0438\u043c\u0435\u043d\u043d\u043e \u0440\u0435\u0447\u044c. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c \u0441\u043b\u043e\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u043e\u0432, \u0438 \u043a\u0430\u043a \u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043e \u043b\u044e\u0431\u044b\u043c \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u043e\u043c. Storacle \u2014 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430, \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u0441\u0432\u044f\u0437\u0438 \u0441 \u043c\u0443\u0437\u044b\u043a\u043e\u0439 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u043d\u0435\u0442. \u041c\u043e\u0436\u043d\u043e \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u043b\u044e\u0431\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432. \u0412 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":80225,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-80224","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043d\u0430\u0447\u043d\u0443, \u0434\u043e\u043b\u0436\u0435\u043d \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/storacle-deczentralizovannoe-hranilishhe-fajlov\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"it_IT\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47Storacle \u2014 \u0434\u0435\u0446\u0435\u043d\u0442\u0440\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0444\u0430\u0439\u043b\u043e\u0432 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043d\u0430\u0447\u043d\u0443, \u0434\u043e\u043b\u0436\u0435\u043d \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/storacle-deczentralizovannoe-hranilishhe-fajlov\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-05-04T11:42:20+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-05-04T11:42:20+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Storacle \u2014 archiviazione decentralizzata di file | ProHoster","description":"Prima di iniziare, devo lasciare.","canonical_url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/storacle-deczentralizovannoe-hranilishhe-fajlov","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"it_IT","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47Storacle \u2014 \u0434\u0435\u0446\u0435\u043d\u0442\u0440\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0444\u0430\u0439\u043b\u043e\u0432 | ProHoster","og:description":"\u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043d\u0430\u0447\u043d\u0443, \u0434\u043e\u043b\u0436\u0435\u043d \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c.","og:url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/storacle-deczentralizovannoe-hranilishhe-fajlov","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-05-04T11:42:20+00:00","article:modified_time":"2020-05-04T11:42:20+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"80224","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 16:22:48","updated":"2022-09-27 20:25:26","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/80224","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/comments?post=80224"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/80224\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media\/80225"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=80224"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=80224"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=80224"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}