Bentrovati amici smart!
Nel video precedente, abbiamo completato la configurazione per connetterci al Raspberry Pi da remoto e prepararlo all'installazione dei servizi di cui avremo bisogno.
Oggi finalmente daremo il via alla creazione della nostra infrastruttura di micro servizi, primo tra tutti HomeAssistant, installando e servendoci di Docker. Come già ampiamente discusso nel video dedicato, Docker è un software OpenSource, da installare sul nostro sistema operativo, che permette di creare, distribuire e gestire applicativi (comunemente denominati micro servizi) all'interno di container. I container sono ambienti isolati che contengono tutto il necessario per eseguire un determinato micro servizio.
Per chi si fosse perso la tappa numero 3 dedicata a Docker, lo invito a recuperarla.
Installazione di Docker e HomeAssistant
Nel corso di questa lezione, quindi, installeremo Docker e successivamente il micro servizio di HomeAssistant mediante Docker Compose, un tool interno a Docker. Quest'ultimo sarà lo strumento principe che utilizzeremo per installare tutti i nostri microservizi. Concluderemo questa tappa avviando HomeAssistant per la prima volta.
Procediamo
Per iniziare accediamo al terminale del Raspberry Pi in SSH utilizzando qualsiasi dispositivo di vostra preferenza, come visto nei video precedenti.
Dopo esseci connessi e autenticati al Raspberry Pi in SSH, passiamo subito all'installazione di Docker. Per farlo eseguiamo i seguenti comandi uno alla volta seguiti dal tasto invio:
sudo curl -fsSL https://get.docker.com -o /tmp/get-docker.sh
sudo chmod +x /tmp/get-docker.sh
sudo sh /tmp/get-docker.sh
sudo usermod -aG docker $USER
sudo apt-get update && sudo apt-get upgrade docker -y
L'esecuzione di ogni singolo comando mostrerà a video una serie di LOG di avanzamento, attendiamo che finiscano.
Al termine, riavviamo il sistema operativo per finalizzare il processo. Quindi eseguiamo:
sudo reboot
Eseguiamo dei test operativi
Dopo il riavvio riconnettiamoci al Raspberry Pi in SSH ed eseguiamo un piccolo test per verificare che Docker sia attivo e funzionante. Proviamo a creare ed autoeliminare un container di test eseguendo il seguente comando seguito dal testo invio:
sudo docker run --rm hello-world
Se tutto funziona regolarmente, dovremmo vedere a video una serie di LOG di avanzamento sulla creazione del container hello-world ed infine la seguente dicitura:
Hello from Docker!
This message shows that your installation appears to be working correctly.
Questa è la conferma che Docker è installato e funzionante.
A questo punto possiamo passare a DockerCompose. Anche in questo caso facciamo un piccolo test per verificare che quest'ultimo funzioni correttamente. Pertanto eseguiamo il seguente comando seguito dal tasto invio:
docker compose
Il terminale dovrebbe eseguire l'applicativo, seppur senza alcun parametro, e mostrarci a video le istruzioni sul suo utilizzo.
Usage: docker compose [OPTIONS] COMMAND
Define and run multi-container applications with Docker
Options:
--all-resources Include all
resources, even
those not used by
services
--ansi string Control when to
print ANSI control
characters
("never"|"always"|"auto") (default "auto")
--compatibility Run compose in
backward
compatibility mode
--dry-run Execute command in
dry run mode
--env-file stringArray Specify an alternate
environment file
-f, --file stringArray Compose
configuration files
--parallel int Control max
parallelism, -1 for
unlimited (default -1)
--profile stringArray Specify a profile to
enable
--progress string Set type of progress
output (auto, tty,
plain, json, quiet)
(default "auto")
--project-directory string Specify an alternate
working directory
(default: the path
of the, first
specified, Compose file)
-p, --project-name string Project name
Commands:
attach Attach local standard input, output, and error streams to a service's running container
build Build or rebuild services
config Parse, resolve and render compose file in canonical format
cp Copy files/folders between a service container and the local filesystem
create Creates containers for a service
down Stop and remove containers, networks
events Receive real time events from containers
exec Execute a command in a running container
images List images used by the created containers
kill Force stop service containers
logs View output from containers
ls List running compose projects
pause Pause services
port Print the public port for a port binding
ps List containers
pull Pull service images
push Push service images
restart Restart service containers
rm Removes stopped service containers
run Run a one-off command on a service
scale Scale services
start Start services
stats Display a live stream of container(s) resource usage statistics
stop Stop services
top Display the running processes
unpause Unpause services
up Create and start containers
version Show the Docker Compose version information
wait Block until containers of all (or specified) services stop.
watch Watch build context for service and rebuild/refresh containers when files are updated
Run 'docker compose COMMAND --help' for more information on a command.
Differenza tra Docker e Docker Compose
Prima di proseguire, è importante chiarire la distinzione tra Docker e Docker Compose. Per scaricare e avviare i container che vogliano, utilizzando Docker puro, è necessario eseguire un comando dal terminale per ciascun container, includendo in ogni comando tutte le istruzioni necessarie per configurare quello specifico container. Tuttavia, l'esecuzione di comandi molto lunghi e dettagliati può risultare complessa e noiosa, sia per chi ha meno esperienza ma anche per gli esperti, soprattutto considerando che occorre eseguire un comando per ogni servizio.
Ed è qui che entra in gioco Docker Compose. Questo strumento di Docker semplifica notevolmente l'installazione dei container per i vari microservizi. È sufficiente creare un file di configurazione dedicato e strutturato in un certo modo, nel quale elencare e configurare tutti i microservizi che desideriamo installare. Così facendo, avremo a disposizione un unico file di testo contenente l'intera configurazione, che potremo modificare facilmente in una sola volta. Infine basterà eseguire un solo comando per dire a Docker Compose di fare il lavoro sporco per conto nostro. In sintesi, Docker Compose leggerà il file da noi creato e utilizzerà Docker per scaricare, installare e inizializzare tutti i container dei micro servizi che abbiamo inserito in configurazione.
Creazione del file docker-compose.yaml
Bene, una volta compresa questa distinzione, possiamo proseguire con la creazione e la configurazione del file docker-compose.yaml e l'organizzazione dei nostri microservizi.
Se avete eseguito tutte le istruzioni del video precedente e creato la struttura di cartelle necessaria a proseguire, posizioniamoci all'interno della sotto cartellla docker-config contenuta in homeassistant_hub. Eseguiamo il seguente comando seguito dal tasto invio:
cd /home/pi/homeassistant_hub/docker-config
Prima di procedere, assicuriamoci di essere realmente nel percorso giusto utilizzando il comando pwd. Quindi eseguiamo il seguente comando seguito dal tasto invio:
pwd
Il terminale dovrebbe mostrarci a video il seguente percorso
/home/pi/homeassistant_hub/docker-config
Nel caso in cui non fosse così, sarà necessario eseguire nuovamente il comando cd visto in precedenza. Una volta entrati all'interno della cartella, dovremo creare il file di configurazione per Docker Compose, nel quale definiremo e organizzeremo tutti i microservizi che vogliamo installare con Docker.
Il file che stiamo per creare funge da manifesto per tutti i microservizi che installeremo, descrivendo come devono essere configurati. Questo file, utilizzato da Docker Compose per l'installazione dei microservizi, adotta la notazione YAML. Quindi è utile avere una conoscenza di base per comprendere e leggere ciò che andremo a scriverci dentro.
Brevemente, giusto per darvi un'idea generale e semplificata, possiamo raffigurare il file di configurazione di Docker Compose nel seguente modo, come se fosse una lista di elementi:
services:
service_1:
param_1:
param_2:
service_2:
param_1:
param_2:
dove la riga services identifica il nodo principale che contiene, al suo interno, tutti i microservizi che dovranno essere installati, che nell'esempio sono service_1 e service_2. Ognuno di questi servizi contiene dei propri parametri di configurazione. Nel post dedicato capiremo più in dettaglio la sua formulazione.
In merito a questo, di seguito un approfondimento nel quale capiremo meglio cos'è YAML, come è strutturato, come leggerlo e interpretarlo.
Per creare un nuovo file di testo all'interno di una cartella mediante il terminale, possiamo utilizzare l'editor nano. Pertanto, per creare il file docker-compose.yaml, è sufficiente eseguire il seguente comando seguito dal tasto invio:
sudo nano docker-compose.yaml
Per completezza d'informazione: il comando nano, seguito dal nome di un file con la sua estensione, può avere due comportamenti a seconda che il file esista o meno nella cartella corrente:
- Se il file esiste già, nano lo aprirà per permetterne la modifica. Potremo quindi aggiungere, rimuovere o modificare il contenuto del file, per poi salvarlo e chiuderlo.
- Se il file non esiste, nano creerà un nuovo file con quel nome e lo aprirà in modalità di modifica. In questo caso, potremo inserire il contenuto desiderato e, una volta terminato, salvare il nuovo file prima di chiudere l'editor.
Dopo aver eseguito il comando, ci troveremo all'interno di una schermata completamente vuota, esattamente come se avessimo creato un nuovo documento su Word. Come detto in precedenza, oggi utilizzeremo Docker Compose per installare solamente HomeAssistant.
Quindi, all'interno del file vuoto incolliamo il seguente blocco di testo. Questo blocco farà capire a DockerCompose che dovrà scaricare, installare e inizializzare il container di HomeAssistant utilizzando Docker.
services:
home_assistant:
container_name: home-assistant
image: ghcr.io/home-assistant/home-assistant:stable
volumes:
- /home/pi/homeassistant_hub/homeassistant/config:/config
- /home/pi/homeassistant_hub/homeassistant/media:/media
- /run/dbus:/run/dbus:ro
environment:
- TZ=Europe/Rome
- DISABLE_JEMALLOC=true
network_mode: host
restart: always
privileged: true
Brevemente, all'interno del nodo services è presente solamente il servizio home_assistant con tutta la sua configurazione. Analizziamo i parametri principali della configurazione:
- container_name: è il nome che identifica il container all'interno di Docker. In questo caso, il container si chiama "home-assistant".
- image: è l'istruzione che dice a Docker quale versione del microservizio, Home Assistant in questo caso, deve scaricare e installare. Qui viene utilizzata l'immagine "ghcr.io/home-assistant/home-assistant", che corrisponde alla versione stabile del servizio.
- volumes: permette di mappare le cartelle sul Raspberry Pi con quelle all'interno del container. Questo significa che i dati salvati nel container saranno disponibili anche fuori di esso. In questo caso:
- /home/pi/homeassistant_hub/homeassistant/config:/config: mappa la cartella "config" sul Raspberry Pi a quella all'interno del container, garantendo che tutte le configurazioni siano salvate in una posizione accessibile.
- /home/pi/homeassistant_hub/homeassistant/media:/media: mappa la cartella "media" per garantire l'accesso ai file multimediali salvati. Nel video precedente, abbiamo visto che la cartella homeassistant_hub è accessibile tramite Samba.
- Nel video precedente, abbiamo visto che la cartella homeassistant_hub è accessibile tramite Samba. Questo significa che le cartelle config e media del container di Home Assistant, che sono mappate all'interno di homeassistant_hub, possono essere consultate direttamente tramite Samba, facilitando l'accesso ai file di configurazione.
- /run/dbus:/run/dbus: mappa il percorso di D-Bus, un sistema che consente la comunicazione tra vari processi del sistema operativo, spesso utilizzato per servizi di sistema e comunicazioni interprocesso. Questo volume serve per permettere a Home Assistant di accedere a D-Bus del sistema operativo host. D-Bus è utilizzato per la comunicazione tra vari processi del sistema, inclusi i servizi di gestione dei dispositivi come Bluetooth, UDisks per il montaggio di dischi, e altri. In un contesto come Home Assistant, questo potrebbe essere necessario per accedere a dispositivi Bluetooth o per interfacciarsi con alcuni componenti hardware gestiti dal sistema operativo. L'opzione "ro" viene utilizzato per garantire che Home Assistant abbia accesso ai dati di D-Bus ma non possa modificarli, migliorando la sicurezza della configurazione.
- environment: imposta variabili di ambiente che il container utilizza per funzionare correttamente. In questo caso:
- TZ=Europe/Rome: imposta il fuso orario del container, utile per sincronizzare eventi e orari.
- DISABLE_JEMALLOC=true: disabilita l'uso della libreria JEMalloc, che potrebbe risolvere alcuni problemi di prestazioni o compatibilità.
- network_mode: imposta la modalità di rete del container. Qui viene utilizzata l'opzione "host", che permette al container di condividere la stessa rete del Raspberry Pi, facilitando l'accesso ai dispositivi di rete. Esiste anche la possibilità , attraverso l'opzione "bridge" di dire al container di creare una sua sottorete con un propio indirizzo IP.
- restart: definisce il comportamento del container in caso di arresto anomalo. L'opzione "always" fa sì che il container si riavvii automaticamente se si blocca o se il sistema viene riavviato.
- privileged: imposta il container in modalità privilegiata. Ciò significa che il container avrà più accesso alle risorse hardware del sistema, necessario per garantire l'accesso ad alcune periferiche come dispositivi USB o GPIO del Raspberry Pi.
Infine, salviamo il file docker-compose.yaml premendo in sequenza e mantenendo premuto CTRL + O. In basso ci verrà chiesta conferma di salvataggio, diamo invio per confermare. Successivamente chiudiamo l'editor premendo in sequenza e mantenendo premuto CTRL + X.
Per vedere se il file è stato creato correttamente all'interno della nostra cartella, cioè /home/pi/homeassistant_hub/docker-config, è sufficiente eseguire il seguente comando seguito dal tasto invio:
ls -l
Se abbiamo eseguito tutto correttamente, il terminale dovrebbe mostrarci a video il file docker-compose.yaml. Già che ci siamo, assicuriamoci che il blocco di codice inserito in precedenza sia stato salvato correttamente. Quindi editando nuovamente il file con l'editor nano eseguendo il seguente comando seguito dal tasto invio:
sudo nano docker-compose.yaml
Se il file contiene il blocco inserito in precedenza, allora usciamo dal file premendo in sequenza e mantenendo premuto CTRL + X. In caso contrario, sarà necessario ripetere il processo descritto precedentemente, poiché qualcosa potrebbe non essere andato a buon fine.
A questo punto, certi di aver creato il file di configurazione per Docker Compose e di averlo popolato con il blocco relativo al nostro primo utilizzo, cioè l'installazione di Home Assistant, possiamo procedere con un semplice comando per istruire Docker Compose a scaricare, installare e avviare il servizio. Basta eseguire il seguente comando seguito dal tasto invio:
sudo docker compose up -d
Vedremo a video una serie di LOG di avanzamento, attendiamo che finiscano. Questo comando è quello che utilizzeremo ogni volta che installeremo un nuovo microservizio inserito nel file di configurazione di Docker Compose.
Piccola nota: È importante sottolineare che questo comando può essere eseguito solo se, nel terminale, ci troviamo nella cartella in cui si trova il file docker-compose.yaml. Questo significa che, ogni volta che vogliamo eseguirlo, dovremo prima di tutto spostarci all'interno della cartella docker-config utilizzando il comando cd. Quindi dovremo eseguire il seguente comando seguito dal tasto invio:
cd /home/pi/homeassistant_hub/docker-config
Se l'esecuzione di Docker Compose non dovesse andare a buon fine, sarà necessario ripetere l'intera procedura per correggere eventuali errori.
In caso contrario, dovremmo avere a video una risposta simile a questa:
✔ Container home-assistant Started
e saremo pronti per il nostro primo accesso di Home Assistant.
Accesso a HomeAssistant
Per accedere a HomeAssistant, apriamo un browser qualsiasi e digitiamo uno dei seguenti indirizzi:
http://homeassistant.local:8123
oppure
http://indirizzo_ip_rpi:8123
8123 è la porta su cui Home Assistant è in ascolto per le connessioni tramite il protocollo HTTP. Quando digiti l'indirizzo http://homeassistant.local:8123 o http://indirizzo_ip_rpi:8123 nel browser, stiamo specificando non solo l'indirizzo del dispositivo (ad esempio, il Raspberry Pi), ma anche la porta su cui desideriamo collegarci.
Nel contesto del protocollo HTTP, le porte sono utilizzate per identificare diversi servizi in esecuzione su un dispositivo. La porta predefinita per HTTP è 80 (normalmente, quando navighiamo su internet non specifichiamo mai la porta, perchè il browser lo fa per noi di default), ma molti servizi, come Home Assistant, utilizzano porte diverse per evitare conflitti e migliorare la gestione delle connessioni. In questo caso, Home Assistant utilizza la porta 8123 per la sua interfaccia web.
Dovrebbe comparire il pannello di Home Assistant, pronto a guidarci per il primo accesso.
Avviamo il wizard del primo accesso cliccando sul pulsante "CREA LA MIA CASA INTELLIGENTE",
- Nel primo step ci viene chiesto di creare la nostra prima utenza con privilegi amministrativi, compiliamo il form con i nostri dati e infine clicchiamo su "Crea account";
- Nel secondo step ci viene chiesto di inserire la posizione in cui ci troviamo. Digitiamo il nostro indirizzo oppure facciamoci geolocalizzare automaticamente, cliccando sull'apposito tasto posto alla destra del campo di ricerca;
- Nel terzo step, ci viene chiesto di selezionare la nazione in cui ci troviamo;
- Nel quarto step, aiutaci ad aiutarti, non abilitiamo nulla e clicchiamo su Avanti;
- Nello quinto step, Home Assistant analizzerà la nostra rete e ci mostrerà tutti i dispositivi rilevati compatibili che possono entrare a far parte della nostra smarthome open. Clicchiamo semplicemente su "Finito" e verremo dirottati, per la prima volta, all'interno della dashboard di HomeAssistant.
Bene per oggi ci fermiamo qui. Nel prossimo video eseguiremo una prima configurazione di HomeAssistant e inizieremo ad analizzare le schermate che lo compongono.
Come sempre, se vi fa piacere seguitemi per altri tutorial, attivate la campanellina e lasciate un like al video.