Guida alla Configurazione Docker Compose di Dify
Tutto quello che devi sapere sull'architettura Docker di Dify — da cosa fa ogni container all'hardening del tuo deployment per la produzione con configurazioni personalizzate.
L'Architettura Docker di Dify
Il file docker-compose.yaml di Dify avvia otto servizi. Capire cosa fa ognuno ti aiuta a configurare, risolvere i problemi e scalare il tuo deployment.
nginx Reverse proxy / web server Instrada le richieste HTTP in arrivo al servizio interno corretto (UI web o API). Questo è l'unico container che deve essere accessibile pubblicamente.
api Server API Dify Il backend principale Python/Flask. Gestisce tutta la logica di business, le chiamate LLM, l'esecuzione della pipeline RAG e gli endpoint REST API.
worker Worker Celery in background Elabora task asincroni: indicizzazione documenti, importazione dataset, catene LLM a lunga esecuzione. Condivide il codice con il container API.
web Frontend Next.js L'interfaccia utente basata su React servita come app Next.js. Comunica con il container API.
db Database PostgreSQL Memorizza tutti i dati persistenti: app, conversazioni, metadati dei dataset, utenti e chiavi API.
redis Cache e message broker Mette in cache le query frequenti, memorizza la coda dei task Celery per il worker e gestisce i dati di rate-limiting.
weaviate Database vettoriale Memorizza gli embedding dei documenti per le knowledge base RAG. Il consumer di memoria più pesante. Può essere sostituito con pgvector o Qdrant.
sandbox Sandbox per l'esecuzione del codice Container isolato per eseguire nodi di codice definiti dall'utente nei workflow Dify. Viene eseguito con permessi limitati.
RAM totale di base: ~1,5 GB solo per i container inattivi. Su un server da 4GB, questo lascia ~2,5 GB per il sistema operativo e i carichi di lavoro effettivi. Per la produzione, si raccomandano 8GB di RAM.
Guida alle Variabili d'Ambiente
Tutta la configurazione di Dify si trova in dify/docker/.env. Copia da .env.example e personalizza queste impostazioni chiave:
Sicurezza (Obbligatorio)
# Genera con: openssl rand -base64 42
SECRET_KEY=your-very-long-random-secret-key
# Chiave di cifratura per i dati sensibili memorizzati
# Genera con: openssl rand -hex 16
ENCRYPT_IV=your-16-char-hex-value Impostazioni del Database
# Impostazioni PostgreSQL (rete Docker interna)
DB_USERNAME=postgres
DB_PASSWORD=change-this-strong-password
DB_HOST=db
DB_PORT=5432
DB_DATABASE=dify
# Impostazioni Redis
REDIS_HOST=redis
REDIS_PORT=6379
REDIS_PASSWORD=change-this-redis-password
REDIS_DB=0 Impostazioni URL & CORS
# Il tuo dominio (senza slash finale)
CONSOLE_URL=https://tuo-dominio.com
APP_URL=https://tuo-dominio.com
SERVICE_API_URL=https://tuo-dominio.com
# Origini CORS (separate da virgola)
CONSOLE_CORS_ALLOW_ORIGINS=https://tuo-dominio.com
WEB_API_CORS_ALLOW_ORIGINS=https://tuo-dominio.com Archiviazione File
# Predefinito: filesystem locale (memorizzato in ./volumes/app/storage)
STORAGE_TYPE=local
# Per lo storage compatibile S3 (consigliato per la produzione)
# STORAGE_TYPE=s3
# S3_ENDPOINT=https://s3.amazonaws.com
# S3_BUCKET_NAME=my-dify-bucket
# S3_ACCESS_KEY=your-access-key
# S3_SECRET_KEY=your-secret-key
# S3_REGION=us-east-1 Chiavi API LLM (opzionale durante la configurazione)
# Puoi anche configurare queste nella UI web di Dify
# Queste impostazioni .env pre-configurano i provider al primo avvio
OPENAI_API_KEY=sk-your-openai-key
ANTHROPIC_API_KEY=sk-ant-your-key
GOOGLE_API_KEY=your-gemini-key
# Per Ollama (LLM locali)
# Configura nell'UI: Impostazioni → Provider Modello → Ollama Configurazioni Personalizzate
Mappatura Porte Personalizzata
Se la porta 80 è occupata, cambia la porta host a cui si collega Nginx di Dify modificando .env:
# Cambia la porta host del container Nginx
EXPOSE_NGINX_PORT=8080
EXPOSE_NGINX_SSL_PORT=8443 Disabilita Weaviate (usa pgvector invece)
Weaviate utilizza ~500MB di RAM. Sui server con poca memoria, passa a pgvector (già disponibile nel container PostgreSQL):
# In .env — passa il vector store a pgvector
VECTOR_STORE=pgvector
# Poi riavvia senza Weaviate
docker compose up -d --scale weaviate=0 Abilita Supporto GPU
Per passare attraverso una GPU NVIDIA (per i modelli di embedding locali), aggiungi il runtime GPU al tuo docker-compose.override.yaml:
services:
api:
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: all
capabilities: [gpu] Vedi la guida al GPU hosting per le istruzioni complete.
Comandi Comuni
docker compose up -d docker compose down docker compose restart api docker compose logs -f api worker docker compose exec api bash docker compose ps docker stats docker compose down --remove-orphans docker compose pull docker compose up -d --build api Risoluzione dei Problemi
Il container continua a riavviarsi / CrashLoopBackOff
Controlla i log: docker compose logs api. Di solito causato da un formato SECRET_KEY errato o una variabile d'ambiente obbligatoria mancante. Assicurati che SECRET_KEY abbia almeno 32 caratteri.
Memoria esaurita — container terminati dall'OOM killer
Aggiungi spazio di swap e/o aggiorna a un server più grande. Esegui dmesg | grep -i "killed process" per confermare le terminazioni OOM. Il container weaviate è solitamente il colpevole — considera di passare a pgvector.
Errori di connessione al database
Assicurati che il container DB sia sano prima che l'API si avvii: docker compose ps db. L'API ha un depends_on con health check, ma sui server lenti il DB potrebbe non finire di inizializzarsi in tempo. Prova docker compose restart api.
Errori di permesso negato su ./volumes
La directory del volume di archiviazione necessita dei permessi corretti. Esegui: sudo chown -R 1000:1000 ./volumes dalla directory dify/docker.
Hardening per la Produzione
Prima di andare in produzione, applica queste misure di sicurezza:
1. Cambia tutte le password predefinite
Imposta valori univoci e sicuri per DB_PASSWORD, REDIS_PASSWORD e soprattutto SECRET_KEY. Non usare mai i valori predefiniti di .env.example in produzione.
2. Proteggi il file .env
chmod 600 dify/docker/.env
# Non eseguire mai il commit di .env nel controllo versione 3. Abilita i backup automatici
Aggiungi al crontab (crontab -e):
0 3 * * * cd ~/dify/docker && docker compose exec -T db pg_dump -U postgres dify > ~/backups/dify_$(date +\%Y\%m\%d).sql 4. Usa S3 per l'archiviazione dei file
Passa a STORAGE_TYPE=s3 così i documenti caricati vengono memorizzati separatamente dal tuo server e sopravvivono alle ricostruzioni dei container.