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

Обсуждение проблем с использованием GNU/Linux и UNIX-подобных систем.
Аватара пользователя
holpa
Admin
Сообщения: 664
Зарегистрирован: 04 сен 2014, 14:00

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

Непрочитанное сообщение holpa » 18 дек 2018, 09:29

Сегодня расскажем как создать свое облако, и раздавать кому угодно доступ к нему.
Можно поставить сервер на любое одно ядерное железо с любым объемом жеского диска (либо арендовать 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.

Изображение

Вводим пароль (символы не отображаются), жмём 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-адрес вашего сервера. Получим такую картинку:

Изображение

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

Код: Выделить всё

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

Изображение

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

Код: Выделить всё

mysql -u root -p
Вводим пароль от MariaDB и попадаем в консоль.

Изображение

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

Код: Выделить всё

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

Код: Выделить всё

CREATE USER 'nextcloud'@'localhost' IDENTIFIED BY 'password';
Дадим этой учётной записи права на базу данных

Код: Выделить всё

GRANT ALL PRIVILEGES ON nextclouddb.* TO 'nextcloud'@'localhost';
Обновим таблицу привилегий, чтобы изменения применились:

Код: Выделить всё

FLUSH PRIVILEGES;
И выходим из консоли:
Теперь пора установить сам 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:

Изображение

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

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

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

Код: Выделить всё

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

Изображение

Отлично, сертификаты получены и лежат в папке /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 (вы используете своё имя домена) и убедится, что всё работает

Изображение

Настроим жёсткое перенаправление с 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
Сохраним и закроем файл. Перезагрузим сервер, чтобы настройка применилась
Запустим и добавим в автозагрузку кэш-сервер Redis:

Код: Выделить всё

systemctl start redis-server
systemctl enable redis-server
Проверить, что 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. Не используйте созданную выше учётную запись администратора для постоянной работы. Зайдите в настройки пользователей, создайте группу(ы) для обычных пользователей, создайте пользователей с ограниченными правами, установите квоты.

Изображение

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

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

Ответить