Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. ioBroker Allgemein
    4. Docker Container restart iobroker per script

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    Docker Container restart iobroker per script

    This topic has been deleted. Only users with topic management privileges can see it.
    • A
      alka @Glasfaser last edited by

      @glasfaser
      damit kann ich grad nichts anfangen? zumindest etwas zu remote-restart konnte ich beim querlesen nicht finden
      ich nutze portainer schon länger (und ja, ich kann problemlos die portainer-Funktionen wie restart nutzen), meine System-Installation läuft und verwaltet 9491 Objekte/ 8347 Zustände, bei 54 hm-Geräten und ca 30 nicht-hm-Geräten mit vieleicht 30 scripts (einige viele tausend Zeilen code)

      UncleSam Glasfaser 2 Replies Last reply Reply Quote 0
      • UncleSam
        UncleSam Developer @alka last edited by

        @alka said in restart iobroker per script?:

        und ja, ich kann problemlos die portainer-Funktionen wie restart nutzen

        Eine Idee: kannst du mal mit dem Browser Portainer öffnen und dann die Entwicklerwerkzeuge des Browsers (Chrome/Edge mit F12) öffnen. Dann mal den Container neu starten. Dann solltest du sehen, welchen Request die Website macht. Wenn du Glück hast, kannst du das auch aus deinem Skript ausführen.

        A 1 Reply Last reply Reply Quote 0
        • Glasfaser
          Glasfaser @alka last edited by

          @alka said in restart iobroker per script?:

          @glasfaser
          damit kann ich grad nichts anfangen?

          Ich habe nur André damit informiert.

          1 Reply Last reply Reply Quote 0
          • andre
            andre Developer last edited by

            Habt ihr schon mal probiert den Container mit automatischem Restart auszustatten (restart Policy) und einfach alle Prozesse im Container zu killen (pkill -u iobroker && pkill -u root)?
            Alternativ sehe ich ein issue im Github mit dem Wunsch einen restart Parameter über das Maintenance Script (Beta) einzubauen... 🙂

            MfG,
            André

            1 Reply Last reply Reply Quote 1
            • A
              alka @UncleSam last edited by alka

              @unclesam said in restart iobroker per script?:

              Eine Idee: kannst du mal mit dem Browser Portainer

              auch der restart per Portainer beendet erst und startet dann, da der Portainer weiterläuft ist das ja kein Problem beide Befehle nacheinander zu senden

              sinnvoll geht es mMn nur so oder ähnlich wie von @fastfoot beschrieben, werde es so lösen
              ideal wäre natürlich wenn in Zukunft die iobroker-Installation so etwas bereits mitbringen würde

              edit:
              allerdings sind der restart von adapter/javascript usw. ja problemlos innerhalb des iobroker zu bewältigen
              mir ging es um den restart des kompletten iobroker-systems

              edit2:
              innerhalb iobroker ist es ja eigentlich relativ einfach, alle instanzen einzusammeln und neu zu starten - einzig muss es dafür eine zusätzliche javascript-instanz geben, welche die eigentlichen javascript-instanzen wieder startet
              wieviel Kapazität frisst denn so einen instanz im system?

              F 1 Reply Last reply Reply Quote 0
              • F
                fastfoot @alka last edited by

                @alka said in restart iobroker per script?:

                edit:
                allerdings sind der restart von adapter/javascript usw. ja problemlos innerhalb des iobroker zu bewältigen

                wie würdest du das tun? Ich wüsste jetzt nicht wie ich das bewerkstelligen sollte

                mir ging es um den restart des kompletten iobroker-systems

                ich wollte mit meinem Vorschlag nicht mit dem Hammer draufschlagen, deshalb nur die Restarts. Natürlich funktioniert auch ein kill aller Prozesse(pkill io), was den Container bei entsprechender Einstellung dann automatisch neustartet, wie von @andre vorgeschlagen. Viel cooler wäre natürlich ein eingebauter Reset eines Containers wie von Andre in Aussicht gestellt. Das Warten auf einen Event mittels Skript und sleep ist nicht gerade neuester Stand der Technik und war auch mehr als Workaround gedacht, ob der Linux Watchdog im Container funktioniert, wollte ich nicht testen, reine Faulheit

                edit2:
                innerhalb iobroker ist es ja eigentlich relativ einfach, alle instanzen einzusammeln und neu zu starten - einzig muss es dafür eine zusätzliche javascript-instanz geben, welche die eigentlichen javascript-instanzen wieder startet
                wieviel Kapazität frisst denn so einen instanz im system?

                also bei mir sind das 250MB, war aber auch schon weniger, hängt evtl. mit der Anzahl der Skripte und zusätzlich installierten Module zusammen, wobei eine frisch initiierte Instanz ohne laufende Skripte auch soviel verbraucht wie meine Hauptinstanz

                A 1 Reply Last reply Reply Quote 0
                • A
                  alka @fastfoot last edited by

                  @fastfoot said in restart iobroker per script?:

                  wie würdest du das tun?
                  Beispiel einzeln in javascript.1 abschalten:

                  setState('system.adapter.javascript.0.alive',false);
                  setState('system.adapter.hm-rega.0.alive',false);
                  

                  anschließend, evtl mit timeout, wieder einschalten (die adapter jedoch nicht einzeln sondern entweder als Liste festlegen und abarbeiten oder sogar autom. einlesen

                  F 1 Reply Last reply Reply Quote 0
                  • F
                    fastfoot @alka last edited by

                    @alka said in restart iobroker per script?:

                    @fastfoot said in restart iobroker per script?:

                    wie würdest du das tun?
                    Beispiel einzeln in javascript.1 abschalten:

                    setState('system.adapter.javascript.0.alive',false);
                    setState('system.adapter.hm-rega.0.alive',false);
                    

                    anschließend, evtl mit timeout, wieder einschalten (die adapter jedoch nicht einzeln sondern entweder als Liste festlegen und abarbeiten oder sogar autom. einlesen

                    och, wie einfach. Dachte immer die alive-DP seien readonly. Ich würde dann aber über diese Restarts gehen anstatt den gesamten Container abzuschiessen, falls irgend möglich. Wäre auch für die Bediener userfreundlicher

                    A 1 Reply Last reply Reply Quote 0
                    • A
                      alka @fastfoot last edited by

                      @fastfoot
                      ja, zudem ich gerade herausgefunden habe wer/was mir dort Probleme bereitet hat:
                      https://forum.iobroker.net/topic/40949/problem-fehler-in-mit-history-adapter
                      dieses script ist aus verschiedenen Gründen notwendig, verhindert aber eine saubere Restart-Aktion

                      1 Reply Last reply Reply Quote 0
                      • Glasfaser
                        Glasfaser last edited by Glasfaser

                        @alka said in restart iobroker per script?:

                        ich benötige eine Ein-Klick (bzw zwei-klick da ich ja auch schon beim alten eine Nachfrage drin hatte) Lösung, welche sich in der VIS befindet

                        Sorry , habe den Thread übersehen das du geantwortet hast !

                        Hier im Thread Script um Befehl auf Synology ausführen, habe ich per SSH Befehl Synology Hyperbackup gestartet.

                        Mit dem hier geänderten Script von mir , kannst du den Container neustarten .

                        //Glasfaser  17.01.2021
                        //
                        //Synology Docker Container von ioBroker aus neustarten 
                        //Im JS Adapter zusätzliche NPM-Module, den Eintrag: simple-ssh
                        //im SSH Befehl name=iobroker : auf dein Containernamen ändern 
                        //user root so lassen 
                        
                        
                        
                        on({id: "0_userdata.0.Test123", change: 'ne', val: true }, function (obj) {
                        
                        log ("--> Neustart Docker gestartet!");
                        console.log('+++ Neustart Docker +++');
                          setState('0_userdata.0.Test123', false);
                          
                        var SSH = require('simple-ssh');
                        
                        var ssh = new SSH({
                           host: 'meineIP',
                           user: 'root',
                           pass: 'passwort'
                        });
                        
                        ssh.exec('/usr/syno/bin/synowebapi --exec api=SYNO.Docker.Container version=1 method=restart name=iobroker', {
                           out: function(stdout) {
                               console.log(stdout);
                               
                        
                           }
                        }).start();
                        
                        }
                        );
                        

                        EDIT:

                        Könntest du den Thread Titel vielleicht ändern auf : Docker Container restart iobroker per script?

                        F 1 Reply Last reply Reply Quote 0
                        • F
                          fastfoot @Glasfaser last edited by

                          @glasfaser said in restart iobroker per script?:

                          Mit dem hier geänderten Script von mir , kannst du den Container neustarten .

                          das ist wesentlich eleganter als meine Lösung, beschränkt die Anwendung aber leider auf einen Restart unter Synology NAS. Mal sehen ob sich für QNAP auch so etwas finden lässt 🙂

                          O Glasfaser 2 Replies Last reply Reply Quote 0
                          • O
                            oFbEQnpoLKKl6mbY5e13 @fastfoot last edited by

                            @fastfoot
                            Ja, bitte! 👍 😬

                            1 Reply Last reply Reply Quote 0
                            • Glasfaser
                              Glasfaser @fastfoot last edited by

                              @fastfoot

                              eventuell dort etwas dabei ?

                              https://qnap-dev.github.io/container-station-api/container.html

                              1 Reply Last reply Reply Quote 0
                              • Glasfaser
                                Glasfaser last edited by

                                @fastfoot

                                Laut DOKU

                                Example request of Docker
                                
                                $ curl -sq -XPUT -b cookies.txt \
                                    http://${QIP}:${QPORT}/containerstation/api/v1/container/docker/<container_id>/restart
                                
                                F 1 Reply Last reply Reply Quote 1
                                • F
                                  fastfoot @Glasfaser last edited by

                                  @glasfaser said in restart iobroker per script?:

                                  @fastfoot

                                  Laut DOKU

                                  Example request of Docker
                                  
                                  $ curl -sq -XPUT -b cookies.txt \
                                      http://${QIP}:${QPORT}/containerstation/api/v1/container/docker/<container_id>/restart
                                  

                                  Danke! Ein sehr guter starting point, bekomme aber immer einen Authorization error 🙂 weiss auch noch nicht was es mit der cookies.txt auf sich hat, aber das bekomme ich hin

                                  F 1 Reply Last reply Reply Quote 0
                                  • F
                                    fastfoot @fastfoot last edited by

                                    @fastfoot said in restart iobroker per script?:

                                    ..., bekomme aber immer einen Authorization error 🙂 weiss auch noch nicht was es mit der cookies.txt auf sich hat, aber das bekomme ich hin

                                    man sollte auch einloggen 🙂 Funktioniert astrein, morgen oder so gibts ein kleines Skript, dann klappt der Restart auch auf der QNAP. Nicht dass ich das bräuchte, aber denkbar wäre jetzt auch eine VIS mit einer Übersicht aller Container etc... wird alles als JSON geliefert, freu...

                                    O 1 Reply Last reply Reply Quote 0
                                    • O
                                      oFbEQnpoLKKl6mbY5e13 @fastfoot last edited by

                                      @fastfoot
                                      Fantastisch! 👍

                                      F 1 Reply Last reply Reply Quote 0
                                      • F
                                        fastfoot @oFbEQnpoLKKl6mbY5e13 last edited by fastfoot

                                        @ofbeqnpolkkl6mby5e13 sagte in restart iobroker per script?:

                                        @fastfoot
                                        Fantastisch! 👍

                                        nun ja, von den Infos bin ich nicht soo sehr begeistert, aber immerhin. Ich frage ja aber auch nur die Containerinfos ab. Der Restart funktioniert einwandfrei, bin gespannt ob das auf anderen QNAP-Systemen auch so klappt. Ich habe die in den Dokus genannte curl Methode mit axios umgesetzt, weshalb das in der JS-Instanz eingetragen werden muss. Die Datenpunkte für die Tabelle und den Restart werden automatisch unter 0_userdata.0.QNAP angelegt. Vor dem Start sind User und Passwort sowie die IP Adresse und der Port der QNAP einzutragen. Happy Restart!
                                        qnap1.PNG

                                        /**
                                        * Zweck:           Infos über und Restart von Docker Containern auf QNAP NAS
                                        * Date:            13.09.2021
                                        * Author:          fastfoot
                                        * Forum:           https://forum.iobroker.net/topic/40916/restart-iobroker-per-script/31?_=1610918563284
                                        * Infos:           https://qnap-dev.github.io/container-station-api/container.html#list-containers
                                        * myHome
                                        */
                                        const axios = require('axios').default; // Muss in JS-Instanz unter NPM-Module eingetragen werden
                                        const dbg = !true;
                                        const username = 'admin';               // user mit Adminrechten auf der QNAP
                                        const password = 'ein_Passwort';        // Passwort für admin oder user der Admingruppe
                                        const server = 'qnapnas';               // Hostname oder IP der QNAP NAS
                                        //const server = '192.168.178.3';
                                        const port = '8080';                    // Port der QNAP NAS
                                        let fakeId = 'xxx';                     // FakeID, wird später ersetzt
                                        const containerName = 'iobroker';       //Containername, welcher neugestartet werden soll
                                        const urlLogin = `http://${server}:${port}/container-station/api/v1/login`;  // Anmelde-URL
                                        const urlInfo = `http://${server}:${port}/container-station/api/v1/container`; // Container Infos
                                        const urlRestart = `http://${server}:${port}/container-station/api/v1/container/docker/${fakeId}/restart`;
                                        const idBase = '0_userdata.0.QNAP';
                                        const idInfo = `${idBase}.info`;                // Originalantwort der API
                                        const idRestart = `${idBase}.Restart`;          // DP zum Auslösen des Restart
                                        const idJson = `${idBase}.json`;                // DP für Infos über Container
                                        let firstRun = true;
                                        
                                        setInterval(main,2000);
                                        
                                        on({id: idRestart, change:'any'},async () => {
                                           if(dbg) log('Restart')
                                           //restart(containerName);
                                        })
                                        
                                        async function main() {
                                           let json = [];
                                           firstRun = await createDatapoints();
                                           let session = await login(urlLogin, username, password);
                                           if(dbg) log(session)
                                           let container = await getInfos(urlInfo, session);
                                           setState(idInfo,JSON.stringify(container,null,4));
                                           container.forEach((rec)=>{
                                               let memory = 0, 
                                                   cpu = 0;
                                               if('memory' in rec) memory = Math.round(rec.memory/1024/1024*1000)/1000;
                                               if('cpu' in rec) cpu = rec.cpu * 100;
                                               json.push({
                                                   Name: rec.name,
                                                   Image: rec.image,
                                                   Memory:  memory,
                                                   CPU: cpu,
                                                   State: rec.state
                                                   //Id: rec.id,
                                               })
                                           })
                                           setState(idJson, JSON.stringify(json,null,4));
                                        }
                                        
                                        async function login(url,username,password) {
                                           let session;
                                           let data = await axios.post(url,{username,password});
                                           if(data.status == 200){
                                               session = data.headers['set-cookie'][0].split(';')[0];
                                           }
                                           return session;
                                        }
                                        
                                        async function getInfos(url, session) {
                                           let data = (await axios.get(url, {headers: {Cookie: session}}));
                                           if(data.status == 200){
                                               return data.data;
                                           }
                                        }
                                        
                                        async function restart(containerName) {
                                           let session = await login(urlLogin, username, password);
                                           let container = await getInfos(urlInfo, session);
                                        
                                           container.forEach(async (rec)=> {
                                               if(rec.name == containerName) {
                                                   let url = urlRestart.replace(fakeId,rec.id);
                                                   if(!firstRun) {
                                                       let data = await axios.put(url,'',{headers: {Cookie: session}});
                                                       if(dbg) log(data.data);
                                                   }
                                               }
                                           })
                                        }
                                        // create data points if not existing
                                        async function createDatapoints() {
                                           let dp,
                                               idKey,
                                               firstRun = false;
                                           
                                           const stateAttributes = {
                                               "Restart":{"name":"Container Restart","type":"boolean","role":"button","read":true,"write":true,"desc":"von Skript erstellt","def":false},
                                               "info":{"name":"Info original","type":"string","role":"state","read":true,"write":true,"desc":"von Skript erstellt","def": ""},
                                               "json":{"name":"Info Tabelle","type":"string","role":"state","read":true,"write":true,"desc":"von Skript erstellt","def":""}
                                           }
                                        
                                           for(let key in stateAttributes) {
                                        
                                               idKey = idBase + '.' + key;
                                        
                                               if (!(await existsStateAsync(idKey))) {
                                                   dp = stateAttributes[key];
                                                   firstRun = true;
                                                   await createStateAsync(idKey, dp);
                                               }
                                           }
                                        
                                           return firstRun;
                                        
                                        }
                                        
                                        

                                        O F 2 Replies Last reply Reply Quote 1
                                        • O
                                          oFbEQnpoLKKl6mbY5e13 @fastfoot last edited by

                                          @fastfoot
                                          Wahnsinn! Vielen, vielen Dank!

                                          2021-01-18 20:09:22.686 - info: host.iobroker-d stopInstance system.adapter.javascript.0 (force=false, process=true)
                                          2021-01-18 20:09:22.697 - info: host.iobroker-d stopInstance system.adapter.javascript.0 send kill signal
                                          2021-01-18 20:09:22.698 - info: javascript.0 (5079) Got terminate signal TERMINATE_YOURSELF
                                          

                                          Daten sind auch alle da! Da mache ich mir doch glatt auch so eine View.

                                          Nach dem Start des Skripts wurde sofort neu gestartet. Normal?

                                          (TS-453 Pro)

                                          F 1 Reply Last reply Reply Quote 0
                                          • F
                                            fastfoot @oFbEQnpoLKKl6mbY5e13 last edited by

                                            @ofbeqnpolkkl6mby5e13 sagte in restart iobroker per script?:

                                            Nach dem Start des Skripts wurde sofort neu gestartet. Normal?

                                            Nein, nicht normal. Das wird eigentlich durch die Variable firstRun verhindert, jedenfalls beim Erstellen der Datenpunkte passierte das und dann habe ich das eingebaut und es hat funktioniert.

                                            Passiert das bei jedem Neustart des Skripts oder war das eine einmalige Sache? Falls Letzteres passiert es beim Erstellen des Restart-DP und sollte durch die Variable verhindert werden. Gerade getestet und funktioniert wie beschrieben. Falls das bei dir anders ist, kannst du das on() in einen Timeout packen, dann sollte er auch nicht beim Erstellen gleich triggern.

                                            setTimeout(()=>{
                                                on({id: idRestart, change:'any'},async () => {
                                                    if(dbg) log('Restart')
                                                    restart(containerName);
                                                })
                                            },2000)
                                            
                                            O 2 Replies Last reply Reply Quote 0
                                            • First post
                                              Last post

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate
                                            FAQ Cloud / IOT
                                            HowTo: Node.js-Update
                                            HowTo: Backup/Restore
                                            Downloads
                                            BLOG

                                            888
                                            Online

                                            31.7k
                                            Users

                                            79.9k
                                            Topics

                                            1.3m
                                            Posts

                                            11
                                            62
                                            4897
                                            Loading More Posts
                                            • Oldest to Newest
                                            • Newest to Oldest
                                            • Most Votes
                                            Reply
                                            • Reply as topic
                                            Log in to reply
                                            Community
                                            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                            The ioBroker Community 2014-2023
                                            logo