В предыдущей статье было описано проектирование программной платформы NAS.
Настало время её реализовать. Обязательно, перед тем, как начинать проверьте работоспособность пула: Пул и все диски в нём должны быть ONLINE. Далее я предполагаю, что на предыдущем этапе всё было сделано по инструкции, и работает, либо вы сами хорошо понимаете, что делаете. Прежде всего, стоит позаботиться об удобном управлении, если вы этого не сделали с самого начала.
Потребуются: После установки SSH надо добавить пользователя, чтобы не заходить через SSH под root (вход по умолчанию отключен и не надо его включать): Для удалённого администрирования это достаточный минимум. Тем не менее, пока нужно держать подключенными клавиатуру и монитор, т.к. ещё потребуется перезагружаться при обновлении ядра и для того, чтобы убедиться в том, что всё работает сразу после загрузки. Альтернативный вариант использовать Virtual KVM, который предоставляет IME. Там есть консоль, правда в моём случае она реализована в виде Java апплета, что не очень удобно. Насколько вы помните, в описанной мной конфигурации есть отдельный SSD под L2ARC, который пока не используется, но взят "на вырост". Необязательно, но желательно заполнить этот SSD случайными данными (в случае Samsung EVO всё-равно заполнится нулями после выполнения blkdiscard, но не на всех SSD так): На ZFS и так используется сжатие, потому сжатие логов через gzip будет явно лишним.
Выключаю: Тут всё просто: После перезагрузки, чтобы зафиксировать новое рабочее состояние, надо переписать первый снэпшот: Первое, что нужно сделать с целью достижения нормальной производительности ZFS — это вынести SLOG на SSD.
Напомню, что SLOG в используемой конфигурации дублируется на двух SSD: для него будут созданы устройства на LUKS-XTS поверх 4-го раздела каждой SSD: Сначала надо создать разделы под swap и l2arc: Раздел подкачки и L2ARC будут зашифрованы на случайном ключе, т.к. после перезагрузки они не требуются и их всегда возможно создать заново.
Поэтому в crypttab прописывается строка для шифрования/расшифрования разделов в plain режиме: Затем нужно перезапустить демоны и включить подкачку: Т.к. активного использования подкачки на SSD не планируется, параметр swapiness, который умолчанию 60, нужно установить в 10. L2ARC на данном этапе ещё не используется, но раздел под него уже готов: Будет описано создание пула tank0, tank1 создаётся по аналогии. Чтобы не заниматься созданием одинаковых разделов вручную и не допускать ошибок, я написал скрипт для создания шифрованных разделов под пулы: Теперь, используя данный скрипт, надо создать пул для хранения данных: Замечания о параметре ashift=12 смотрите в моих предыдущих статьях и комментариях к ним. После создания пула, я выношу его журнал на SSD: В дальнейшем, при установленном и настроенном OMV, возможно будет создавать пулы через GUI:  Для того, чтобы гарантированно включить автомонтирование пулов, выполните следующие команды: На данном этапе закончена настройка дисковой подсистемы. Первым делом надо установить и настроить OMV, чтобы наконец получить какую-то основу для NAS. OMV будет установлен в виде deb-пакета. Для того, чтобы это сделать, возможно воспользоваться официальной инструкцией. Скрипт add_repo.sh добавляет репозиторий OMV Arrakis в/etc/apt/ sources.list.d, чтобы пакетная система увидела репозиторий. Обратите внимание, что по сравнению с оригиналом, репозиторий partner включен. Для установки и первичной инициализации надо выполнить команды, приведённые ниже. OMV установлен. Он использует своё ядро, и после установки может потребоваться перезагрузка. Перезагрузившись, интерфейс OpenMediaVault, будет доступен на порту 80 (зайдите в браузере на NAS по IP-адресу):  Логин/пароль по умолчанию: admin/openmediavault. Далее большая часть настройки будет проходить через WEB-GUI. Сейчас надо сменить пароль WEB-администратора и сгенерировать сертификат для NAS, чтобы в дальнейшем работать по HTTPS. Смена пароля производится на вкладке "Система->Общие настройки->Пароль Web Администратора".
Для генерация сертификата на вкладке "Система->Сертификаты->SSL" надо выбрать "Добавить->Создать". Созданный сертификат будет виден на той же вкладке:  После создания сертификата, на вкладке "Система->Общие настройки" надо включить флажок "Включить SSL/TLS". Сертификат потребуется до завершения настройки. В окончательном варианте для обращения к OMV будет использоваться подписанный сертификат. Теперь надо перелогиниться в OMV, на порт 443 или просто приписав в браузере префикс https:// перед IP. Если войти удалось, на вкладке "Система->Общие настройки" надо включить флажок "Принудительно SSL/TLS". Измените порты 80 и 443 на 10080 и 10443.
И попробуйте войти по следующему адресу: https://IP_NAS:10443.
Изменение портов важно, потому что порты 80 и 443 будет использовать docker контейнер с nginx-reverse-proxy. Минимальные настройки, которое надо сделать в первую очередь: Если второй сетевой интерфейс NAS ещё не был подключен, подключите его к роутеру. Затем:  В результате, должны появиться интерфейсы в бондинге, которые роутер будет видеть, как один интерфейс и присвоит ему один IP адрес:  При желании, возможно дополнительно настроить SSH из WEB GUI:  На вкладке "Система->Управление обновлениями->Настройки" включите "Обновления поддерживаемые сообществом". Сначала требуется добавить репозитории OMV extras.
Это возможно сделать просто установив плагин, либо пакет, как указано на форуме. На странице "Система->Плагины" надо найти плагин "openmediavault-omvextrasorg" и установить его. В результате, в меню системы появится значок "OMV-Extras" (его возможно видеть на скриншотах). Зайдите туда и включите следующие репозитории: На вкладке "Система->OMV Extras->Ядро" вы можете выбрать нужное вам ядро, в том числе ядро от Proxmox (сам я его не ставил, т.к. мне пока не нужно, потому не рекомендую):  Установите необходимые плагины (жирным выделены абсолютно необходимые, курсивом — опциональные, которые я не устанавливал): Все диски, которые есть в системе, должны быть видны OMV. Удостоверьтесь в этом, посмотрев на вкладке "Хранилище->Диски". Если не все диски видны, запустите сканирование.  Там же, на всех HDD надо включить кэширование записи (кликнув на диске из списка и нажав кнопку "Редактировать"). Удостоверьтесь, что видны все шифрованные разделы на вкладке "Хранилище->Шифрование":  Теперь пора настроить S.M.A.R.T., указанный, как средство повышения надёжности: На этом настройку дисков возможно считать оконченной. Надо создать файловые системы для предопределённых каталогов.
Сделать это возможно из консоли, либо из WEB-интерфейса OMV (Хранилище->ZFS->Выбрать пул tank0->Кнопка "Добавить"->Filesystem). В итоге должна получиться следующая структура каталогов:  После этого, добавьте созданные ФС, как общие каталоги на странице "Управление правами доступа->Общие каталоги->Добавить".
Обратите внимание, что параметр "Устройство" равен пути к созданной в ZFS файловой системе, а параметр "Путь" у всех каталогов равен "/".  Резервное копирование производится двумя инструментами: Если вы воспользуетесь плагином, скорее всего получите ошибку: Для того, чтобы её исправить, по замечанию разработчиков OMV в этой "очень нестандартной конфигурации", возможно было бы отказаться от плагина и воспользоваться средствами ZFS в виде zfs send/receive.
Либо явно указать параметр "Root device" в виде физического устройства, с которого производится загрузка.
Мне удобнее использовать плагин и делать резервное копирование ОС из интерфейса, вместо того, чтобы городить что-то своё с zfs send, потому я предпочитаю второй вариант.  Чтобы резервное копирование работало, сначала создайте через ZFS файловую систему tank0/apps/backup, затем в меню "Система->Резервирование" кликните "+" в поле параметра "Общая папка" и добавьте созданное устройство, как целевое, а поле "Путь" установите в "/". С zfs-auto-snapshot тоже есть проблемы. Если её не настроить, она будет делать снимки каждый час, каждый день, каждую неделю, каждый месяц в течение года.
В итоге получится то, что на скриншоте:  Если вы уже на это натолкнулись, выполните следующий код для удаления автоматических снимков: Затем настройте запуск zfs-auto-snapshot в cron.
Для начала, просто удалите /etc/cron.hourly/zfs-auto-snapshot, если вам не требуется делать снимки каждый час. Нотификация по e-mail была указана, как одно из средств достижения надёжности.
Потому теперь надо настроить E-mail уведомления.
Для этого, зарегистрируйте на одном из публичных серверов ящик (ну либо настройте SMTP сервер самостоятельно, если у вас действительно есть причины это сделать). После чего надо зайти на страницу "Система->Уведомление" и вписать: Крайне желательно включить SSL/TLS. Пример настройки для Yandex показан на скриншоте:  Я использую белый статический IP-адрес, который стоит плюсом 100 рублей в месяц. Если нет желания платить и ваш адрес динамический, но не за NAT, возможно корректировать внешние DNS записи через API выбранного сервиса.
Тем не менее, стоит иметь ввиду, что адрес не за NAT может внезапно стать адресом за NAT: как правило, провайдеры не дают никаких гарантий. В качестве роутера у меня Mikrotik RouterBoard, похожий на тот, что на картинке ниже.  На роутере требуется сделать три вещи:  С CLouDNS всё просто. Заводите аккаунт, подтверждаете. NS записи уже у вас будут прописаны. Далее требуется минимальная настройка. Во-первых, нужно создать необходимые зоны (зона с именем NAS, подчёркнутая на скриншоте красным — это то, что вы должны создать, с другим названием, конечно).  Во-вторых, в этой зоне вы должны прописать следующие A-записи: Остальные доменные имена будут добавляться по мере добавления служб.
Кликайте на зону, далее "Add new record", выбираете A-тип, вводите имя зоны и IP адрес роутера, за которым стоит NAS.  Во-вторых, требуется получить доступ к API. В ClouDNS он платный, так что предварительно надо его оплатить. В других сервисах он бесплатный. Если знаете, что лучше, и это поддерживается Lexicon, напишите пожалуйста в комментариях. Получив доступ к API, туда надо добавить нового пользователя API.  В поле "IP address" надо вписать IP роутера: это адрес, с которого будет доступен API. После того, как пользователь будет добавлен, вы сможете использовать API, авторизовавшись по auth-id и auth-password. Их надо будет передавать в Lexicon, как параметры.  На этом настройка ClouDNS закончена. Если вы установили плагин openmediavault-docker-gui, пакет docker-ce уже должен был подтянуться по зависимостям. Дополнительно, установите пакет docker-compose, поскольку в дальнейшем он будет использован для управления контейнерами: Также создайте файловую систему под конфигурацию сервисов: Все настройки, образы и контейнеры докера хранятся в /var/lib/docker. Он туда интенсивно пишет (надо помнить, что это SSD), но главное, создаёт снэпшоты, клоны и файловые системы с именами в виде хэшей. Т.о., через некоторое время там скопится достаточно много мусора и будет не особенно удобно
с ним разбираться. Пример на скриншоте.  Чтобы этого избежать, надо локализовать каталог с данными на отдельной файловой системе.
Изменить расположение базового пути докера не сложно, это возможно сделать даже через GUI плагина, но тогда возникнет проблема: пулы перестанут монтироваться при загрузке, т.к. докер создаст свои каталоги в точке монтирования, и она будет не пуста. Решается эта проблема заменой каталога докера в /var/lib на символическую ссылку: В результате: Теперь надо создать межконтейнерную сеть: На этом первичная настройка Docker закончена и возможно приступать к созданию контейнеров. После того как Docker настроен, возможно приступить к реализации диспетчера. Найти все конфигурационные файлы вы можете здесь, либо под спойлерами. Для него используются два образа: nginx-proxy и letsencrypt-dns. Напомню, что порты интерфейса OMV требуется изменить на 10080 и 10443, потому что диспетчер будет работать на портах 80 и 443. В данном конфиге настраиваются два контейнера: Для создания и запуска контейнера с nginx-reverse-proxy используется образ jwilder/nginx-proxy. docker0 — межконтейнерная сеть, которая была создана ранее, ей не управляет docker-compose.
nginx-proxy — сервис обратного прокси, собственной персоной. Он смотрит в сеть docker0. При этом, порты 80 и 443 в секции ports пробрасываются на аналогичные порты хоста (значит, на хосте будут открыты такие же порты, а данные с них будут перенаправляться на порты в сети docker0, которые слушает прокси).
Параметр restart: always означает, что нужно запускать этот сервис при перезагрузке. Тома: Контейнер letsencrypt-dns создаётся из образа adferrand/letsencrypt-dns. Он включает упомянутый выше ACME клиент и Lexicon, для общения с провайдером DNS зоны. Общий каталог certs/letsencrypt отображается в /etc/letsencrypt внутри контейнера. Чтобы это заработало, требуется настроить ещё несколько переменных окружения внутри контейнера: После этой настройки будут два независимо работающих контейнера: прокси и агент для получения сертификата.
При этом, прокси будет искать сертификат в каталогах, указанных в конфиге, но не в структуре каталогов, которую создаст агент Let's encrypt: Для того, чтобы прокси начал видеть полученные сертификаты, требуется немного исправить шаблон. Видно, что по умолчанию nginx будет искать сертификаты типа /etc/nginx/certs/%s.crt и /etc/nginx/certs/%s.pem, где %s — имя сертификата (по умолчанию — имя хоста, но его возможно изменять через переменные). Агент же хранит сертификаты в структуре каталогов /etc/nginx/certs/letsencrypt/live/%s/{fullchain.pem, privkey.pem}, и потому в нескольких местах шаблона дополнены условия для таких имён сертификатов: Теперь остаётся указать агенту, для какого домена выдавать сертификат в файле domains.conf. И ещё один маленький нюанс. Для того, чтобы в будущем вы могли загружать файлы приемлемого размера в облако, и их не резал прокси, установите для него параметр client_max_body_size хотя бы гигабайт в 20, как это показано ниже. Настройка закончена, пора запустить контейнер: Проверьте работоспособность (всё скачалось и запустилось), нажмите Ctrl+C и запустите контейнер в отвязанном от консоли режиме: Тестовый сервер — это минимальный nginx, который должен выводить страницу приветствия. Нужно, чтобы он мог легко запускаться и останавливаться, а его контейнер быстро пересоздавался.
Он будет первым и пока единственным сервисом, который будет работать в составе NAS. Файлы конфигурации находятся здесь. Вот его docker-compose файл: Каждому контейнеру со службой нужно указать следующие параметры: Контейнер настроен, теперь нужно его поднять. Выполнив docker-compose up, зайдите по адресу test.NAS.cloudns.cc. На консоль должно быть выведено примерно следующее: А браузер покажет следующую страницу:  Если, в итоге, у вас появилась страница, как на скриншоте выше, могу вас поздравить: всё настроено и работает правильно. Теперь этот контейнер больше не нужен, остановите по Ctrl+C, выполнив затем docker-compose down. После настройки прокси, неплохо бы поднять контейнер с nginx-default с сервером, проксирующим запросы для хоста nas, omv и подобных через внешнюю сеть на порты 10080 и 10443 ОС хостовой машины. Файлы конфигурации находятся здесь. С конфигурацией docker-compose всё должно быть понятно, и останавливаться на её описании я не буду.
Единственное, что хочу заметить, это то, что один из доменов NAS.cloudns.cc. Это сделано для того, чтобы при обращении к NAS только по имени DNS зоны, запрос переводился на хост. LDAP-сервер — это центральный компонент системы управления пользователями.
Он также работает внутри Docker контейнера. В котором, помимо него, запущены интерфейсы для администрирования и смены паролей. Файлы конфигурации и LDIF-файлы находятся здесь. В конфиге описано три сервиса: LDAP-сервер требует настройки некоторых параметров, которые задаются через переменные окружения: По-идее, не мешает добавить ещё и пользователя "только для чтения", но потом. Тома: Сервер работает во внутренней сети ldap, но его порты 389 (незащищённый LDAP) и 636 (LDAP по SSL, пока не используемый) проброшены в сеть хоста. PhpLdapAdmin работает в двух сетях: он обращается к серверу LDAP в сети ldap и открывает порт 443 в сети docker0, для того, чтобы к нему мог обратиться nginx-reverse-proxy. Настройки: Блок переменных после этого предназначен для настройки SSL и сейчас не обязателен. SSP доступен по HTTP и тоже работает в двух сетях.
Тома, в этом контейнере не используются, и проброшенный сертификат остался от старых экспериментов. Переменные для настройки — это ограничения на длину пароля и учётные данные для доступа к серверу LDAP. Установите на хостовой машине утилиты для работы с LDAP и инициализируйте LDAP каталог: В gitlab_attr.ldif добавляется атрибут, по которому Gitlab (о нём потом) будет находить пользователей.
После этого вы можете выполнить следующую команду для проверки. На этом настройка LDAP сервера закончена. Управлять сервером вы можете через WEB-интерфейс. Если LDAP сервер настроен и работает, OMV настраивается на работу с ним очень просто: указываете хост, порт, данные для авторизации, корневой каталог для поиска пользователей и атрибут для определения того, что найденная запись — аккаунт пользователя. LDAP плагин вы уже должны были установить. Всё показано на скриншоте:  Сначала настройте ИБП по инструкции, которая идёт вместе с ним, и подключите его к NAS по USB.
Плагин для работы с ИБП вы должны были установить ранее.
Теперь остаётся только настроить NUT через GUI OMV.
Зайдите на страницу "Сервисы->ИБП", включите ИБП, в поле идентификатор введите любую строку, описывающую ИБП, например "eaton". В поле "Директивы конфигурации драйверов" введите следующее: Остальные параметры возможно посмотреть в документации. Вывод lsusb, строка с ИБП указана стрелкой: "Режим отключения" надо установить в "низкий заряд батареи".
Должно получиться примерно так, как показано на скриншоте:  Выключите ИБП и снова включите. Если были настроены уведомления, вам на почту придёт письмо о потере питания.
На этом настройка ИБП окончена. На этом основа системы установлена и настроена. Несмотря на то, что многое тут было сделано из консоли, делать так вовсе не обязательно, просто я считаю, что это удобнее.
Но одно из достоинств системы — её гибкость. Если хотите действовать по-другому, OMV позволит вам это. Доступно управление сетями из WEB-интерфейса, причём в некотором плане это более удобно, чем через консоль:  Для Docker тоже есть весьма понятный WEB-интерфейс:  Кроме того, OMV может рисовать красивые графики. График использования сети:  График использования памяти:  График использования CPU:  На этом всё.
С Богом!  Технарь-психопат