diff --git a/setup/nextcloud.sh b/setup/nextcloud.sh index e80480a5..6873d06d 100755 --- a/setup/nextcloud.sh +++ b/setup/nextcloud.sh @@ -2,7 +2,7 @@ # Nextcloud ########################## -source setup/functions.sh # load our functions +source ../setup/functions.sh # load our functions source /etc/mailinabox.conf # load global vars # ### Installing Nextcloud @@ -11,88 +11,116 @@ echo "Installing Nextcloud (contacts/calendar)..." apt-get purge -qq -y owncloud* # we used to use the package manager -apt_install php php-fpm \ - php-cli php-sqlite3 php-gd php-imap php-curl php-pear curl \ - php-dev php-gd php-xml php-mbstring php-zip php-apcu php-json \ - php-intl php-imagick +apt_install php php7.2-fpm \ + php-cli php-sqlite3 php-gd php-imap php-curl php-pear curl \ + php-dev php-gd php-xml php-mbstring php-zip php-apcu php-json \ + php-intl php-imagick InstallNextcloud() { - version=$1 - hash=$2 + version=$1 - echo - echo "Upgrading to Nextcloud version $version" - echo + echo + echo "Upgrading to Nextcloud version $version" + echo # Download and verify - wget_verify https://download.nextcloud.com/server/releases/nextcloud-$version.zip $hash /tmp/nextcloud.zip + wget --directory-prefix=/tmp/ https://download.nextcloud.com/server/releases/nextcloud-$version.zip - # Remove the current owncloud/Nextcloud - rm -rf /usr/local/lib/owncloud + # Remove the current owncloud/Nextcloud + rm -rf /usr/local/lib/owncloud - # Extract ownCloud/Nextcloud - unzip -q /tmp/nextcloud.zip -d /usr/local/lib - mv /usr/local/lib/nextcloud /usr/local/lib/owncloud - rm -f /tmp/nextcloud.zip + # Extract ownCloud/Nextcloud + unzip -q /tmp/nextcloud-$version.zip -d /usr/local/lib + mv /usr/local/lib/nextcloud /usr/local/lib/owncloud + rm -f /tmp/nextcloud-$version.zip - # The two apps we actually want are not in Nextcloud core. Download the releases from - # their github repositories. - mkdir -p /usr/local/lib/owncloud/apps + # The two apps we actually want are not in Nextcloud core. Download the releases from + # their github repositories + if [[ $version =~ ^17]]; then + wget --directory-prefix=/tmp/ https://github.com/nextcloud/contacts/releases/download/v3.1.7/contacts.tar.gz + tar -xf /tmp/contacts.tar.gz -C /usr/local/lib/owncloud/apps/ + rm /tmp/contacts.tar.gz - wget_verify https://github.com/nextcloud/contacts/releases/download/v3.1.6/contacts.tar.gz d331dc6db2ecf7c8e6166926a055dfa3b59722c3 /tmp/contacts.tgz - tar xf /tmp/contacts.tgz -C /usr/local/lib/owncloud/apps/ - rm /tmp/contacts.tgz + wget --directory-prefix=/tmp/ https://github.com/nextcloud/calendar/releases/download/v2.0.1/calendar.tar.gz + tar -xf /tmp/calendar.tar.gz -C /usr/local/lib/owncloud/apps/ + rm /tmp/calendar.tar.gz + elif [[ $version =~ ^16]]; then + wget --directory-prefix=/tmp/ https://github.com/nextcloud/contacts/releases/download/v3.1.6/contacts.tar.gz + tar -xf /tmp/contacts.tar.gz -C /usr/local/lib/owncloud/apps/ + rm /tmp/contacts.tar.gz - wget_verify https://github.com/nextcloud/calendar/releases/download/v1.7.1/calendar.tar.gz bd7c846bad06da6d6ba04280f6fbf37ef846c2ad /tmp/calendar.tgz - tar xf /tmp/calendar.tgz -C /usr/local/lib/owncloud/apps/ - rm /tmp/calendar.tgz + wget --directory-prefix=/tmp/ https://github.com/nextcloud/calendar/releases/download/v1.7.2/calendar.tar.gz + tar -xf /tmp/calendar.tar.gz -C /usr/local/lib/owncloud/apps/ + rm /tmp/calendar.tar.gz + elif [[ $version =~ ^15 ]]; then + wget --directory-prefix=/tmp/ https://github.com/nextcloud/contacts/releases/download/v3.1.6/contacts.tar.gz + tar -xf /tmp/contacts.tar.gz -C /usr/local/lib/owncloud/apps/ + rm /tmp/contacts.tar.gz - # Starting with Nextcloud 15, the app user_external is no longer included in Nextcloud core, - # we will install from their github repository. - if [[ $version =~ ^1[567] ]]; then - wget_verify https://github.com/nextcloud/user_external/releases/download/v0.7.0/user_external-0.7.0.tar.gz 555a94811daaf5bdd336c5e48a78aa8567b86437 /tmp/user_external.tgz - tar -xf /tmp/user_external.tgz -C /usr/local/lib/owncloud/apps/ - rm /tmp/user_external.tgz - fi + wget --directory-prefix=/tmp/ https://github.com/nextcloud/calendar/releases/download/v1.7.2/calendar.tar.gz + tar -xf /tmp/calendar.tar.gz -C /usr/local/lib/owncloud/apps/ + rm /tmp/calendar.tar.gz + elif [[ $version =~ ^14]] then + wget --directory-prefix=/tmp/ https://github.com/nextcloud/contacts/releases/download/v2.1.8/contacts.tar.gz + tar -xf /tmp/contacts.tar.gz -C /usr/local/lib/owncloud/apps/ + rm /tmp/contacts.tar.gz - # Fix weird permissions. - chmod 750 /usr/local/lib/owncloud/{apps,config} + wget --directory-prefix=/tmp/ https://github.com/nextcloud/calendar/releases/download/v1.6.6/calendar.tar.gz + tar -xf /tmp/calendar.tar.gz -C /usr/local/lib/owncloud/apps/ + rm /tmp/calendar.tar.gz + elif [[$version =~ ^13]] then + wget --directory-prefix=/tmp/ https://github.com/nextcloud/contacts/releases/download/v3.1.6/contacts.tar.gz + tar -xf /tmp/contacts.tar.gz -C /usr/local/lib/owncloud/apps/ + rm /tmp/contacts.tar.gz - # Create a symlink to the config.php in STORAGE_ROOT (for upgrades we're restoring the symlink we previously - # put in, and in new installs we're creating a symlink and will create the actual config later). - ln -sf $STORAGE_ROOT/owncloud/config.php /usr/local/lib/owncloud/config/config.php + wget --directory-prefix=/tmp/ https://github.com/nextcloud/calendar/releases/download/v1.7.2/calendar.tar.gz + tar -xf /tmp/calendar.tar.gz -C /usr/local/lib/owncloud/apps/ + rm /tmp/calendar.tar.gz + # Starting with Nextcloud 15, the app user_external is no longer included in Nextcloud core, + # we will install from their github repository. + if [[ $version =~ ^15 ]]; then + wget --directory-prefix=/tmp/ https://github.com/nextcloud/user_external/releases/download/v0.8.0/user_external-0.8.0.tar.gz + tar -xf /tmp/user_external-0.8.0.tar.gz -C /usr/local/lib/owncloud/apps/ + rm /tmp/user_external-0.8.0.tar.gz + fi - # Make sure permissions are correct or the upgrade step won't run. - # $STORAGE_ROOT/owncloud may not yet exist, so use -f to suppress - # that error. - chown -f -R www-data.www-data $STORAGE_ROOT/owncloud /usr/local/lib/owncloud || /bin/true + # Fix weird permissions. + chmod 750 /usr/local/lib/owncloud/{apps,config} - # If this isn't a new installation, immediately run the upgrade script. - # Then check for success (0=ok and 3=no upgrade needed, both are success). - if [ -e $STORAGE_ROOT/owncloud/owncloud.db ]; then - # ownCloud 8.1.1 broke upgrades. It may fail on the first attempt, but - # that can be OK. - sudo -u www-data php /usr/local/lib/owncloud/occ upgrade - if [ \( $? -ne 0 \) -a \( $? -ne 3 \) ]; then - echo "Trying ownCloud upgrade again to work around ownCloud upgrade bug..." - sudo -u www-data php /usr/local/lib/owncloud/occ upgrade - if [ \( $? -ne 0 \) -a \( $? -ne 3 \) ]; then exit 1; fi - sudo -u www-data php /usr/local/lib/owncloud/occ maintenance:mode --off - echo "...which seemed to work." - fi + # Create a symlink to the config.php in STORAGE_ROOT (for upgrades we're restoring the symlink we previously + # put in, and in new installs we're creating a symlink and will create the actual config later). + ln -sf $STORAGE_ROOT/owncloud/config.php /usr/local/lib/owncloud/config/config.php - # Add missing indices. NextCloud didn't include this in the normal upgrade because it might take some time. - sudo -u www-data php /usr/local/lib/owncloud/occ db:add-missing-indices + # Make sure permissions are correct or the upgrade step won't run. + # $STORAGE_ROOT/owncloud may not yet exist, so use -f to suppress + # that error. + chown -f -R www-data.www-data $STORAGE_ROOT/owncloud /usr/local/lib/owncloud || /bin/true - # Run conversion to BigInt identifiers, this process may take some time on large tables. - sudo -u www-data php /usr/local/lib/owncloud/occ db:convert-filecache-bigint --no-interaction - fi + # If this isn't a new installation, immediately run the upgrade script. + # Then check for success (0=ok and 3=no upgrade needed, both are success). + if [ -e $STORAGE_ROOT/owncloud/owncloud.db ]; then + # ownCloud 8.1.1 broke upgrades. It may fail on the first attempt, but + # that can be OK. + sudo -u www-data php /usr/local/lib/owncloud/occ upgrade + if [ \( $? -ne 0 \) -a \( $? -ne 3 \) ]; then + echo "Trying ownCloud upgrade again to work around ownCloud upgrade bug..." + sudo -u www-data php /usr/local/lib/owncloud/occ upgrade + if [ \( $? -ne 0 \) -a \( $? -ne 3 \) ]; then exit 1; fi + sudo -u www-data php /usr/local/lib/owncloud/occ maintenance:mode --off + echo "...which seemed to work." + fi + + # Add missing indices. NextCloud didn't include this in the normal upgrade because it might take some time. + sudo -u www-data php /usr/local/lib/owncloud/occ db:add-missing-indices + + # Run conversion to BigInt identifiers, this process may take some time on large tables. + sudo -u www-data php /usr/local/lib/owncloud/occ db:convert-filecache-bigint --no-interaction + fi } # Nextcloud Version to install. Checks are done down below to step through intermediate versions. -nextcloud_ver=17.0.1 -nextcloud_hash=81e47f2288377927346a4b4cbbb2ecf1b6f4a0e1 +nextcloud_ver=$version # Current Nextcloud Version, #1623 # Checking /usr/local/lib/owncloud/version.php shows version of the Nextcloud application, not the DB @@ -102,76 +130,73 @@ nextcloud_hash=81e47f2288377927346a4b4cbbb2ecf1b6f4a0e1 # If config.php exists, get version number, otherwise CURRENT_NEXTCLOUD_VER is empty. if [ -f "$STORAGE_ROOT/owncloud/config.php" ]; then - CURRENT_NEXTCLOUD_VER=$(php -r "include(\"$STORAGE_ROOT/owncloud/config.php\"); echo(\$CONFIG['version']);") + CURRENT_NEXTCLOUD_VER=$(php -r "include(\"$STORAGE_ROOT/owncloud/config.php\"); echo(\$CONFIG['version']);") else - CURRENT_NEXTCLOUD_VER="" + CURRENT_NEXTCLOUD_VER="" fi # If the Nextcloud directory is missing (never been installed before, or the nextcloud version to be installed is different -# from the version currently installed, do the install/upgrade if [ ! -d /usr/local/lib/owncloud/ ] || [[ ! ${CURRENT_NEXTCLOUD_VER} =~ ^$nextcloud_ver ]]; then - # Stop php-fpm if running. If theyre not running (which happens on a previously failed install), dont bail. - service php7.2-fpm stop &> /dev/null || /bin/true + # Stop php-fpm if running. If theyre not running (which happens on a previously failed install), dont bail. + service php7.2-fpm stop &> /dev/null || /bin/true - # Backup the existing ownCloud/Nextcloud. - # Create a backup directory to store the current installation and database to - BACKUP_DIRECTORY=$STORAGE_ROOT/owncloud-backup/`date +"%Y-%m-%d-%T"` - mkdir -p "$BACKUP_DIRECTORY" - if [ -d /usr/local/lib/owncloud/ ]; then - echo "Upgrading Nextcloud --- backing up existing installation, configuration, and database to directory to $BACKUP_DIRECTORY..." - cp -r /usr/local/lib/owncloud "$BACKUP_DIRECTORY/owncloud-install" - fi - if [ -e $STORAGE_ROOT/owncloud/owncloud.db ]; then - cp $STORAGE_ROOT/owncloud/owncloud.db $BACKUP_DIRECTORY - fi - if [ -e $STORAGE_ROOT/owncloud/config.php ]; then - cp $STORAGE_ROOT/owncloud/config.php $BACKUP_DIRECTORY - fi + # Backup the existing ownCloud/Nextcloud. + # Create a backup directory to store the current installation and database to + BACKUP_DIRECTORY=$STORAGE_ROOT/owncloud-backup/`date +"%Y-%m-%d-%T"` + mkdir -p "$BACKUP_DIRECTORY" + if [ -d /usr/local/lib/owncloud/ ]; then + echo "Upgrading Nextcloud --- backing up existing installation, configuration, and database to directory to $BACKUP_DIRECTORY..." + cp -r /usr/local/lib/owncloud "$BACKUP_DIRECTORY/owncloud-install" + fi + if [ -e $STORAGE_ROOT/owncloud/owncloud.db ]; then + cp $STORAGE_ROOT/owncloud/owncloud.db $BACKUP_DIRECTORY + fi + if [ -e $STORAGE_ROOT/owncloud/config.php ]; then + cp $STORAGE_ROOT/owncloud/config.php $BACKUP_DIRECTORY + fi - # If ownCloud or Nextcloud was previously installed.... - if [ ! -z ${CURRENT_NEXTCLOUD_VER} ]; then - # Database migrations from ownCloud are no longer possible because ownCloud cannot be run under - # PHP 7. - if [[ ${CURRENT_NEXTCLOUD_VER} =~ ^[89] ]]; then - echo "Upgrades from Mail-in-a-Box prior to v0.28 (dated July 30, 2018) with Nextcloud < 13.0.6 (you have ownCloud 8 or 9) are not supported. Upgrade to Mail-in-a-Box version v0.30 first. Setup aborting." - exit 1 - elif [[ ${CURRENT_NEXTCLOUD_VER} =~ ^1[012] ]]; then - echo "Upgrades from Mail-in-a-Box prior to v0.28 (dated July 30, 2018) with Nextcloud < 13.0.6 (you have ownCloud 10, 11 or 12) are not supported. Upgrade to Mail-in-a-Box version v0.30 first. Setup aborting." - exit 1 - elif [[ ${CURRENT_NEXTCLOUD_VER} =~ ^13 ]]; then - # If we are running Nextcloud 13, upgrade to Nextcloud 14 - InstallNextcloud 14.0.6 4e43a57340f04c2da306c8eea98e30040399ae5a - CURRENT_NEXTCLOUD_VER="14.0.6" - fi - if [[ ${CURRENT_NEXTCLOUD_VER} =~ ^14 ]]; then - # During the upgrade from Nextcloud 14 to 15, user_external may cause the upgrade to fail. - # We will disable it here before the upgrade and install it again after the upgrade. - hide_output sudo -u www-data php /usr/local/lib/owncloud/console.php app:disable user_external - InstallNextcloud 15.0.8 4129d8d4021c435f2e86876225fb7f15adf764a3 - CURRENT_NEXTCLOUD_VER="15.0.8" - fi - if [[ ${CURRENT_NEXTCLOUD_VER} =~ ^15 ]]; then - InstallNextcloud 16.0.6 0bb3098455ec89f5af77a652aad553ad40a88819 - CURRENT_NEXTCLOUD_VER="16.0.6" - fi - fi - - InstallNextcloud $nextcloud_ver $nextcloud_hash -fi + # If ownCloud or Nextcloud was previously installed.... + if [ ! -z ${CURRENT_NEXTCLOUD_VER} ]; then + # Database migrations from ownCloud are no longer possible because ownCloud cannot be run under + # PHP 7. + if [[ ${CURRENT_NEXTCLOUD_VER} =~ ^[89] ]]; then + echo "Upgrades from Mail-in-a-Box prior to v0.28 (dated July 30, 2018) with Nextcloud < 13.0.6 (you have ownCloud 8 or 9) are not supported. Upgrade to Mail-in-a--in-a-Box version v0.30 first. Setup aborting." + exit 1 + elif [[ ${CURRENT_NEXTCLOUD_VER} =~ ^1[012] ]]; then + echo "Upgrades from Mail-in-a-Box prior to v0.28 (dated July 30, 2018) with Nextcloud < 13.0.6 (you have ownCloud 10, 11 or 12) are not supported. Upgrade to Mail$ + exit 1 + elif [[ ${CURRENT_NEXTCLOUD_VER} =~ ^13 ]]; then + # If we are running Nextcloud 13, upgrade to Nextcloud 14 + InstallNextcloud 14.0.6 + elif [[ ${CURRENT_NEXTCLOUD_VER} =~ ^14 ]]; then + # During the upgrade from Nextcloud 14 to 15, user_external may cause the upgrade to fail. + # We will disable it here before the upgrade and install it again after the upgrade. + hide_output sudo -u www-data php /usr/local/lib/owncloud/console.php app:disable user_external + InstallNextcloud 15.0.0 + elif [[ ${CURRENT_NEXTCLOUD_VER} =~ ^15 ]]; then + InstallNextcloud 16.0.0 + + elif [[ ${CURRENT_NEXTCLOUD_VER} =~ ^16 ]]; then + InstallNextcloud 17.0.0 + + elif [[ ${CURRENT_NEXTCLOUD_VER} =~ ^17 ]]; then + InstallNextcloud 18.0.0 + + fi + InstallNextcloud 18.0.0 # ### Configuring Nextcloud # Setup Nextcloud if the Nextcloud database does not yet exist. Running setup when # the database does exist wipes the database and user data. if [ ! -f $STORAGE_ROOT/owncloud/owncloud.db ]; then - # Create user data directory - mkdir -p $STORAGE_ROOT/owncloud - - # Create an initial configuration file. - instanceid=oc$(echo $PRIMARY_HOSTNAME | sha1sum | fold -w 10 | head -n 1) - cat > $STORAGE_ROOT/owncloud/config.php < $STORAGE_ROOT/owncloud/config.php < '$STORAGE_ROOT/owncloud', @@ -203,11 +228,11 @@ if [ ! -f $STORAGE_ROOT/owncloud/owncloud.db ]; then ?> EOF - # Create an auto-configuration file to fill in database settings - # when the install script is run. Make an administrator account - # here or else the install can't finish. - adminpassword=$(dd if=/dev/urandom bs=1 count=40 2>/dev/null | sha1sum | fold -w 30 | head -n 1) - cat > /usr/local/lib/owncloud/config/autoconfig.php </dev/null | sha1sum | fold -w 30 | head -n 1) + cat > /usr/local/lib/owncloud/config/autoconfig.php < EOF - # Set permissions - chown -R www-data.www-data $STORAGE_ROOT/owncloud /usr/local/lib/owncloud - - # Execute Nextcloud's setup step, which creates the Nextcloud sqlite database. - # It also wipes it if it exists. And it updates config.php with database - # settings and deletes the autoconfig.php file. - (cd /usr/local/lib/owncloud; sudo -u www-data php /usr/local/lib/owncloud/index.php;) + # Set permissions + chown -R www-data.www-data $STORAGE_ROOT/owncloud /usr/local/lib/owncloud + # Execute Nextcloud's setup step, which creates the Nextcloud sqlite database. + # It also wipes it if it exists. And it updates config.php with database + # settings and deletes the autoconfig.php file. + (cd /usr/local/lib/owncloud; sudo -u www-data php /usr/local/lib/owncloud/index.php;) fi # Update config.php. @@ -275,7 +299,6 @@ chown www-data.www-data $STORAGE_ROOT/owncloud/config.php hide_output sudo -u www-data php /usr/local/lib/owncloud/console.php app:disable firstrunwizard hide_output sudo -u www-data php /usr/local/lib/owncloud/console.php app:enable user_external hide_output sudo -u www-data php /usr/local/lib/owncloud/console.php app:enable contacts -hide_output sudo -u www-data php /usr/local/lib/owncloud/console.php app:enable calendar # When upgrading, run the upgrade script again now that apps are enabled. It seems like # the first upgrade at the top won't work because apps may be disabled during upgrade? @@ -285,47 +308,48 @@ if [ \( $? -ne 0 \) -a \( $? -ne 3 \) ]; then exit 1; fi # Set PHP FPM values to support large file uploads # (semicolon is the comment character in this file, hashes produce deprecation warnings) -tools/editconf.py /etc/php/7.2/fpm/php.ini -c ';' \ - upload_max_filesize=16G \ - post_max_size=16G \ - output_buffering=16384 \ - memory_limit=512M \ - max_execution_time=600 \ - short_open_tag=On +../tools/editconf.py /etc/php/7.2/fpm/php.ini -c ';' \ + upload_max_filesize=16G \ + post_max_size=16G \ + output_buffering=16384 \ + memory_limit=512M \ + max_execution_time=600 \ + short_open_tag=On # Set Nextcloud recommended opcache settings -tools/editconf.py /etc/php/7.2/cli/conf.d/10-opcache.ini -c ';' \ - opcache.enable=1 \ - opcache.enable_cli=1 \ - opcache.interned_strings_buffer=8 \ - opcache.max_accelerated_files=10000 \ - opcache.memory_consumption=128 \ - opcache.save_comments=1 \ - opcache.revalidate_freq=1 +../tools/editconf.py /etc/php/7.2/cli/conf.d/10-opcache.ini -c ';' \ + opcache.enable=1 \ +opcache.enable_cli=1 \ + opcache.interned_strings_buffer=8 \ + opcache.max_accelerated_files=10000 \ + opcache.memory_consumption=128 \ + opcache.save_comments=1 \ + opcache.revalidate_freq=1 + +# Configure the path environment for php-fpm +../tools/editconf.py /etc/php/7.2/fpm/pool.d/www.conf -c ';' \ + env[PATH]=/usr/local/bin:/usr/bin:/bin # If apc is explicitly disabled we need to enable it if grep -q apc.enabled=0 /etc/php/7.2/mods-available/apcu.ini; then - tools/editconf.py /etc/php/7.2/mods-available/apcu.ini -c ';' \ - apc.enabled=1 + ../tools/editconf.py /etc/php/7.2/mods-available/apcu.ini -c ';' \ + apc.enabled=1 fi # Set up a cron job for Nextcloud. -cat > /etc/cron.d/mailinabox-nextcloud << EOF; +cat > /etc/cron.hourly/mailinabox-owncloud << EOF; #!/bin/bash # Mail-in-a-Box -*/5 * * * * root sudo -u www-data php -f /usr/local/lib/owncloud/cron.php +sudo -u www-data php -f /usr/local/lib/owncloud/cron.php EOF -chmod +x /etc/cron.d/mailinabox-nextcloud - -# Remove previous hourly cronjob -rm -f /etc/cron.hourly/mailinabox-owncloud +chmod +x /etc/cron.hourly/mailinabox-owncloud # There's nothing much of interest that a user could do as an admin for Nextcloud, # and there's a lot they could mess up, so we don't make any users admins of Nextcloud. # But if we wanted to, we would do this: # ``` # for user in $(tools/mail.py user admins); do -# sqlite3 $STORAGE_ROOT/owncloud/owncloud.db "INSERT OR IGNORE INTO oc_group_user VALUES ('admin', '$user')" +# sqlite3 $STORAGE_ROOT/owncloud/owncloud.db "INSERT OR IGNORE INTO oc_group_user VALUES ('admin', '$user')" # done # ```