2014-08-15 22:29:05 +00:00
#!/bin/bash
2017-04-02 09:19:21 +00:00
# Nextcloud
2014-08-11 14:24:29 +00:00
##########################
source setup/functions.sh # load our functions
source /etc/mailinabox.conf # load global vars
2017-04-02 09:19:21 +00:00
# ### Installing Nextcloud
2014-09-21 20:05:11 +00:00
2017-03-25 12:20:21 +00:00
echo "Installing Nextcloud (contacts/calendar)..."
2015-08-19 19:58:35 +00:00
2014-08-11 14:24:29 +00:00
apt_install \
dbconfig-common \
2014-08-11 15:59:04 +00:00
php5-cli php5-sqlite php5-gd php5-imap php5-curl php-pear php-apc curl libapr1 libtool libcurl4-openssl-dev php-xml-parser \
2017-01-22 15:37:54 +00:00
php5 php5-dev php5-gd php5-fpm memcached php5-memcached
2014-08-11 14:24:29 +00:00
apt-get purge -qq -y owncloud*
2015-06-14 15:42:32 +00:00
# Migrate <= v0.10 setups that stored the ownCloud config.php in /usr/local rather than
# in STORAGE_ROOT. Move the file to STORAGE_ROOT.
2015-06-12 12:53:02 +00:00
if [ ! -f $STORAGE_ROOT /owncloud/config.php ] \
&& [ -f /usr/local/lib/owncloud/config/config.php ] ; then
2015-06-14 15:42:32 +00:00
# Move config.php and symlink back into previous location.
echo "Migrating owncloud/config.php to new location."
mv /usr/local/lib/owncloud/config/config.php $STORAGE_ROOT /owncloud/config.php \
&& \
2015-06-12 12:53:02 +00:00
ln -sf $STORAGE_ROOT /owncloud/config.php /usr/local/lib/owncloud/config/config.php
fi
2016-10-18 10:04:13 +00:00
InstallOwncloud( ) {
2017-03-26 13:20:27 +00:00
version = $1
hash = $2
2017-03-25 12:20:21 +00:00
flavor = $3
2017-03-26 13:20:27 +00:00
2016-10-18 10:04:13 +00:00
echo
2017-03-25 12:20:21 +00:00
echo " Upgrading to $flavor version $version "
2016-10-18 10:04:13 +00:00
echo
2014-09-01 08:02:46 +00:00
2017-04-02 09:19:21 +00:00
# Remove the current owncloud/Nextcloud
2016-10-18 10:04:13 +00:00
rm -rf /usr/local/lib/owncloud
# Download and verify
2017-03-25 12:20:21 +00:00
if [ " $flavor " = "Nextcloud" ] ; then
wget_verify https://download.nextcloud.com/server/releases/nextcloud-$version .zip $hash /tmp/owncloud.zip
else
wget_verify https://download.owncloud.org/community/owncloud-$version .zip $hash /tmp/owncloud.zip
fi
2015-02-12 19:53:17 +00:00
2017-04-02 09:19:21 +00:00
# Extract ownCloud/Nextcloud
2016-10-18 10:04:13 +00:00
unzip -q /tmp/owncloud.zip -d /usr/local/lib
2017-03-25 12:20:21 +00:00
if [ " $flavor " = "Nextcloud" ] ; then
mv /usr/local/lib/nextcloud /usr/local/lib/owncloud
fi
2014-09-01 08:02:46 +00:00
rm -f /tmp/owncloud.zip
2015-02-12 19:53:17 +00:00
2017-04-02 09:19:21 +00:00
# The two apps we actually want are not in Nextcloud core. Download the releases from
2015-02-12 19:53:17 +00:00
# their github repositories.
mkdir -p /usr/local/lib/owncloud/apps
2017-03-25 12:20:21 +00:00
if [ " $flavor " = "Nextcloud" ] ; then
wget_verify https://github.com/nextcloud/contacts/releases/download/v1.5.3/contacts.tar.gz 78c4d49e73f335084feecd4853bd8234cf32615e /tmp/contacts.tgz
else
wget_verify https://github.com/owncloud/contacts/releases/download/v1.4.0.0/contacts.tar.gz c1c22d29699456a45db447281682e8bc3f10e3e7 /tmp/contacts.tgz
fi
2016-10-18 10:04:13 +00:00
tar xf /tmp/contacts.tgz -C /usr/local/lib/owncloud/apps/
rm /tmp/contacts.tgz
2017-03-25 12:20:21 +00:00
if [ " $flavor " = "Nextcloud" ] ; then
wget_verify https://github.com/nextcloud/calendar/releases/download/v1.5.2/calendar.tar.gz 7b8a94e01fe740c5c23017ed5bc211983c780fce /tmp/calendar.tgz
else
wget_verify https://github.com/nextcloud/calendar/releases/download/v1.4.0/calendar.tar.gz c84f3170efca2a99ea6254de34b0af3cb0b3a821 /tmp/calendar.tgz
fi
2016-10-18 10:04:13 +00:00
tar xf /tmp/calendar.tgz -C /usr/local/lib/owncloud/apps/
rm /tmp/calendar.tgz
2015-02-12 19:53:17 +00:00
# Fix weird permissions.
chmod 750 /usr/local/lib/owncloud/{ apps,config}
2015-06-14 15:42:32 +00:00
# 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).
2015-06-12 12:53:02 +00:00
ln -sf $STORAGE_ROOT /owncloud/config.php /usr/local/lib/owncloud/config/config.php
2015-02-12 19:53:17 +00:00
# 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
2015-08-19 19:43:34 +00:00
# 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).
2016-10-18 10:04:13 +00:00
if [ -e $STORAGE_ROOT /owncloud/owncloud.db ] ; then
2015-08-23 16:37:25 +00:00
# ownCloud 8.1.1 broke upgrades. It may fail on the first attempt, but
# that can be OK.
2015-08-19 19:43:34 +00:00
sudo -u www-data php /usr/local/lib/owncloud/occ upgrade
2015-08-23 16:37:25 +00:00
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
2015-08-19 19:43:34 +00:00
fi
2016-10-18 10:04:13 +00:00
}
2017-03-25 12:20:21 +00:00
owncloud_ver = 10.0.4
owncloud_hash = 346590278a5cc7b0a3c8d1a68eafec68ac59c475
owncloud_flavor = Nextcloud
2016-10-18 10:04:13 +00:00
2017-04-02 09:19:21 +00:00
# Check if Nextcloud dir exist, and check if version matches owncloud_ver (if either doesn't - install/upgrade)
2016-10-18 10:04:13 +00:00
if [ ! -d /usr/local/lib/owncloud/ ] \
|| ! grep -q $owncloud_ver /usr/local/lib/owncloud/version.php; then
# Stop php-fpm
hide_output service php5-fpm stop
2017-04-02 09:19:21 +00:00
# Backup the existing ownCloud/Nextcloud.
2016-10-18 10:04:13 +00:00
# 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
2017-03-25 12:20:21 +00:00
echo " upgrading ownCloud/Nextcloud to $owncloud_flavor $owncloud_ver (backing up existing installation, configuration and database to directory to $BACKUP_DIRECTORY ... "
2016-10-18 10:04:13 +00:00
cp -r /usr/local/lib/owncloud " $BACKUP_DIRECTORY /owncloud-install "
fi
if [ -e /home/user-data/owncloud/owncloud.db ] ; then
cp /home/user-data/owncloud/owncloud.db $BACKUP_DIRECTORY
fi
if [ -e /home/user-data/owncloud/config.php ] ; then
cp /home/user-data/owncloud/config.php $BACKUP_DIRECTORY
fi
2017-04-02 09:19:21 +00:00
# We only need to check if we do upgrades when owncloud/Nextcloud was previously installed
2016-10-18 10:04:13 +00:00
if [ -e /usr/local/lib/owncloud/version.php ] ; then
2016-11-30 17:54:27 +00:00
if grep -q "8\.1\.[0-9]" /usr/local/lib/owncloud/version.php; then
2016-10-18 10:04:13 +00:00
echo "We are running 8.1.x, upgrading to 8.2.3 first"
2017-03-25 12:20:21 +00:00
InstallOwncloud 8.2.3 bfdf6166fbf6fc5438dc358600e7239d1c970613 ownCloud
2016-10-18 10:04:13 +00:00
fi
# If we are upgrading from 8.2.x we should go to 9.0 first. Owncloud doesn't support skipping minor versions
2016-11-30 17:54:27 +00:00
if grep -q "8\.2\.[0-9]" /usr/local/lib/owncloud/version.php; then
2016-10-18 10:04:13 +00:00
echo "We are running version 8.2.x, upgrading to 9.0.2 first"
# We need to disable memcached. The upgrade and install fails
# with memcached
CONFIG_TEMP = $( /bin/mktemp)
php <<EOF > $CONFIG_TE MP && mv $CONFIG_TEMP $STORAGE_ROOT /owncloud/config.php;
<?php
include( " $STORAGE_ROOT /owncloud/config.php " ) ;
\$ CONFIG[ 'memcache.local' ] = '\OC\Memcache\APC' ;
echo "<?php\n\\\$CONFIG = " ;
var_export( \$ CONFIG) ;
echo ";" ;
?>
EOF
chown www-data.www-data $STORAGE_ROOT /owncloud/config.php
# We can now install owncloud 9.0.2
2017-03-25 12:20:21 +00:00
InstallOwncloud 9.0.2 72a3d15d09f58c06fa8bee48b9e60c9cd356f9c5 ownCloud
2016-10-18 10:04:13 +00:00
# The owncloud 9 migration doesn't migrate calendars and contacts
# The option to migrate these are removed in 9.1
# So the migrations should be done when we have 9.0 installed
sudo -u www-data php /usr/local/lib/owncloud/occ dav:migrate-addressbooks
# The following migration has to be done for each owncloud user
for directory in $STORAGE_ROOT /owncloud/*@*/ ; do
username = $( basename " ${ directory } " )
sudo -u www-data php /usr/local/lib/owncloud/occ dav:migrate-calendar $username
done
sudo -u www-data php /usr/local/lib/owncloud/occ dav:sync-birthday-calendar
fi
2017-03-25 12:20:21 +00:00
# If we are upgrading from 9.0.x we should go to 9.1 first.
if grep -q "9\.0\.[0-9]" /usr/local/lib/owncloud/version.php; then
echo "We are running ownCloud 9.0.x, upgrading to ownCloud 9.1.4 first"
InstallOwncloud 9.1.4 e637cab7b2ca3346164f3506b1a0eb812b4e841a ownCloud
fi
2016-10-18 10:04:13 +00:00
fi
2017-03-25 12:20:21 +00:00
InstallOwncloud $owncloud_ver $owncloud_hash Nextcloud
2014-08-11 14:24:29 +00:00
fi
2017-04-02 09:19:21 +00:00
# ### Configuring Nextcloud
2014-09-21 20:05:11 +00:00
2017-04-02 09:19:21 +00:00
# Setup Nextcloud if the Nextcloud database does not yet exist. Running setup when
2014-08-16 12:38:03 +00:00
# the database does exist wipes the database and user data.
if [ ! -f $STORAGE_ROOT /owncloud/owncloud.db ] ; then
2015-06-12 12:53:02 +00:00
# Create user data directory
mkdir -p $STORAGE_ROOT /owncloud
2015-08-30 21:14:00 +00:00
# Create an initial configuration file.
2014-08-16 12:38:03 +00:00
instanceid = oc$( echo $PRIMARY_HOSTNAME | sha1sum | fold -w 10 | head -n 1)
2015-06-12 12:53:02 +00:00
cat > $STORAGE_ROOT /owncloud/config.php <<EOF;
2014-08-11 15:53:01 +00:00
<?php
2014-08-12 10:01:18 +00:00
\$ CONFIG = array (
2014-08-11 23:15:17 +00:00
'datadirectory' = > '$STORAGE_ROOT/owncloud' ,
2014-08-12 13:25:38 +00:00
'instanceid' = > '$instanceid' ,
2014-08-15 23:07:20 +00:00
2017-04-02 09:19:21 +00:00
'forcessl' = > true, # if unset/false, Nextcloud sends a HSTS=0 header, which conflicts with nginx config
2014-08-12 13:25:38 +00:00
'overwritewebroot' = > '/cloud' ,
2015-08-16 23:47:51 +00:00
'overwrite.cli.url' = > '/cloud' ,
2014-08-12 10:33:42 +00:00
'user_backends' = > array(
array(
'class' = >'OC_User_IMAP' ,
2016-05-06 13:06:52 +00:00
'arguments' = >array( '{127.0.0.1:993/imap/ssl/novalidate-cert}' )
2014-08-12 10:33:42 +00:00
)
2014-08-11 23:15:17 +00:00
) ,
2016-10-18 10:04:13 +00:00
'memcache.local' = > '\OC\Memcache\APC' ,
2014-08-12 11:18:45 +00:00
'mail_smtpmode' = > 'sendmail' ,
'mail_smtpsecure' = > '' ,
2014-08-12 08:09:44 +00:00
'mail_smtpauthtype' = > 'LOGIN' ,
2014-08-12 11:18:45 +00:00
'mail_smtpauth' = > false,
'mail_smtphost' = > '' ,
'mail_smtpport' = > '' ,
'mail_smtpname' = > '' ,
'mail_smtppassword' = > '' ,
'mail_from_address' = > 'owncloud' ,
'mail_domain' = > '$PRIMARY_HOSTNAME' ,
2014-08-11 23:15:17 +00:00
) ;
2014-08-11 21:01:18 +00:00
?>
2014-08-11 15:53:01 +00:00
EOF
2014-08-12 08:10:53 +00:00
2014-08-16 12:38:03 +00:00
# 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.
2015-11-17 22:13:49 +00:00
adminpassword = $( dd if = /dev/urandom bs = 1 count = 40 2>/dev/null | sha1sum | fold -w 30 | head -n 1)
2014-09-21 20:05:11 +00:00
cat > /usr/local/lib/owncloud/config/autoconfig.php <<EOF;
2014-08-15 23:07:20 +00:00
<?php
\$ AUTOCONFIG = array (
# storage/database
'directory' = > '$STORAGE_ROOT/owncloud' ,
'dbtype' = > 'sqlite3' ,
# create an administrator account with a random password so that
2017-04-02 09:19:21 +00:00
# the user does not have to enter anything on first load of Nextcloud
2014-08-15 23:07:20 +00:00
'adminlogin' = > 'root' ,
'adminpass' = > '$adminpassword' ,
) ;
?>
EOF
2015-06-12 12:53:02 +00:00
# Set permissions
2014-08-16 12:38:03 +00:00
chown -R www-data.www-data $STORAGE_ROOT /owncloud /usr/local/lib/owncloud
2014-08-11 14:24:29 +00:00
2017-04-02 09:19:21 +00:00
# Execute Nextcloud's setup step, which creates the Nextcloud sqlite database.
2015-06-14 15:42:32 +00:00
# It also wipes it if it exists. And it updates config.php with database
# settings and deletes the autoconfig.php file.
2014-08-16 12:38:03 +00:00
( cd /usr/local/lib/owncloud; sudo -u www-data php /usr/local/lib/owncloud/index.php; )
fi
2014-08-15 23:07:20 +00:00
2015-08-30 21:14:00 +00:00
# Update config.php.
# * trusted_domains is reset to localhost by autoconfig starting with ownCloud 8.1.1,
# so set it here. It also can change if the box's PRIMARY_HOSTNAME changes, so
# this will make sure it has the right value.
# * Some settings weren't included in previous versions of Mail-in-a-Box.
2016-04-13 21:52:13 +00:00
# * We need to set the timezone to the system timezone to allow fail2ban to ban
# users within the proper timeframe
2016-06-27 03:19:12 +00:00
# * We need to set the logdateformat to something that will work correctly with fail2ban
2015-08-30 21:14:00 +00:00
# Use PHP to read the settings file, modify it, and write out the new settings array.
2016-04-13 21:52:13 +00:00
TIMEZONE = $( cat /etc/timezone)
2015-08-16 23:46:23 +00:00
CONFIG_TEMP = $( /bin/mktemp)
php <<EOF > $CONFIG_TE MP && mv $CONFIG_TEMP $STORAGE_ROOT /owncloud/config.php;
<?php
include( " $STORAGE_ROOT /owncloud/config.php " ) ;
2015-08-30 21:14:00 +00:00
\$ CONFIG[ 'trusted_domains' ] = array( '$PRIMARY_HOSTNAME' ) ;
2016-10-18 10:04:13 +00:00
\$ CONFIG[ 'memcache.local' ] = '\OC\Memcache\APC' ;
2015-08-16 23:47:51 +00:00
\$ CONFIG[ 'overwrite.cli.url' ] = '/cloud' ;
2015-11-05 11:20:16 +00:00
\$ CONFIG[ 'mail_from_address' ] = 'administrator' ; # just the local part, matches our master administrator address
2015-08-30 21:14:00 +00:00
2016-04-13 21:52:13 +00:00
\$ CONFIG[ 'logtimezone' ] = '$TIMEZONE' ;
2016-06-26 12:17:12 +00:00
\$ CONFIG[ 'logdateformat' ] = 'Y-m-d H:i:s' ;
2016-04-13 21:52:13 +00:00
2015-08-16 23:46:23 +00:00
echo "<?php\n\\\$CONFIG = " ;
var_export( \$ CONFIG) ;
echo ";" ;
?>
EOF
chown www-data.www-data $STORAGE_ROOT /owncloud/config.php
2017-04-02 09:19:21 +00:00
# Enable/disable apps. Note that this must be done after the Nextcloud setup.
2014-08-15 23:07:20 +00:00
# The firstrunwizard gave Josh all sorts of problems, so disabling that.
2017-04-02 09:19:21 +00:00
# user_external is what allows Nextcloud to use IMAP for login. The contacts
2015-02-12 19:53:17 +00:00
# and calendar apps are the extensions we really care about here.
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
2014-08-15 23:07:20 +00:00
2015-07-19 13:05:04 +00:00
# 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?
# Check for success (0=ok, 3=no upgrade needed).
sudo -u www-data php /usr/local/lib/owncloud/occ upgrade
if [ \( $? -ne 0 \) -a \( $? -ne 3 \) ] ; then exit 1; fi
2015-07-17 11:29:28 +00:00
2014-08-12 12:00:28 +00:00
# Set PHP FPM values to support large file uploads
2014-08-15 22:29:05 +00:00
# (semicolon is the comment character in this file, hashes produce deprecation warnings)
tools/editconf.py /etc/php5/fpm/php.ini -c ';' \
2014-08-12 12:00:28 +00:00
upload_max_filesize = 16G \
post_max_size = 16G \
output_buffering = 16384 \
2014-08-13 05:30:32 +00:00
memory_limit = 512M \
max_execution_time = 600 \
short_open_tag = On
2014-08-12 12:00:28 +00:00
2016-10-24 11:59:34 +00:00
# If apc is explicitly disabled we need to enable it
if grep -q apc.enabled= 0 /etc/php5/mods-available/apcu.ini; then
tools/editconf.py /etc/php5/mods-available/apcu.ini -c ';' \
apc.enabled= 1
fi
2017-04-02 09:19:21 +00:00
# Set up a cron job for Nextcloud.
2014-08-16 13:00:36 +00:00
cat > /etc/cron.hourly/mailinabox-owncloud << EOF;
#!/bin/bash
# Mail-in-a-Box
sudo -u www-data php -f /usr/local/lib/owncloud/cron.php
EOF
chmod +x /etc/cron.hourly/mailinabox-owncloud
2014-08-12 07:24:49 +00:00
2017-04-02 09:19:21 +00:00
# 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.
2014-09-21 20:05:11 +00:00
# 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')"
# done
# ```
2014-08-16 12:59:29 +00:00
2014-09-21 20:05:11 +00:00
# Enable PHP modules and restart PHP.
2014-08-11 15:59:04 +00:00
php5enmod imap
2014-08-12 11:18:45 +00:00
restart_service php5-fpm