Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Breaking] Update Zigbee2mqtt to v.2.0.0 (Read PR Description) #1221

Merged
merged 11 commits into from
Jan 5, 2025
113 changes: 31 additions & 82 deletions ct/zigbee2mqtt.sh
Original file line number Diff line number Diff line change
Expand Up @@ -28,95 +28,44 @@ function update_script() {
header_info
check_container_storage
check_container_resources
if [[ ! -d /opt/zigbee2mqtt ]]; then
msg_error "No ${APP} Installation Found!"
exit
fi
if [[ "$(node -v | cut -d 'v' -f 2)" == "18."* ]]; then
if ! command -v npm >/dev/null 2>&1; then
if ! command -v pnpm >/dev/null 2>&1; then
echo "Installing NPM..."
apt-get install -y npm >/dev/null 2>&1
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think the Debian npm package contains pnpm, does it?
If not, this is what the pnpm website suggest for installing on POSIX systems:

Suggested change
apt-get install -y npm >/dev/null 2>&1
wget -qO- https://get.pnpm.io/install.sh | sh -

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also, the install script uses npm install -g pnpm, so maybe we should keep it consistent here. With nodejs being installed, npm will be present.

echo "Installed NPM..."
fi
fi
cd /opt/zigbee2mqtt

stop_zigbee2mqtt() {
if which systemctl 2>/dev/null >/dev/null; then
echo "Shutting down Zigbee2MQTT..."
sudo systemctl stop zigbee2mqtt
else
echo "Skipped stopping Zigbee2MQTT, no systemctl found"
fi
}

start_zigbee2mqtt() {
if which systemctl 2>/dev/null >/dev/null; then
echo "Starting Zigbee2MQTT..."
sudo systemctl start zigbee2mqtt
else
echo "Skipped starting Zigbee2MQTT, no systemctl found"
fi
}

set -e

if [ -d data-backup ]; then
echo "ERROR: Backup directory exists. May be previous restoring was failed?"
echo "1. Save 'data-backup' and 'data' dirs to safe location to make possibility to restore config later."
echo "2. Manually delete 'data-backup' dir and try again."
exit 1
if [[ ! -d /opt/zigbee2mqtt ]]; then
msg_error "No ${APP} Installation Found!"
exit
fi

stop_zigbee2mqtt

echo "Generating a backup of the configuration..."
cp -R data data-backup || {
echo "Failed to create backup."
exit 1
}

echo "Checking if any changes were made to package-lock.json..."
git checkout package-lock.json || {
echo "Failed to check package-lock.json."
exit 1
}

echo "Initiating update..."
if ! git pull; then
echo "Update failed, temporarily storing changes and trying again."
git stash && git pull || (
echo "Update failed even after storing changes. Aborting."
exit 1
)
RELEASE=$(curl -s https://api.github.com/repos/Koenkk/zigbee2mqtt/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
msg_info "Stopping Service"
systemctl stop zigbee2mqtt
msg_ok "Stopped Service"

msg_info "Creating Backup"
mkdir -p /opt/z2m_backup
tar -czf /opt/z2m_backup/${APP}_backup_$(date +%Y%m%d%H%M%S).tar.gz -C /opt zigbee2mqtt &>/dev/null
mv /opt/zigbee2mqtt/data /opt/z2m_backup
msg_ok "Backup Created"

msg_info "Updating ${APP} to v${RELEASE}"
cd /opt
wget -q "https://github.com/Koenkk/zigbee2mqtt/archive/refs/tags/${RELEASE}.zip"
unzip -q ${RELEASE}.zip
mv zigbee2mqtt-${RELEASE} /opt/zigbee2mqtt
rm -rf /opt/zigbee2mqtt/data
mv /opt/z2m_backup/data /opt/zigbee2mqtt
MickLesk marked this conversation as resolved.
Show resolved Hide resolved

msg_info "Starting Service"
systemctl start zigbee2mqtt
msg_ok "Started Service"
echo "${RELEASE}" >/opt/${APP}_version.txt
else
msg_ok "No update required. ${APP} is already at v${RELEASE}."
fi

echo "Acquiring necessary components..."
npm ci || {
echo "Failed to install necessary components."
exit 1
}

echo "Building..."
npm run build || {
echo "Failed to build new version."
exit 1
}

echo "Restoring configuration..."
cp -R data-backup/* data || {
echo "Failed to restore configuration."
exit 1
}

rm -rf data-backup || {
echo "Failed to remove backup directory."
exit 1
}

start_zigbee2mqtt

echo "Done!"
exit
}

Expand All @@ -127,4 +76,4 @@ description
msg_ok "Completed Successfully!\n"
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:9442${CL}"
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:9442${CL}"
46 changes: 28 additions & 18 deletions install/zigbee2mqtt-install.sh
Original file line number Diff line number Diff line change
Expand Up @@ -14,15 +14,16 @@ network_check
update_os

msg_info "Installing Dependencies"
$STD apt-get install -y curl
$STD apt-get install -y sudo
$STD apt-get install -y mc
$STD apt-get install -y git
$STD apt-get install -y make
$STD apt-get install -y g++
$STD apt-get install -y gcc
$STD apt-get install -y ca-certificates
$STD apt-get install -y gnupg
$STD apt-get install -y \
curl \
sudo \
mc \
git \
make \
g++ \
gcc \
ca-certificates \
gnupg
msg_ok "Installed Dependencies"

msg_info "Setting up Node.js Repository"
Expand All @@ -36,37 +37,46 @@ $STD apt-get update
$STD apt-get install -y nodejs
MickLesk marked this conversation as resolved.
Show resolved Hide resolved
msg_ok "Installed Node.js"

msg_info "Setting up Zigbee2MQTT Repository"
$STD git clone --depth 1 https://github.com/Koenkk/zigbee2mqtt.git /opt/zigbee2mqtt
msg_ok "Set up Zigbee2MQTT Repository"
msg_info "Installing pnpm"
$STD npm install -g pnpm
msg_ok "Installed pnpm"

msg_info "Installing Zigbee2MQTT"
msg_info "Setting up Zigbee2MQTT"
cd /opt
$STD corepack enable
RELEASE=$(curl -s https://api.github.com/repos/Koenkk/zigbee2mqtt/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
wget -q "https://github.com/Koenkk/zigbee2mqtt/archive/refs/tags/${RELEASE}.zip"
unzip -q ${RELEASE}.zip
mv zigbee2mqtt-${RELEASE} /opt/zigbee2mqtt
cd /opt/zigbee2mqtt/data
mv configuration.example.yaml configuration.yaml
cd /opt/zigbee2mqtt
$STD npm ci
$STD pnpm install
MickLesk marked this conversation as resolved.
Show resolved Hide resolved
msg_ok "Installed Zigbee2MQTT"
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Shouldn't there be a buildstep somewhere with pnpm build? Maybe I am missing it somewhere.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For what?

Copy link
Contributor

@dsiebel dsiebel Jan 4, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's what the update.sh script in the zigbee2mqtt repository does.
Maybe it makes sense to use the update script rather than building our own?
It already contains data backup, systemd service handling.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

But the Script do an Git Pull, i hate Git pulls, because its breaking often some scripts

Copy link
Contributor

@dsiebel dsiebel Jan 4, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fair point, I didn't realize you changed install to stable version from release assets. I like this approach much better.

The pnpm build will still be required, I guess, since the script just downloads the source code, not a pre-built release package.

Copy link
Contributor

@se-bastiaan se-bastiaan Jan 4, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The pnpm build will still be required, I guess, since the script just downloads the source code, not a pre-built release package.

Exactly. Zigbee2MQTT is written in typescript. The start command only runs the index.js file and without the build command there is no dist folder with the actual code that can be opened by Node. The TS needs to be transpiled and that is what pnpm build does.

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

actually I think you should run pnpm run build as described in the documentation which will execute tsc && node index.js writehash and the same should happen in the update part.
https://github.com/Koenkk/zigbee2mqtt/blob/060ae99cff715cc9ef6a0cfa7cae0cdcb17f0c8a/package.json#L23

Copy link
Contributor

@se-bastiaan se-bastiaan Jan 4, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That's exactly the idea. pnpm run build and pnpm build are equivalent.


msg_info "Creating Service"
service_path="/etc/systemd/system/zigbee2mqtt.service"
cat <<EOF >/etc/systemd/system/zigbee2mqtt.service
echo "[Unit]
Description=zigbee2mqtt
After=network.target
[Service]
Environment=NODE_ENV=production
ExecStart=/usr/bin/npm start
ExecStart=/usr/bin/pnpm start
WorkingDirectory=/opt/zigbee2mqtt
StandardOutput=inherit
StandardError=inherit
Restart=always
User=root
[Install]
WantedBy=multi-user.target" >$service_path
$STD systemctl enable zigbee2mqtt.service
EOF
systemctl enable -q --now zigbee2mqtt.service
msg_ok "Created Service"

motd_ssh
customize

msg_info "Cleaning up"
rm -rf /opt/${RELEASE}.zip
$STD apt-get -y autoremove
$STD apt-get -y autoclean
msg_ok "Cleaned"
Loading