OMV i Docker

Dobry wieczór!

Wiele się słyszy od dłuższego czasu w światku IT, głównie programistów, ale również osób zajmujących się IoT, Home Automation o Dockerze i konteneryzacji. Do tej pory patrzyłem na to z boku, delikatnie śledząc temat, pora jednak najwyższa się w to 'wdrożyć'. Dobrze zrobiłem, bo temat jest nad wyraz ciekawy i (nie tylko) moim zdaniem rewolucyjny.

Docker i kontenery, w przeciwieństwie do maszyn wirtualnych, nie są osobnymi systemami, ale pewnymi 'zbiornikami' w których w izolacji pracują programy. Co ciekawe – korzystają ze wspólnych zasobów pamięci, odpowiednio nimi zawiadując. Czyli możemy sobie w sumie postawić ich wiele na jednym systemie i korzystać, będąc pewnym, że w razie jakichkolwiek problemów możemy przeinstalować tylko i wyłącznie jeden kontener, nie całość systemu, bez potrzeby 'stawiania' wszystkiego od nowa.

Nadmieniam, że jestem w tym temacie jeszcze początkujący, ale zafascynowany, wybaczcie więc możliwe błędy w pełnym rozumieniu tematu. Z chęcią również posłucham Waszych rad i korekt, jeżeli potrzeba.

Kilka osób mówiło: 'Docker, tak. Kup QNAP, albo jakiś starszy serwer i tam instaluj'. No ale ja już mam mój 'biedny NAS' postawiony na Orange Pi Zero Plus z NAS Hat. Głupio by było go nie wykorzystać, chociaż sprawdzić temat, bo jak nie 'zaskoczy' to wydam 1k PLN bez potrzeby.

Po raz kolejny – warto być upartym, bo mimo że 'szału nie ma' to działa na nim i Docker. Mimo limitu 512MB RAM. Coraz częściej jednak myślę o Odroid HC1/HC2.

Po pierwsze musimy w Open Media Vault (bo jego używam na moim NAS) zainstalować wtyczkę do Docker’a.

Po instalacji pojawi się nowa opcja w menu Services, do której przechodzimy.

Tam już zobaczymy możliwe do pobrania obrazy kontenerów Docker.

Pora przedstawić cel wpisu: instalujemy graficzny interface do pokazania naszych zdjęć w NAS. Do tego celu użyjemy lychee oraz MariaDB (czyli sewer baz danych tworzony przez zespół MySQL po tym jak zostali kupieni przez Oracle). Lekki, dostępny, ciekawy, ładny.

Zróbmy to jednak trochę inaczej. Na zakładce Overview w wyszukiwarce po prawej wpiszmy na początek linuxserver/mariadb i pobierzmy wybrany obraz. Po zakończeniu zobaczymy go w górnej połowie ekranu. Dobra, pobrany. Co teraz? Teraz trzeba go sparametryzować i uruchomić. Świetną cechą kontenerów jest to, że komunikują się przez konkretny port/porty z całym systemem. Czyli wystawiają pewien port, który później jest przekierowany na wybrany przez nas. W tym przypadku pozostanę przy standardowym dla MariaDB 3306.

Więcej informacji o parametrach, opisie znajdziecie na stronie z repozytorium kontenerów: https://hub.docker.com/r/linuxserver/mariadb. Opis parametrów, folderów do wyboru znajduje się na wymienionej stronie. Tu udajcie się w razie wątpliwości i wiedzy jakie parametry ma jaki kontener.

W przypadku tej konfiguracji musimy podać:
– PUID
– PGID
– TZ – TimeZone
– Hasło root do MySQL

WAŻNE! Każdą wpisaną wartość musicie 'potwierdzić' i przejść do kolejnej linii aby został zatwierdzony. To był mój główny błąd na początku nauki.

Poniżej również bardzo ważne dane – informacje o folderach z którymi może się komunikować nasz kontener. Wskazujemy folder po stronie kontenera i adekwatny folder na dysku NAS. Ja tworzę dla każdego kontenera osobny folder z konfiguracją, ale to zależy już od Waszych potrzeb i poczucia estetyki.

Lepiej zdefiniować je tak:

Jeżeli wszystko skonfigurowaliście poprawnie, obraz zostanie uruchomiony i od razu zobaczycie jego status.

W identyczny sposób instalujemy lychee. Konfiguracja jest odrobinę inna, jak poniżej:

I teraz ciekawa część. Wskażemy stronę lychee, w celu wstępnej konfiguracji. Tak jak ustawiliśmy, Lychee zgłasza się pod adresem naszego NAS z portem jaki wskazaliśmy przy konfiguracji kontenera, u mnie 192.168.1.124:81, czyli port 81. Ja sobie jak widać na routerze nazwy domen domowych przypisałem do adresów IP.

Lychee poprosi nas o adres IP serwera MariaDB (czyli w moim przypadku adres mojego NAS) i hasło do użytkownika którego chcecie używać. Ja wybrałem root. Niezbyt może bezpiecznie, ale mój NAS 'nie wychodzi na świat', nie mam do niego dostępu spoza domu. Lychee stworzy swoją bazę jeżeli chcecie, na wypadek 'przenosin' w inne miejsce macie możliwość wskazania lokalizacji używanej poprzednio bazy. Po założeniu będziemy jeszcze musieli stworzyć użytkownika i hasło, które chcecie używać w programie.

Jesteśmy gotowi do pracy!

Zasada Lychee jest następująca: wskazujemy folder źródłowy oraz docelowy, do którego zostaną przeniesione skatalogowane zdjęcia. Na początku trochę się wahałem, bo mam swój własny sposób na katalogowanie zdjęć, ale operacja (mimo że długotrwała przy kilkudziesięciu gigabajtach zdjęć) zakończyła się sukcesem.

OMV i klucze SSH do łatwiejszej komunikacji pomiędzy różnymi sprzętami

Jak pisałem – zbudowałem sobie NAS. Kopię danych z laptopa załatwiłem sobie prostym xcopy z poziomu Windows (nie chce mi się instalować jakiego wielkiego softu do backupów, chociaż używałem kiedyś Cobian backup), miałem jednak mały zgryz z kopią Domoticz oraz RetroPie.

A miało to wyglądać tak:
– kopia wykonywana z poziomu NAS (czyli OMV) pobierająca foldery z Raspberry Pi na którym jest Domoticz
– kopia wykonywana z poziomu NAS pobierająca foldery z Raspberry Pi na którym jest RetroPie

Wszystko to miał obsłużyć rsync. Aby zrobić to pomiędzy dwoma systemami musiałem użyć połączenia szyfrowanego (SSH), ponieważ tego wymaga rsync.

Chciałem to zautomatyzować na ile się da i w sumie udało mi się bez problemu przez SSH (Secure SHell), ale zawsze stało mi na przeszkodzie hasło, które musiałem podawać przy logowaniu się do serwera. Pora była nauczyć się generowania kluczy SSH, które później można użyć przy bezpośrednim łączeniu się pomiędzy konkretnymi komputerami.

Jak się okazuje – dla chcącego nic trudnego…

Po pierwsze – po stronie systemu NA KTÓRY chciałem się logować bez hasła musiałem wygenerować klucz rsa:

ssh-keygen -t rsa

Robiłem to dla standardowego użytkownika 'pi', dlatego klucz publiczny znajduje się w folderze /home/pi/.ssh/id_rsa.pub. Klucz prywatny (identyfikator) znajduje się w /home/pi/.ssh/id_rsa.

TERAZ WAŻNE: trzeba nakazać skopiowanie klucza serwerowi KTÓRY będzie się logował na inny, gdzie jest klucz. Poleceniem ssh-copy-id, jak poniżej

ssh-copy-id pi@192.168.1.200 

Z POZIOMU SERWERA który ma się dostać do danych, czyli z OMV.

Podajemy hasło do konta, jednorazowo.

Teraz już bez problemu działają polecenia:

sudo rsync -avz -e ssh pi@192.168.1.200:/var/www/html/dashboard /sharedfolders/Sobczaki/Dane/Backup/Domoticz

sudo rsync -avz -e ssh pi@192.168.1.200:/home/pi/habridge /sharedfolders/Sobczaki/Dane/Backup/Domoticz

sudo rsync -avz -e ssh pi@192.168.1.200:/home/pi/domoticz /sharedfolders/Sobczaki/Dane/Backup/Domoticz

sudo rsync -avz -e ssh pi@192.168.1.126:/etc/emulationstation /sharedfolders/Sobczaki/Dane/Backup/RetroPie/

Wpakuję sobie to wszystko do CRON i backup 'będzie się robił sam'.

Monitorowanie aktywności urządzeń w sieci

Lubię wiedzieć co się dzieje. Czy to w domu czy na świecie. Jako że nad światem nie zapanuję, można się chociaż starać sprawdzić co się dzieje w domu 😉

Większość urządzeń ma teraz połączenie bezprzewodowe i je możemy bez problemu monitorować. Laptop, konsole, tablety, drukarki – gdy są włączone na komendę arp-scan odpowiada ich adres MAC. To dzisiaj zrobimy.

Jest co prawda natywny System Alive Checker (Ping), ale u mnie więcej oszukiwał, niż podawał prawdziwe dane. Ostatnio chyba został poprawiony, ale skoro już swoje skrypty mam…

Ruszamy.

Na początek – definiowanie nowej zmiennej w Domoticz.

Niech się nazywa PRESENCE_LIST (jak w przykładzie z forum Domoticz). Format jest następujący: Adres_MAC;ID_Z_Domoticz_TEGO_CZEGO_STAN_SPRAWDZAMY| (pionowa kreska!). Na końcu łańcucha już jej nie dajemy. Czyli na przykład: aa:bb:cc:dd:ee:ff;73|bb:cc:dd:ee:ff:gg;122. Adres MAC urządzeń możemy poznać na przykład za pomocą aplikacji ipscan24.
Cyfra po średniku to IDX naszego urządzenia (które chcemy testować na obecność w sieci!) w Domoticz. Wcześniej należy pamiętać, aby stworzyć odpowiedni sprzęt w sekcji Hardware!
Czyli na przykład Playstation timer jako Dummy w Sekcji Hardware i tam tworzymy dwa Virtual sensors: jeden Switch i drugi Counter Incremental


Później konieczne będzie doinstalowanie arp-scan:

sudo apt-get update

sudo apt-get upgrade

sudo apt-get install arp-scan

I przechodzimy do sedna, czyli naszych funkcji badających obecność urządzeń w sieci.

cd domoticz

sudo nano scripts/Check_MAC.sh

I tam wstawiamy:

#!/bin/bash
MAC=$1
IDX=$2

sudo arp-scan –localnet | grep -e $MAC

if [ $? -eq 1 ]
then
echo „Device $MAC Not in LOCAL LAN”
curl „http://IP_Domoticz:Port/json.htm?type=command&param=switchlight&idx=$IDX&switchcmd=Off”
else
echo „Device $MAC in LOCAL LAN”
curl „http://IP_Domoticz:Port/json.htm?type=command&param=switchlight&idx=$IDX&switchcmd=On”
fi

Zamieniając IP_Domoticz:Port na własne IP i port

I WAŻNE, prawa do uruchamiania

sudo chmod +x /home/pi/domoticz/scripts/Check_MAC.sh

sudo nano scripts/lua/script_time_Presence.lua

A tutaj to:

function splitString(str, delim, maxNb)
    — Eliminate bad cases…
    if string.find(str, delim) == nil then
        return { str }
    end
    if maxNb == nil or maxNb < 1 then
        maxNb = 0    — No limit
    end
    local result = {}
    local pat = „(.-)” .. delim .. „()”
    local nb = 0
    local lastPos
    for part, pos in string.gmatch(str, pat) do
        nb = nb + 1
        result[nb] = part
        lastPos = pos
        if nb == maxNb then break end
    end
    — Handle the last field
    if nb ~= maxNb then
        result[nb + 1] = string.sub(str, lastPos)
    end
    return result
end

commandArray = {}
maclist= uservariables[’PRESENCE_LIST']
Lines=splitString(maclist,”|”)

for i,line in pairs(Lines) do
   –print (i..” „..line)
   macs=splitString(line,”;”)
   print („MAC Address to Poll: „..macs[1]..” On IDX:”..macs[2])
        execcommand=”sudo /home/pi/domoticz/scripts/Check_MAC.sh „..macs[1]..” „..macs[2]..” &”
    os.execute(execcommand)

end

I na koniec dla KAŻDEGO urządzenia:

sudo nano scripts/lua/script_time_playstation_update.lua

local timer_device_ID = 8 <—- Tu wstawiamy IDX naszego Device z Counter incremental

commandArray = {}
commandArray[’UpdateDevice'] = timer_device_ID .. '|0|0′

local TotalMinutesOn = otherdevices_svalues['Playstation timer']
if otherdevices['Playstation 4'] == 'On' then
  TotalMinutesOn = TotalMinutesOn + 1
end
commandArray[’UpdateDevice'] = timer_device_ID .. '|0|' .. tostring(TotalMinutesOn)

return commandArray

Co robi powyższa funkcja? Sprawdza, czy urządzenie Playstation 4 (czyli to musicie zmienić na nazwę u siebie) jest dostępna w sieci. Jeżeli tak, zwiększy licznik Playstation timer o 1, czyli i jedną minutę.

I tyle. Koniec. Tutaj jednak należy się Wam wytłumaczenie. Nazwy plików MUSZĄ rozpoczynać się od script_time_*, ponieważ jest to wewnętrzny mechanizm Domoticz, który uruchamia skrypty.

Co teraz zrobiliśmy? Napisaliśmy skrypt, który co minutę się uruchomi i sprawdzi, czy urządzenia zapisane na naszej zmiennej użytkownika są widoczne w sieci. Jeżeli tak, zwiększamy licznik.

Efekt?

Jak poniżej.

Pozdrawiam! Miłej zabawy!

EDIT.

Jak widać w komentarzach, są z tym czasem problemy, jednak ciężko mi określić, czemu może u niektórych z Was nie działać ta funkcja. Dla próby dodałem przed chwilą dzisiaj podłączony czujnik smogu na ESP. Świeża rzecz, nie ma więc prawa być w systemie, działać z tytułu zaszłości, itp. Po kolei:

1. Skoro działa, bo buczy i go słyszę, zbadajmy jaki ma adres MAC:

2. Dodaję wirtualny Switch, na Hardware typu Dummy. Zrobiłem to na istniejącym o nazwie Telefony:

3. Sprawdzam jaki ma IDX:

4. Dodaję adres MAC i IDX do zmiennej (fakt, adres MAC MAŁYMI literami):

5. Po chwili Switch odpowiada:

Idę spać, wyłączam testowy czujnik, po chwili: