Skip to content
Snippets Groups Projects
Select Git revision
  • 1f68d75d192e732f129aa25c72ade8fbbdf161ed
  • master default protected
  • 133-fail2ban-page
  • reorganisation
  • 16-maintenace-service
  • 11-fail2ban
  • 6-monit-update
  • 7-dolibarr-fail2ban
  • 6-surveillance-interne-des-serveur
  • test-glpi
  • 2-migrate-to-phpfpm
  • jessie
  • github
13 results

installNextcloud.sh

Blame
  • David Beniamine's avatar
    1e01bfe5
    History
    installNextcloud.sh 10.94 KiB
    #!/bin/bash -
    #
    # Copyright (C) 2017  Tetras Libre <admin@tetras-libre.fr>
    # Author: Curt, Sebastien <sebastien.curt@tetras-libre.fr>
    #
    # This program is free software: you can redistribute it and/or modify # it
    # under the terms of the GNU General Public License as published by # the Free
    # Software Foundation, either version 3 of the License, or # (at your option)
    # any later version.
    #
    # This program is distributed in the hope that it will be useful, # but WITHOUT
    # ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or
    # FITNESS FOR A PARTICULAR PURPOSE.  See the # GNU General Public License for
    # more details.
    #
    # You should have received a copy of the GNU General Public License # along
    # with this program.  If not, see <http://www.gnu.org/licenses/>.
    
    set -o nounset                              # Treat unset variables as an error
    
    ###########################################################################
    # 1. Download Nexcloud Package
    # 2. Check package integrity and source authenticity
    # 3.
    # 4. Start mysql service
    ###########################################################################
    SCRIPT_DIRECTORY=`pwd`
    . `pwd`/installNextcloud.env
    
    RUNNING_DATE_TIME="`date +%Y%m%d%H%M%S`"
    
    
    if [ ! -d $NEXTCLOUD_DIRECTORY_SOURCES ]
    then
        mkdir -p $NEXTCLOUD_DIRECTORY_SOURCES
    fi
    
    cd $NEXTCLOUD_DIRECTORY_SOURCES
    # 1. Download Nexcloud Package
    DEBIAN_FRONTEND='noninteractive' apt-get update \
        && DEBIAN_FRONTEND='noninteractive' apt-get -qq install \
        apg \
        bzip2 \
        gnupg2 \
        isomd5sum \
        php \
        php-apcu \
        php-curl \
        php-gd \
        php-intl \
        php-imagick \
        php-json \
        php-mbstring \
        php-mcrypt \
        php-mysql \
        php-xml \
        php-zip \
        sudo \
        tar \
        ufw \
        ${WEB_SERVER_PACKAGES} \
        wget
    
    if [ -d ${NEXTCLOUD_INSTALL_DIR} ]
    then
        echo "Nextcloud install directory already exists : " \
            ${NEXTCLOUD_INSTALL_DIR} >&2
        return
    fi
    
    echo "Begin to download nextcloud packages"
    {
        # insert nextcloud download
        echo "${NEXTCLOUD_PACKAGE}"
    
        # insert nextcloud release package MD5
        echo "${NEXTCLOUD_PACKAGE}.md5"
    
        # insert nextcloud GPG release package key
        echo "${NEXTCLOUD_PACKAGE}.asc"
    } > $NEXTCLOUD_WGET_INPUT
    
    # Download nextcloud package
    wget --output-file=wget_nextcloud.log \
        --base=https://download.nextcloud.com/server/releases/ \
        --tries=5 \
        --continue \
        --timestamping \
        --input-file=$NEXTCLOUD_WGET_INPUT
    
    # Downloa NextCloud GPG
    echo "Download authentic key of nextcloud"
    wget --output-file=wget_nextcloud.log \
        --tries=5 \
        --continue \
        --timestamping \
        https://nextcloud.com/nextcloud.asc
    
    gpg2 --import nextcloud.asc
    
    echo "Check both package integrity and sources authenticity"
    # 2. Check package integrity and source authenticity
    md5sum --quiet -c ${NEXTCLOUD_PACKAGE}.md5 < ${NEXTCLOUD_PACKAGE} \
        && LC_ALL="en_US.utf-8" gpg2 --verbose --batch --output - \
        --no-auto-check-trustdb --verify ${NEXTCLOUD_PACKAGE}.asc \
        ${NEXTCLOUD_PACKAGE} 2>&1 | grep -q "Good signature"
    
    # stop if the package isn't reliable
    if [ $? -ne 0 ]
    then
        echo "Nextcloud packages unsafe" >&2
        return
    fi
    
    echo "Extract nextcloud archives"
    bzip2 -d ${NEXTCLOUD_PACKAGE}
    tar xf ${NEXTCLOUD_VERSION}.tar
    cp -r nextcloud $(dirname ${NEXTCLOUD_INSTALL_DIR%/})
    chown -R www-data:www-data ${NEXTCLOUD_INSTALL_DIR}
    mkdir -p ${NEXTCLOUD_DATA_DIR}
    chown -R www-data:www-data ${NEXTCLOUD_DATA_DIR}
    
    echo "Check Nextcloud is not installed"
    LC_ALL="en_US.utf-8" sudo -u www-data php ${NEXTCLOUD_INSTALL_DIR}occ -V | grep -q "Nextcloud is not installed"
    
    if [ $? -ne 0 ]
    then
        echo "Nextcloud already installed"
        return
    fi
    echo "Nexcloud isn't already installed => continue installation"
    
    # Set the max php size from 13Mo to 16Go
    sed -i.bak -e 's/\(upload_max_filesize\).*/\1 16G/' \
        -e 's/\(post_max_size\).*/\1 16G/' \
        ${NEXTCLOUD_INSTALL_DIR}.htaccess
    
    for dir in apache2 cli fpm
    do
        if [ -e /etc/php/7.0/$dir/php.ini ]
        then
            # set max input time from 1 minute to 1 hour
            # php timeout for large file
            sed -i.bak -e 's/\(max_input_time =\).*/\1 3600/' \
                -e 's/\(max_execution_time =\).*/\1 3600/' \
                /etc/php/7.0/$dir/php.ini
        fi
    done
    
    echo "configure mysqld compatiblity to nextcloud"
    # configure mysqld for nextcloud
    {
        echo "[mysqld]"
        echo "binlog-format=MIXED"
        echo "transaction-isolation=READ-COMMITTED"
        echo "innodb_large_prefix=true"
        echo "innodb_file_format=barracuda"
        echo "innodb_file_per_table=true"
    } > /etc/mysql/conf.d/mysqld.cnf
    echo "mysql configure to nextcloud compatibility : check" \
         "file /etc/mysql/conf.d/mysql.cnf"
    
    # Create nextcloud database in mysql
    echo "create nextcloud database"
    echo "mysql -e 'CREATE DATABASE ${NEXTCLOUD_DATABASE_NAME} CHARACTER SET = \"utf8mb4\"" \
         "COLLATE = \"utf8mb4_general_ci\";'"
    mysql -e "CREATE DATABASE ${NEXTCLOUD_DATABASE_NAME} CHARACTER \
    SET = \"utf8mb4\" COLLATE = \"utf8mb4_general_ci\";"
    echo "Nextcloud database created"
    
    nextcloudPassword=${NEXTCLOUD_DATABASE_PASS:-"$(apg -q -a 0 -n 1 -m 21 -M NCL)"}
    
    echo "Create admin Password for nextcloud"
    adminPassword=${NEXTCLOUD_ADMIN_PASS=-"$(apg -q -a 0 -n 1 -m 21 -M NCL)"}
    {
        echo "[nextcloud]"
        echo "user=admin"
        echo "password=${adminPassword}"
    } >> ${HOME}/.passwords
    chmod 600 ${HOME}/.passwords
    echo "amdin user password store in ${HOME}/.passwords only" \
        "readable by the root user"
    
    echo "Set nextcloud user for nextcloud@localhost in database"
    mysql -e "CREATE USER 'nextcloud'@'localhost' IDENTIFIED BY
    '${nextcloudPassword}';"
    if [ $? -eq 0 ]
    then
        echo "nextcloud user set for nextcloud@localhost in database"
    else
        echo "error processing : $?" >&2
    fi
    
    echo "Grant all privileges to nexcloud user to ${NEXTCLOUD_DATABASE_NAME} database"
    mysql -e "GRANT ALL PRIVILEGES on nextcloud.* to
    '${NEXTCLOUD_DATABASE_NAME}'@'localhost' IDENTIFIED BY '${nextcloudPassword}';
    FLUSH PRIVILEGES;";
    if [ $? -eq 0 ]
    then
        echo "Privileges granted"
    else
        echo "Error processing : $?" >&2
    fi
    
    #    service mysql restart
    
    nextcloud_Install_Options=""
    
    nextcloud_Install_Options=${NEXTCLOUD_DATABASE:+--database=${NEXTCLOUD_DATABASE}}
    
    nextcloud_Install_Options="${nextcloud_Install_Options}
        ${NEXTCLOUD_DATABASE_NAME:+--database-name=${NEXTCLOUD_DATABASE_NAME}}"
    
    nextcloud_Install_Options="${nextcloud_Install_Options}
    ${NEXTCLOUD_DATABASE_HOST:+--database-host=${NEXTCLOUD_DATABASE_HOST}}"
    
    nextcloud_Install_Options="${nextcloud_Install_Options}
    ${NEXTCLOUD_DATABASE_PORT:+--database-port=${NEXTCLOUD_DATABASE_PORT}}"
    
    nextcloud_Install_Options="${nextcloud_Install_Options}
    ${NEXTCLOUD_DATABASE_USER:+--database-user=${NEXTCLOUD_DATABASE_USER}}"
    
    nextcloud_Install_Options="${nextcloud_Install_Options}
    ${nextcloudPassword:+--database-pass=${nextcloudPassword}}"
    
    nextcloud_Install_Options="${nextcloud_Install_Options}
    ${NEXTCLOUD_DATABASE_TABLE_PREFIX:+ \
        --database-table-prefix=${NEXTCLOUD_DATABASE_TABLE_PREFIX}}"
    
    nextcloud_Install_Options="${nextcloud_Install_Options}
    ${NEXTCLOUD_DATABASE_ADMIN_USER:+--admin-user=${NEXTCLOUD_DATABASE_ADMIN_USER}}"
    
    nextcloud_Install_Options="${nextcloud_Install_Options}
    ${adminPassword:+--admin-pass=${adminPassword}}"
    
    nextcloud_Install_Options="${nextcloud_Install_Options}
    ${NEXTCLOUD_DATA_DIR:+--data-dir=${NEXTCLOUD_DATA_DIR}}"
    
    nextcloud_Install_Options=$(echo ${nextcloud_Install_Options} | tr -s \
        '[:space:]' ' ')
    
    
    # Install Nexcloud
    sudo -u www-data php ${NEXTCLOUD_INSTALL_DIR}occ  \
        maintenance:install ${nextcloud_Install_Options}
    
    # remove all downloaded files
    cd ..
    rm -r $NEXTCLOUD_DIRECTORY_SOURCES
    cd ${SCRIPT_DIRECTORY}
    
    if [ -f `pwd`/installNextcloudApps.sh ]
    then
        . `pwd`/installNextcloudApps.sh
    fi
    
    . `pwd`/nextcloudStrongDirectoryPermissions.sh
    
    if [ -f /etc/${WEB_SERVER}/nextcloud.conf ]
    then
        cp /etc/${WEB_SERVER}/nextcloud.conf \
            /etc/${WEB_SERVER}/${RUNNING_DATE_TIME}_nextcloud.conf
    fi
    
    # Configure Apache for nextcloud
    echo "Configure ${WEB_SERVER} nextcloud.conf"
    sed \
        "s/<+NEXTCLOUD_CONFIG_ServerAdmin+>/${NEXTCLOUD_CONFIG_ServerAdmin}/;
        s/<+NEXTCLOUD_CONFIG_ServerName+>/${NEXTCLOUD_CONFIG_ServerName}/" \
    `pwd`/etc/${WEB_SERVER}/sites-available/nextcloud.conf > \
        /etc/${WEB_SERVER}/sites-available/nextcloud.conf
    
    if [ ${WEB_SERVER} == "nginx" ] && [ ! -e /etc/nginx/ssl.conf ]
    then
        # Configure Apache for nextcloud
        echo "Configure nginx ssl.conf"
        sed \
            "s@<+SSLCertificateFile+>@${NEXTCLOUD_CONFIG_certificateFile:-<+SSLCertificateFile+>}@
            s@<+SSLCertificateKeyFile+>@${NEXTCLOUD_CONFIG_certificateKeyFile:-<+SSLCertificateKeyFile+>}@" \
                `pwd`/etc/nginx/ssl.conf > \
                openssl dhparam -out /etc/nginx/dhparam.pem 2048
                /etc/nginx/ssl.conf
    fi
    
    #ln -s /etc/apache2/sites-available/nextcloud.conf \
    #    /etc/apache2/sites-enabled/nextcloud.conf
    #echo "WARNING : SSLEngine is disabled : to enable modify file /etc/apache2/ssl.conf"
    #echo "Configure Apache nextcloud.conf : terminated"
    
    if [ "${WEB_SERVER}" == "apache2" ]
    then
        MODS="php7.0 rewrite headers env dir mime ssl zip"
        for mod in ${MODS}
        do
            echo "enabling '$mod'"
            a2enmode $mod
            echo "enabling '$mod' : terminated"
        done
        # activation ssl
        a2ensite nextcloud
    
        echo "apachectl restart"
        apachectl configtest && apachectl restart || echo "Failed restartin apache"
    else
        ln -s /etc/nginx/sites-available/nextcloud.conf /etc/nginx/sites-enabled/
        cp `pwd`/etc/ngix/conf.d/* /etc/ngix/conf.d/
        sed -ibak /etc/nginx/nginx.conf 's/^\s*#\s*\(server_names_hash_bucket_size\)/\1/'
        systemctl restart nginx
    fi
    
    echo "Warning: ssl isn't properly activated, please run certbot then uncomment the contents of /etc/${WEB_SERVER}/ssl.conf"
    
    line="*/15  *  *  *  * php -f ${NEXTCLOUD_INSTALL_DIR}/cron.php"
    echo "Adding crontab entry '$line' to www-data"
    (crontab -u www-data -l; echo "${line}") | crontab -u www-data -
    echo "Adding crontab entry '$line' to www-data, done"
    
    
    # Configure config.php
    
    echo "cd ${NEXTCLOUD_INSTALL_DIR}/config"
    cd ${NEXTCLOUD_INSTALL_DIR}/config
    echo "cd ${NEXTCLOUD_INSTALL_DIR}/config : terminated"
    
    sections=${NEXTCLOUD_CONFIG_trusted_domains:-\
        "${NEXTCLOUD_CONFIG_trusted_domains}"}
    sections="${sections} 'memcache.local' => 'APCu',"
    # sections=$(echo $sections | tr -s '[:space:]' ' ')
    
    echo "Set /var/www/nexcloud/config/config.php"
    sed -i.bak -e "/'trusted_domains'/,/),/d;
    s@)@${sections})@;
    /array(/s@,@,\n@g;" \
        -e 's/APCu/OC\\\\Memcache\\\\APCu/' \
        `pwd`/config.php
    
    echo "sed -i.bak \"/'trusted_domains'/,/),/d;" \
         "s@)@${sections})@;" \
         "/array(/s@,@,\n@;\" `pwd`/config.php : terminated"
    echo "WARNING : Take a look at /var/www/nexcloud/config/config.php"
    
    cd ${SCRIPT_DIRECTORY}
    
    echo "Copying nextcloud php.ini recommandations (opcache)"
    if [ "${WEB_SERVER}" == "apache2" ]
    then
        cat ${SCRIPT_DIRECTORY}/etc/php/7.0/apache2/php.ini >> /etc/php/7.0/apache2/php.ini
    else
        cat ${SCRIPT_DIRECTORY}/etc/php/7.0/apache2/php.ini >> /etc/php/7.0/fpm/php.ini
    fi
    
    systemctl restart apache2
    
    unset nextcloudPassword
    unset adminPassword