czwartek, 8 lutego 2018

Monit - abyśmy byli pewni, że Domoticz działa...

Ostatnio miałem dużo problemów z Raspberry Pi i kiepskim zapisem na kartę SD. Czego bym nie robił, po dwóch, trzech tygodniach system 'się rozjeżdżał', finalnie kończąc na 'Memory fault' i 'Kernel panic'. Kiepska sprawa. Co prawda na Raspberry Pi nie stoją żadne krytyczne usługi, ale ciągłe odzyskiwanie z backupu nie jest najciekawszą pracą, jaką można robić...

Na pewno pomogło przeniesienie systemu Raspberry Pi na dysk HDD, ale dodatkowo można dołączyć sprawdzanie statusu Domoticz - u mnie są problemy z pluginami i czasem lubi nie wystartować.

Pomaga w tym 'monit' - oprogramowanie, które dba o to, aby nasze procesy były uruchomione, a w razie ich nieprzewidzianego zatrzymania - pojawiły się ponownie. Opisywał to już Łukasz Jokiel na swoim blogu, ale od wiedzy jeszcze nikt nie umarł, dlatego pozwolę sobie opisać to i u siebie.

Na początku zaktualizujmy system:

sudo apt-get update

sudo apt-get upgrade

I zainstalujmy 'monit'

sudo apt-get install monit

Od razu po tym możemy przystąpić do zmian w domyślnym pliku konfiguracyjnym. Jest dość pokaźny, w większości opatrzony komentarzami przy przykładach.

sudo nano /etc/monit/monitrc

Dopiszmy sekcję (zamiast HASŁO podajecie hasło jakim chcecie się logować do monit'a w przeglądarce):

set httpd port 8890 and
use address localhost  # only accept connection from localhost
allow localhost        # allow localhost to connect to the server 
allow admin:HASŁO # and require user 'admin' with password 'monit'
use address 0.0.0.0    # only accept connection from localhost
allow 0.0.0.0/0.0.0.0
allow @monit    # allow users of group 'monit' to connect (rw)
allow @users readonly # allow users of group 'users' to connect readonly

Wszyscy sugerują na końcu, więc dodajmy na końcu również:

check process domoticz with pidfile /var/run/domoticz.pid
start program = "/etc/init.d/domoticz.sh start"
stop  program = "/etc/init.d/domoticz.sh stop"
if failed
   url http://127.0.0.1:80/json.htm?type=command&param=getversion
       and content = '"status" : "OK"'
   for 2 cycles
   then restart
if 5 restarts within 5 cycles then exec "/sbin/reboot"

UWAGA - ostatnia linijka mówi o tym, że jeżeli 10 (2*5) razy nie powiedzie się uruchomienie Domoticz, to nastąpi restart Raspberry Pi - bądźcie świadomi! Do tego - zmieńcie port Domoticz na odpowiedni o Was (127.0.0.1 jest adresem hosta lokalnego) - u mnie jest to 80, domyślnym w Domoticz jest 8080 (dziękuję za sugestię).

Teraz

sudo systemctl enable monit.service
sudo systemctl restart monit.service

Sprawdzamy. Pierwsza komenda sprawdzi poprawność pliku konfiguracyjnego, druga poda pełen status.

sudo monit -t

sudo monit status


Wygląda na to, że działa. Teraz wystarczy

sudo service domoticz stop

i zobaczymy czy monit przywróci go do życia spoza grobu.

Taram! Bangla!

Strona przedstawia się następująco:


Ważne - wpisujecie adres swojego Raspberry, po nim port 8890 (lub taki, jaki ustawiliście w skrypcie konfiguracyjnym monitrc). Jeżeli macie konfiguracje rozproszone (Domoticz na innej maszynie, albo chcecie monitorować procesy na innych Raspberry) - musicie wpisać odpowienie adresy IP i porty.

Mała sugestia - jeżeli będziecie chcieli kiedyś wyłączyć świadomie Domoticz (chcecie coś sprawdzić, dodać nowy plugin powoli, itp.) - monit od razu włączy serwis Domoticz. No, taka jego funkcja. Dlatego to, musicie po kolei wydać polecenia:

sudo /etc/init.d/monit stop 

sudo /etc/init.d/domoticz.sh stop

Zmieniamy, mieszamy, testujemy, sprawdzamy...

I później:

sudo /etc/init.d/domoticz.sh start

sudo /etc/init.d/monit start

Dla pewności, poniżej zawartość całego pliku:

  set daemon 120
  set logfile /var/log/monit.log
  set idfile /var/lib/monit/id
  set statefile /var/lib/monit/state
  set eventqueue
      basedir /var/lib/monit/events
      slots 100
   include /etc/monit/conf.d/*
set httpd port 8890 and
use address localhost
allow localhost
allow admin:xxxxxxxxxxxx
use address 0.0.0.0
allow 0.0.0.0/0.0.0.0
allow @monit
allow @users readonly

check process domoticz with pidfile /var/run/domoticz.pid
start program = "/etc/init.d/domoticz.sh start"
stop  program = "/etc/init.d/domoticz.sh stop"
if failed
   url http://127.0.0.1:80/json.htm?type=command&param=getversion
       and content = '"status" : "OK"'
   for 2 cycles
   then restart
if 5 restarts within 5 cycles then exec "/sbin/reboot"

36 komentarzy:

  1. Ten komentarz został usunięty przez autora.

    OdpowiedzUsuń
  2. Do /etc/monit/monitr dodaj c ;)

    OdpowiedzUsuń
    Odpowiedzi
    1. Oczywiście, bardzo dziękuję. Taki sam błąd popełniłem próbując i Copy-Paste zrobiło swoje. Poprawione.

      Usuń
  3. Witam.

    W url http://127.0.0.1:80/json.htm?type=command&param=getversion zakładamy że system pracuje na porcie 80 ?
    Może warto zmienić w tekście na domyślny 8080 albo doprecyzować. Dla początkujących będzie jaśniej.

    OdpowiedzUsuń
    Odpowiedzi
    1. Dziękuję za sugestię. Postaram się odpowiednio profilować artykuły. Do tej pory często po prostu opisywałem i zostawiałem użytkownikowi miejsce na eksperymenty.

      Usuń
  4. Cześć,
    Czy dobrze rozumiem za wiki Domoticza, jeśli mamy narzucone hasło/uzytkownika na Domoticza (nawet połączenia lokalne), to komenda JSON powinna wyglądać następująco?

    url http://user:password@IP_RASPBERRY:DOMOTICZ_PORT/json.htm?type=command&param=getversion

    OdpowiedzUsuń
  5. Ten komentarz został usunięty przez autora.

    OdpowiedzUsuń
  6. Cześć,
    Monit wykonuje swoje zadanie poprawnie - tj. po położeniu Domoticza, podnosi go na nowo. Pytanie mam następujące: monit ma opóźnienie w odświeżaniu informacji nt. statusu działania usługi Domoticza. Czy jest to w jakiś sposób sparametryzowane (czas opóźnienia odświeżania informacji)?

    OdpowiedzUsuń
    Odpowiedzi
    1. W sumie się nad tym nie zastanawiałem, ale czy nie będzie za to odpowiadał parametr 'set daemon 120 # check services at 2-minute intervals' w monitrc?

      Usuń
  7. Dokładnie tak, set deamon przetestowany na różnych wartościach.

    Kolejne pytanie: zauważyłem, że monit nie jest uruchamiany po restarcie Rpi3. Czy przy jego domyślenj konfiguracji jest to normalne zachowanie? Jeśli tak, to w jaki - bezpieczny - sposób, dodać uruchamianie monit do autostartu?

    OdpowiedzUsuń
    Odpowiedzi
    1. Hmmm. Powinien się uruchomić. Co mówi /var/log/monit.log?

      Usuń
    2. Wpisy z loga:

      [CET Feb 26 17:17:05] info : Starting Monit 5.20.0 daemon with http interface at [0.0.0.0]:8890
      [CET Feb 26 17:17:05] info : 'raspberrypi' Monit 5.20.0 started
      [CET Feb 26 17:17:05] error : HTTP server -- Cannot translate IPv4 socket [0.0.0.0]:8890 -- Name or service not known
      [CET Feb 26 17:17:05] error : HTTP server -- Cannot translate IPv6 socket [0.0.0.0]:8890 -- Name or service not known
      [CET Feb 26 17:17:05] error : 'domoticz' process is not running
      [CET Feb 26 17:17:05] info : 'domoticz' trying to restart
      [CET Feb 26 17:17:05] info : 'domoticz' start: '/etc/init.d/domoticz.sh start'

      Po restarcie Rpi3, przy sprawdzaniu czy monit działał (sudo monit status), dostawałem w konsoli: HTTP server -- Cannot translate IPv4 socket [0.0.0.0]:8890 -- Name or service not known


      Zastosowałem rozwiazane z wpisem w rc.local.

      sudo nano /etc/rc.local

      wiersz dodany do rc.local:
      home/pi/scripts/runmonit.sh

      zawartość runmonit.sh:
      /usr/bin/sudo systemctl restart monit.service

      Taka kombinacja spowodowała, że monit działa po restarcie Rpi3.

      Nie wiem jednak czy jest to prawidłowe/bezpieczne rozwiązanie.

      Usuń
    3. Świeży log, po zakomentowaniu rc.local i restarcie Rpi3.

      [CET Feb 26 19:50:19] info : Starting Monit 5.20.0 daemon with http interface at [0.0.0.0]:8890
      [CET Feb 26 19:50:19] info : 'raspberrypi' Monit 5.20.0 started
      [CET Feb 26 19:50:19] error : HTTP server -- Cannot translate IPv4 socket [0.0.0.0]:8890 -- Name or service not known
      [CET Feb 26 19:50:19] error : HTTP server -- Cannot translate IPv6 socket [0.0.0.0]:8890 -- Name or service not known
      [CET Feb 26 19:50:19] error : 'domoticz' process is not running
      [CET Feb 26 19:50:19] info : 'domoticz' trying to restart
      [CET Feb 26 19:50:19] info : 'domoticz' start: '/etc/init.d/domoticz.sh start'
      [CET Feb 26 19:52:29] info : 'domoticz' process is running with pid 479

      Więc teoretycznie monit działa, czyż nie? A jednak, sprawdzenie czy monit działa po uruchomieniu Rpi3 (sudo monit status), daje dokładnie komunikat:
      Cannot create socket to [0.0.0.0]:8890 -- Connection refused

      Dopiero po wpisaniu (sudo systemctl restart monit.service), po sprawdzeniu (sudo monit status), dostaję poprawny raport z działania usług, kóre monit monitoruje.

      Usuń
    4. Mam ten sam problem na Rpi4. Domoticz wstaje ale Monit Web serwice już nie.
      Cannot create socket to [0.0.0.0]:8890 -- Connection refused

      Usuń
  8. A jak zrobić, aby Domoticz restartował się automatycznie codziennie np. o g.3.30 w nocy?

    OdpowiedzUsuń
    Odpowiedzi
    1. Domoticz czy całe Raspberry (jeżeli na nim masz postawiony system)? Tak czy siak - najlepiej wpis w crontab.

      Usuń
    2. W sumie to sam Domoticz, bo często jakiś plugin etc przestaje działać i zazwyczaj restart Domoticza pomaga. Dlatego jakby go codziennie w nocy restartować to nawet jak w ciągu dnia coś "padnie" to na drugi dzień już będzie działało.
      To trzeba wpisać w crontab aby o danej godzinie restartować Domoticza?

      Usuń
    3. Na przykład: @hourly sudo sudo service domoticz restart

      Usuń
  9. Ten komentarz został usunięty przez autora.

    OdpowiedzUsuń
  10. W przypadku instalacji programu "Monit", gdzie jest również "Domoticz" na Malince, na końcu pliku w /etc/monit/monitrc warto dodać jeszcze linijkę:

    check system localhost

    nawiązując do problemu "Monit service name error"
    dokładnie tu:
    https://stackoverflow.com/questions/8436555/monit-service-name-error
    Problem ten pojawi się gdy naszego hosta (Malinkę) nazwiemy akurat "Domoticz".
    Nie zaszkodzi a może pomóc.

    OdpowiedzUsuń
  11. Cześć,

    Czy aby to zrobić to malina musi być podpięta do internetu po kablu, czy to nie ma znaczenia?

    Niby zrobiłem wszystko tak jak jest w poradniku, a mam coś takiego:


    pi@DOMOTICZ:~ $ sudo monit -t
    'check system' not defined in control file, failed to add automatic configuration (service name DOMOTICZ is used already) -- please add 'check system ' manually
    /etc/monit/monitrc:25: Service name conflict, DOMOTICZ already defined '/sbin/reboot'


    pi@DOMOTICZ:~ $ sudo monit status
    'check system' not defined in control file, failed to add automatic configuration (service name DOMOTICZ is used already) -- please add 'check system ' manually
    /etc/monit/monitrc:25: Service name conflict, DOMOTICZ already defined '/sbin/reboot'

    OdpowiedzUsuń
    Odpowiedzi
    1. Na pewno nie musi, bo w tym przypadku nie ma to znaczenia.

      Usuń
    2. Czy udało Ci sie rozwiązać problem? Mam ten sam komunikat :(

      Usuń
    3. chodzi o nazwe hosta, trzeba zmienić z domoticz na jakąś inną

      Usuń
  12. Witam. Swietny poradnik jak i pozostałe.
    Mam pytanie ponieważ u mnie po resecie Maliny i sprawdzenie statusu Monit:
    Cannot create socket to [0.0.0.0]:8890 -- Connection refused

    Czyli monit nie uruchamia się sam po resecie jak zrobić aby uruchamiał się razem z Maliną ?

    OdpowiedzUsuń
    Odpowiedzi
    1. a restart serwisu pomaga? sudo service monit restart?

      Usuń
    2. Pomaga. Ale jeżeli będzie zanik napięcia domoticz nie uruchomi się to monit go nie uruchomi.

      Usuń
    3. możliwe, że Monit działa, tylko serwer http nie wstaje, przetestuj - nie uruchamiaj ponownie usługi Monita, wyłącz Domoticza i poczekaj chwile - prawdopodobnie Domoticz wstanie, ewentualnie jako workaround problemu można w CRONie dodać wpis, który spowoduje po restarcie Malinki, na przykład po 2 minutach, restart (jak wyżej) serwisu Monita :)

      Usuń
  13. Dołączam się do pytania powyżej

    OdpowiedzUsuń
  14. Witam, faktycznie po instalacji i resecie Maliny, Monit jakby nie wstawał. Serwer http nie działa, komenda sudo monit status nie daje pozytywnego rezultatu, ale Domoticz jest restartowany. Po 2 minutach uruchamia się ponownie.

    OdpowiedzUsuń
    Odpowiedzi
    1. Skonfigurowałem powiadomienia mailowe, po resecie Maliny działają, pomimo tego że Monit wydaje się nieaktywny.

      Usuń
  15. dzień dobry mam problem niestety ze zrozumieniem(jestem początkującym)
    co mam wpisać w tych linijkach:
    use address 0.0.0.0
    allow 0.0.0.0/0.0.0.0 i w
    url http://127.0.0.1:80/json.htm?type=command&param=getversion

    OdpowiedzUsuń
    Odpowiedzi
    1. Jeżeli monit instalujesz tam gdzie Domoticz - zostawiasz jak jest. Te cyfry wskazują na adres lokalnego komputera (localhost)

      Usuń
    2. Tutaj masz to dokładniej opisane:
      https://www.domoticz.com/wiki/Monitoring_domoticz
      Przykład:
      allow 192.168.0.1/255.255.255.0 #This will only allow hosts coming from the local network (change x.x.x.1 to your own LAN IP-range).
      allow localhost #use in combination with local network to allow command line to work

      Usuń