А сегодня мы с вами быстро и решительно легко и просто поднимем свое личное файловое облако типа Google Drive или Яндекс.Диск, а если повезет, то еще и очень дешево.
Зачем? Ну, например, потому что не хотим зависеть от корпораций с их кабальными лицензионными соглашениями и сменой условий задним числом. Или потому что нам хочется приватности. Или просто потому что можем. А бонусом на нашем сервере вы потом сможете еще установить VPN или прокси для доступа к запрещенным сайтам, или поднять простенький веб-сайтик.
Я специально будут рассказывать все максимально подробно и пошагово, чтобы даже люди без большого опыта системного администрирования смогли все повторить. В наше время, благодаря развитому инструментарию, такому как docker и snap, установить и настроить все что нужно можно очень быстро всего лишь несколькими командами.
Поехали
Первым делом, нам нужен сервер под это дело. Shared hosting нам не подходит, dedicated server - оверкилл и очень дорого, поэтому нам нужен VDS/VPS. Поскольку цель всего затеянного - хранить данные, много данных, самый распространенный вариант “SSD VDS” нам не подходит, и нужно найти то, что обычно называется “HDD VPS” или “Storage VDS”. Гуглим и выбираем то что надо исходя из своих потребностей и размеров кошелька. Я уже много лет пользуюсь одним классным украино-американским хостером, который предлагает HDD VPS в дата-центре в Болгарии за смешные деньги, а именно 1 евро в месяц за сервер с 100 гигабайт дискового пространства, 3 евро в месяц за сервер с 500 гигабайтами, и т.д.
Регистрируемся у хостера, заполняем все необходимые данные, и, наконец, заказываем услугу, выбирая сервер/тариф который нам хочется. Обычно при этом еще задается вопрос, какую ОС установить на сервер. Как известно, лучший дистрибутив Linux - это тот, который использует ваш Linux-гуру, поэтому выбирайте Debian самой свежей версии, которая есть - все дальнейшие инструкции будут приведены именно для Debian. Если Debian в списке нет (чему я очень сильно удивлюсь), то можно выбрать Ubuntu, там будет почти все то же самое.
После этого нужно подождать (обычно от нескольких минут до получаса), пока создается наша виртуальная машина. После этого либо в админиистративной панели хостера, либо в письме у вас в почтовом ящике, либо и там и там, вы получите реквизиты вашего нового сервера: его имя, IP-адрес, а также логин и пароль root-пользователя.
Для подключения к серверу нам нужен SSH-клиент. Если вы линуксоид, или у вас установлен WSL (Windows Subsystem for Linux), то просто используйте команду ‘ssh’. Если вы приверженец Windows, скачайте PuTTy.
Подключаемся к серверу по его IP-адресу:
$ ssh root@xx.xx.xx.xx (где root - это имя пользователя, а xx.xx.xx.xx это IP)
Сразу же меняем пароль суперпользователя с хостерского на свой свежепридуманный:
$ passwd
Обновим установленный в системе софт до свежих версий и установим несколько пакетов, которые нам пригодятся:
nano - это простой текстовый редактор, как по мне, самый дружелюбный к начинающим пользователям благодаря постоянно присутствующим там на экране подсказкам по его комбинациям клавиш, mc - классический двухпанельный файловый менеджер для более удобных прогулок по файловой системе.
Создадим учетную запись обычного пользователя (не root) и зададим ему пароль:
$ adduser user
$ passwd user
После этого немного укрепим безопасность нашей системы. Перевесим SSH-сервер со стандартного порта 22 на нестандартный (на самом деле я нередко встречал мнение, что в наше время это не сильно помогает от сканеров-ботов, но лично я вижу, что помогает) и запретим логиниться пользователю root: сначала надо будет зайти под учетной записью обычного пользователя, а уже потом командой ‘su -’ при необходимости эскалировать права.
Делаем
$ nano /etc/ssh/sshd_config
и там меняем параметр Port на
Port 2200
и PermitRootLogin на
PermitRootLogin no
После этого для подключения к вашему серверу по SSH нужно будет добавлять опцию '-p2200'.
Более секьюрным подходом был бы полный запрет авторизацию по паролям и разрешение авторизации только по ключам, но для начинающих пользователей это обычно оказывается слишком сложно, а если вам это нужно и хочется, вы легко найдете в гугле как это сделать.
Теперь давайте немного поколдуем над файловой системой.
Сначала выполним команду mount и найдем, как называется наш основной диск, на котором находится корневой системный раздел:
Как видим, наш диск зовется /dev/vda1. По умолчанию Linux резервирует на каждом диске определенное место “на всякий случай” для пользователя root, чтобы, например, при полном исчерпании свободного пространства, сервисы не начали падать из-за невозможности писать логи и по-прежнему была возможность залогиниться и все исправить. Нюанс в том, что по умолчанию это место задается в % от общего объема, а поскольку диск у нас довольно большой, то не стоит заниматься расточительством, 1% более чем достаточно:
$ tune2fs -m1 /dev/vda1
HDD VPS обычно предназначены именно для хранения данных, а не для работы каких-либо тяжелых сервисов, поэтому характеристики у них бывают нередко скромные. Часто можно встретить виртуальные машины с 1 гигбайтом или даже 512 мегабайтами оперативной памяти, что в наше время и для наших целей, прямо скажем, очень мало. Первым делом, проверим, сколько у нас вообще памяти, и главное, есть ли swap (раздел подкачки).
$ free
total used free shared buff/cache available
Mem: 999824 255160 87040 668 657624 612536
Swap: 262140 148092 114048
Если в последней строчке вы видите нули, то это тревожный звоночек: памяти мало, свопа нет, и в дальнейшем есть риск наткнуться на серьезные проблемы из-за этого. Сейчас мы все исправим.
- этот набор команд создаст на диске swap-файл размером в 1 гигабайт и начнет использовать его в системе.
Чтобы не надо было делать swapon после каждой перезагрузки, добавим новую строчку в /etc/fstab:
/swapfile swap swap defaults 0 0
Все, с диском и памятью закончили, теперь переходим к более интересным делам.
Использовать нешифрованный HTTP в наше время очень неблагоразумно, а для HTTPS нам нужны сертификаты, которые не получится получить без доменного имени. Соответственно, нам нужен домен.
Нам потребуется доменное имя для сервера, чтобы на нём беспроблемно работал TLS (HTTPS). Вы можете либо купить домен и привязать его к IP-адресу вашего VPS, либо использовать какой-либо бесплатный сервис, предоставляющий доменные имена. В последнем случае, родительский домен вашего домена должен быть внесён в список публичных суффиксов доменов. Иначе могут возникнуть проблемы с выпуском сертификата через Let's Encrypt - упрётся в разрешённое число выпущенных сертификатов для родительского домена за какой-то период времени. В этом руководстве мы воспользуемся бесплатным сервисом freemyip.com, который даёт домен пользователю даже без регистрации.
Запустите следующую команду на вашем сервере: curl 'ССЫЛКА', где ССЫЛКА - та самая ссылка, которую вы получили на предыдущем шаге. Обратите внимание: нужно не забыть взять ссылку в одиночные кавычки!
Проверка: проверьте ваш домен ping-ом, он должен указывать на IP-адрес вашего VPS. Если это не так, то попробуйте подождать несколько минут и попробовать снова.
Я лично пользовался сервисом https://www.dynu.com/, там все очень просто: зарегистрировались, нажали DDNS Services -> Add -> выбрали красивый домен -> задали IP-адрес своего сервера. Всё.
Настало время самого важного.
Мы будем устанавливать NextCloud. Из альтернатив могу назвать еще Seafile, но NextCloud мне попался под руку раньше, поэтому я буду использовать его.
Инструкция по ручной установке NextCloud довольно страшная: нужно установить Apache, PHP, MySQL/MariaDB, Redis, создать таблицы, сделать еще кучу всего, и не сойти с ума. Хвала людям, придумавшим формат дистрибьюции пакетов snap, мы получим все это введя лишь пару команд.
Устанавливаем snapd (обратите внимание, не snap, а snapd):
$ apt install snapd
Устанавливаем nextcloud:
$ snap install nextcloud
Это может занять некоторое время, терпеливо ждем.
Поскольку NextCloud поставляется в snap-пакете, то там уже в планировщике стоит задание для автоматического обновления NextCloud - периодически при логине через браузер вы будете видеть веселые уведомления о том, что он обновился до новой версии.
Потом вспоминаем доменное имя, которое мы зарегистрировали ранее, пусть, например, это будет 'habrdrive.mywire.org'.
Заходим браузером на него: http://habrdrive.mywire.org Откроется веб-интерфейс NextCloud с мастером установки, где кликаем на “Next”/”Далее” и немного ждем, пока он делает все необходимое под капотом. NextCloud может предложить вам установить дополнительные расширения (“приложения), но если у вас слабенький сервер (гигабайт памяти или меньше), то лучше вежливо отказаться, если что, доустановите потом.
Немного магии: домен, который мы использовали для первого входа, NextCloud запомнит и больше не будет пускать клиентов ниоткуда, кроме него - то есть если вы, например, потом попробуйте обратиться к NextCloud через браузер не по доменному имени, а по IP-адресу, то NextCloud вежливо вам в этом откажет. В целях безопасности, типа.
Окей. Установка закончена: мы видим веб-интерфейс, пункты меню, мы можем уже загружать и скачивать файлы. Мы ничего не забыли? Конечно забыли. Мы забыли TLS-шифрование :)
Настроить его можно очень просто, всего одной командой в консольке:
$ nextcloud.enable-https lets-encrypt
NextCloud попросит вас согласиться с правилами Let’s Encrypt, сам сходит за сертификатом, установит его, и добавит в планировщик задачу, которая автоматически будет обновлять сертификат каждый 3 месяца.
После этого можно лазить по веб-интерфейсу NextCloud, изучать настройки. Чтобы создать новые пользовательские аккаунты, для себя, для друзей, для родственников, для кота, и т.д., нужно перейти в пункт “Пользователи” в админской менюшке, и дальше разберетесь. Да, для пользователей можно задавать квоты (максимально допустимый объем занятого пространства) :)
В целом, NextCloud даже без дополнительных расширений умеет всё, что полагается уметь файловому облаку: можно создавать папки, заливать и скачивать файлы, шарить файлы и папки между пользователями в пределах облака и даже на весь Интернет, и много чего другого. Есть “Корзина” для удаленных файлов, есть журнал событий - короче говоря, все как у людей.
Интерфейс интуитивно понятный:
Меню выбора приложений (1): в верхнем левом углу, там торчат все “Приложения” NextCloud, но если вы ничего дополнительно не устанавливали, то как минимум там будут “Файлы” и “События”.
Поле «Информация о приложениях» (2): расположено на левой боковой панели и содержит пункты, связанные с выбранным вами приложением. Например, когда открыты «Файлы», там есть специальный набор фильтров для быстрого поиска, например, файлы которыми вы поделились с вами, и файлы, которыми вы поделились с другими, и т.д.
Панель навигации (4). классические “хлебные крошки” (breadcrumbs), показывающие, насколько глубоко вы забрались по папкам и позволяющие оттуда вылезти.
Кнопка «Создать» (5): расположенная на панели навигации кнопка «Создать» позволяет создавать новые файлы, новые папки или загружать файлы. Можно и без нее, просто перетащить drag-n-drop’ом файл или диру в браузер.
Поле поиска (6): поиск по тому, что у вас есть в хранилище.
Меню настроек (9): нажмите на изображение своего профиля, расположенное справа от поля поиска, чтобы открыть раскрывающееся меню настроек. На странице настроек представлены следующие настройки и функции:
Ссылки для скачивания десктопных и мобильных приложений
Управление паролями
Настройки имени, электронной почты и изображения профиля
Управление “подключенными” (залогиненными) браузерами и устройствами
Настройки языка интерфейса
Управление уведомлениями
Информация о версии Nextcloud
У NextCloud есть десктопный клиент для синхронизации под Windows, MacOS и Linux, есть очень удобные мобильные клиенты для Android и iOS. Найти все это дело можно на их официальном сайте: https://nextcloud.com/clients/
После установки клиента он первым делом спросит у вас адрес сервера - введите свое доменное имя. Дальше пользовательские логин/пароль, и дело сделано:
Кроме того, с NextCloud можно работать любым WebDAV-клиентом. Например, подобный функционал нередко используется во всевозможных менеджерах паролей, утилитах для бэкапов, и т.д. Чтобы получить ссылку для webdav-соединения, при открытом окошке “Файлы” ткните на “Настройки” слева снизу (да, вот это немного неочевидно), и она будет там:
Оптимизации
Если у вас на сервере 1 гигабайт памяти, то все еще неплохо, а вот если у вас только 512 мегабайт, то NextCloud будет работать… неторопливо. Да, мы добавили swap, потому что без swap’а на системах с 512 мегабайтами он вообще нормально не работает - процесс MariaDB (базы данных) периодически тупо прибивается системным out-of-memory-killer’ом и все с грохотом падает. С активным свопом такого не происходит, но поскольку диск у нас HDD, то работает все это дело иногда довольно медленно, вплоть до того, что когда вы после долгого бездействия открываете веб-морду NextCloud или мобильное приложение, первые одна-две попытки соединиться отваливаются по таймауту, что, само собой, не очень приятно, и с этим надо что-то делать.
Сейчас я расскажу несколько трюков, которые помогли мне свести эту проблему к минимуму на моей 512-мегабайтной VPS’ке.
Включаем zswap
Zswap - технология компрессии страниц в памяти. Поскольку своп у нас очень медленный, то даже с учетом оверхеда на компрессию-декомпрессию страниц процессором, zswap все равно может дать очень неплохое ускорение работы.
Проверяем, не включено ли оно уже - обычно не включено
$ cat /sys/module/zswap/parameters/enabled
N
Если видим N, то делаем
$ echo Y | tee /sys/module/zswap/parameters/enabled
$ echo z3fold | tee /sys/module/zswap/parameters/zpool
и потом добавляем те же самые строчки в /etc/rc.local чтобы оно сразу включалось после перезагрузки:
#!/bin/bash
echo Y | tee /sys/module/zswap/parameters/enabled
echo z3fold | tee /sys/module/zswap/parameters/zpool
exit 0
Существует и другой, более “правильный” способ активации zswap еще на этапе загрузки системы через параметры ядра, но не будем переусложнять, оно и так нормально работает.
Из других оптимизаций:
Можно отключить MDNS-Publisher, посколько он нужен только в локальной сети:
$ snap stop --disable nextcloud.mdns-publisher
Это освободит еще немного памяти.
Еще в /etc/systemd/journald.conf можно выставить опцию
Storage=persistent
и после этого перезапустить journald командой
$ systemctl restart systemd-journald
чтобы SystemD скидывал логи на диск, а не хранил их в памяти.
Ну и наконец, фантастический костыль, создадим в NextCloud юзера по имени dummy, а в /etc/cron.hourly/ создадим файл ‘poke’ со следущим содержанием:
После этого cron каждый час будет тыкать nextcloud через webdav, заставляя того активизировать свои воркеры и прочитать что-нибудь из базы данных, что вызовет загрузку их страниц памяти из свопа если они по какой-то причине там оказались. Да, костыль, но он работает :)