Home Assistant + Ubuntu + Docker = Love

Home Assistant a fost conceput de la bun început cu dorința de economie de resurse hardware ca cerință esențială. Mai mult, HA a devenit un sistem de operare de sine stătător, construit pe un nucleu Debian și care rulează mai mult decât satisfăcător pe un RaspberryPi 3. Dacă numai instalezi un sistem „la cheie” pentru o automatizare, în mod sigur Hass.io rulând pe un Raspberry este soluția câștigătoare.

Dar dacă experimentezi integrări noi – cazul meu – micuțul Raspberry vine cu un pachețel de neajunsuri. Și asta pentru că, inclusiv RaspberyPi 4, nu suportă în mod nativ instalarea pe un SSD. Iar cardurile de memorie, indiferent cât de performante ar fi ele, sunt destinate camerelor foto și telefoanelor, nu sistemelor de operare, au o viteză și o durată de viață (a se citi număr de scrieri) extrem de limitat. Și, legat de cele scrise mai sus, în momentul în care fișierul de configurare devine mai „gras”, un reboot al sistemului durează chiar și 3 minute. Bref: este nevoie de ceva mai multă putere de calcul și cu un mediu de stocare de cursă lungă! 

Soluția o reprezintă rularea lui Hass.io într-un mediu virtual, pe o mașină mult mai puternică, cu mai multe resurse procesor, de memorie și, musai, cu stocare pe un disc rapid.

Aici intră în scenă minunatul Docker. Ce este Docker?

Păi, este o aplicație care simplifică procesul de management al aplicațiilor prin instalarea acestora în containere. Containerele ne permit să rulăm aplicații într-un mediu complet izolat din punct de vedere al resurselor. Sunt similare mașinilor virtuale dar sunt mult mai „portabile” mai puțin consumatoare de resurse hardware dar și mult mai dependente de sistemul de operare gazdă. Care – nu uităm – este Ubuntu, adică un soi de Debian.

Eu am instalat Docker pe un PC HP Elite 8200 USDT, cu i5-2500S și numai 6 GB RAM. Deocamdată cu un HDD WD Raptor de 500 GB. Dar vine el și SSD-ul! Pe PC rulează Ubuntu 18.04 LTS chel, în sensul că, în afară de SSH nu mai rulează niciun alt server.

Cu serverul „up-and-running” și logați prin SSH (Prin Putty, Terminal sau ce vă convine) trecem la instalarea Docker.

Mai întîi pregătim instalarea prin adăugarea unor pachete:

$ sudo apt-get update

$ sudo apt-get install apt-transport-https \

    ca-certificates curl  gnupg-agent \

   software-properties-common

Apoi acordăm „încredere” surselor din care vom descărca Docker:

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add –

…și verificăm instalarea cheii de securitate, prin căutarea ultimelor caractere din aceasta:

$ sudo apt-key fingerprint 0EBFCD88

Dacă totul este ok, descărcăm programul:

$ sudo add-apt-repository \

    “deb [arch=amd64] https://download.docker.com/linux/ubuntu \

$(lsb_release -cs) stable”

… și îl instalăm:

$ sudo apt-get update

$ sudo apt-get install docker-ce docker-ce-cli containerd.io

Acum, dacă nu ați citit mai nimic despre docker, trebuie să știți că dezvoltatorii acestuia mențin o arhivă de imagini ale unor aplicații uzuale și a configurărilor mediului în care acestea rulează. Una dintre acestea ne permite să verificăm instalărea corectă și funcționarea Docker, printr-un progrămel numit „Hello-world”:

$ sudo docker run hello-world

Bineînțeles că o să ne dorim ca Docker să pornească în mod automat, de fiecare dată cînd sistemul repornește, deci:

$ sudo systemctl enable docker

$ sudo apt-get install apparmor-utils avahi-daemon dbus jq network-manager socat

Iarăși trebuie să fac apel la ceva cunoștințe despre Docker. Este foarte important să știm că toată informația despre configurări, variabile, baze de date, etc. aferente unui program care rulează într-un container, există atât timp cât există containerul. Dispare containerul, dispar toate datele. Iar containerul există doar atât timp cât aplicația conținută are cel puțin un proces activ. Cert este, că există modalități pentru a configura containerul respectiv, astfel încât, configurările aplicației și datele care ne dorim să le păstrăm pentru utilizare ulterioară (ex. la un restart) să fie salvate într-o locație de pe disc, locație exterioară containerului, nevolatilă, de unde să poată fi reîncărcate. De aceea este important să instalăm o imagine a aplicației din arhiva Docker, pentru că cineva s-a străduit și a efectuat toate configurările necesare, de la alocarea optimă de resurse hardware și pînă la locația de salvare a setărilor și datelor pe care ni le dorim nevolatile. Astea fiind spuse, nu ne mai rămâne decît să descărcăm imaginea Home Assistant și să o rulăm într-un container:

$ sudo curl -sL ”https://raw.githubusercontent.com/home-assistant/hassio-installer/master/hassio_install.sh” | bash -s

Pentru a accesa Home Assistant, se folosește același port extern (8123). Deci, dacă IP-ul local al serverului este XXX.XXX.XXX.XXX, pentru acces și prima configurare, în orice browser tastați:

http://XXX.XXX.XXX.XXX:8123

Acum, eu știu din experiență că sunt oameni curioși să vadă „de ce și cum merge?”. Special pentru aceștia, niște băieți deștepți au inventat un progrămel care îți arată ce containere sunt active și cam ce fac ele. Progrămelul se numește Portainer iar multe, multe informații despre acesta puteți găsi pe site-ul https://www.portainer.io 

Instalarea este extrem de simplă:

$ docker volume create portainer_data

$ docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer

Accesarea portainer este la fel de simplă, deși acesta rulează și el într-un container.  Deci în browser:

http://XXX.XXX.XXX.XXX:9000

Oricum, dacă vă hotărîți să folosiți Portainer, citiți pentru că ar fi bine să știți ce faceți.

Enjoy !

Nessy – aprilie 2020