#!/bin/bash # T&M Hansson IT AB © - 2022, https://www.hanssonit.se/ # Copyright © 2021 Simon Lindner (https://github.com/szaimen) true SCRIPT_NAME="Push Notifications for Nextcloud" SCRIPT_EXPLAINER="$SCRIPT_NAME attempts to solve the issue where Nextcloud clients have to \ periodically check the server if any files have been changed, new activities were created, \ or a notification was created/processed/dismissed, which increases the load on the server. \ By providing a way for the server to send update notifications to the clients, \ the need for the clients to make these checks can be greatly reduced, \ which reduces the load on the servern and delivers notifications to the clients in some cases faster." # shellcheck source=lib.sh source /var/scripts/fetch_lib.sh || source <(curl -sL https://raw.githubusercontent.com/nextcloud/vm/master/lib.sh) # Check for errors + debug code and abort if something isn't right # 1 = ON # 0 = OFF DEBUG=0 debug_mode # Check if root root_check # NC 21 required lowest_compatible_nc 21 # Variables NOTIFY_PUSH_SERVICE_PATH="/etc/systemd/system/notify_push.service" ARCHITECTURE=$(uname -p) # Test prequesites print_text_in_color "$ICyan" "Checking if Nextcloud is installed..." # Check redis if ! php -m | grep -q redis then msg_box "The redis php extension isn't enabled. Please run the an update to fix this." exit 1 fi # Check TLS NCDOMAIN=$(nextcloud_occ_no_check config:system:get overwrite.cli.url | sed 's|https://||;s|/||') if ! curl -s https://"$NCDOMAIN"/status.php | grep -q 'installed":true' then msg_box "It seems like Nextcloud is not installed or that you don't use https on: $NCDOMAIN. Please install Nextcloud and make sure your domain is reachable, or activate TLS on your domain to be able to run this script. If you use the Nextcloud VM you can use the Let's Encrypt script to get TLS and activate your Nextcloud domain." exit 1 fi # Check apache conf if ! [ -f "$SITES_AVAILABLE/$NCDOMAIN.conf" ] then msg_box "It seems like you haven't used the built-in 'Activate TLS' script to enable 'Let's Encrypt!' \ on your instance. Unfortunately is this a requirement to be able to configure $SCRIPT_NAME successfully. The installation will be aborted." exit 1 elif ! grep -q "" "$SITES_AVAILABLE/$NCDOMAIN.conf" then msg_box "The virtualhost config doesn't seem to be the default. Cannot proceed." exit 1 fi # Check processor architecture if [ "$ARCHITECTURE" != "x86_64" ] && [ "$ARCHITECTURE" != "aarch64" ] && [ "$ARCHITECTURE" != "armv7" ] then msg_box "No compatible processor architecture found. Cannot proceed." exit 1 fi # Check if notify_push is already installed if ! [ -f "$NOTIFY_PUSH_SERVICE_PATH" ] && ! is_app_installed notify_push then # Ask for installing install_popup "$SCRIPT_NAME" else # Ask for removal or reinstallation reinstall_remove_menu "$SCRIPT_NAME" # Removal if is_app_installed notify_push then nextcloud_occ_no_check app:remove notify_push fi sed -i "/#Notify-push-start/,/#Notify-push-end/d" "$SITES_AVAILABLE/$NCDOMAIN.conf" systemctl restart apache2 systemctl stop notify_push &>/dev/null systemctl disable notify_push &>/dev/null rm -f "$NOTIFY_PUSH_SERVICE_PATH" count=0 while [ "$count" -lt 10 ] do if [ "$(nextcloud_occ_no_check config:system:get trusted_proxies "$count")" = "127.0.0.1" ] then nextcloud_occ_no_check config:system:delete trusted_proxies "$count" break else count=$((count+1)) fi done # Show successful uninstall if applicable removal_popup "$SCRIPT_NAME" fi # Install the app install_and_enable_app notify_push # The app needs to be disabled before the setup nextcloud_occ_no_check app:disable notify_push # configure correct rights (otherwise the daemon might fail to start) chmod 770 -R "$NC_APPS_PATH/notify_push" # Setting up the service cat << NOTIFY_PUSH > "$NOTIFY_PUSH_SERVICE_PATH" [Unit] Description = Push daemon for Nextcloud clients [Service] Environment = PORT=7867 ExecStart = $NC_APPS_PATH/notify_push/bin/$ARCHITECTURE/notify_push $NCPATH/config/config.php User = www-data [Install] WantedBy = multi-user.target NOTIFY_PUSH # Starting and enabling the service systemctl start notify_push systemctl enable notify_push # Apache config sudo a2enmod proxy sudo a2enmod proxy_http sudo a2enmod proxy_wstunnel cat << APACHE_PUSH_CONF > /tmp/apache.conf #Notify-push-start - Please don't remove or change this line ProxyPass /push/ws ws://localhost:7867/ws ProxyPass /push/ http://localhost:7867/ ProxyPassReverse /push/ http://localhost:7867/ #Notify-push-end - Please don't remove or change this line" APACHE_PUSH_CONF sed -i '//r /tmp/apache.conf' "$SITES_AVAILABLE/$NCDOMAIN.conf" rm -f /tmp/apache.conf if ! systemctl restart apache2 then msg_box "Failed to restart apache2. Will restore the old NCDOMAIN config now." sed -i "/#Notify-push-start/,/#Notify-push-end/d" "$SITES_AVAILABLE/$NCDOMAIN.conf" systemctl stop notify_push rm "$NOTIFY_PUSH_SERVICE_PATH" systemctl restart apache2 nextcloud_occ_no_check app:remove notify_push exit 1 fi # Add localhost to trusted proxies count=0 while [ "$count" -lt 10 ] do if [ "$(nextcloud_occ_no_check config:system:get trusted_proxies "$count")" = "127.0.0.1" ] then break elif [ -z "$(nextcloud_occ_no_check config:system:get trusted_proxies "$count")" ] then nextcloud_occ_no_check config:system:set trusted_proxies "$count" --value="127.0.0.1" break else count=$((count+1)) fi done # Enable Nextcloud app install_and_enable_app notify_push # Configure the Nextcloud app and test if it works countdown "Waiting for the setup check to take place..." "3" if ! nextcloud_occ_no_check notify_push:setup "https://$NCDOMAIN/push" then msg_box "Something didn't work while testing $SCRIPT_NAME. Please try again by running this script again!" exit 1 else msg_box "Congratulations! $SCRIPT_NAME was set up correctly!" fi