Skip to Content
TecnicaInfrastrutturaConfigurazione AWS S3 Storage

Configurazione AWS S3 Storage

Questo progetto utilizza AWS S3 (o servizi compatibili come MinIO, DigitalOcean Spaces, ecc.) per lo storage di file e immagini.

Variabili d’Ambiente Richieste

Aggiungi le seguenti variabili al tuo file .env.local:

# AWS S3 Configuration AWS_REGION=eu-south-1 AWS_ACCESS_KEY_ID=your_access_key_here AWS_SECRET_ACCESS_KEY=your_secret_key_here AWS_S3_BUCKET=foodcost-uploads # URL pubblico del bucket (opzionale, se usi CloudFront o un dominio custom) AWS_S3_PUBLIC_URL=https://your-bucket.s3.eu-south-1.amazonaws.com # O se usi CloudFront: # AWS_S3_PUBLIC_URL=https://dxxxxx.cloudfront.net

Setup AWS S3

1. Crea un Bucket S3

  1. Vai su AWS Console → S3
  2. Crea un nuovo bucket (es: foodcost-uploads)
  3. Scegli la region (es: eu-south-1 per Milano)
  4. Disabilita “Block all public access” solo se vuoi URL pubblici diretti
  5. Abilita versioning (opzionale ma consigliato)

2. Configura le Policy del Bucket

Per permettere lettura pubblica dei file, aggiungi questa Bucket Policy:

{ "Version": "2012-10-17", "Statement": [ { "Sid": "PublicReadGetObject", "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::foodcost-uploads/*" } ] }

3. Configura CORS (se necessario)

Se accedi ai file da un dominio diverso, configura CORS:

[ { "AllowedHeaders": ["*"], "AllowedMethods": ["GET", "HEAD"], "AllowedOrigins": ["*"], "ExposeHeaders": [] } ]

4. Crea un IAM User

  1. Vai su IAM → Users → Add User
  2. Scegli un nome (es: foodcost-app)
  3. Seleziona “Programmatic access”
  4. Crea una policy con questi permessi:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:PutObject", "s3:GetObject", "s3:DeleteObject", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::foodcost-uploads", "arn:aws:s3:::foodcost-uploads/*" ] } ] }
  1. Salva Access Key ID e Secret Access Key

Struttura delle Cartelle su S3

I file vengono organizzati automaticamente in cartelle:

foodcost-uploads/ ├── payslips/ # Buste paga │ ├── uuid_file1.pdf │ └── uuid_file2.pdf ├── products/ # Immagini prodotti │ ├── uuid_img1.jpg │ └── uuid_img2.png ├── images/ # Immagini generiche └── profiles/ # Foto profilo

CloudFront (Opzionale ma Consigliato)

Per prestazioni migliori e costi ridotti, usa CloudFront:

  1. Crea una distribuzione CloudFront
  2. Scegli il bucket S3 come origin
  3. Copia l’URL della distribuzione (es: dxxxxx.cloudfront.net)
  4. Imposta AWS_S3_PUBLIC_URL=https://dxxxxx.cloudfront.net

Alternative a AWS S3

MinIO (Self-hosted)

AWS_REGION=us-east-1 AWS_ACCESS_KEY_ID=minioadmin AWS_SECRET_ACCESS_KEY=minioadmin AWS_S3_BUCKET=foodcost-uploads AWS_S3_PUBLIC_URL=http://localhost:9000/foodcost-uploads

DigitalOcean Spaces

AWS_REGION=fra1 AWS_ACCESS_KEY_ID=your_do_spaces_key AWS_SECRET_ACCESS_KEY=your_do_spaces_secret AWS_S3_BUCKET=foodcost-uploads AWS_S3_PUBLIC_URL=https://foodcost-uploads.fra1.digitaloceanspaces.com

Test

Dopo la configurazione, testa l’upload:

  1. Avvia l’applicazione
  2. Carica un’immagine o una busta paga
  3. Verifica su AWS Console che il file sia presente nel bucket
  4. Verifica che l’URL del file sia accessibile pubblicamente

Troubleshooting

”AccessDenied” error

  • Verifica che le credenziali IAM siano corrette
  • Controlla che la policy IAM abbia i permessi necessari
  • Verifica che il bucket esista nella region specificata

File non accessibili pubblicamente

  • Controlla la Bucket Policy
  • Verifica che “Block all public access” sia disabilitato
  • Prova ad accedere all’URL direttamente nel browser

Costi

  • S3 Standard: ~$0.023 per GB/mese
  • Transfer OUT: ~$0.09 per GB (usa CloudFront per ridurre i costi)
  • PUT/POST requests: $0.005 per 1000 richieste
Last updated on