{"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\/pt\/blog\/administrirovanie\/storacle-deczentralizovannoe-hranilishhe-fajlov","title":{"rendered":"Storacle \u2014 um armazenamento de arquivos descentralizado","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Storacle \u2014 um armazenamento de arquivos descentralizado\" src=\"\/wp-content\/uploads\/2020\/05\/333f7b998e00ce32367d97f7ccd05bef.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Antes de come\u00e7ar, devo deixar <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/495058\/\">um link para o artigo anterior<\/a><\/noindex>, para que fique claro sobre o que estamos falando.<\/p>\n<p><\/p>\n<p>Neste artigo, gostaria de discutir a camada que \u00e9 respons\u00e1vel pelo armazenamento de arquivos e como isso pode ser utilizado por qualquer pessoa. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/ortexx\/storacle\/\">Storacle \u2014 uma biblioteca independente<\/a><\/noindex>, n\u00e3o tem rela\u00e7\u00e3o direta com m\u00fasica. Pode-se organizar o armazenamento de qualquer arquivo.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>No artigo anterior, eu critiquei um pouco <strong>ipfs<\/strong>, mas isso aconteceu no contexto da tarefa que eu estava resolvendo. No geral, considero este projeto interessante. Apenas prefiro a possibilidade de criar diferentes redes para diferentes tarefas. Isso permite organizar melhor a estrutura e reduzir a carga em n\u00f3s individuais e na rede como um todo. \u00c9 poss\u00edvel, mesmo dentro de um projeto espec\u00edfico, dividir a rede em partes com base em determinados crit\u00e9rios, diminuindo a carga geral.<\/p>\n<p><\/p>\n<p>Ent\u00e3o, o storacle utiliza o mecanismo <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/ortexx\/spreadable\">spreadable<\/a><\/noindex> para organizar a rede. Principais caracter\u00edsticas:<\/p>\n<p><\/p>\n<ul>\n<li>Arquivos podem ser adicionados ao reposit\u00f3rio atrav\u00e9s de qualquer n\u00f3.<\/li>\n<li>Os arquivos s\u00e3o salvos na \u00edntegra, n\u00e3o em blocos.<\/li>\n<li>Cada arquivo tem seu pr\u00f3prio hash exclusivo baseado em seu conte\u00fado para futuras opera\u00e7\u00f5es.<\/li>\n<li>Os arquivos podem ser duplicados para maior confiabilidade<\/li>\n<li>O n\u00famero de arquivos em um n\u00f3 \u00e9 limitado apenas pelo sistema de arquivos (h\u00e1 uma exce\u00e7\u00e3o, que ser\u00e1 mencionada abaixo)<\/li>\n<li>O n\u00famero de arquivos na rede \u00e9 limitado pelas capacidades do spreadable em termos do n\u00famero permitido de n\u00f3s na rede, que na segunda vers\u00e3o permitir\u00e1 trabalhar com um n\u00famero infinito de n\u00f3s (isso ser\u00e1 abordado em outro artigo)<\/li>\n<\/ul>\n<p><\/p>\n<p>Um exemplo simples de como isso funciona no 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  try {\n    const node = new Node({\n      port: 4000,\n      hostname: 'localhost'\n    });\n    await node.init();\n  }\n  catch(err) {\n    console.error(err.stack);\n    process.exit(1);\n  }\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  try {\n    const client = new Client({\n      address: 'localhost:4000'\n    });\n    await client.init();\n    const hash = await client.storeFile('.\/my-file');\n    const link = await client.getFileLink(hash);\n    await client.removeFile(hash);\n  }\n  catch(err) {\n    console.error(err.stack);\n    process.exit(1);\n  }\n})();<\/code><\/pre>\n<p><\/p>\n<p><strong>Uma vis\u00e3o de dentro<\/strong><\/p>\n<p><\/p>\n<p>Por tr\u00e1s dos panos, n\u00e3o h\u00e1 nada de sobrenatural. As informa\u00e7\u00f5es sobre a quantidade de arquivos, seu tamanho total e outros detalhes s\u00e3o armazenadas em um banco de dados em mem\u00f3ria e s\u00e3o atualizadas quando arquivos s\u00e3o adicionados ou removidos. Portanto, n\u00e3o h\u00e1 necessidade de acessar o sistema de arquivos com frequ\u00eancia. A \u00fanica exce\u00e7\u00e3o \u00e9 quando o coletor de lixo \u00e9 ativado, exigindo a circula\u00e7\u00e3o de arquivos ao atingir certos limites de armazenamento, em vez de proibir a adi\u00e7\u00e3o de novos. Nesse caso, \u00e9 necess\u00e1rio percorrer o armazenamento, e lidar com um grande n\u00famero de arquivos (&gt; um milh\u00e3o, por exemplo) pode gerar cargas significativas. \u00c9 melhor armazenar menos arquivos e executar mais n\u00f3s. Se o 'limpador' estiver desligado, esse problema n\u00e3o existe.<\/p>\n<p><\/p>\n<p>O armazenamento de arquivos consiste em 256 pastas e 2 n\u00edveis de profundidade. Os arquivos s\u00e3o armazenados nas pastas de segundo n\u00edvel. Ou seja, com 1 milh\u00e3o de arquivos, cada uma dessas pastas conter\u00e1 cerca de 62.500 arquivos (1000000 \/ sqrt(256)).<\/p>\n<p><\/p>\n<p>Os nomes das pastas s\u00e3o gerados a partir do hash do arquivo, permitindo acesso r\u00e1pido, conhecendo o hash.<\/p>\n<p><\/p>\n<p>Essa estrutura foi escolhida com base em uma s\u00e9rie de requisitos variados para o armazenamento: suporte a sistemas de arquivos deficientes, onde n\u00e3o \u00e9 desej\u00e1vel ter muitos arquivos em uma \u00fanica pasta, acesso r\u00e1pido a todas as pastas quando necess\u00e1rio, etc. Uma esp\u00e9cie de meio-termo.<\/p>\n<p><\/p>\n<p><strong>Cache<\/strong><\/p>\n<p><\/p>\n<p>Ao adicionar arquivos, bem como ao recuper\u00e1-los, refer\u00eancias aos arquivos s\u00e3o escritas no cache.<br \/>\nGra\u00e7as a isso, muitas vezes n\u00e3o h\u00e1 necessidade de percorrer toda a rede em busca de um arquivo. Isso acelera a obten\u00e7\u00e3o de refer\u00eancias e reduz a carga na rede. O cache tamb\u00e9m \u00e9 feito atrav\u00e9s de cabe\u00e7alhos http.<\/p>\n<p><\/p>\n<p><strong>Isomorfismo<\/strong><\/p>\n<p><\/p>\n<p>O cliente \u00e9 escrito em javascript e \u00e9 isom\u00f3rfico, podendo ser utilizado diretamente do navegador.\u00a0<br \/>\n\u00c9 poss\u00edvel carregar um arquivo <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 um script e acessar <strong>window.ClientStoracle <\/strong>ou import\u00e1-lo atrav\u00e9s de um sistema de constru\u00e7\u00e3o, etc.<\/p>\n<p><\/p>\n<p><strong>Refer\u00eancias adiadas<\/strong><\/p>\n<p><\/p>\n<p>Uma funcionalidade interessante \u00e9 o 'link atrasado'. Este \u00e9 um link para um arquivo que pode ser obtido de forma s\u00edncrona, aqui e agora, enquanto o arquivo ser\u00e1 recuperado assim que for encontrado no armazenamento. Isso \u00e9 muito conveniente, por exemplo, quando \u00e9 necess\u00e1rio mostrar algumas imagens no site. Basta usar o link atrasado no src e tudo estar\u00e1 pronto. H\u00e1 muitos casos que podem ser imaginados.<\/p>\n<p><\/p>\n<p><strong>API do cliente<\/strong><\/p>\n<p><\/p>\n<ul>\n<li>ass\u00edncrono <strong>Client.prototype.storeFile()<\/strong> \u2014 para salvar um arquivo<\/li>\n<li>ass\u00edncrono <strong>Client.prototype.getFileLink()<\/strong> \u2014 para obter um link direto para o arquivo<\/li>\n<li>ass\u00edncrono <strong>Client.prototype.getFileLinks()<\/strong> \u2014 obter uma lista de links diretos para o arquivo de todos os n\u00f3s onde ele est\u00e1 presente<\/li>\n<li>ass\u00edncrono <strong>Client.prototype.getFileToBuffer()<\/strong> \u2014 obter o arquivo no buffer<\/li>\n<li>ass\u00edncrono <strong>Client.prototype.getFileToPath()<\/strong> \u2014 obter o arquivo no sistema de arquivos<\/li>\n<li>ass\u00edncrono <strong>Client.prototype.getFileToBlob()<\/strong> \u2014 obter o arquivo em blob (para a vers\u00e3o do navegador)<\/li>\n<li>ass\u00edncrono <strong>Client.prototype.removeFile()<\/strong> \u2014 remover arquivo<\/li>\n<li><strong>Client.prototype.createRequestedFileLink()<\/strong> \u2014 criar um link adiado<\/li>\n<\/ul>\n<p><\/p>\n<p><strong>Exportar arquivos para outro servidor<\/strong><\/p>\n<p><\/p>\n<p>Para transferir arquivos para outro n\u00f3, voc\u00ea pode:<\/p>\n<p><\/p>\n<ul>\n<li>Apenas copiar toda a pasta de armazenamento junto com as configura\u00e7\u00f5es. (no futuro, isso pode n\u00e3o funcionar)<\/li>\n<li>Copiar apenas a pasta com os arquivos. Mas, neste caso, ser\u00e1 necess\u00e1rio executar uma vez a fun\u00e7\u00e3o <strong>node.normalizeFilesInfo()<\/strong>, para recalcular todos os dados e registr\u00e1-los no banco.<\/li>\n<li>Usar a fun\u00e7\u00e3o <strong>node.exportFiles()<\/strong>, que iniciar\u00e1 a c\u00f3pia dos arquivos.<\/li>\n<\/ul>\n<p><\/p>\n<p><strong>Configura\u00e7\u00f5es principais do n\u00f3<\/strong><br \/>\nAo iniciar o n\u00f3 de armazenamento, \u00e9 poss\u00edvel especificar todas as configura\u00e7\u00f5es necess\u00e1rias.<br \/>\nDescreverei as mais b\u00e1sicas; o restante pode ser encontrado no GitHub.<\/p>\n<p><\/p>\n<ul>\n<li><strong>storage.dataSize<\/strong> \u2014 tamanho da pasta com os arquivos<\/li>\n<li><strong>storage.tempSize<\/strong> \u2014 tamanho da pasta tempor\u00e1ria<\/li>\n<li><strong>storage.autoCleanSize<\/strong> \u2014 tamanho m\u00ednimo de armazenamento que deve ser mantido. Se este par\u00e2metro for especificado, assim que o espa\u00e7o come\u00e7ar a faltar, os arquivos menos utilizados ser\u00e3o removidos.<\/li>\n<li><strong>file.maxSize<\/strong> \u2014 tamanho m\u00e1ximo do arquivo<\/li>\n<li><strong>file.minSize<\/strong> \u2014 tamanho m\u00ednimo do arquivo<\/li>\n<li><strong>file.preferredDuplicates<\/strong> \u2014 n\u00famero preferido de duplicatas do arquivo na rede<\/li>\n<li><strong>file.mimeWhitelist<\/strong> \u2014 tipos de arquivo permitidos<\/li>\n<li><strong>file.mimeBlacklist<\/strong> \u2014 tipos de arquivo n\u00e3o permitidos<\/li>\n<li><strong>file.extWhitelist<\/strong> \u2014 extens\u00f5es de arquivo permitidas<\/li>\n<li><strong>file.extBlacklist<\/strong> \u2014 extens\u00f5es de arquivo n\u00e3o permitidas<\/li>\n<li><strong>file.linkCache<\/strong> \u2014 diferentes configura\u00e7\u00f5es de cache de links<\/li>\n<\/ul>\n<p><\/p>\n<p>Quase todos os par\u00e2metros relacionados aos tamanhos podem ser especificados tanto em unidades absolutas quanto relativas.<\/p>\n<p><\/p>\n<p><strong>Opera\u00e7\u00e3o atrav\u00e9s da linha de comando<\/strong><br \/>\nA biblioteca pode ser utilizada atrav\u00e9s da linha de comando. Para isso, precisa ser instalada globalmente: <strong>npm i -g storacle<\/strong>. Ap\u00f3s isso, voc\u00ea pode executar as a\u00e7\u00f5es necess\u00e1rias do diret\u00f3rio com o projeto, onde est\u00e1 o n\u00f3. Por exemplo, <strong>storacle -a storeFile -f .\/file.txt -c .\/config.js<\/strong>, para adicionar um arquivo. Todas as a\u00e7\u00f5es podem ser encontradas em <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 que voc\u00ea pode precisar disso<\/strong><\/p>\n<p><\/p>\n<ul>\n<li>Se voc\u00ea deseja criar um projeto descentralizado no qual pretende armazenar e trabalhar com arquivos de maneiras convenientes. Por exemplo, o projeto de m\u00fasica, descrito no link no in\u00edcio do artigo, utiliza <strong>storacle<\/strong>.<\/li>\n<li>Se voc\u00ea est\u00e1 trabalhando em outros projetos que precisam armazenar arquivos de forma distribu\u00edda. Voc\u00ea pode facilmente construir sua pr\u00f3pria rede privada, configurar n\u00f3s flexivelmente e adicionar novos quando necess\u00e1rio.<\/li>\n<li>Se voc\u00ea s\u00f3 precisa de um lugar para armazenar os arquivos do seu site e n\u00e3o quer escrever tudo sozinho. Esta biblioteca pode ser mais adequada do que outras, no seu caso.<\/li>\n<li>Se voc\u00ea tem um projeto em que est\u00e1 trabalhando com arquivos, mas quer realizar todas as opera\u00e7\u00f5es a partir do navegador. Voc\u00ea pode evitar a necessidade de escrever c\u00f3digo do lado do servidor.<\/li>\n<\/ul>\n<p><\/p>\n<p>Meus contatos:<\/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.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\/pt\/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=\"pt_PT\" \/>\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\/pt\/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 armazenamento de arquivos descentralizado | ProHoster","description":"Antes de come\u00e7ar, preciso deixar claro.","canonical_url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/storacle-deczentralizovannoe-hranilishhe-fajlov","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pt_PT","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\/pt\/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\/pt\/wp-json\/wp\/v2\/posts\/80224","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/comments?post=80224"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/80224\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media\/80225"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media?parent=80224"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/categories?post=80224"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/tags?post=80224"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}