Executando verificação de segurança...
2

Qual a melhor maneira de criar uma API para upload de milhares de fotos e armazená-las de forma eficiente e econômica com React, Node.js e Nest.js?

Contextualização: Você está trabalhando em um projeto que exige que os usuários possam fazer o upload de milhares de fotos através de uma API, e você precisa encontrar a melhor maneira de armazenar essas fotos de forma eficiente e econômica. Você decidiu usar React para o front-end e Node.js com Nest.js para o back-end, mas ainda não tem certeza sobre a melhor abordagem para o armazenamento.

Pergunta: Quais são as melhores práticas para criar uma API de upload de milhares de fotos e armazená-las de forma eficiente e econômica usando React, Node.js e Nest.js? Quais serviços de armazenamento em nuvem são recomendados para essa finalidade e como escolher a melhor opção considerando o custo-benefício?

Carregando publicação patrocinada...
1

Bom dia,

Pelo que eu vi seu projeto parece ser grande e precisa ser escalavel certo?
Se for do caso recomendo que use os serviços da AWS, crie um S3 e as maquinas na AWS tambem configuradas na mesma sub-região assim você diminue bastante a latencia.
Lembre-se de fazer as conexões das maquinas por IP interno isso é muito importante

1- Não esqueça tambem de configurar os grupos de segurança tanto do S3 quanto das maquinas para que não tenha problemas futuros, libere os acessos apenas por maquinas internas da AWS e para seu IP. Sei que é chato trocar o IP na AWS toda vez que sua internet cai mas isso te evita uma grande dor de cabeça.

2- Não sirva os arquivos direto do S3, consuma eles pelo servidor Node e sirva para o usuário pois essa é a melhor pratica e garante que você consiga fazer sistemas de autenticação dinamica para acessos de imagens videos e etc...

3- Caso você esteja usando express com a biblioteca aws-sdk e typescript lembre-se de servir o resultado da busca de arquivos por strams:

response.set("Content-Type", result.ContentType); const readStream = new stream.PassThrough(); readStream.end(result.Body); readStream.pipe(response);
Pois os buffers que retornam da biblioteca aws-sdk podem dar conflito caso você tente converter para usar uma função mais direta como:
response.sendFile(<conteudo do arquivo>);

4- Cuidado com a performace se vir que o servidor esta engargalando por tratar arquivos muito grandes use o multi-thread do Node (particularmente gosto do piscina)

OBS: a AWS é uma otima opção para pricipamente para aplicações que você precisa de uma latencia baixa, eficiencia de maquina e escalabilidade.
Se precisar de um load balancer basta configurar um no painel é bem simples e eu uso em alguns clientes que tem milhares de requests por segundo ou muitas pessoas penduradas nos sockets ao mesmo tempo

Espero ter ajudado

1

Olá, muito obrigado pelas dicas!

Você parece entender bem sobre a S3, nesse caso, quais são os grupos de segurança que devem ser configurados tanto para o S3 quanto para as máquinas na AWS?

2

Olá, você precisaria configurar os acessos apenas pelas maquinas exemplo:

Criando EC2 AWS

  1. Após criar sua maquina EC2 crie uma chave para acesso ssh no seu servidor
  2. Você precisara criar um grupo de segurança e vincula-lo a maquina (eu geralmente coloco o nome de 'remote-access')
  3. Libere o acesso a porta 22 apenas e selecione na coluna source 'My IP'
  4. Lembre-se de criar um grupo de segurança default que permite acesso de qualquer pessoa pelas portas de acesso web tipo a 80 e 443 esse você pode definir como acesso publico

Isso irá fazer com que apenas o acesso a essa maquina possa ser feito da sua maquina com aquela chave ssh.

obs: Se precisa de mais performace crie uma AmazonLinux2, são um pouco mais chatas de configurar porem são melhores que as ubunto pois vem mais limpa.

Se precisar ter acesso a um banco de dados teria que autorizar seu IP na porta da base de dados tambem.

Configurando bases de dados

Caso precise configurar um RDS vincule tambem o grupo de segurança 'remote-access'. Porem irá ter que criar um grupo de acesso a base de dados tambem com o IP publico e privado das EC2 que irão ter acesso direto a base. Ai basta vincular esse outro grupo ao RDS tambem.

(Eu recomendo que configure o banco de dados direto em um ec2 caso saiba fazer, é melhor e mais barato. Tive que fazer isso recentemente porque o meu RDS deu uns bugs sabe Deus por que. E lembre-se sempre dos servidores de backup usando rsync em caso de dar algum pepino)

Criando S3

  1. Para criar o S3 é bem simples basta seguir o passo a passo e NÃO LIBERE O ACESSO PUBLICO
  2. Para fazer o acesso do S3 você deve criar uma conta IAM com as permissões predefinidas da aws apenas para S3.
  3. Use essa conta para acessar o S3 diretamente da aplicação

Configure as chaves no .env pelo amor de Deus não suba para o git kkkkkkkkkkkk

A partir dai é só usar a lib aws-sdk

Dica extra

Se a conta da aws for de um cliente crie uma sub-conta IAM com acesso total a conta da aws e não fale para ninguem. Se algo acontecer com a conta da AWS você consegue recupera-lá muito facil, porque as vezes o cliente pode tentar te sacanear. Então é bom previnir.

Porque configurar os grupos de segurança

Você provavelmente já entendeu mas em base é que os unicos acessos que irão circular pelas maquinas são aqueles que você permitir, ou seja isso vai dificultar bastante a vida de invasores, só é chato trocar o IP quando cai a conexão de internet.
E o melhor é que você irá servir os arquivos seguindo S3 -> aplicação -> cliente e não S3 -> cliente. Fazendo que os documentos fiquem mais seguros e não vazando os dados como algumas empresas fizeram tipo a Nubank kkkkk

1
1

Imagina você tambem me ajudou bastante a distrair a cabeça, se precisar de uma mentoria especifica para algum projeto até em questão de escalabilidade ou performace, você pode entrar em contato comigo
https://bkode.com.br

Mas tambem te respondo por aqui fica tranquilo, gosto de fazer isso porque da uma distraida do dia a dia e compartilhar conhecimento sempre é bom

1
1
1

Caramba, cara! Que animal!

Esse serviço é muito top, cara, nunca imaginei que teria isso...

Vou dar uma lida aqui se tem como adiocar uma logo na imagem nessa parte de editar

Mais uma vez, muito obrigado, você é um cara bastante prestativo! Gostaria de trabalhar contigo algum dia, com certeza tem muita coisa a ensinar!

1

Bom dia,

Eu não sei sobre a eficiência, mais quem sabe a própria api do google drive pode te atender!?

Da uma olhadinha se o tempo de requisições te satisfaz.

1

Olá, cara, o tempo de requisição não me preocupa tanto, claro, quanto mais eficiente melhor... O que mais me preocupa seria o custos mesmo, porque seria muitas fotos de cada cliente.

1
1

A API em si não é importante, mas onde você vai guardar os dados!

Vai ter que ser em algum lugar que seja um object storage.
Existem várias empresas nessa área, a mais conhecida é AWS com o S3.
As outras empresas acaba usando a mesma API compative com S3.

R2 da cloudflare é um deles
https://www.cloudflare.com/pt-br/products/r2/

Outros:

https://bunny.net/storage/

https://www.idrive.com/object-storage-e2/

https://wasabi.com/

https://contabo.com/en/object-storage/

https://www.scaleway.com/en/pricing/?tags=storage

Aqui um texto comparando alguns
https://www.coralnodes.com/amazon-s3-alternatives/

Todos eles usma a API S3.
O bom dessa API é que: vc faz um upload direto navegador pro balde do storage!
Sem ter que passar pelo seu servidor(e gastar muita banda)

Aqui como usar API s3 com node(todos os serviços são compativeis)
https://austingil.com/upload-to-s3/
Usa a API s3 e escolhe o serviço que melhor for pra você!

Aqui mostra como fazer direto do navegador pro balde
https://devcenter.heroku.com/articles/s3-upload-node

Eu acho que o melhor custo beneficio é o R2 da cloudflare!
Se você utilizar um deles ou OUTRO deixa uma resposta aqui no meu comentário e edita a postagem com a empresa que você escolheu

1

Antes de tudo, muito obrigado pela respostas, Uriel!

Li aqui os links que você mandou, foi muito esclarededor!

Mas queria perguntar, então o custo-benefício do R2 da cloudflare é superior ao usar somente a S3? Ou ela seria melhor, falando em custo-benefício, em comparação aos outros citados?

1

custo-benefício do R2 da cloudflare é superior ao usar somente a S3

R2 tem saída de objetos de graça!
S3 custa dinheiro.

Cada imagem vista num navegador ou baixada entra no custo.

Cada giga que sai do s3 e vai pra algum lugar custa: 0.08
cada giga armazenado no s3 custa 0.023 por mês

Cada giga que sai do R2 não custa nada!
cada giga armazenado no R2 custa 0,015 por mês

Mas leia bastante! R2 cobra por outras coisas!

Você pode usar a calculadora do R2 https://r2-calculator.cloudflare.com/
para ter uma ideia!

Tem também o https://www.idrive.com/object-storage-e2/pricing
Que dizem não cobrar pela saída!

Aqui um relato do uso do R2 e a diferença do S3

https://simplebackups.com/blog/early-look-cloudflare-r2-vs-S3-pricing-backups/

O custo beneficio vai ser apenas seu! Você é que vai ter que calcular tudo isso
e ver a melhor opção pra seu caso!

E lembre-se de nos informar aqui sua decisão

Abraços!

1

Caramba, que top! Muito bom sua explicação, man.

Eu estava cogitando a S3 por causa da fama, mas agora vou pesquisar mais sobre a R2 e outras parecidas (as que você citou).

A feature seria aparentemente simples, os usuários poderiam subir quantas fotos quiserem, mas acho que haveria tratamento na API (principalmente, em diminuir tamanho e colocar a logo), ou seja não enviaria direto para armazenar...

1

API (principalmente, em diminuir tamanho e colocar a logo)

Acho que a cloudflare tem algo de transformação assim! Não tenho certeza.
Mas seria bom pesquisar no site deles!

0

Que bom que ajudei! Espero que consiga resolver bem eu problema.
Lembre-se de informar aqui uma resposta

De um upvote nas respostas pra ajudar a gente aqui no site!
:)

1

Informo sim, vai levar um tempinho para chegar nessa parte, mas volto aqui pra falar a decisão que foi tomada.

Tentei dar um upvote aqui, falaram que eu não tenho que ter 2 coins (estronho). Assim que tiver, dou o upvote

1
1

Cara, li aqui, muito bom! Parece que a cloudfare irá resolver meu problema, ainda vou pesquisar um pouco, não sabia sobre a parte de ter que pagar toda vez que uma foto for acessada, estou analisando quanto custaria e quanto eu deveria cobrar por esse serviço...