Script CLI em Node.js para fazer backup, otimizar imagens de um bucket S3 e reenviá-las otimizadas ao mesmo bucket.
- 📥 Faz download das imagens de um bucket S3 para uma pasta local (
files/original
) - 🧠 Otimiza imagens grandes e/ou pesadas com base no formato e tamanho
- 📤 Salva a imagem otimizada localmente (
files/optimized
) - 🔁 Possibilidade de reenviar (substituir) as imagens otimizadas no bucket S3
- 🔧 Usa a biblioteca Sharp para compressão e redimensionamento
- ✅ Operações seguras com tratamento de erros (
safeOperation
)
- Node.js (>=20.10.0)
- TypeScript
- Sharp
- AWS SDK v3
- Zod (validação de variáveis de ambiente)
- Prettier
git clone https://github.com/seu-usuario/s3-image-optimizer.git
cd s3-image-optimizer
npm install
Renomeie o arquivo .env.example
para .env
e preencha com as informações do seu bucket:
S3_REGION=
S3_ACCESS_KEY=
S3_SECRET_ACCESS_KEY=
S3_ENDPOINT=
S3_BUCKET_NAME=
npm run backup-and-optimize
As imagens serão baixadas e otimizadas nas pastas:
- Originais:
files/original/
- Otimizadas:
files/optimized/
npm run push-and-replace
⚠️ ATENÇÃO: Substitui as imagens originais do S3 pelas versões otimizadas.
Esta operação é irreversível e sobrescreve os arquivos existentes no bucket.
Certifique-se de ter um backup ou execute primeironpm run backup-and-optimize
para salvar as imagens originais localmente.
Script | Descrição |
---|---|
npm run backup-and-optimize |
Baixa e otimiza as imagens do bucket |
npm run push-and-replace |
Substitui as imagens originais pelas otimizadas no bucket |
npm run lint |
Executa Prettier em todos os arquivos |
.
├── files/
│ ├── original/ # Imagens originais do S3
│ └── optimized/ # Imagens otimizadas
├── src/
│ ├── s3/ # Instância do cliente S3
│ ├── utils/ # Funções auxiliares
│ └── backup-and-optimize.ts
│ └── push-and-replace.ts
├── .env.example
├── package.json
- Redimensionamento para máx. 1200px
- Compressão com qualidade adequada por formato:
- JPEG: qualidade 80,
mozjpeg: true
- PNG: compressão 9,
adaptiveFiltering: true
- WebP: qualidade 80
- AVIF: qualidade 50
- JPEG: qualidade 80,
Dependendo do uso e escala da aplicação, o script pode ser adaptado com melhorias como:
- 🧪 Dry run (modo de simulação): Mostrar quais arquivos seriam alterados antes de sobrescrevê-los
- 📏 Configuração de tamanhos e qualidade via
.env
ou linha de comando - 🖼 Conversão de formatos: Ex: converter tudo para WebP ou AVIF
- ⏱ Execução paralela/assíncrona: Processar múltiplas imagens ao mesmo tempo para maior performance.
Isso pode ser feito de forma segura com limite de concorrência, usando a bibliotecap-limit
. - 📊 Relatório de compressão: Mostrar antes/depois de cada imagem (tamanho original vs. otimizado)
- 🛡 Validação adicional: Evitar sobrescrever arquivos caso não haja ganho significativo de tamanho
Sinta-se à vontade para adaptar ou contribuir com melhorias conforme sua necessidade.
- Bruno Menegidio – @bmenegidio
Este projeto está licenciado sob a licença MIT.