{"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\/da\/blog\/administrirovanie\/storacle-deczentralizovannoe-hranilishhe-fajlov","title":{"rendered":"Storacle \u2014 decentraliseret filopbevaring","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Storacle \u2014 decentraliseret filopbevaring\" src=\"\/wp-content\/uploads\/2020\/05\/333f7b998e00ce32367d97f7ccd05bef.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>F\u00f8r jeg begynder, vil jeg efterlade <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/495058\/\">et link til den tidligere artikel<\/a><\/noindex>, s\u00e5 det er klart, hvad det handler om.<\/p>\n<p><\/p>\n<p>I denne artikel vil jeg gerne gennemg\u00e5 det lag, der er ansvarligt for filopbevaring, og hvordan det kan bruges af enhver. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/ortexx\/storacle\/\">Storacle \u2014 et selvst\u00e6ndigt bibliotek<\/a><\/noindex>, der ikke har nogen direkte forbindelse til musik. Det er muligt at organisere opbevaring af enhver type filer.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>I den forrige artikel kom jeg lidt med kritik af <strong>ipfs<\/strong>, men det skete netop i konteksten af den opgave, jeg arbejdede med. Generelt set, synes jeg, at dette projekt er fantastisk. Jeg kan bare bedre lide muligheden for at skabe forskellige netv\u00e6rk til forskellige opgaver. Det giver en bedre organisering af strukturen og reducerer belastningen p\u00e5 de enkelte noder og netv\u00e6rket som helhed. Selv inden for et bestemt projekt, kan man om n\u00f8dvendigt opdele netv\u00e6rket i sektioner efter visse kriterier, hvilket reducerer den samlede belastning.<\/p>\n<p><\/p>\n<p>S\u00e5, storacle bruger mekanismen <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/ortexx\/spreadable\">spreadable<\/a><\/noindex> til at organisere netv\u00e6rket. Hovedtr\u00e6k:<\/p>\n<p><\/p>\n<ul>\n<li>Filer kan tilf\u00f8jes i opbevaringen via enhver node.<\/li>\n<li>Filer gemmes i sin helhed, ikke i blokke.<\/li>\n<li>Hver fil har sin egen unikke hash baseret p\u00e5 indholdet til videre behandling.<\/li>\n<li>Filer kan duplikeres for \u00f8get p\u00e5lidelighed.<\/li>\n<li>Antallet af filer p\u00e5 en node er kun begr\u00e6nset af filsystemet (der er en undtagelse, som jeg vil n\u00e6vne nedennede).<\/li>\n<li>Antallet af filer i netv\u00e6rket er begr\u00e6nset af mulighederne i spreadable i forhold til antallet af tilladte noder i netv\u00e6rket, som i den anden version vil kunne tillade arbejde med et uendeligt antal noder (mere om dette i en anden artikel).<\/li>\n<\/ul>\n<p><\/p>\n<p>Et simpelt eksempel p\u00e5, hvordan dette fungerer fra programmet:<\/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>Kunde:<\/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>Et indblik fra indersiden<\/strong><\/p>\n<p><\/p>\n<p>Under overfladen er der ikke noget overnaturligt. Informationen om antallet af filer, den samlede st\u00f8rrelse og andre aspekter gemmes i en in-memory database og opdateres, n\u00e5r filer tilf\u00f8jes eller fjernes, s\u00e5 der er ikke behov for ofte at tilg\u00e5 filsystemet. En undtagelse er aktiveringen af affaldsindsamleren, n\u00e5r der er behov for cirkulation af filer, n\u00e5r lagerpladsen n\u00e5r visse st\u00f8rrelser, i stedet for at forbyde tilf\u00f8jelse af nye. I s\u00e5danne tilf\u00e6lde er det n\u00f8dvendigt at gennemg\u00e5 lageret, og h\u00e5ndtering af et stort antal filer (&gt; en million, lad os sige) kan medf\u00f8re betydelig belastning. Det er bedre at opbevare f\u00e6rre filer og starte flere noder. Hvis \"rensningsprogrammet\" er slukket, er der ikke dette problem.<\/p>\n<p><\/p>\n<p>The file storage consists of 256 folders and 2 levels of nesting. Files are stored in the second-level folders. This means that with 1 million files, there will be about 62500 files in each such folder (1000000 \/ sqrt(256)).<\/p>\n<p><\/p>\n<p>The names of the folders are generated from the file hash to enable quick access, knowing the hash.<\/p>\n<p><\/p>\n<p>This structure was chosen based on a large number of different requirements for the storage: support for weak file systems, where it is undesirable to have too many files in one folder, quick traversal of all folders when necessary, etc. A kind of golden mean.<\/p>\n<p><\/p>\n<p><strong>Caching<\/strong><\/p>\n<p><\/p>\n<p>When files are added or retrieved, links to the files are written to the cache.<br \/>\nThanks to this, it is often unnecessary to traverse the entire network in search of a file. This speeds up link retrieval and reduces network load. Caching also occurs through HTTP headers.<\/p>\n<p><\/p>\n<p><strong>Isomorphism<\/strong><\/p>\n<p><\/p>\n<p>The client is written in JavaScript and isomorphic; it can be used directly from the browser.\u00a0<br \/>\nYou can upload a 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> as a script and access <strong>window.ClientStoracle <\/strong>or import it via the build system, etc.<\/p>\n<p><\/p>\n<p><strong>Deferred links<\/strong><\/p>\n<p><\/p>\n<p>En interessant funktion er ogs\u00e5 \"forsinket link\". Dette er et link til en fil, som kan opn\u00e5s synkront, her og nu, mens filen vil blive hentet, n\u00e5r den findes i lageret. Det er meget praktisk, n\u00e5r man for eksempel skal vise nogle billeder p\u00e5 et websted. Man placerer bare en forsinket link i src, og s\u00e5 er det hele klar. Der kan opst\u00e5 mange scenarier.<\/p>\n<p><\/p>\n<p><strong>Client API<\/strong><\/p>\n<p><\/p>\n<ul>\n<li>async <strong>Client.prototype.storeFile()<\/strong> \u2014 saving a file<\/li>\n<li>async <strong>Client.prototype.getFileLink()<\/strong> \u2014 obtaining a direct link to the file<\/li>\n<li>async <strong>Client.prototype.getFileLinks()<\/strong> \u2014 f\u00e5 listen over direkte links til filen fra alle noder, hvor den findes<\/li>\n<li>async <strong>Client.prototype.getFileToBuffer()<\/strong> \u2014 f\u00e5 filen til bufferen<\/li>\n<li>async <strong>Client.prototype.getFileToPath()<\/strong> \u2014 f\u00e5 filen til filsystemet<\/li>\n<li>async <strong>Client.prototype.getFileToBlob()<\/strong> \u2014 f\u00e5 filen til blob (til browserversionen)<\/li>\n<li>async <strong>Client.prototype.removeFile()<\/strong> \u2014 slette filen<\/li>\n<li><strong>Client.prototype.createRequestedFileLink()<\/strong> \u2014 oprette en forsinket link<\/li>\n<\/ul>\n<p><\/p>\n<p><strong>Eksport af filer til en anden server<\/strong><\/p>\n<p><\/p>\n<p>For at flytte filer til en anden node kan man:<\/p>\n<p><\/p>\n<ul>\n<li>Bare kopiere hele lagermappen sammen med indstillingerne. (i fremtiden kan dette muligvis ikke fungere)<\/li>\n<li>Kun kopiere mappen med filer. Men i s\u00e5 fald skal man \u00e9n gang k\u00f8re funktionen <strong>node.normalizeFilesInfo()<\/strong>, for at genberegne alle data og indtaste dem i databasen.<\/li>\n<li>Brug funktionen <strong>node.exportFiles()<\/strong>, som starter kopiering af filer.<\/li>\n<\/ul>\n<p><\/p>\n<p><strong>Hovedindstillinger for noden<\/strong><br \/>\nN\u00e5r man starter lager noden, kan man angive alle n\u00f8dvendige indstillinger.<br \/>\nJeg vil beskrive de vigtigste, resten kan findes p\u00e5 GitHub.<\/p>\n<p><\/p>\n<ul>\n<li><strong>storage.dataSize<\/strong> \u2014 st\u00f8rrelsen p\u00e5 mappen med filer<\/li>\n<li><strong>storage.tempSize<\/strong> \u2014 st\u00f8rrelsen p\u00e5 den midlertidige mappe<\/li>\n<li><strong>storage.autoCleanSize<\/strong> \u2014 minimumsst\u00f8rrelsen p\u00e5 lageret, som skal opretholdes. Hvis man angiver denne parameter, vil de mindst brugte filer blive slettet, s\u00e5 snart pladsen begynder at mangle.<\/li>\n<li><strong>file.maxSize<\/strong> \u2014 maksimal filst\u00f8rrelse<\/li>\n<li><strong>file.minSize<\/strong> \u2014 minimal filst\u00f8rrelse<\/li>\n<li><strong>file.preferredDuplicates<\/strong> \u2014 foretrukket antal duplikater af filen i netv\u00e6rket<\/li>\n<li><strong>file.mimeWhitelist<\/strong> \u2014 tilladte filtyper<\/li>\n<li><strong>file.mimeBlacklist<\/strong> \u2014 ikke tilladte filtyper<\/li>\n<li><strong>file.extWhitelist<\/strong> \u2014 tilladte filudvidelser<\/li>\n<li><strong>file.extBlacklist<\/strong> \u2014 ikke tilladte filudvidelser<\/li>\n<li><strong>file.linkCache<\/strong> \u2014 forskellige indstillinger for caching af links<\/li>\n<\/ul>\n<p><\/p>\n<p>N\u00e6sten alle parametre relateret til st\u00f8rrelser kan angives b\u00e5de i absolutte og relative enheder.<\/p>\n<p><\/p>\n<p><strong>Arbejder via kommandolinjen<\/strong><br \/>\nBiblioteket kan bruges via kommandolinjen. For at g\u00f8re dette skal det installeres globalt: <strong>npm i -g storacle<\/strong>. Efter dette kan man k\u00f8re de n\u00f8dvendige handlinger fra kataloget med projektet, hvor noden er. For eksempel, <strong>storacle -a storeFile -f .\/file.txt -c .\/config.js<\/strong>, for at tilf\u00f8je en fil. Alle handlinger kan findes i <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>Hvorfor kan du have brug for dette<\/strong><\/p>\n<p><\/p>\n<ul>\n<li>Hvis du \u00f8nsker at oprette et decentraliseret projekt, hvor det planl\u00e6gges at gemme og arbejde med filer p\u00e5 bekvemme metoder. For eksempel, projektet med musik beskrevet i linket i starten af artiklen bruger <strong>storacle<\/strong>.<\/li>\n<li>Hvis du arbejder med andre projekter, hvor filer skal opbevares decentralt, kan du nemt opbygge dit eget lukkede netv\u00e6rk, tilpasse noderne fleksibelt og tilf\u00f8je nye, n\u00e5r det er n\u00f8dvendigt.<\/li>\n<li>Hvis du blot har brug for et sted at opbevare filer til dit website, og det f\u00f8les besv\u00e6rligt at skrive alt selv, kan dette bibliotek v\u00e6re et bedre valg for dig.<\/li>\n<li>Hvis du har et projekt, hvor du arbejder med filer, men \u00f8nsker at udf\u00f8re alle handlinger fra browseren, kan du undg\u00e5 at skrive serverkode.<\/li>\n<\/ul>\n<p><\/p>\n<p>Mine kontaktoplysninger:<\/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>Kilde: <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.3 - 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\/da\/blog\/administrirovanie\/storacle-deczentralizovannoe-hranilishhe-fajlov\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"da_DK\" \/>\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\/da\/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 decentraliseret filopbevaring | ProHoster","description":"F\u00f8r jeg begynder, skal jeg efterlade.","canonical_url":"https:\/\/prohoster.info\/da\/blog\/administrirovanie\/storacle-deczentralizovannoe-hranilishhe-fajlov","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"da_DK","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\/da\/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\/da\/wp-json\/wp\/v2\/posts\/80224","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/comments?post=80224"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts\/80224\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media\/80225"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media?parent=80224"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/categories?post=80224"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/tags?post=80224"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}