# apps/api (Fastify). Copia in `.env` e compila. Non committare `.env`. # La configurazione è validata all'avvio (src/config/env.ts): se manca qualcosa il server non parte # e stampa l'elenco delle variabili mancanti o non valide. # --- Server --- NODE_ENV=development HOST=0.0.0.0 # 3000: è la porta a cui Medusa invia i webhook (FASTIFY_WEBHOOK_URL in medusa/apps/backend/.env) PORT=3000 LOG_LEVEL=info # Cartella dei log su file con rotazione (obbligatoria con NODE_ENV=production) LOG_DIR= # Proxy fidati per l'IP reale da X-Forwarded-For: false, true, oppure indirizzi/CIDR/preset separati da virgola # (produzione: "loopback,uniquelocal", cioè Caddy e il server SSR sulla rete Docker) TRUST_PROXY=false # --- Database applicativo --- # Postgres iti_app con l'utente iti_app (credenziali APP_DB_* del .env di root) DATABASE_URL=postgres://iti_app:change-me@localhost:5432/iti_app # --- Seed (npm run db:seed): utente admin iniziale, password almeno 12 caratteri --- SEED_ADMIN_EMAIL= SEED_ADMIN_PASSWORD= # --- Sicurezza --- # Origini CORS consentite, separate da virgola (sito pubblico + area privata) CORS_ORIGINS=http://localhost:4200,http://localhost:4300 # Segreto per i cookie firmati (almeno 32 caratteri) # node -e "console.log(require('crypto').randomBytes(32).toString('hex'))" COOKIE_SECRET= # Rate limit globale per IP RATE_LIMIT_MAX=300 RATE_LIMIT_WINDOW=1 minute # --- Autenticazione --- # Segreto HS256 degli access token (almeno 32 caratteri) JWT_SECRET= # Durata access token (secondi) e refresh token (giorni) ACCESS_TOKEN_TTL_SECONDS=900 REFRESH_TOKEN_TTL_DAYS=30 # Dominio padre del cookie di refresh per condividerlo tra sottodomini (es. .ititechnology.it); vuoto in sviluppo AUTH_COOKIE_DOMAIN= AUTH_COOKIE_SECURE=true # Limiti per IP: login/reset al minuto, route che inviano email ogni 15 minuti AUTH_LOGIN_RATE_MAX=5 AUTH_EMAIL_RATE_MAX=3 # URL dell'area privata (base dei link nelle email di verifica/reset) PRIVATE_APP_URL=http://localhost:4300 # Versione dell'informativa privacy salvata con i consensi PRIVACY_POLICY_VERSION=privacy-v1 # Destinatari delle notifiche interne (nuovo ordine), separati da virgola; vuoto = utenti admin attivi ADMIN_NOTIFY_EMAILS= # --- Storage file (disco) --- # Radice: contiene public/ (servita da Caddy) e private/ (mai servita staticamente, solo via API). # In produzione un percorso assoluto su volume Docker. UPLOAD_DIR=uploads # Dimensione massima di un upload in byte (25 MB) UPLOAD_MAX_BYTES=26214400 # URL pubblico dell'area public/ (in sviluppo la serve l'API stessa su /uploads) PUBLIC_UPLOADS_URL=http://localhost:3000/uploads # --- Email transazionali --- # Provider: console (solo log + EMAIL_OUTBOX_DIR), brevo, resend. Cambiare provider = cambiare queste variabili. EMAIL_PROVIDER=console # Mittente su dominio verificato presso il provider (obbligatorio con brevo/resend) EMAIL_FROM= EMAIL_FROM_NAME=ITI TECHNOLOGY EMAIL_REPLY_TO= # Chiave del provider scelto BREVO_API_KEY= RESEND_API_KEY= # Solo sviluppo: le email (adapter console) vengono salvate complete in questa cartella EMAIL_OUTBOX_DIR= # --- Medusa --- # URL del backend Medusa (in Docker: http://medusa:9000) e timeout di ogni chiamata in ms MEDUSA_URL=http://localhost:9000 MEDUSA_TIMEOUT_MS=5000 # Payment provider del checkout (Stripe registrato in medusa-config.ts con id "stripe") MEDUSA_PAYMENT_PROVIDER_ID=pp_stripe_stripe # Publishable API key del sales channel "Web": la stampa a console lo script seed # (in medusa/apps/backend: npx medusa exec ./src/scripts/seed-base.ts), riga MEDUSA_PUBLISHABLE_KEY=pk_... MEDUSA_PUBLISHABLE_KEY= # Segreto condiviso con Medusa per le route /internal/* (header x-internal-secret). Deve coincidere con # INTERNAL_API_SECRET in medusa/apps/backend/.env. Generare un valore casuale lungo (almeno 32 caratteri). INTERNAL_API_SECRET= # Segreto per verificare la firma HMAC-SHA256 (header x-signature) dei webhook Medusa su /webhooks/medusa. # Deve coincidere con WEBHOOK_SECRET in medusa/apps/backend/.env (almeno 32 caratteri). WEBHOOK_SECRET=