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 pullTí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/DockerfileNá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-emailPo 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“
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
Smaz ten soubor v te ceste a mas to nejrychlejsi 😀