Files
termanager2/.env.example
Francesco Picone fc8623f7db Posta configurabile dall'app, contatti dei proclamatori, conferma email
- Server di posta in Impostazioni (password cifrata, email di prova): se
  compilato prende il posto del .env; non si esporta e l'import XML non lo
  cancella. MAIL_SCHEME=tls nel .env.example non era valido per Laravel 11.
- Proclamatori con email e telefono facoltativi, cifrati, nell'XML e
  cancellati dall'anonimizzazione; il numero apre WhatsApp.
- Dopo l'assegnazione un riquadro in evidenza con il link del PDF,
  "Invia su WhatsApp" con il messaggio pronto e la scelta "inviato /
  non ancora", che resta finché non si sceglie.
- Conferma dell'email obbligatoria per tutti gli utenti, anche esistenti:
  email in italiano, link valido senza login, nuova conferma a ogni cambio
  di indirizzo, "Reinvia conferma" in Utenti. Senza conferma restano
  raggiungibili profilo, cambio password e, per l'admin, il server di
  posta; comando utenti:conferma-email per l'emergenza.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 17:12:31 +02:00

180 lines
7.1 KiB
Plaintext

# =============================================================================
# TerManager2 — configurazione
#
# Questo file e' l'UNICA fonte di configurazione: docker-compose.yml lo legge
# cosi' com'e' e non ridichiara nulla.
#
# In locale: cp .env.example .env e modifica quello che serve
# Su Dokploy: incolla queste variabili in Environment, il .env lo
# genera lui
#
# Le variabili marcate [OBBLIGATORIA] non hanno default: lo stack si rifiuta
# di partire senza.
# =============================================================================
# -----------------------------------------------------------------------------
# Applicazione
# -----------------------------------------------------------------------------
APP_NAME=TerManager2
APP_ENV=production
APP_DEBUG=false
APP_TIMEZONE=Europe/Rome
# [OBBLIGATORIA] Deve combaciare ESATTAMENTE con l'indirizzo da cui accedi,
# schema e porta inclusi. L'app rifiuta richieste con un Host diverso
# (protezione contro l'host header injection): un valore sbagliato da' 400
# su tutto.
#
# accesso per IP:porta -> http://192.0.2.10:8080
# accesso in locale -> http://localhost:8080
# dominio con HTTPS -> https://territori.example.org
APP_URL=http://192.0.2.10:8080
# [OBBLIGATORIA] Genera con: echo "base64:$(openssl rand -base64 32)"
# I dati personali dei proclamatori sono cifrati con questa chiave: se la
# perdi non sono piu' leggibili nemmeno avendo il backup del database.
# Conservala in un password manager.
# Una copia sta nel volume dello storage: se questo valore cambia e non
# coincide con la copia, il container si rifiuta di partire invece di rendere
# illeggibili i dati. Per un cambio voluto aggiungi APP_KEY_ROTATE=1 (la
# chiave vecchia viene conservata accanto alla copia), poi toglila.
APP_KEY=
LOG_CHANNEL=stderr
LOG_LEVEL=warning
# -----------------------------------------------------------------------------
# Primo avvio
# -----------------------------------------------------------------------------
# L'amministratore creato al primo deploy. Cambia la password dopo il login.
INITIAL_ADMIN_NAME=Amministratore
INITIAL_ADMIN_EMAIL=
INITIAL_ADMIN_PASSWORD=
# Lasciale cosi': esistono come via di fuga se qualcosa va storto.
RUN_MIGRATIONS=true
RUN_DB_SEED_ON_FIRST_START=true
ENSURE_INITIAL_ADMIN_ON_EMPTY_DB=true
# -----------------------------------------------------------------------------
# Database
# -----------------------------------------------------------------------------
# DB_HOST deve restare "mariadb": e' il nome del servizio in
# docker-compose.yml, non un indirizzo di rete.
DB_CONNECTION=mysql
DB_HOST=mariadb
DB_PORT=3306
DB_DATABASE=termanager2
DB_USERNAME=termanager2
# [OBBLIGATORIE] Genera con: openssl rand -base64 24
DB_PASSWORD=
DB_ROOT_PASSWORD=
# -----------------------------------------------------------------------------
# Redis — cache, sessioni, code
# -----------------------------------------------------------------------------
# Come sopra: "redis" e' il nome del servizio, non va cambiato.
REDIS_HOST=redis
REDIS_PORT=6379
# [OBBLIGATORIA] openssl rand -base64 24
REDIS_PASSWORD=
CACHE_STORE=redis
SESSION_DRIVER=redis
QUEUE_CONNECTION=redis
# -----------------------------------------------------------------------------
# Dimensione massima dei file caricati (MB)
# -----------------------------------------------------------------------------
# Governa insieme nginx (client_max_body_size), PHP (upload_max_filesize e
# post_max_size) e la validazione dell'applicazione: li genera l'entrypoint da
# questo unico valore, cosi' non possono andare fuori sincrono.
#
# Il file piu' grande che passa di qui e' il pacchetto di ripristino, che
# contiene tutti i PDF dei territori: con qualche centinaio di mappe si arriva
# facilmente a oltre un giga. Se un caricamento muore senza spiegazioni e la
# barra si pianta, e' quasi sempre questo il limite che si e' incontrato.
#
# Alzarlo non costa memoria: nginx accumula il corpo su disco e PHP lavora su un
# file temporaneo. Serve pero' spazio libero nel volume.
MAX_UPLOAD_MB=2048
# Renderer delle piantine (pagina "Piantine", solo amministratore).
#
# E' il container `map-renderer` del compose: il default punta gia' li' e non
# serve impostare niente. Le variabili esistono per chi volesse spostare il
# renderer altrove o allungare il tempo concesso a un singolo rendering
# (comprende il download delle tessere OSM non ancora in cache).
# MAP_RENDERER_URL=http://map-renderer:3000
# MAP_RENDERER_TIMEOUT=180
# DEVE essere false se accedi in HTTP (tipicamente per IP:porta).
#
# Con true, il cookie di sessione viene marcato "secure" e il browser non lo
# rimanda mai su una connessione HTTP: il login risponde 419 "Page Expired"
# e si torna alla schermata di accesso, senza spiegazioni.
#
# Attenzione: provandolo su http://localhost NON te ne accorgi, perche' i
# browser trattano localhost come contesto sicuro. Il problema salta fuori
# solo accedendo per IP.
#
# Mettilo a true quando servirai l'app in HTTPS dietro un dominio.
SESSION_SECURE_COOKIE=false
# -----------------------------------------------------------------------------
# Posta
# -----------------------------------------------------------------------------
# Il server di posta si configura di solito dall'applicazione (Impostazioni →
# Server di posta): se lì è compilato, questi valori vengono ignorati.
# Servono le email di conferma: senza posta gli utenti non possono confermare
# il loro indirizzo e il loro account non funziona.
#
# In produzione: SMTP esterno.
# In locale con --profile dev: MAIL_HOST=mailpit, MAIL_PORT=1025
# Per disattivare del tutto l'invio: MAIL_MAILER=log
#
# MAIL_SCHEME: vuoto (sceglie da solo: STARTTLS sulla 587, SSL sulla 465),
# oppure smtp / smtps. "tls" non è un valore valido con Laravel 11 e fa
# fallire ogni invio.
MAIL_MAILER=smtp
MAIL_HOST=
MAIL_PORT=587
MAIL_USERNAME=
MAIL_PASSWORD=
MAIL_SCHEME=
MAIL_FROM_ADDRESS=noreply@example.org
MAIL_FROM_NAME="${APP_NAME}"
# -----------------------------------------------------------------------------
# Porte esposte sull'host
# -----------------------------------------------------------------------------
# Per ogni servizio decidi separatamente SU QUALE INTERFACCIA ascoltare (_BIND)
# e SU QUALE PORTA (_PORT):
#
# 0.0.0.0 raggiungibile da fuori, cioe' da Internet se il server e'
# pubblico e non c'e' un firewall davanti
# 127.0.0.1 solo dalla macchina stessa; da remoto ci arrivi con un
# tunnel SSH: ssh -L 8080:127.0.0.1:8080 utente@server
# --- Applicazione ---
# Esposta, cosi' l'app risponde su http://IP-DEL-SERVER:8080
# Quando passerai a un dominio con HTTPS, rimetti APP_BIND=127.0.0.1: il
# traffico arrivera' dal reverse proxy sulla rete interna e la porta non
# servira' piu'.
APP_BIND=0.0.0.0
APP_PORT=8080
# --- Database ---
# Legato a localhost: per collegare un client grafico (DBeaver, TablePlus)
# apri un tunnel: ssh -L 3306:127.0.0.1:3306 utente@server
# Se la 3306 e' gia' occupata sull'host, cambia DB_PORT_HOST (es. 3307).
# Sconsigliato mettere DB_BIND=0.0.0.0: esporrebbe il database a Internet.
DB_BIND=127.0.0.1
DB_PORT_HOST=3306
# --- Mailpit (solo con --profile dev) ---
MAILPIT_BIND=127.0.0.1
MAILPIT_UI_PORT=8025