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.netSetup AWS S3
1. Crea un Bucket S3
- Vai su AWS Console → S3
- Crea un nuovo bucket (es:
foodcost-uploads) - Scegli la region (es:
eu-south-1per Milano) - Disabilita “Block all public access” solo se vuoi URL pubblici diretti
- 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
- Vai su IAM → Users → Add User
- Scegli un nome (es:
foodcost-app) - Seleziona “Programmatic access”
- 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/*"
]
}
]
}- 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 profiloCloudFront (Opzionale ma Consigliato)
Per prestazioni migliori e costi ridotti, usa CloudFront:
- Crea una distribuzione CloudFront
- Scegli il bucket S3 come origin
- Copia l’URL della distribuzione (es:
dxxxxx.cloudfront.net) - 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-uploadsDigitalOcean 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.comTest
Dopo la configurazione, testa l’upload:
- Avvia l’applicazione
- Carica un’immagine o una busta paga
- Verifica su AWS Console che il file sia presente nel bucket
- 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