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 Engine 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.

yaml
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-stopped

Per 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).

bash
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/mongo su /data/db per 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:

bash
# 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):

javascript
// 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 mongodump per 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 rs0 nel 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.