{"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\/es\/blog\/administrirovanie\/storacle-deczentralizovannoe-hranilishhe-fajlov","title":{"rendered":"Storacle \u2013 almacenamiento de archivos descentralizado","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Storacle \u2013 almacenamiento de archivos descentralizado\" src=\"\/wp-content\/uploads\/2020\/05\/333f7b998e00ce32367d97f7ccd05bef.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Antes de comenzar, debo dejar <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/495058\/\">un enlace al art\u00edculo anterior<\/a><\/noindex>, para que quede claro de qu\u00e9 se trata.<\/p>\n<p><\/p>\n<p>En este art\u00edculo, me gustar\u00eda abordar la capa responsable del almacenamiento de archivos y c\u00f3mo puede ser utilizada por cualquier persona. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/ortexx\/storacle\/\">Storacle es una biblioteca independiente<\/a><\/noindex>, no hay conexi\u00f3n directa con la m\u00fasica. Se puede organizar el almacenamiento de cualquier archivo.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>En el art\u00edculo anterior, hice un poco de \"cr\u00edtica\" sobre <strong>ipfs<\/strong>, pero esto ocurri\u00f3 precisamente en el contexto del problema que estaba resolviendo. En general, considero que este proyecto es genial. Simplemente me gusta m\u00e1s la capacidad de crear diferentes redes para diversas tareas. Esto permite organizar mejor la estructura y reducir la carga en nodos individuales y en la red en su conjunto. Incluso se puede fragmentar la red en partes basadas en ciertos criterios dentro de un mismo proyecto, reduciendo as\u00ed la carga general.<\/p>\n<p><\/p>\n<p>Entonces, storacle utiliza un mecanismo <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/ortexx\/spreadable\">spreadable<\/a><\/noindex> para organizar la red. Caracter\u00edsticas principales:<\/p>\n<p><\/p>\n<ul>\n<li>Los archivos pueden a\u00f1adirse al almacenamiento a trav\u00e9s de cualquier nodo.<\/li>\n<li>Los archivos se guardan en su totalidad, no en bloques.<\/li>\n<li>Cada archivo tiene su propio hash \u00fanico basado en su contenido para futuras operaciones con \u00e9l.<\/li>\n<li>Los archivos pueden duplicarse para mayor fiabilidad.<\/li>\n<li>El n\u00famero de archivos en un nodo est\u00e1 limitado solo por el sistema de archivos (hay una excepci\u00f3n, la mencionar\u00e9 m\u00e1s abajo).<\/li>\n<li>El n\u00famero de archivos en la red est\u00e1 limitado por las capacidades de spreadable y el n\u00famero permitido de nodos en la red, que en la segunda versi\u00f3n podr\u00e1 permitir trabajar con un n\u00famero infinito de nodos (de esto hablar\u00e9 en otro art\u00edculo).<\/li>\n<\/ul>\n<p><\/p>\n<p>Un ejemplo simple de c\u00f3mo funciona esto en el programa:<\/p>\n<p><\/p>\n<p>Servidor:<\/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>Una mirada desde adentro<\/strong><\/p>\n<p><\/p>\n<p>Bajo el cap\u00f3 no hay nada sobrenatural. La informaci\u00f3n sobre la cantidad de archivos, su tama\u00f1o total y otros aspectos se almacenan en una base de datos en memoria y se actualizan al eliminar y agregar archivos, por lo que no es necesario acceder a menudo al sistema de archivos. La excepci\u00f3n es la inclusi\u00f3n del recolector de basura, cuando se necesita circular archivos al alcanzar ciertos tama\u00f1os de almacenamiento, y no prohibir la adici\u00f3n de nuevos. En este caso, es necesario recorrer el almacenamiento, y trabajar con una gran cantidad de archivos (&gt; un mill\u00f3n, digamos) puede generar cargas importantes. Es mejor almacenar menos archivos y ejecutar m\u00e1s nodos. Si el \"limpiador\" est\u00e1 desactivado, no hay tal problema.<\/p>\n<p><\/p>\n<p>El almacenamiento de archivos consiste en 256 carpetas y 2 niveles de anidamiento. Los archivos se almacenan en carpetas de segundo nivel. Es decir, con 1 mill\u00f3n de archivos, habr\u00e1 alrededor de 62500 en cada carpeta (1000000 \/ sqrt(256)).<\/p>\n<p><\/p>\n<p>Los nombres de las carpetas se forman a partir del hash del archivo, para poder acceder r\u00e1pidamente una vez conocido el hash.<\/p>\n<p><\/p>\n<p>Se eligi\u00f3 esta estructura en funci\u00f3n de un gran n\u00famero de requisitos diversos para el almacenamiento: soporte para sistemas de archivos d\u00e9biles, donde no es deseable tener muchos archivos en una carpeta, acceso r\u00e1pido a todas las carpetas cuando sea necesario, etc. Es una especie de t\u00e9rmino medio.<\/p>\n<p><\/p>\n<p><strong>Cacheo<\/strong><\/p>\n<p><\/p>\n<p>Al agregar archivos, as\u00ed como al obtenerlos, se registran enlaces a los archivos en la cach\u00e9.<br \/>\nGracias a esto, a menudo no es necesario recorrer toda la red en busca de un archivo. Esto acelera la obtenci\u00f3n de enlaces y reduce la carga en la red. Adem\u00e1s, la cach\u00e9 se realiza a trav\u00e9s de encabezados HTTP.<\/p>\n<p><\/p>\n<p><strong>Isomorfismo<\/strong><\/p>\n<p><\/p>\n<p>El cliente est\u00e1 escrito en javascript y es isom\u00f3rfico, se puede usar directamente desde el navegador.\u00a0<br \/>\nPuedes cargar un archivo <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> como un script y obtener acceso a <strong>window.ClientStoracle <\/strong>o importarlo a trav\u00e9s del sistema de compilaci\u00f3n, etc.<\/p>\n<p><\/p>\n<p><strong>Enlaces diferidos<\/strong><\/p>\n<p><\/p>\n<p>Una caracter\u00edstica interesante tambi\u00e9n es el \"enlace diferido\". Este es un enlace a un archivo que se puede obtener de forma sincr\u00f3nica, aqu\u00ed y ahora, y el archivo se buscar\u00e1 cuando ya se haya encontrado en el almacenamiento. Esto es muy conveniente, cuando, por ejemplo, se necesita mostrar algunas im\u00e1genes en el sitio web. Simplemente establecemos el enlace diferido en src y listo. Se pueden inventar muchos casos.<\/p>\n<p><\/p>\n<p><strong>API del cliente<\/strong><\/p>\n<p><\/p>\n<ul>\n<li>async <strong>Client.prototype.storeFile()<\/strong> \u2014 guarda un archivo<\/li>\n<li>async <strong>Client.prototype.getFileLink()<\/strong> \u2014 obtiene un enlace directo al archivo<\/li>\n<li>async <strong>Client.prototype.getFileLinks()<\/strong> \u2014 obtener una lista de enlaces directos al archivo desde todos los nodos donde est\u00e1 presente<\/li>\n<li>async <strong>Client.prototype.getFileToBuffer()<\/strong> \u2014 obtener el archivo en un b\u00fafer<\/li>\n<li>async <strong>Client.prototype.getFileToPath()<\/strong> \u2014 obtener el archivo en el sistema de archivos<\/li>\n<li>async <strong>Client.prototype.getFileToBlob()<\/strong> \u2014 obtener el archivo en un blob (para la versi\u00f3n del navegador)<\/li>\n<li>async <strong>Client.prototype.removeFile()<\/strong> \u2014 eliminar archivo<\/li>\n<li><strong>Client.prototype.createRequestedFileLink()<\/strong> \u2014 crear un enlace diferido<\/li>\n<\/ul>\n<p><\/p>\n<p><strong>Exportar archivos a otro servidor<\/strong><\/p>\n<p><\/p>\n<p>Para transferir archivos a otro nodo puedes:<\/p>\n<p><\/p>\n<ul>\n<li>Simplemente copiar toda la carpeta de almacenamiento junto con la configuraci\u00f3n. (esto puede no funcionar en el futuro)<\/li>\n<li>Copiar solo la carpeta con los archivos. Pero, en este caso, necesitar\u00e1s ejecutar una vez la funci\u00f3n <strong>node.normalizeFilesInfo()<\/strong>, para recalcular todos los datos y registrarlos en la base de datos.<\/li>\n<li>Usar la funci\u00f3n <strong>node.exportFiles()<\/strong>, que comenzar\u00e1 a copiar los archivos.<\/li>\n<\/ul>\n<p><\/p>\n<p><strong>Configuraciones principales del nodo<\/strong><br \/>\nAl iniciar el nodo de almacenamiento, puedes especificar todas las configuraciones necesarias.<br \/>\nDescribir\u00e9 las m\u00e1s importantes, lo dem\u00e1s se puede encontrar en GitHub.<\/p>\n<p><\/p>\n<ul>\n<li><strong>storage.dataSize<\/strong> \u2014 tama\u00f1o de la carpeta con archivos<\/li>\n<li><strong>storage.tempSize<\/strong> \u2014 tama\u00f1o de la carpeta temporal<\/li>\n<li><strong>storage.autoCleanSize<\/strong> \u2014 tama\u00f1o m\u00ednimo de almacenamiento que debe mantenerse. Si se especifica este par\u00e1metro, en cuanto el espacio comience a ser insuficiente, se eliminar\u00e1n los archivos menos utilizados.<\/li>\n<li><strong>file.maxSize<\/strong> \u2014 tama\u00f1o m\u00e1ximo del archivo<\/li>\n<li><strong>file.minSize<\/strong> \u2014 tama\u00f1o m\u00ednimo del archivo<\/li>\n<li><strong>file.preferredDuplicates<\/strong> \u2014 n\u00famero preferido de duplicados del archivo en la red<\/li>\n<li><strong>file.mimeWhitelist<\/strong> \u2014 tipos de archivos permitidos<\/li>\n<li><strong>file.mimeBlacklist<\/strong> \u2014 tipos de archivos no permitidos<\/li>\n<li><strong>file.extWhitelist<\/strong> \u2014 extensiones de archivos permitidas<\/li>\n<li><strong>file.extBlacklist<\/strong> \u2014 extensiones de archivos no permitidas<\/li>\n<li><strong>file.linkCache<\/strong> \u2014 varias configuraciones de cach\u00e9 de enlaces<\/li>\n<\/ul>\n<p><\/p>\n<p>Casi todos los par\u00e1metros relacionados con tama\u00f1os pueden especificarse tanto en valores absolutos como en relativos.<\/p>\n<p><\/p>\n<p><strong>Trabajo a trav\u00e9s de la l\u00ednea de comandos<\/strong><br \/>\nLa biblioteca se puede utilizar a trav\u00e9s de la l\u00ednea de comandos. Para ello, necesitas instalarla globalmente: <strong>npm i -g storacle<\/strong>. Despu\u00e9s de esto, puedes ejecutar las acciones necesarias desde el directorio con el proyecto, donde est\u00e1 el nodo. Por ejemplo, <strong>storacle -a storeFile -f .\/file.txt -c .\/config.js<\/strong>, para agregar un archivo. Todas las acciones se pueden encontrar en <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>Por qu\u00e9 podr\u00edas necesitar esto<\/strong><\/p>\n<p><\/p>\n<ul>\n<li>Si deseas crear alg\u00fan proyecto descentralizado, en el que se planea almacenar y trabajar con archivos de manera conveniente. Por ejemplo, el proyecto de m\u00fasica descrito en el enlace al principio del art\u00edculo utiliza <strong>storacle<\/strong>.<\/li>\n<li>Si trabajas en otros proyectos donde necesitas almacenar archivos de forma descentralizada, puedes construir f\u00e1cilmente tu propia red privada, configurando los nodos de manera flexible y a\u00f1adiendo nuevos cuando sea necesario.<\/li>\n<li>Si solo necesitas un lugar para almacenar los archivos de tu sitio y no quieres escribir todo t\u00fa mismo, quiz\u00e1s esta biblioteca sea la mejor opci\u00f3n para ti.<\/li>\n<li>Si tienes un proyecto en el que trabajas con archivos, pero quieres realizar todas las operaciones desde el navegador, puedes evitar escribir c\u00f3digo del lado del servidor.<\/li>\n<\/ul>\n<p><\/p>\n<p>Mis contactos:<\/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>Fuente: <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.2 - 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\/es\/blog\/administrirovanie\/storacle-deczentralizovannoe-hranilishhe-fajlov\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"es_ES\" \/>\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\/es\/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 almacenamiento de archivos descentralizado | ProHoster","description":"Antes de comenzar, debo dejar claro.","canonical_url":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/storacle-deczentralizovannoe-hranilishhe-fajlov","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"es_ES","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\/es\/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\/es\/wp-json\/wp\/v2\/posts\/80224","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/comments?post=80224"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/80224\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media\/80225"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media?parent=80224"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/categories?post=80224"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/tags?post=80224"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}