MongoDB
In questa guida installeremo MongoDB , un potente database NoSQL open-source sviluppato da MongoDB Inc. (precedentemente 10gen). Tramite un container Docker ufficiale, renderemo l’installazione semplice e portatile, ideale per self-hosting. Configureremo l’accesso sicuro, la persistenza dei dati e le basi per l’uso in applicazioni scalabili.
Cos’è MongoDB e Perchè
MongoDB è un database NoSQL orientato agli oggetti, progettato per gestire grandi volumi di dati non strutturati con flessibilità e alta performance. Nato nel 2007, si basa su documenti BSON (simili a JSON), permettendo schemi dinamici senza rigide strutture relazionali. È ideale per applicazioni web scalabili, IoT, analisi in tempo reale e e-commerce, dove la velocità di query e la scalabilità orizzontale sono cruciali. In alternativa, per esigenze relazionali più tradizionali, considera PostgreSQL o MySQL.
L’installazione tramite Docker offre isolamento, portabilità e facilità di gestione, rendendolo perfetto per ambienti self-hosted su server, NAS o VM. Questo approccio minimizza dipendenze host e accelera i deployment, con supporto nativo per replica set e sharding in configurazioni avanzate. Ecco i principali vantaggi e casi d’uso:
- Flessibilità dello schema: Adatta i dati in tempo reale senza migrazioni complesse, ideale per prototipi rapidi o app con dati eterogenei.
- Scalabilità orizzontale: Supporta distribuzioni su cluster per gestire terabyte di dati, con replica automatica per alta disponibilità.
- Prestazioni elevate: Query rapide su documenti nidificati, con indici geospatiali e aggregazioni per analisi big data.
- Integrazione self-hosting: Basso footprint su hardware limitato (es. Raspberry Pi), con persistenza dati garantita via volumi Docker.
- Sicurezza integrata: Autenticazione role-based e crittografia dati, essenziale per ambienti privati.
Installazione via Docker
Dopo aver installato Docker e Docker Compose sul server, procediamo con il deployment di MongoDB. La configurazione utilizza l’immagine ufficiale mongo:latest (aggiornata alla versione 8.0 al ottobre 2025), che include mongosh per l’accesso shell e supporta l’inizializzazione automatica con credenziali root. Il setup è declinato in due file: docker-compose.yaml per i servizi e .env per i secrets.
Creiamo il Docker Compose
Il file docker-compose.yaml definisce un servizio singolo per MongoDB, con mappatura della porta 27017 per connessioni esterne, un volume persistente per i dati (/data/db) e variabili d’ambiente per l’autenticazione root. Il container si riavvia automaticamente (unless-stopped), e il file .env è referenziato per caricare i secrets. Questo garantisce un ambiente isolato e scalabile.
services:
mongodb:
image: mongo:latest
container_name: mongodb
env_file: .env
ports:
- "27017:27017"
volumes:
- ./db/mongo:/data/db
environment:
MONGO_INITDB_ROOT_USERNAME: ${MONGO_ROOT_USER}
MONGO_INITDB_ROOT_PASSWORD: ${MONGO_ROOT_PWD}
restart: unless-stoppedPer avviare: crea la directory ./db/mongo (per persistenza), poi esegui docker compose up -d. Verifica con docker logs mongodb.
Definiamo i Secrets (.env)
Per la sicurezza, memorizza le credenziali in un file .env separato, non versionato (aggiungilo a .gitignore). Questo previene esposizioni accidentali. Sostituisci i valori di esempio con password complesse (almeno 12 caratteri, miste).
MONGO_ROOT_USER=root
MONGO_ROOT_PWD=M3g4P455w0rd_S3cur3!!!! note “Nota sulla sicurezza”
Usa password generate casualmente (es. con openssl rand -base64 32). Per produzione, abilita TLS/SSL e considera hashed passwords o segreti gestiti con Docker Secrets.
Code Explanation
Il file docker-compose.yaml è compatto ma robusto, focalizzato su semplicità e best practice. Ecco un riassunto dei componenti chiave:
- Image:
mongo:latest– Immagine ufficiale MongoDB, aggiornata regolarmente per patch di sicurezza e feature (es. supporto per MongoDB 8.0 con miglioramenti su query vector search). - Ports: Mappa la porta host 27017 alla interna, abilitando connessioni TCP da client esterni (es. Compass o app).
- Volumes: Monta
./db/mongosu/data/dbper persistenza; crea la directory host prima del deploy per evitare errori. - Environment: Inizializza l’utente root al primo avvio; successive esecuzioni ignorano se già configurato.
- Restart:
unless-stopped– Riavvia su crash o reboot host, ma non se fermato manualmente.
| Variabile d’Ambiente | Scopo | Valore Predefinito | Opzioni di Personalizzazione |
|---|---|---|---|
MONGO_INITDB_ROOT_USERNAME |
Username root per admin (obbligatorio con password). | Nessuno | Stringa alfanumerica; usa per autenticazione iniziale. |
MONGO_INITDB_ROOT_PASSWORD |
Password root (obbligatoria). | Nessuno | Stringa sicura; abilita auth all’avvio. Per disabilitare auth: ometti entrambe. |
MONGO_INITDB_DATABASE |
Database iniziale da creare (opzionale). | test |
Specifica un DB di default, es. mydatabase. |
Queste variabili sono processate solo al primo run; per cambiamenti, rimuovi il volume e riavvia.
Further Configurations
Una volta deployato, configura MongoDB per l’uso operativo. Accedi al container con docker exec -it mongodb bash, poi usa mongosh (shell moderna, sostituisce mongo deprecato). L’accesso iniziale richiede le credenziali root dal .env.
Nota sull’accesso iniziale: Connettiti via mongosh --host localhost --port 27017 -u ${MONGO_ROOT_USER} -p ${MONGO_ROOT_PWD} --authenticationDatabase admin. Accetta avvisi self-signed se TLS non configurato.
Accesso e Gestione Base
Entra nella shell per verificare e creare risorse:
# Connessione dalla host (installa mongosh localmente se necessario)
mongosh "mongodb://root:M3g4P455w0rd_S3cur3!@localhost:27017/admin?authSource=admin"
# Nella shell: visualizza databases
show dbs
# Crea un database e collezione di test
use myapp
db.users.insertOne({ name: "Test User", email: "test@example.com" })
db.users.find()Creazione di Utenti e Database Personalizzati
Per sicurezza, crea utenti dedicati (non usare root in app):
// Nella shell mongosh, come root
use admin
db.createUser({
user: "appuser",
pwd: "AppP455w0rd!",
roles: [{ role: "readWrite", db: "myapp" }]
})
// Esci e riconnettiti come appuser
exit
mongosh "mongodb://appuser:AppP455w0rd!@localhost:27017/myapp?authSource=admin"Backup e Monitoraggio
- Backup: Usa
mongodumpper esportazioni:docker exec mongodb mongodump --uri="mongodb://root:.../admin" --out=/data/db/backup. Monta un volume extra per storage. - Monitoraggio: Integra con tool come Prometheus (aggiungi exporter in Compose) o abilita logging esteso con
environment: MONGO_LOG: "verbose". - Scalabilità Avanzata: Per replica set, aggiungi servizi secondari nel Compose e configura
--replSet rs0nel comando init.
Per produzione, abilita TLS (certificati self-signed o Let’s Encrypt), firewall (es. ufw allow 27017 solo da IP trusted) e replica set per HA.
!!! note “Risoluzione Problemi Comuni”
- Connessione rifiutata: Verifica porta aperta (netstat -tuln | grep 27017), firewall disabilitato e credenziali corrette. Prova docker logs mongodb per errori auth.
- Perdita dati: Assicurati che ./db/mongo esista e sia scrivibile (chmod 755). Non rimuovere volumi durante test.
- Aggiornamenti: Esegui docker compose pull seguito da docker compose up -d. Backup prima per major version (es. 7.x a 8.0).
- Auth disabilitata: Se omessi env vars, abilita con --auth in un override command.
Per configurazioni enterprise, consulta la documentazione ufficiale MongoDB . Questa guida è basata su fonti aggiornate al ottobre 2025.