IOTstack – převod z old-menu na master
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“
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 😀