Облачный терабайт за пачку сухарей. Nextcloud на StorageVPS

Стоимость хранения информации в облаках непрерывно снижается, но до сих пор иметь под рукой большие облачные ёмкости было не дёшево. Но вот, один за другим, хостеры стали обновлять линейки тарифов на так называемые StorageVPS. Это виртуальные машины с небольшой производительностью, но большой ёмкостью диска. Сегодня арендовать виртуалку с отказоустойчивым терабайтом стоит всего 5 евро!

Я предлагаю воспользоваться такой возможностью и поднять Nextcloud на StorageVPS. Для примера я взял одно из вкусных предложений от Time4VPS — одноядерную виртуалку с одним гигабайтом оперативки, 100-мегабитной сеткой (месячный объем исходящего трафика 10 TB) и терабайтным диском на борту.  Кстати, тут можно платить биткоинами 😉

Еще понадобиться доменное имя. Можно и без него, но это не очень удобно, да и сертификаты https правильные не сделать. Как получить халявный домен на dot.tk и настроить DNS-зону написано в этой статье. В статье я буду использовать доменное имя nc.mydomen.ml

Для начала установим операционную систему Debian 9 x64.

Для настройки нам понадобиться стандартный набор инструментов. Как подключиться по SSH, установить и настроить PUTTY и WinSCP, настроить вход по сертификатам — написано в этой статье. Вам только понадобятся логин и пароль от SSH.

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

echo 'deb http://packages.dotdeb.org stretch all' >> /etc/apt/sources.list
echo 'deb-src http://packages.dotdeb.org stretch all' >> /etc/apt/sources.list
echo 'deb http://ftp.debian.org/debian stretch-backports main' >> /etc/apt/sources.list
wget https://www.dotdeb.org/dotdeb.gpg
apt-key add dotdeb.gpg
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 648ACFD622F3D138
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 0E98404D386FA1D9
apt-get -y install apt-transport-https lsb-release ca-certificates curl
wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg
sh -c 'echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list'

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

apt -y update 
apt -y upgrade

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

apt-get -y install php7.4 php7.4-common php7.4-cli
apt-get -y install apache2 mariadb-server libapache2-mod-php7.4 php7.4-redis

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

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

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

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

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

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

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

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

mysql_secure_installation

Если ранее был запрос пароля (см. выше), то вводим его. Нам зададут ряд вопросов, отвечаем так:

Если запроса пароля ранее не было, то тут просто жмём Enter и далее соглашаемся на смену пароля, придумываем его и отвечаем на вопросы:

Теперь зайдём в консоль 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;

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

\q

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

Скачиваем:

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

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

unzip nextcloud-22.1.1.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 [email protected]
  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)

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

a2enmod php7.4
a2dissite 000-default
a2ensite nextcloud
systemctl reload apache2
systemctl restart apache2

Теперь можно перейти по адресу 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 [email protected]
    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 [email protected]
  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-server

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

ps ax | grep redis

В WinSCP откроем файл /usr/share/nextcloud/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"

Сохраним и закроем файл.

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

systemctl reload apache2
systemctl restart apache2

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

Ряд рекомендаций:

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

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

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

На этом всё. Вопросы можно задавать в Telegram @SecFAll_adm.

Там же мой канал с новостями.

Вы можите оставить комментарий, или поставить трэкбек со своего сайта.

Написать комментарий

XHTML: Вы можете использовать эти теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>