Перейти к основному содержанию

OwnCloud — установка на Ubuntu 20.04

Owncloud

OwnCloud — это свободное и открытое веб-приложение для синхронизации данных и совместной работы с файлами в стиле Dropbox. Замечательный инструмент для создания личного, семейного или корпоративного файлового хранилища.

Облачные хранилища данных сейчас широко распространены и используются повсеместно для корпоративных и личных нужд.

https://owncloud.com

Сегодня мы установим OwnCloud на Ubuntu 20.04. Версия Ubuntu выбрана просто, на официальном сайте есть подробная документация:

https://doc.owncloud.com/server/next/admin_manual/installation/manual_installation/server_prep_ubuntu_20.04.html

Официальные требования к установке:

  • Операционная система: Ubuntu 20.04 LTS
  • СУБД: MariaDB 10.5 1
  • Web сервер: Apache 2.4 с prefork и mod_php
  • PHP Runtime: 7.4

Виртуальная машина

Чтобы установить OwnCloud нам понадобится сервер. На гипервизоре ESXi 7 создаю виртуальную машину.

owncloud

Подробный отчёт писать не стал, благо есть инструкция по разворачиванию Ubuntu 20.04 на ESXi 6.7:

Установка Ubuntu Server 20.04 LTS на виртуальную машину VMware ESXi 6.7

По инструкции накатываю ОС Ubuntu 20.04.

owncloud

Подготовка к установке OwnCloud

Перед тем как перейти непосредственно к установке OwnCloud, нужно установить PHP 7.4 т необходимые пакеты:

sudo apt install php-fpm php-cgi

owncloud

sudo apt install php

owncloud

sudo apt install php-mysql php-mbstring php-intl php-redis php-imagick \
         php-igbinary php-gmp php-bcmath php-curl php-gd php-zip php-imap \
         php-ldap php-bz2 php-ssh2 php-phpseclib php-common php-json php-xml

owncloud

sudo apt install php-dev libsmbclient-dev php-pear

owncloud

Это ещё не всё, продолжаем.

sudo apt install smbclient

owncloud

В документации рекомендуется установка кеширующего сервера Redis, я, конечно, поставил, но потом не стал его использовать из-за странных блокировок при совместном доступе к файлам.

sudo apt install redis-server

owncloud

Архиватор понадобится.

sudo apt install unzip

owncloud

Без SSL никуда.

sudo apt install openssl

owncloud

Конечно же rsync.

sudo apt install rsync

owncloud

Для работы с изображениями imagemagick.

sudo apt install imagemagick

owncloud

Стандартная версия PEAR не подходит, смотрим текущую:

pear version

owncloud

PEAR VERSION: 1.10.9

Текущая версия 1.10.9, а нужна 1.10.13. Создаём временную папку:

sudo mkdir -p /tmp/pear/cache

owncloud

Обновляем PEAR:

sudo pear upgrade --force --alldeps http://pear.php.net/get/PEAR-1.10.13

owncloud

Чистим-обновляем:

sudo pear clear-cache
sudo pear update-channels

owncloud

Продолжаем обновлять:

sudo pear upgrade --force

owncloud

А потом... обновляем.

sudo pear upgrade-all

owncloud

Обновлять нечего, это хорошо. Мы добились успеха. Проверяем версию:

pear version

owncloud

PEAR VERSION: 1.10.13

Текущая версия 1.10.13.

Чистим кэш:

rm -r /tmp/pear/cache

owncloud

Расширения PHP

Список доступных расширений в /etc/php/7.4/mods-available.

cd /etc/php/7.4/mods-available
ll

Я не знаю какие вам могут понадобиться расширения, но если они понадобятся, до добавить их можно так:

sudo phpenmod php-ldap

А убрать так:

sudo phpdismod php-ldap

Настройка DNS и проверка доступности домена

Настраиваем сеть на виртуалке. У всех могут быть разные настройки. Я, к примеру, первоначальные настройки указал при установке сервера, но забыл указать свой локальный доменный DNS. Добавляю его в netplan:

owncloud

И в /etc/systemd/resolved.conf:

owncloud

И в /etc/nsswitch.conf:

owncloud

systemctl enable systemd-resolved

owncloud

У меня на сервере будет использоваться доменная аутентификация, проверяю доступность домена ilab.local.

host -t SRV _ldap._tcp.ilab.local

owncloud

Вижу один контроллер домена. Всё в порядке.

Проверяю доступность сетевых папок (у меня планируется использование внешних SMB хранилищ) на контроллере домена под доменным пользователем.

smbclient -L ilab-dc.ilab.local -U ilab.local/user1

Указываю пароль пользователя.

owncloud

Шара доступна.

База данных

В документации рекомендуют MariaDB в качестве сервера БД. Вынес установку в отдельную статью:

Установка MariaDB 10 на Ubuntu 20.04

После установки MariaDB нужно создать пользователя для OwnCloud:

sudo mysql --user=root
CREATE USER 'dbadmin'@'localhost' IDENTIFIED BY 'qwerty';
GRANT ALL PRIVILEGES ON *.* TO 'dbadmin'@'localhost' WITH GRANT OPTION;
FLUSH PRIVILEGES;

owncloud

Создаю пользователя dbadmin с паролем qwerty и даю ему полные права на все базы. Подразумевается, что никаких баз кроме OwnCloud на этом сервере не будет.

Apache

В качестве web сервера в документации рекомендуют Apache. Ну пусть будет, устанавливаем.

sudo apt install libapache2-mod-php apache2

owncloud

Создаём конфигурационный файл для OwnCloud.

cd /etc/apache2/sites-available
touch owncloud.conf

owncloud

Внутри я пишу что-то вроде:

alias /owncloud "/var/www/owncloud"

<Directory /var/www/owncloud>
  Options +FollowSymlinks
  AllowOverride All

 <IfModule mod_dav.c>
  Dav off
 </IfModule>
</Directory>

owncloud

В документации есть более правильный скрипт для создания конфигурационного файла:

FILE="/etc/apache2/sites-available/owncloud.conf"
cat <<EOM >$FILE
<VirtualHost *:80>
# uncommment the line below if variable was set
#ServerName $my_domain
DirectoryIndex index.php index.html
DocumentRoot /var/www/owncloud
<Directory /var/www/owncloud>
  Options +FollowSymlinks -Indexes
  AllowOverride All
  Require all granted

 <IfModule mod_dav.c>
  Dav off
 </IfModule>

 SetEnv HOME /var/www/owncloud
 SetEnv HTTP_HOME /var/www/owncloud
</Directory>
</VirtualHost>
EOM

Включаем:

a2ensite owncloud.conf
systemctl reload apache2

owncloud

Конфигурационный файл появляется в /etc/apache2/sites-enabled.

owncloud

Можно отключить лишнюю конфигурацию:

a2dissite 000-default

Подключаем модули Apache:

sudo a2enmod headers
sudo a2enmod env
sudo a2enmod dir
sudo a2enmod mime
sudo a2enmod unique_id
systemctl restart apache2

owncloud

Установка OwnCloud

Теперь можно установить OwnCloud. Есть несколько способов установки, я воспользуюсь установкой с помощью скриптов.

Качаю пакет в /tmp.

cd /tmp
wget https://download.owncloud.com/server/stable/owncloud-complete-latest.tar.bz2 

owncloud

Качается последняя версия OwnCloud. Если нужна другая, то ссылки можно найти здесь:

https://owncloud.com/download-server/

owncloud

В папке /opt/owncloud создаю два скрипта. Примеры здесь:

https://doc.owncloud.com/server/10.10/admin_manual/installation/manual_installation/script_guided_install.html

Модифицирую скрипт instance.sh под свою установку.

  • ocname — название директории с файлами owncloud (по умолчанию owncloud)
  • ocroot — путь к ocname, обычно /var/www (без завершаюзего слеша, по умолчанию /var/www)
  • linkroot — путь к папке с прилинкованными данными и внешними приложениями apps-external (по умолчанию /mnt/owncloud_data). Вы должны подготовить папку заранее и назначить права r/w пользователю web сервера.
  • htuser — пользователь web сервера (по умолчанию www-data)
  • htgroup — группа web сервера (по умолчанию www-data)
  • rootuser — пользователь root (по умолчанию root)
  • #!/bin/bash
    # Script Version 2022.06.23
    
    # This script prepares the parameters for owncloud_prep.sh
    # Handy if you have more instances to maintain where the process stays the same with different parameters
    # The processing script is expected in the same directory of this script.
    
    # To setup this script for your environment, adopt the following variables to your needs:
    #
    # ocname        the name of your directory containing the owncloud files
    # ocroot        the path to ocname, usually /var/www (no trailing slash)
    # linkroot      the path to your source directory for linking data and apps-external (no trailing slash)
    # htuser        the webserver user
    # htgroup       the webserver group
    # rootuser      the root user
    
    ocname='owncloud'
    ocroot='/var/www'
    
    linkroot='/opt/owncloud/owncloud_data'
    
    htuser='www-data'
    htgroup='www-data'
    rootuser='root'
    
    if [ "$(id -u)" != 0 ]; then
      printf "\nThis script should be run as root user to allow filesystem modifications\nExiting\n\n"
    fi
    
    printf "\nConsider backing up the database before you continue when upgrading!\n\n"
    
    # Resolve the absolute path this script is located and expects the called script to be there too
    DIR="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")"
    
    $DIR/owncloud_prep.sh "$ocname" "$ocroot" "$linkroot" "$htuser" "$htgroup" "$rootuser"

owncloud_prep.sh не редактируем.

  • #!/bin/bash
    # Script Version 2022.06.23
    
    # To set up this script for your environment, hand over the following variables according your needs:
    #
    # ocname        the name of your directory containing the owncloud files
    # ocroot        the path to ocname, usually /var/www (no trailing slash)
    # linkroot      the path to your source directory for linking data and apps-external (no trailing slash)
    # htuser        the webserver user
    # htgroup       the webserver group
    # rootuser      the root user
    
    # Short description for parameters used in find
    #
    # -L       ... Follow symbolic links. Needed in case if links are used or present
    # -path    ... The path to process
    # -prune   ... If the file is a directory, do not descend into it (used to exclude directories)
    # -o       ... OR (to add more parameters)
    # -type    ... File is of type [d ... directory, f ... file]
    # -print0  ... Print the full file name on the standard output, followed by a null character
    # xargs -0 ... Reads items from the standard input, input items are terminated by a null character
    
    
    ocname=$1
    ocroot=$2
    ocpath=$ocroot/$ocname
    ocdata=$ocroot/$ocname/'data'
    ocapps_external=$ocpath/'apps-external'
    oldocpath=$ocroot/$ocname'_'$(date +%F-%H.%M.%S)
    
    linkroot=$3
    linkdata=$linkroot/'data'
    linkapps_external=$linkroot/'apps-external'
    
    htuser=$4
    htgroup=$5
    rootuser=$6
    
    arguments=6
    
    filmod="0640"
    dirmod="0750"
    htamod="0640"
    
    # Because the data directory can be huge or on external storage, an automatic chmod/chown can take a while.
    # Therefore this directory can be treated differently.
    # If you have already created an external "data" and "apps-external" directory which you want to link,
    # set the paths above accordingly. This script can link and set the proper rights and permissions
    # depending what you enter when running the script.
    
    # When the instance is setup either post a fresh install or after an upgrade, run this script again but
    # only for securing ".htaccess files". This sets the appropriate ownership and permission for them.
    
    # In case you upgrade an existing installation, your original directory will be renamed including a timestamp
    
    
    if [ "$#" -ne "$arguments" ]; then
      printf "\nThis script needs $arguments arguments, $# given.\n\n"
    fi
    
    printf "\nFollowing parameters used\n\n"
    printf "ocname: $ocname\nocroot: $ocroot\nlinkroot: $linkroot\nhtuser: $htuser\nhtgroup:  $htgroup\nrootuser:  $rootuser\n"
    
    function get_tar {
      read -p "Please specify the tar file to extract with full path: " -r -e tarFile
      if [ ! -f "$tarFile" ]; then
        echo "tar file to extract not found. Exiting."
        echo
        exit
      fi
    }
    
    echo
    
    read -p "Do you want to secure your .htaccess files post installing/upgrade (y/N)? " -r -e answer
    (echo "$answer" | grep -iq "^y") && do_secure="y" || do_secure="n"
    
    if [ "$do_secure" = "y" ]; then
      printf "\nSecuring .htaccess files with chmod/chown\n"
      if [ -f ${ocpath}/.htaccess ]; then
        chmod $htamod ${ocpath}/.htaccess
        chown ${rootuser}:${htgroup} ${ocpath}/.htaccess
      fi
      if [ -f ${ocdata}/.htaccess ];then
        chmod $htamod ${ocdata}/.htaccess
        chown ${rootuser}:${htgroup} ${ocdata}/.htaccess
      fi
      printf "\nDone\n\n"
      exit
    fi
    
    
    read -p "Do you want to install a new instance (y/N)? " -r -e answer
    (echo "$answer" | grep -iq "^y") && do_new="y" || do_new="n"
    
    
    if [ "$do_new" = "n" ]; then
        read -p "Do you want to upgrade an existing installation (y/N)? " -r -e answer
        (echo "$answer" | grep -iq "^y") && do_upgrade="y" || do_upgrade="n"
    fi
    
    read -p "Use links for data and apps-external directories (Y/n)? " -r -e answer
    (echo "$answer" | grep -iq "^n") && uselinks="n" || uselinks="y"
    
    if [ "$uselinks" = "y" ]; then
      read -p "Do you want to chmod/chown these links (y/N)? " -r -e answer
      (echo "$answer" | grep -iq "^y") && chmdir="y" || chmdir="n"
    fi
    
    # check if upgrading an existing installation
    if [ "$do_upgrade" = "y" ]; then
      read -p "Is the instance in maintenance mode? (y/N)? " -r -e answer
      (echo "$answer" | grep -iq "^y") && mmode="y" || mmode="n"
      if [ "$mmode" = "n" ]; then
        echo "Please enable maintenance mode first: sudo -u$htuser ./occ maintenance:mode --on"
        echo
        exit
      fi
      get_tar
      # rename the source for backup reasons
      if [ -d ${ocpath} ]; then
        mv $ocpath $oldocpath
      fi
    fi
    
    # get the tar file for new installs
    if [ "$do_new" = "y" ]; then
      get_tar
    fi
    
    # in case of upgrade or new, extract the source
    if [ "$do_upgrade" = "y" ] || [ "$do_new" = "y" ]; then
      mkdir -p $ocpath
      tar xvf "$tarFile" -C $ocpath --strip-components=1
    
      if [ $? != 0 ]; then
        echo
        echo "tar extract failed, please check !"
        echo
        # rename back in case of tar errors
        if [ "$do_upgrade" = "y" ] && [ -d ${oldocpath} ]; then
          rm -r $ocpath
          mv $oldocpath $ocpath
        fi
        exit
      fi
    fi
    
    # create / link missing directories
    printf "\nCreating or linking possible missing directories \n"
    mkdir -p $ocpath/updater
    # check if directory creation is possible and create if ok
    if [ "$uselinks" = "n" ]; then
      if [ -L ${ocdata} ]; then
        echo "Symlink for $ocdata found but mkdir requested. Exiting."
        echo
        exit
      else
        echo "mkdir $ocdata"
        echo
        mkdir -p $ocdata
      fi
      if [ -L ${ocapps_external} ]; then
        echo "Symlink for $ocapps_external found but mkdir requested. Exiting."
        echo
        exit
      else
        printf "mkdir $ocapps_external \n"
        mkdir -p $ocapps_external
      fi
    else
      if [ -d ${ocdata} ] && [ ! -L $ocdata ]; then
        echo "Directory for $ocdata found but link requested. Exiting."
        echo
        exit
      else
        printf "ln $ocdata --> $linkdata\n"
        mkdir -p $linkdata
        ln -sfn $linkdata $ocdata
      fi
      if [ -d ${ocapps_external} ] && [ ! -L $ocapps_external ]; then
        echo "Directory for $ocapps_external found but link requested. Exiting."
        echo
        exit
      else
        printf "ln $ocapps_external --> $linkapps_external\n"
        mkdir -p $linkapps_external
        ln -sfn $linkapps_external $ocapps_external
      fi
    fi
    
    # copy existing *config.php and all .json files which are required for the new webUI
    if [ "$do_upgrade" = "y" ]; then
      # check if at minimum a config.php file is present
      # note that you can have more than one config.php representing different settings
      if [ -f ${oldocpath}/config/config.php ]; then
        printf "\nCopy existing *config.php and *.json files \n"
        # using find to omit messages if no files found
        find ${oldocpath}/config/ -name \*config.php -exec cp {} ${ocpath}/config/ \;
        find ${oldocpath}/config/ -name \*.json -exec cp {} ${ocpath}/config/ \;
      else
        printf "Skip to copy old config.php, file not found: ${oldocpath}/config/config.php \n"
      fi
    fi
    
    printf "\nchmod files and directories excluding data and apps-external directory\n"
    
    # check if there are files to chmod/chown available. If not, exiting.
    # chmod
    if [ ! "$(find $ocpath -maxdepth 1 -type f)" ]; then
      echo "Something is wrong. There are no files to chmod. Exiting."
      exit
    fi
    
    find -L ${ocpath} -path ${ocdata} -prune -o -path ${ocapps_external} -prune -o -type f -print0 | xargs -0 chmod $filmod
    find -L ${ocpath} -path ${ocdata} -prune -o -path ${ocapps_external} -prune -o -type d -print0 | xargs -0 chmod $dirmod
    
    # no error messages on empty directories
    if [ "$chmdir" = "n" ] && [ "$uselinks" = "n" ]; then
    
      printf "chmod data and apps-external directory (mkdir) \n"
    
      if [ -n "$(ls -A $ocdata)" ]; then
        find ${ocdata}/ -type f -print0 | xargs -0 chmod $filemod
      fi
      find ${ocdata}/ -type d -print0 | xargs -0 chmod $dirmod
      if [ -n "$(ls -A $ocapps_external)" ]; then
        find ${ocapps_external}/ -type f -print0 | xargs -0 chmod $filemod
      fi
      find ${ocapps_external}/ -type d -print0 | xargs -0 chmod $dirmod
    fi
    
    if [ "$chmdir" = "y" ] && [ "$uselinks" = "y" ]; then
    
      printf "chmod data and apps-external directory (linked) \n"
    
      if [ -n "$(ls -A $ocdata)" ]; then
        find -L ${ocdata}/ -type f -print0 | xargs -0 chmod $filmod
      fi
      find -L ${ocdata}/ -type d -print0 | xargs -0 chmod $dirmod
      if [ -n "$(ls -A $ocapps_external)" ]; then
        find -L ${ocapps_external}/ -type f -print0 | xargs -0 chmod $filmod
      fi
      find -L ${ocapps_external}/ -type d -print0 | xargs -0 chmod $dirmod
    fi
    
    #chown
    printf "chown files and directories excluding data and apps-external directory \n"
    
    find  -L $ocpath  -path ${ocdata} -prune -o -path ${ocapps_external} -prune -o -type d -print0 | xargs -0 chown ${rootuser}:${htgroup}
    find  -L $ocpath  -path ${ocdata} -prune -o -path ${ocapps_external} -prune -o -type f -print0 | xargs -0 chown ${rootuser}:${htgroup}
    
    # do only if directories are present
    if [ -d ${ocpath}/apps/ ]; then
      printf "chown apps directory \n"
      chown -R ${htuser}:${htgroup} ${ocpath}/apps/
    fi
    if [ -d ${ocpath}/config/ ]; then
      printf "chown config directory \n"
      chown -R ${htuser}:${htgroup} ${ocpath}/config/
    fi
    if [ -d ${ocpath}/updater/ ]; then
      printf "chown updater directory \n"
      chown -R ${htuser}:${htgroup} ${ocpath}/updater
    fi
    
    if [ "$chmdir" = "n" ] && [ "$uselinks" = "n" ]; then
      printf "chown data and apps-external directories (mkdir) \n"
      chown -R ${htuser}:${htgroup} ${ocapps_external}/
      chown -R ${htuser}:${htgroup} ${ocdata}/
    fi
    if [ "$chmdir" = "y" ] && [ "$uselinks" = "y" ]; then
      printf "chown data and apps-external directories (linked) \n"
      chown -R ${htuser}:${htgroup} ${ocapps_external}/
      chown -R ${htuser}:${htgroup} ${ocdata}/
    fi
    
    printf "\nchmod occ command to make it executable \n"
    if [ -f ${ocpath}/occ ]; then
      chmod +x ${ocpath}/occ
    fi
    
    
    # tell to remove the old instance, do upgrade and end maintenance mode etc.
    printf "\nSUCCESS\n\n"
    if [ "$do_upgrade" = "y" ]; then
      if [ "$uselinks" = "n" ]; then
        echo "Please migrate (move/copy) your data/ and apps-external/ directory manually back to the original location BEFORE running the upgrade command!"
        echo
      fi
      echo "Please change to your upgraded ownCloud directory: cd $ocroot/$ocname"
      echo "Please manually run: sudo -u$htuser ./occ upgrade"
      echo "Copy any changes manually added in .user.ini and .htaccess from the backup directory"
      echo "Please manually run: sudo -u$htuser ./occ maintenance:mode --off"
      echo "Please manually remove the directory of the old instance: $oldocpath"
      echo "When successfully done, re-run this script to secure your .htaccess files"
      echo
    fi
    
    if [ "$do_new" = "y" ]; then
      echo "Open your browser, configure your instance and rerun this script to secure your .htaccess files"
      echo
    fi

Запускаем instance.sh.

Скрипт начинает задавать вопросы.

Do you want to secure your .htaccess files post installing/upgrade (y/N)? N
Do you want to install a new instance (y/N)? y

owncloud

Do you want to upgrade an existing installation (y/N)? N
Use links for data and apps-external directories (Y/n)? Y
Do you want to chmod/chown these links (y/N)? Y
Please specify the tar file to extract with full path:

Указываю полный путь к архиву: /tmp/owncloud-complete-latest.tar.bz2

owncloud

Установка завершена. Дальнейшие настройки нужно проводить в браузере.

owncloud

Внимательно читаем вопросы мастера, отвечаем. В процессе будет создана база данных и учётная запись администратора OwnCloud.

Затем настраиваем конфигурационный файл owncloud, нужно ознакомиться с документацией. Настраиваем https, сертификаты, доменное имя. Разбираемся с тем как накатить свой скин. Устанавливаем дополнительные пакеты из магазина, там есть и бесплатные. Настраиваем LDAP аутентификацию, если нужно. Вникаем в тонкости установки и настройки внешних хранилищ. Всё это не в рамках данной статьи.

owncloud

 

Похожие материалы

Seafile сервер для Linux версия 7.0.5

23 сентября 2019 года вышла новая версия сервера Seafile для Linux — 7.0.5. Релиз доступен для скачивания. До этого был успешный релиз 7.0.4. На этот раз попробую обновиться дальше до версии 7.0.5.

Seafile — установка на Ubuntu 18.04 LTS

Seafile — это личное облачное хранилище для хранения данных в стиле Dropbox. Сегодня мы развернём это хранилище на виртуальном сервере. В качестве гипервизора у нас ESXi 6.7 Update 1.