Найти в Дзене
Holpa

Создание облака Nextcloud

Сегодня расскажем как создать свое облако, и раздавать кому угодно доступ к нему.
Можно поставить сервер на любое одно ядерное железо с любым объемом жеского диска (либо арендовать vps сервер и поставить его там)
Важная особенность данной статьи это у вас должно быть доменное имя (можете уже зарегистрировать). Можно и без него, но это муторно.
В качестве операционной системы выступит Debian или Ubuntu (большого отличия для заданной тематики не будет)

Для начала настроим репозитории следующим набором команд:

echo 'deb http://packages.dotdeb.org jessie all' >> /etc/apt/sources.list
echo 'deb-src http://packages.dotdeb.org jessie all' >> /etc/apt/sources.list
echo 'deb http://ftp.debian.org/debian jessie-backports main' >> /etc/apt/sources.list
echo 'deb http://ftp.utexas.edu/dotdeb/ jessie all' >> /etc/apt/sources.list
wget https://www.dotdeb.org/dotdeb.gpg
apt-key add dotdeb.gpg

Обновим наш сервер командами:

apt -y update
apt -y upgrade

Установим необходимые пакеты:

apt-get -y install apache2 mariadb-server libapache2-mod-php7.0 php7.0-redis

Тут нас попросят придумать пароль для рутовой учётки MariaDB.

-2

Вводим пароль (символы не отображаются), жмём Enter и повторно вводим тот-же пароль и жмём Enter.

Доустановим ещё пакетов командами:

apt-get -y install php7.0-gd php7.0-json php7.0-mysql php7.0-curl php7.0-mbstring
apt-get -y install php7.0-intl php7.0-mcrypt php7.0-xml php7.0-zip
apt-get -y install libmagickwand-dev imagemagick php-dev redis-server
apt-get -y install python-certbot-apache -t jessie-backports

Запустим и добавим в автозагрузку наши Web-сервер и СУБД:

systemctl start apache2
systemctl enable apache2
systemctl start mysql
systemctl enable mysql

Можно убедиться, что наш Web-сервер работает, перейдя по адресу http://<ip-адрес вашего сервера. Получим такую картинку:

-3

Выполним первичную настройку безопасности СУБД:

mysql_secure_installation

Вводим тот пароль для MariaDB, который мы придумали ранее. Нам зададут ряд вопросов, отвечаем так:

-4

Теперь зайдём в консоль MariaDB командой:

mysql -u root -p

Вводим пароль от MariaDB и попадаем в консоль.

-5

Создадим базу данных (точка с запятой в конце команд обязательны):

CREATE DATABASE nextclouddb;

Создадим учётную запись, с которой на Nextcloud будет обращаться к базе данных. Вместо password придумываем и вставляем в команду новый пароль:

CREATE USER 'nextcloud'@'localhost' IDENTIFIED BY 'password';

Дадим этой учётной записи права на базу данных

GRANT ALL PRIVILEGES ON nextclouddb.* TO 'nextcloud'@'localhost';

Обновим таблицу привилегий, чтобы изменения применились:

FLUSH PRIVILEGES;

И выходим из консоли:

\q

Теперь пора установить сам Nextcloud. Посмотреть список доступных версий можно на этой странице. Выбираем самую свежую. На дату написания статьи это nextcloud-12.0.2

Скачиваем:

cd /tmp
wget https://download.nextcloud.com/server/releases/nextcloud-12.0.2.zip

Распаковываем:

unzip nextcloud-12.0.2.zip

И переносим к месту постоянного обитания:

mv nextcloud /usr/share/

Обязательно нужно дать права web-серверу на папку:

chown -R www-data:www-data /usr/share/nextcloud

Теперь любым удобным способом (например с помощью WinSCP) создадим в папке /etc/apache2/sites-available/ файл с именем nextcloud.conf со следующим содержимым:

ServerName nc.mydomen.ml
<VirtualHost *:80>
ServerAdmin admin@mydomen.ml
ServerName nc.mydomen.ml
DocumentRoot /usr/share/nextcloud
</VirtualHost>
<Directory "/usr/share/nextcloud/">
Options MultiViews FollowSymlinks
AllowOverride All
Order allow,deny
Allow from all
</Directory>
TransferLog /var/log/apache2/nextcloud_access.log
ErrorLog /var/log/apache2/nextcloud_error.log

По тексту конфига исправляем под себя адрес электронной почты и домен (ServerAdmin, ServerName)

Сохраняем файл и применяем настройки командами:

a2dissite 000-default
a2ensite nextcloud
service apache2 reload
service apache2 restart

Теперь можно перейти по адресу http://nc.mydomen.ml (свой домен) и настроить наш Nextcloud:

-6

Придумываем и вводим логин и пароль администратора, вписываем настройки базы данных, которые мы сделали ранее и нажимаем "Завершить установку".

Сервер уже работает. Осталось настроить безопасность.

Переведём наш сервер на https. Для этого сначала получим сертификаты командой:

certbot --apache certonly

На запросы вводим адрес электронной почты (укажите реальный, на него будут приходить уведомления о действиях с сертификатом), принимаем условия использования сервисом Let's Encrypt (вводим A) и вводим имя домена (или выбираем из предложенного списка), для которого получаем сертификат (например nc.mydomen.ml):

-7

Отлично, сертификаты получены и лежат в папке /etc/letsencrypt/live/nc.mydomen.ml/

Срок действия сертификатов - 90 дней. Об истечении срока придёт письмо на указанную выше почту. Для обновления сертификатов используем команду:

certbot renew

Этот процесс можно автоматизировать с помощью Cron. Пример приведён в статье про ownCloud.

Настроим Apache. Включим ssl модуль командой:

a2enmod ssl

Включим конфиг по умолчанию для ssl:

a2ensite default-ssl.conf

Поскольку нам нужно будет перенаправлять клиентов с 80 порта (http) на 443 (hhtps), то включим модуль перенаправлений:

a2enmod rewrite

Теперь любым удобным способом (например с помощью WinSCP) создадим в папке /etc/apache2/sites-available/ файл с именем nextcloud-ssl.conf со следующим содержимым:

<IfModule mod_ssl.c>
<VirtualHost nc.mydomen.ml:443>
ServerAdmin admin@mydomen.ml
DocumentRoot /usr/share/nextcloud
TransferLog /var/log/apache2/nextcloud_access.log
ErrorLog /var/log/apache2/nextcloud_error.log
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/nc.mydomen.ml/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/nc.mydomen.ml/privkey.pem
<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory /usr/lib/cgi-bin>
SSLOptions +StdEnvVars
</Directory>
BrowserMatch "MSIE [2-6]" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown
</VirtualHost>
</IfModule>

Сохраняем файл и применяем настройки командами:

a2ensite nextcloud-ssl
service apache2 reload
service apache2 restart

Теперь можно перейти по адресу https://nc.mydomen.ml (вы используете своё имя домена) и убедится, что всё работает

-8

Настроим жёсткое перенаправление с http на https. Тогда работа с нашим сайтом будет возможна только по https.

Откройте файл /etc/apache2/sites-available/nextcloud.conf и добавим две строчки с директивой Rewrite:

ServerName nc.mydomen.ml
<VirtualHost *:80>
ServerAdmin admin@mydomen.ml
ServerName nc.mydomen.ml
DocumentRoot /usr/share/nextcloud
RewriteEngine On
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
</VirtualHost>
<Directory "/usr/share/nextcloud/">
Options MultiViews FollowSymlinks
AllowOverride All
Order allow,deny
Allow from all
</Directory>
TransferLog /var/log/apache2/nextcloud_access.log
ErrorLog /var/log/apache2/nextcloud_error.log

Применим настройки

service apache2 reload
service apache2 restart

Попробуйте войти на сайт по http и убедитесь, что вас перенаправляет на https.

Канал защитили. Теперь оптимизируем производительность сервера за счёт кэширования.

С помощью WinSCP или иным способом откроем файл /etc/sysctl.conf и добавим в конце строчку:

vm.overcommit_memory = 1

Сохраним и закроем файл. Перезагрузим сервер, чтобы настройка применилась

reboot

Запустим и добавим в автозагрузку кэш-сервер Redis:

systemctl start redis-server
systemctl enable redis-serve
r

Проверить, что Redis работает и слушает порт 6379 можно командой:

ps ax | grep redis

В WinSCP или иным способом откроем файл /usr/share/nginx/html/config/config.php. Смотрим на последнюю строчку, она выглядит так:

);
Перед ней добавим строчки

'memcache.local' => '\OC\Memcache\Redis',
'redis' => array(
'host' => 'localhost',
'port' => 6379,
),

Сохраним и закроем файл. Зайдите в свой Nextcloud, страницы должны корректно отображаться.

Сделаем еще одну настройку безопасности.

Включим модуль headers:

a2enmod headers

В файл /etc/apache2/sites-available/nextcloud-ssl.conf добавим между тегами <VirtualHost и </VirtualHost> в любое место строчку

Header always set Strict-Transport-Security "max-age=15552000; includeSubDomains"
Сохраним и закроем файл.

Применим настройки:

service apache2 reload
service apache2 restart

Заходим в Nextcloud и проверяем, что всё работает.

Profit

Рекомендации

1. Не используйте созданную выше учётную запись администратора для постоянной работы. Зайдите в настройки пользователей, создайте группу(ы) для обычных пользователей, создайте пользователей с ограниченными правами, установите квоты.

-9

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

3. Включите использование системного Cron для фоновых заданий.
3. Включите использование системного Cron для фоновых заданий.