
Excalidraw è una lavagna virtuale open source, distribuita con licenza MIT, pensata per creare in modo rapido diagrammi, schizzi e wireframe con un caratteristico stile “disegnato a mano”.
A differenza degli strumenti di diagrammistica tradizionali, dove la precisione formale è spesso richiesta fin da subito, Excalidraw punta sull’informalità del tratto: questo lo rende particolarmente adatto alle fasi di brainstorming, alla progettazione rapida di flussi e architetture di sistema, o semplicemente a spiegare un’idea con pochi tratti essenziali, senza la rigidità di strumenti come UML o BPMN.
Il progetto, scritto in TypeScript e React, è sviluppato attivamente ed è oggi uno dei punti di riferimento tra le alternative open source a strumenti come Miro o FigJam.
Uno degli aspetti che rende Excalidraw interessante per un’organizzazione è proprio la possibilità di self-hosting: l’applicazione può essere eseguita interamente sui propri server tramite container Docker, mantenendo così pieno controllo sui dati e sui diagrammi prodotti, senza dipendere da un servizio cloud di terze parti né dover condividere contenuti potenzialmente sensibili (schemi di rete, architetture applicative, processi interni) al di fuori della propria infrastruttura.
Va però precisato un dettaglio tecnico non sempre evidente: l’immagine Docker ufficiale distribuita dal progetto fornisce solo l’editor client, mentre le funzionalità di collaborazione in tempo reale (più utenti che disegnano contemporaneamente sulla stessa lavagna) richiedono componenti aggiuntivi, come il servizio excalidraw-room per il canale WebSocket e un backend di storage per il salvataggio delle scene condivise.
Nella pratica, un self-hosting completo si realizza tipicamente componendo più container tramite Docker Compose.
In questo articolo vedremo come installare e configurare Excalidraw in versione base su un sistema Ubuntu Server 26.04, utilizzando Docker Engine per l’esecuzione dei container: dalla preparazione dell’ambiente Docker fino all’avvio della lavagna, con l’obiettivo di ottenere un’istanza funzionante e pronta all’uso.
PREREQUISITI
- Server con Ubuntu Server 26.04 LTS appena installato, accesso sudo o root via SSH.
- Risorse minime: 1 vCPU, 1 GB di RAM, 5 GB di spazio disco (l’app è molto leggera, ~40 MB l’immagine).
- Un dominio che punti all’IP del server (consigliato: Excalidraw usa WebSocket per la collaborazione live, che funziona meglio dietro HTTPS).
- Firewall con le porte 22 (SSH), 80 (HTTP) e 443 (HTTPS) raggiungibili.
AGGIORNAMENTO DEL SISTEMA
Aggiornare il sikstema con i seguenti comandi:
|
0
1
2
3
4
5
6
|
sudo apt update && sudo apt upgrade -y
sudo apt install -y ca-certificates curl ufw
sudo ufw allow OpenSSH
sudo ufw enable
|
NOTA PRELIMINARE
Excalidraw non ha un metodo di installazione “tradizionale” (niente PHP/MySQL): il progetto distribuisce un’immagine Docker ufficiale ed è il modo supportato per self-hostarlo.
Questa guida usa Docker + Apache come reverse proxy HTTPS.
INSTALLAZIONE DI DOCKER ENGINE
Per l’installazione di Docker eseguire i comandi:
|
0
1
2
3
4
5
6
|
sudo apt remove -y docker.io docker-doc docker-compose podman-docker containerd runc 2>/dev/null
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
|
|
0
1
2
3
4
5
6
7
|
sudo tee /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF
|
|
0
1
2
3
4
|
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo systemctl enable --now docker
sudo usermod -aG docker $USER
newgrp docker
|
NOTA BENE: se sudo apt update restituisce un errore sul repository Docker (può succedere nei primi mesi dopo l’uscita di una nuova versione LTS, se Docker non ha ancora pubblicato i pacchetti per il codename “resolute”), sostituisci temporaneamente il valore di Suites con noble nel file /etc/apt/sources.list.d/docker.sources: i pacchetti di Ubuntu 24.04 sono compatibili.
AVVIO DEL CONTAINER EXCALIDRAW
Usare Docker Compose per gestire il servizio in modo ordinato:
|
0
1
2
|
sudo mkdir -p /opt/excalidraw
sudo nano /opt/excalidraw/docker-compose.yml
|
Quindi copiare all’interno del file il seguente output:
|
0
1
2
3
4
5
6
|
services:
excalidraw:
image: excalidraw/excalidraw:latest
container_name: excalidraw
restart: unless-stopped
ports:
- "127.0.0.1:5000:80"
|
NOTA BENE: Il container ascolta solo su localhost: sarà Apache a esporlo pubblicamente in HTTPS
|
0
1
2
|
cd /opt/excalidraw
sudo docker compose up -d
|
Dovremmo visualizzare un output simile al seguente:
|
0
1
2
3
|
[+] up 13/13
✔ Image excalidraw/excalidraw:latest Pulled 4.1s
✔ Network excalidraw_default Created 0.0s
✔ Container excalidraw Started
|
VERIFICA LOCALE
Fare una verifica con i seguenti comandi:
|
0
1
2
|
sudo docker ps
curl -I http://127.0.0.1:5000
|
Il primo comando deve mostrare il container excalidraw in stato Up:
|
0 |
2f8a6f688111 excalidraw/excalidraw:latest "/docker-entrypoint.…" 51 seconds ago Up 50 seconds (healthy) 127.0.0.1:5000->80/tcp excalidraw
|
il secondo deve restituire HTTP/1.1 200 OK:
|
0
1
2
3
4
5
6
7
8
|
HTTP/1.1 200 OK
Server: nginx/1.27.5
Date: Thu, 27 Aug 2026 12:31:08 GMT
Content-Type: text/html
Content-Length: 6843
Last-Modified: Wed, 06 May 2026 21:19:55 GMT
Connection: keep-alive
ETag: "69fbb07b-1abb"
Accept-Ranges: bytes
|
INSTALLAZIONE DI APACHE COME REVERSE PROXY
Installare Apache come Reverse Proxy con i seguenti comandi:
|
0
1
2
3
4
5
6
|
sudo apt install -y apache2
sudo a2enmod proxy proxy_http proxy_wstunnel headers rewrite
sudo systemctl restart apache2
sudo ufw allow "Apache Full"
|
NOTA BENE: I moduli proxy_http e proxy_wstunnel sono necessari perché Excalidraw usa WebSocket per la modalità collaborativa.
VIRTUAL HOST DI APACHE
Configurare il Virtual Host di Apache editando il file con il comando:
|
0 |
sudo nano /etc/apache2/sites-available/excalidraw.conf
|
Copiare il seguente output:
|
0
1
2
3
4
5
6
7
8
9
|
<VirtualHost *:80>
ServerName draw.tuodominio.org
ProxyPreserveHost On
ProxyPass / http://127.0.0.1:5000/
ProxyPassReverse / http://127.0.0.1:5000/
ErrorLog ${APACHE_LOG_DIR}/excalidraw_error.log
CustomLog ${APACHE_LOG_DIR}/excalidraw_access.log combined
</VirtualHost>
|
ATTENZIONE: Sostituire draw.tuodominio.org con il tuo dominio
Attivare il sito con i comandi:
|
0
1
2
3
4
|
sudo a2ensite excalidraw.conf
sudo a2dissite 000-default.conf
sudo systemctl reload apache2
|
HTTPS CON LET’S ENCRYPT
Attivare HTTPS con Let’s Encrypt con i seguenti comandi:
|
0
1
2
3
4
|
sudo apt install -y certbot python3-certbot-apache
sudo certbot --apache -d draw.tuodominio.org
sudo certbot renew --dry-run
|
ACCESSO VIA WEB GUI
A questo punto è possibile richiamare da un qualsiasi browser il link http://draw.tuodominio.org
Se è andato tutto a buon fine dovremmo visualizzare la lavagna virtuale come mostrato nell’immagine sovrastante
GESTIONE DEL CONTAINER
Alcuni comandi utili per la manutenzione ordinaria, da eseguire in /opt/excalidraw:
|
0
1
2
3
4
5
6
|
sudo docker compose logs -f # log in tempo reale
sudo docker compose pull # scarica un aggiornamento dell'immagine
sudo docker compose up -d # riavvia con la nuova immagine
sudo docker compose down # ferma il servizio
|
Grazie a restart: unless-stopped e a docker abilitato come servizio di sistema, il container riparte automaticamente anche dopo un riavvio del server.
COLLABORAZIONE IN TEMPO REALE (OPZIONALE-AVANZATO)
Va detto con chiarezza: l’immagine ufficiale excalidraw/excalidraw è una build statica che, per la funzione “Live collaboration”, punta al server pubblico gratuito di Excalidraw (oss-collab.excalidraw.com). Questo continua a funzionare anche su un’istanza self-hosted, e i dati della sessione restano comunque cifrati end-to-end lato client.
Se invece vuoi che tutto il traffico di collaborazione resti sul tuo server, serve affiancare il servizio ufficiale excalidraw/excalidraw-room e ricompilare il frontend da sorgente con la variabile VITE_APP_WS_SERVER_URL impostata sul tuo dominio: nell’immagine pre-costruita questo indirizzo è “congelato” nel bundle JavaScript in fase di build, non è configurabile a runtime con una semplice variabile d’ambiente.
Per questo motivo esula da una configurazione “base”: richiede una build Node.js personalizzata del frontend.
Se vuoi comunque provare il solo servizio di relay (utile se in futuro ricompili il frontend), il pezzo di configurazione è:
|
0
1
2
3
4
5
|
excalidraw-room:
image: excalidraw/excalidraw-room:latest
container_name: excalidraw-room
restart: unless-stopped
ports:
- "127.0.0.1:5001:80"
|
con un secondo Virtual Host Apache su un sottodominio dedicato (es. collab.tuodominio.org) che inoltra sia le richieste HTTP sia l’upgrade WebSocket verso 127.0.0.1:5001.
SALVATAGGIO E BACKUP
L’immagine base non include un database né uno storage lato server: ogni disegno viene salvato automaticamente solo nel localStorage del browser di chi lo sta usando.
Non c’è quindi nulla da backuppare sul server in questa configurazione base vale però la pena avvisare gli utenti di esportare periodicamente i lavori importanti da File → Esporta (formato .excalidraw o immagine), perché cancellare i dati del browser equivale a perdere il disegno.
PRO E CONTRO
PRO
- Gratuito, open source e senza registrazione: licenza MIT, nessun costo di licenza né account da creare per iniziare a disegnare.
- Interfaccia essenziale e curva di apprendimento minima: canvas pulito, tante scorciatoie da tastiera, adatto a chi vuole buttare giù un’idea senza distrazioni.
- Stile “disegnato a mano” efficace per l’informalità: perfetto per brainstorming, wireframe rapidi e schemi di architettura da usare in fase di discussione, senza la rigidità di strumenti UML/BPMN.
- Leggero ed embeddabile: distribuito anche come pacchetto React (@excalidraw/excalidraw), è integrabile in altre applicazioni ed esiste come plugin/estensione in strumenti come Obsidian e VS Code.
- Controllo completo dei dati con il self-hosting: eseguendolo su propri container Docker, i diagrammi (anche quelli che rappresentano schemi di rete o architetture interne) restano sulla propria infrastruttura invece che su un servizio cloud di terze parti.
- Esportazione flessibile: i lavori possono essere esportati in PNG, SVG o nel formato nativo .excalidraw per backup o condivisione manuale.
CONTRO
- Non adatto a diagrammi formali complessi: manca di funzionalità per notazioni rigorose come UML, ER o BPMN, ed è meno indicato per presentazioni che richiedono un aspetto grafico curato e “pulito”.
- Persistenza limitata nella versione self-hosted di base: senza un backend di storage dedicato, i disegni vengono salvati solo localmente nel browser (localStorage/IndexedDB); svuotando i dati del browser si perde tutto ciò che non è stato esportato manualmente.
- Collaborazione in tempo reale non inclusa “di serie”: l’immagine Docker ufficiale fornisce solo l’editor; abilitare la collaborazione multi-utente richiede componenti aggiuntivi (excalidraw-room, backend di storage) e una configurazione più articolata via Docker Compose.
- Nessuna condivisione tramite link diretto: a differenza della versione pubblica excalidraw.com, l’istanza self-hosted non genera link di condivisione: la distribuzione dei lavori avviene esportando e inviando manualmente i file.
- Dipendenza da accesso HTTPS in uscita per le librerie della community: in ambienti isolati o air-gapped questa funzionalità non è disponibile senza interventi manuali.
- Versionamento dell’immagine Docker poco strutturato: sono disponibili solo i tag latest o basati sull’hash del commit, senza versioning semantico, il che rende più delicata la gestione degli aggiornamenti in un ambiente di produzione.

0 Commenti