Installare WebODM e ODM su Ubuntu con Docker Engine

Intermedio Entrambe le linee 13 min di lettura

Ultimo aggiornamento:

Testato con: WebODM via Docker (repository github.com/WebODM/WebODM); ODM 3.6.0 e NodeODM via immagini opendronemap/odm e opendronemap/nodeodm; Ubuntu 22.04 / 24.04 LTS

In questa pagina

Perché Linux è la piattaforma di riferimento#

Su Linux Docker gira in modo nativo, senza la macchina virtuale che Docker Desktop richiede su Windows e macOS. Tutta la RAM e tutti i core del computer sono disponibili per il motore, non c'è un disco virtuale da 20 GB da allargare, e l'accelerazione GPU NVIDIA funziona direttamente. È il motivo per cui le workstation di studio e i server usano quasi sempre questa strada, ed è la stessa procedura che seguirai su un server in cloud, descritta nella guida server cloud o VPS.

Cosa installi dipende dalla linea. Le due linee, nate dalla separazione del 6 aprile 2026, hanno strade diverse su Linux.

WebODM / ODX

Il software è WebODM di UAV4GEO, dal repository github.com/WebODM/WebODM, con il motore ODX e il nodo NodeODX. Si clona con Git e si gestisce con lo script webodm.sh. Se hai istruzioni precedenti al 6 aprile 2026 che citano il repository di OpenDroneMap, sono superate: la guida sull'ecosistema del 2026 spiega cosa è cambiato e, più avanti, questa guida ti dice come migrare un'installazione esistente.

OpenDroneMap / ODM

Per la linea ODM esistono due vie. La prima è OpenDroneMap Desktop, l'interfaccia della nonprofit OpenDroneMap Inc. (un fork di WebODM): secondo opendronemap.org/download su Linux è "gratuito con installazione manuale"; la procedura non è riportata qui perché va verificata su docs.opendronemap.org, e la guida su OpenDroneMap Desktop raccoglie quanto dichiarato alla data. La seconda via, descritta in questa guida, usa le immagini Docker pubblicate dalla nonprofit: opendronemap/odm per il motore ODM da riga di comando e opendronemap/nodeodm per NodeODM, l'API di elaborazione con interfaccia web minima. Alla data di verifica la nonprofit non pubblica un repository open dell'interfaccia: l'indirizzo storico github.com/OpenDroneMap/WebODM reindirizza al repository di WebODM.

Il termine "Docker Engine" indica il servizio Docker da riga di comando, senza interfaccia grafica: è ciò che si installa su Linux. "Docker Desktop" è l'applicazione per Windows e Mac. Entrambi eseguono contenitori (container), cioè programmi impacchettati con tutte le loro dipendenze. I termini sono nel glossario.

Installazione#

Passo 1: aggiorna il sistema e installa Docker Engine#

Vale per entrambe le linee. Apri un terminale e aggiorna i pacchetti.

bash
sudo apt-get update && sudo apt-get upgrade

Installa poi Docker Engine seguendo la procedura ufficiale di Docker per Ubuntu, che aggiunge il repository di Docker e installa il motore insieme al plugin Docker Compose. Non riportiamo qui i comandi perché Docker li aggiorna di tanto in tanto e la pagina ufficiale è sempre corretta per la tua versione di Ubuntu. Evita il pacchetto docker.io dei repository di Ubuntu, spesso datato, e i pacchetti Snap: WebODM si aspetta la versione distribuita da Docker, e la stessa scelta è la più sicura anche per le immagini della linea ODM.

Al termine, docker --version deve rispondere con il numero di versione.

Passo 2: aggiungi il tuo utente al gruppo docker#

Vale per entrambe le linee. Per impostazione predefinita solo root può parlare con Docker, e sia lo script di WebODM sia un docker run fallirebbero con un errore di permessi. La documentazione di WebODM indica la soluzione: aggiungere il tuo utente al gruppo docker, poi uscire e rientrare nella sessione perché il cambiamento abbia effetto.

bash
sudo usermod -aG docker $USER
# uscire e rientrare nella shell
./webodm.sh start

L'ultima riga riguarda la linea WebODM e la eseguirai dopo il clone del passo 4; la riportiamo perché così compare nella documentazione. Dopo il nuovo accesso, docker ps senza sudo deve rispondere con un elenco, anche vuoto, e non con un errore di permessi. La pagina Docker sui passi post-installazione spiega le implicazioni di sicurezza di questa scelta: chi è nel gruppo docker ha, di fatto, privilegi equivalenti a root sulla macchina.

Passo 3: installa Git#

Serve alla linea WebODM per clonare il repository; per la linea ODM via immagini Docker non è necessario, ma non fa danni.

bash
sudo apt-get install git

Passo 4: scarica e avvia la tua linea#

Da qui le due linee divergono. Segui il blocco della tua linea; dal passo 5 in avanti il testo indica cosa vale per ciascuna.

WebODM / ODX

Spostati nella cartella in cui vuoi tenere l'installazione, per esempio la tua home, ed esegui i tre comandi, uno alla volta.

bash
git clone https://github.com/WebODM/WebODM --config core.autocrlf=input --depth 1
cd WebODM
./webodm.sh start

L'opzione --config core.autocrlf=input è pensata per Windows e su Linux non cambia nulla, ma tenerla rende il comando identico su ogni sistema. --depth 1 scarica solo l'ultima versione senza la cronologia.

Il primo ./webodm.sh start scarica le immagini Docker con prefisso webodm/, diversi gigabyte, e avvia i contenitori: database PostgreSQL, coda dei messaggi, applicazione web e nodo di elaborazione NodeODX. Vedrai scorrere i log per alcuni minuti. L'avvio è completo quando compaiono le righe che indicano l'applicazione in ascolto.

Terminale Ubuntu con l'output di webodm.sh start durante il download delle immagini
Il primo avvio di WebODM: download delle immagini Docker e avvio dei contenitori.
OpenDroneMap / ODM

Per il motore ODM da riga di comando, crea una cartella di progetto con le foto nella sottocartella images (per esempio /home/utente/datasets/progetto/images) ed esegui:

bash
docker pull opendronemap/odm
docker run -ti --rm -v /home/utente/datasets:/datasets opendronemap/odm --project-path /datasets progetto

Il pull scarica l'immagine (diversi gigabyte). Il run elabora le foto e scrive gli output nelle sottocartelle del progetto, poi termina; con --rm il contenitore viene rimosso, i dati restano nella cartella montata. Le opzioni di elaborazione si aggiungono in coda: la guida ODM da riga di comando spiega la sintassi. La documentazione ODM descrive anche un'installazione nativa su Ubuntu 24.04 con bash configure.sh install dal repository github.com/OpenDroneMap/ODM: è una strada per chi sviluppa o non vuole Docker, da verificare su docs.opendronemap.org.

Per un nodo di elaborazione sempre attivo, con interfaccia web minima e API REST, avvia NodeODM:

bash
docker pull opendronemap/nodeodm
docker run -d -p 3000:3000 --restart unless-stopped opendronemap/nodeodm

La porta 3000 è quella storica di NodeODM e --restart unless-stopped fa ripartire il contenitore al boot insieme a Docker: verifica nel README dell'immagine su Docker Hub e su docs.opendronemap.org porta, opzioni di avvio (per esempio il numero massimo di lavori paralleli e la cartella dei dati) e sintassi aggiornata prima di affidarti a questi comandi.

Terminale Ubuntu con l'output di docker pull opendronemap/odm e l'avvio di NodeODM
Il primo download delle immagini della linea ODM e l'avvio del contenitore NodeODM.

Passo 5: apri l'interfaccia#

WebODM / ODX

Dal browser della stessa macchina apri http://localhost:8000. Da un altro computer della rete locale usa l'indirizzo IP della macchina Ubuntu, per esempio http://192.168.1.50:8000, purché il firewall lo consenta. Crea l'utente amministratore e verifica nel menu dei nodi di elaborazione che il nodo locale sia online.

Pagina di primo accesso a WebODM con la creazione dell'utente amministratore
Il primo accesso a WebODM: creazione dell'amministratore.
OpenDroneMap / ODM

Con ODM da riga di comando non c'è un'interfaccia: gli output sono nella cartella del progetto, pronti per QGIS. Con NodeODM apri http://localhost:3000 (o l'IP della macchina seguito dalla porta pubblicata, dalla rete locale): l'interfaccia web minima permette di caricare immagini, avviare un lavoro e scaricare gli output, senza utenti né progetti. Non c'è un account da creare: chi raggiunge la porta può usare il nodo, quindi non esporla oltre la rete locale senza le cautele descritte nella guida su NodeODM e ClusterODM.

Interfaccia web minima di NodeODM con il modulo di caricamento immagini
L'interfaccia web di NodeODM su Ubuntu.

Interfaccia WebODM con nodo NodeODM della nonprofit#

Alcuni lettori vogliono l'interfaccia completa di WebODM e, come nodo di calcolo, il NodeODM della nonprofit con il motore ODM, per esempio per confrontare i due motori dallo stesso pannello. Tecnicamente è possibile: avvii WebODM come nel blocco della linea WebODM, avvii NodeODM come nel blocco della linea ODM su una porta diversa da quelle usate da WebODM, e aggiungi il nodo dal menu Processing Nodes di WebODM indicando indirizzo e porta.

Archivio progetti su un disco dedicato#

È la configurazione adatta a chi lavora sul serio, e va decisa subito. Il principio vale per entrambe le linee: i dati vanno su un disco capiente, i file temporanei su un disco veloce. Il modo di ottenerlo è diverso.

WebODM / ODX

WebODM distingue due cartelle: la media dir, dove conserva in modo permanente immagini, file intermedi e output di tutti i progetti, e la node dir, dove il nodo di elaborazione scrive i file temporanei mentre calcola. Per impostazione predefinita entrambe vivono in volumi Docker sul disco di sistema, che su molte macchine è un SSD piccolo.

Con l'opzione --media-dir sposti l'archivio su un disco più grande; con --node-dir sposti i file temporanei, che beneficiano di un disco veloce. Supponendo di aver montato un disco dedicato su /storage, il comando è questo.

bash
./webodm.sh restart --media-dir /storage/media --node-dir /storage/node

Le due cartelle devono esistere ed essere scrivibili. Due regole della documentazione: la media dir non va spostata dopo l'inizializzazione, perché il database memorizza i percorsi dei file; la node dir invece si può spostare quando vuoi, perché contiene solo file temporanei. Per questo conviene scegliere il disco dell'archivio prima di caricare il primo progetto. Se lo fai su un'installazione già in uso, la guida su aggiornare, fare backup e ripristinare spiega come salvare e ripristinare i volumi.

Le opzioni passate a restart valgono per quell'avvio: ricordati di ripeterle ogni volta che riavvii, oppure inseriscile nel servizio di avvio automatico descritto sotto.

OpenDroneMap / ODM

Con ODM da riga di comando decidi tu dove stanno i dati: è la cartella che monti con -v, quindi basta creare la cartella dei dataset sul disco dedicato (per esempio /storage/datasets) e indicarla nel comando. Con NodeODM i lavori e i file temporanei vivono dentro il contenitore, a meno che non monti un volume o una cartella dell'host: il README dell'immagine opendronemap/nodeodm indica quale percorso interno montare e con quali opzioni; verificalo su Docker Hub e su docs.opendronemap.org prima di caricare dati importanti, perché senza volume i lavori si perdono quando il contenitore viene rimosso.

Una scelta sensata, per entrambe, è un SSD per sistema e file temporanei, e un disco capiente, anche meccanico, per l'archivio.

Avvio automatico al riavvio#

Dopo un riavvio della macchina vuoi che tutto torni disponibile senza intervento. Il servizio Docker Engine si avvia da solo al boot se è abilitato in systemd, cosa che l'installazione ufficiale fa per impostazione predefinita; puoi verificarlo con systemctl is-enabled docker. I contenitori, a loro volta, ripartono con Docker solo se hanno una restart policy (per esempio unless-stopped o always).

WebODM / ODX

Hai due strade, e conviene capirle entrambe.

La prima si affida a Docker. Controlla nel file docker-compose.yml della cartella WebODM quale restart policy è impostata per i servizi: se è presente, i contenitori riprendono al boot con le stesse opzioni dell'ultimo avvio. Non affidarti a questo comportamento senza averlo verificato con un riavvio di prova.

La seconda strada, più esplicita, è un servizio systemd che esegue webodm.sh start all'avvio e webodm.sh stop allo spegnimento. Ha il vantaggio di fissare le opzioni, come --media-dir, in un solo posto. Questo è un esempio da adattare: sostituisci utente con il tuo nome utente e i percorsi con i tuoi.

ini
[Unit]
Description=WebODM
After=docker.service
Requires=docker.service

[Service]
Type=oneshot
RemainAfterExit=yes
User=utente
WorkingDirectory=/home/utente/WebODM
ExecStart=/home/utente/WebODM/webodm.sh start --media-dir /storage/media --node-dir /storage/node
ExecStop=/home/utente/WebODM/webodm.sh stop

[Install]
WantedBy=multi-user.target

Salvalo come /etc/systemd/system/webodm.service, poi ricarica systemd e abilita il servizio.

bash
sudo systemctl daemon-reload
sudo systemctl enable --now webodm.service

Da questo momento sudo systemctl status webodm ti dice se il servizio è attivo e sudo journalctl -u webodm mostra i log dell'avvio. Se preferisci gestire WebODM a mano con ./webodm.sh, ferma prima il servizio con sudo systemctl stop webodm, per evitare che i due metodi si sovrappongano. Il file di unità è un esempio nostro, non parte della documentazione ufficiale: verifica che webodm.sh start sulla tua versione ritorni il controllo al termine dell'avvio; se restasse in primo piano a mostrare i log, cambia Type=oneshot in Type=simple e rimuovi RemainAfterExit.

OpenDroneMap / ODM

Per NodeODM basta la restart policy di Docker: se hai avviato il contenitore con --restart unless-stopped, come nel passo 4, riparte con Docker a ogni boot finché non lo fermi tu con docker stop. Verifica con un riavvio di prova e con docker ps. ODM da riga di comando non ha nulla da avviare al boot: ogni elaborazione è un comando che lanci tu.

Gestire l'installazione#

WebODM / ODX

Tutti i comandi si eseguono nella cartella WebODM.

bash
./webodm.sh stop
./webodm.sh update
./webodm.sh start && ./webodm.sh resetadminpassword nuovapassword
./webodm.sh down

stop ferma i contenitori conservando i dati; update scarica codice e immagini aggiornate; resetadminpassword reimposta la password dell'amministratore con WebODM in esecuzione; down ferma e rimuove i contenitori lasciando intatti i volumi. Altre opzioni di restart utili su Linux sono --gpu, che richiede driver NVIDIA e NVIDIA Container Toolkit (guida GPU NVIDIA), --ssl --hostname per HTTPS con Let's Encrypt su una macchina raggiungibile da internet (guida server cloud), --ipv6 e --with-micmac.

Se stai migrando un'installazione clonata dal repository di OpenDroneMap prima del 6 aprile 2026, i comandi sono due.

bash
git remote set-url origin https://github.com/WebODM/WebODM.git
./webodm.sh update

I dati restano nei volumi. Fai prima un backup con la procedura della guida dedicata.

OpenDroneMap / ODM

Non c'è uno script: usi Docker. Per aggiornare il motore o il nodo ripeti docker pull dell'immagine e, per NodeODM, ricrea il contenitore (docker stop, docker rm, poi di nuovo docker run). docker ps mostra i contenitori attivi, docker logs seguito dal nome del contenitore mostra i log del nodo. Se avevi un'installazione di WebODM clonata prima del 6 aprile 2026 e vuoi passare alla linea ODM, non esiste un comando di migrazione: la guida Repository, immagini Docker e migrazioni spiega come esportare i progetti e come tenere le due linee affiancate.

Come verificare

L'installazione è riuscita se:

  1. docker ps elenca i contenitori in stato "Up", senza bisogno di sudo: quelli di WebODM per la linea WebODM, quello di NodeODM per la linea ODM.
  2. Linea WebODM: http://localhost:8000 mostra la pagina di accesso e il nodo locale è online. Linea ODM: NodeODM risponde sulla porta pubblicata, oppure docker run di ODM termina senza errori.
  3. Un progetto di prova con una ventina di foto, per esempio da un dataset di prova, viene elaborato fino alla fine.
  4. Se hai configurato un disco dedicato (--media-dir per WebODM, cartella montata con -v per la linea ODM), dopo l'elaborazione la cartella indicata contiene i file del progetto.
  5. Dopo un riavvio della macchina, l'interfaccia o il nodo tornano raggiungibili senza intervento.
  6. Nel log dell'elaborazione compare la versione del motore: ODX per la linea WebODM, ODM 3.6.0 per la linea ODM alla data di verifica.

Problemi frequenti#

"permission denied" parlando con Docker. L'utente non è nel gruppo docker, o non sei ancora uscito e rientrato dopo usermod. Ripeti il passo 2. Vale per entrambe le linee.

"Out of memory" durante l'elaborazione. Su Linux non c'è un limite di Docker Desktop da alzare: la RAM è quella fisica. Riduci il dataset, ridimensiona le immagini o abbassa la qualità, come nella guida su tempi e memoria, oppure aumenta la RAM. Vale per ODX e per ODM.

"No space left on device". Il disco di sistema è pieno di immagini Docker e progetti. Sposta l'archivio su un disco dedicato (--media-dir per WebODM, cartella montata per la linea ODM) e rimuovi i progetti di prova.

Porta 8000 o 3000 occupata o non raggiungibile dalla rete. Verifica con ss -ltnp chi usa la porta e controlla le regole del firewall (ufw). La guida agli errori comuni tratta entrambi i casi. Per NodeODM puoi cambiare il primo numero in -p.

ODM da riga di comando non trova le immagini. Le foto non sono nella sottocartella images del progetto, oppure il percorso passato a -v è sbagliato. Controlla con ls prima di lanciare il contenitore.

Dopo il riavvio WebODM non parte. Controlla systemctl status docker e, se hai creato il servizio, systemctl status webodm e il relativo journal. Per NodeODM, controlla che il contenitore abbia la restart policy con docker inspect.

Prossimi passi#

Fonti

Guide correlate