IOTstack – převod z old-menu na master

Vzhledem k faktu, že stabilita master vývojové větve již pokročila a že výhody převážily, je vhodné přejít ze stávajícího old-menu na hlavní větev. V tomto návodu si nastíníme, jak to udělat.

Stav doposud byl takový, že se doporučovalo u IOTstack využít tzv. old-menu branch, což znamená jiné vývojové větvi, než je ta hlavní (nazvaná master branch nebo též pouze master, případně v komunitě okolo IOTstack jako new-menu). Pro účely tohoto článku se bude jako rozlišení jednotlivých větví používat označení old-menu a master.


Trocha teorie do začátku

Předem návodu je třeba říci, že celý výsledný stack je de-facto pouze o jediném souboru docker-compose.yml, ve kterém jsou definice jednotlivých služeb/programů. Toto je zásadní informace, kterou je nutné pochopit, před započetím všech úkonů.

Tento soubor je generován přes skript menu.sh, který dle nastavené vývojové větve používá různý obsah výchozích adresářů (typicky /.templates/ – šablony a následně i třeba /services/, kde byly uloženy například provozní proměnné). Respektive v old-menu právě používal provozní proměnné z podadresáře /services/, kde je načítal ze souborů s koncovkou .env.

Základním rozdílem mezi starou a novou vývojovou větví je ten, že se používají striktnější formu zápisu, nepoužívají se již .env soubory, ale veškeré definice proměnných je přímo v docker-compose.yml souboru, stejně jako definice sítí (rozdílné rozsahy IP, IP bran, DNS, apod.).

Nyní již pojďme ke konkrétním změnám.


Od teorie k praxi

Jak již bylo řečeno v předchozí sekci, vše je pro stávající uživatele pouze o souboru docker-compose.yml. Tedy si jej zazálohujeme a z adresáře /IOTstacku/ jej můžeme smazat.

Nyní změníme branch z old-menu na master příkazy:

cd ~/IOTstack/ 
git checkout .
git checkout master
git pull

Tímto by se měl změnit branch na master, což můžeme ověřit příkazem git branch (měl by vrátit hodnotu * master).

Pokud chceme přesně zjistit, co je potřeba kde změnit a chceme se v tom vrtat, pokračujeme ve čtení dalšího odstavce, pokud to někoho nezajímá a chce mít hned hotovo, přeskočí odstavec s generováním souboru a inspiruje se u mého vzorového souboru, který si porovná se svým a upraví dle mého (včetně sekce networks).

Spustíme tedy ./menu.sh a necháme si přes Build stack vygenerovat znovu docker-compose.yml, stejně jako „tenkrát poprvé„. Následně můžeme soubory porovnat a podívat se na změny v konkrétních sekcích a tyto aplikovat ve svém původním souboru.

Základním novým požadavkem je počet mezer. Zapamatujte si, že základní schéma, tvořící stromovou strukturu, je vždy X+2, kdy výchozí X je 2. Tedy první definice sekce je odsazená o dvě mezery, její podvolby o 2+2, tedy 4 mezery. Takto to pokračuje dále. Nelze používat žádné TABulátory, pouze mezery!

Sekci network: můžete nechat dole souboru jak je, tu zatím běžně nevyužijeme.

Nakonec jen upravený soubor nahrajeme zpět do původního umístění v RPi a jen dáme příkaz DOWN na vypnutí stacku a následně UP pro jeho znovusestavení.

Tímto máme celou migraci na master hotovou.


Vzorový docker-compose.yml, který používám

Pokud byste se chtěli inspirovat konkrétními sekcemi, jak je mám řešené já, přidávám obsah svého souboru. Klidně si celé sekce můžete vykopírovat a použít. Případně si jej stáhnout celý a ty co nepotřebujete zakomentovat/smazat:

version: '3.6'

services:

  nodered:
    container_name: nodered
    build: ./services/nodered/.
    restart: unless-stopped
    environment:
      - TZ=Europe/Prague
#    ports:
#      - "1880:1880"
    volumes:
      - ./volumes/nodered/data:/data
      - ./volumes/nodered/ssh:/root/.ssh
      - /var/run/docker.sock:/var/run/docker.sock
      - /var/run/dbus/system_bus_socket:/var/run/dbus/system_bus_socket
    user: "0"
    devices:
      - "/dev/ttyAMA0:/dev/ttyAMA0"
      - "/dev/vcio:/dev/vcio"
      - "/dev/gpiomem:/dev/gpiomem"
    network_mode: host

  deconz:
    image: deconzcommunity/deconz:latest
    container_name: deconz
    restart: unless-stopped
    ports:
      - "8090:80"
      - "443:443"
      - "5901:5900"
    volumes:
      - ./volumes/deconz:/opt/deCONZ
    devices:
      #ConBee II:
      - /dev/ttyACM0
    environment:
      - DECONZ_VNC_MODE=1
      - DECONZ_VNC_PASSWORD=tajneheslo
      - DEBUG_INFO=1
      - DEBUG_APS=0
      - DEBUG_ZCL=0
      - DEBUG_ZDP=0
      - DEBUG_OTAU=0
      - TZ=Europe/Prague

  portainer-ce:
    container_name: portainer-ce
    image: portainer/portainer-ce
    restart: unless-stopped
    ports:
      - "8000:8000"
      - "9000:9000"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./volumes/portainer-ce/data:/data

  influxdb:
    container_name: influxdb
    image: "influxdb:1.8"
    restart: unless-stopped
    ports:
      - "8086:8086"
      - "8083:8083"
    environment:
      - TZ=Europe/Prague
      - INFLUXDB_HTTP_FLUX_ENABLED=false
      - INFLUXDB_REPORTING_DISABLED=false
      - INFLUXDB_HTTP_AUTH_ENABLED=false
      - INFLUXDB_USER=tajnyuzivatel
      - INFLUXDB_USER_PASSWORD=tajneheslo
      - INFLUXDB_UDP_ENABLED=false
      - INFLUXDB_UDP_BIND_ADDRESS=0.0.0.0:8086
      - INFLUXDB_UDP_DATABASE=udp
    volumes:
      - ./volumes/influxdb/data:/var/lib/influxdb
      - ./backups/influxdb/db:/var/lib/influxdb/backup
    healthcheck:
      test: ["CMD", "curl", "http://localhost:8086"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 30s
  grafana:
    container_name: grafana
    image: grafana/grafana:latest
    restart: unless-stopped
    ports:
      - "3000:3000"
    environment:
      - TZ=Europe/Prague
      - GF_PATHS_DATA=/var/lib/grafana
      - GF_PATHS_LOGS=/var/log/grafana      - GF_DATE_FORMATS_INTERVAL_HOUR=DD/MM HH:mm
      - GF_DATE_FORMATS_INTERVAL_DAY=DD/MM    volumes:
      - ./volumes/grafana/data:/var/lib/grafana
      - ./volumes/grafana/log:/var/log/grafana
    user: "0"
    healthcheck:
      test: ["CMD", "wget", "-O", "/dev/null", "http://localhost:3000"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 30s

  mosquitto:
    container_name: mosquitto
    build: ./.templates/mosquitto/.
    restart: unless-stopped
    environment:
      - TZ=Europe/Prague
    ports:
      - "1883:1883"
    volumes:
      - ./volumes/mosquitto/config:/mosquitto/config
      - ./volumes/mosquitto/data:/mosquitto/data
      - ./volumes/mosquitto/log:/mosquitto/log
      - ./volumes/mosquitto/pwfile:/mosquitto/pwfile

  tasmoadmin:
    container_name: tasmoadmin
    image: raymondmm/tasmoadmin
    restart: unless-stopped
    ports:
      - "8088:80"
    volumes:
      - ./volumes/tasmoadmin/data:/data

  homebridge:
    container_name: homebridge
    image: oznu/homebridge:latest
    restart: unless-stopped
    environment:
      - TZ=Europe/Prague
      - PGID=1000
      - PUID=1000
      - HOMEBRIDGE_CONFIG_UI=1
      - HOMEBRIDGE_CONFIG_UI_PORT=8581
    volumes:
      - ./volumes/homebridge:/homebridge
    network_mode: host

  dozzle:
    container_name: dozzle
    image: amir20/dozzle:latest
    restart: unless-stopped
    ports:
      - "9087:8080"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock

  homer:
    image: b4bz/homer:latest
    container_name: homer
    environment:
      - UID=1000
      - GID=1000
    volumes:
      - ./volumes/homer/assets:/www/assets
    ports:
      - "8881:8080"
    restart: unless-stopped

networks:
  default:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: "10.77.60.0/24"

  nextcloud:
    driver: bridge
    internal: true
    ipam:
      driver: default
      config:
        - subnet: "10.77.76.0/24"

Určitě si všimnete, že proti standardnímu řešení je u některých sekcí přidaný i tzv. healthcheck, který navíc testuje i dostupnost dané služby (je následně vidět třeba v portaineru).

Pokud používáte i Node-RED, je potřeba ověřit, že soubor Dockerfile v cestě ~/IOTstack/services/nodered/ odpovídá novému dle master. Vypsání obsahu provedete příkazem:

cat ~/IOTstack/services/nodered/Dockerfile

Následně srovnejte s mým, pokud neodpovídá, tak nahraďte jeho obsah mým:

FROM nodered/node-red:latest-14 
USER root RUN apk update && apk add --no-cache eudev-dev mosquitto-clients bind-tools tcpdump tree 
USER node-red 
RUN npm install \
#  node-red-node-pi-gpiod \
#  node-red-dashboard \
#  node-red-contrib-influxdb \
  node-red-contrib-boolean-logic \
#  node-red-node-rbe \
#  node-red-configurable-ping \
#  node-red-node-email

Po uložení je potřeba provést ještě BUILD nodered, aby se tento sestavil znovu, dle výše uvedeného souboru.


Opětovně chci zde pod čarou poděkovat Phillovi (Paraphraser), který je pro mne opravdu nekonečnou studnicí informací, podpory, návodů a postřehů, na základě kterých píši i tyto články a návody.

$ s myšlenky na „$ s“
  1. co s tím? díky 😀
    pi@raspberrypi:~/IOTstack $ git checkout master
    error: Your local changes to the following files would be overwritten by checkout:
    .templates/deconz/build.sh
    Please commit your changes or stash them before you switch branches.
    Aborting

Zanechat komentář