Заметки Debian / Ubuntu


07.10.2020

Установка OMV / Nextcloud / DuckDNS на raspberry pi 3

Доброго времени суток друзья! В этой статье мы вместе развернём своё облако. 

Что для этого нужно:

  • Установить Debian server на Raspberry Pi 3 Model B

  • Установить OpenMediaVault 5 на Debian

  • Установить контейнеры duckdns, mariadb, letsencrypt, nextcloud на OpenMediaVault.

 

Так уж получилось что у меня лежал не задействованный “малинка” он же “Raspberry Pi 3 Model B” а также два жёстких диска 3,5 дюймов - один 500GB и другой 750GB. И чтобы сделать из этого что-то полезное нужно было докупить на алиэкспресс какую-нибудь приблуду, которая позволит подключить эти диски к малинке. Этой приблудой оказалась док-станция ORICO. Название и ссылку привожу ниже:

Док-станция ORICO Dual 3,5 ''USB3.0 HDD 6 Гбит/с SATA USB 3 

https://aliexpress.ru/item/33045401597.html?spm=a2g0s.9042311.0.0.745933edkOcQ9X


 

Это что касаемо аппаратной части. Теперь по поводу ПО. Мы будем использовать связку:

OpenMediaVault как основную систему + Докер-контейнер “Duckdns” + Докер-контейнер “Nextcloud”.

 

Установка OpenMediaVault 5 на Raspberry Pi 3

Для начала нужно взять MicroSD карту и записать на неё систему “Raspberry Pi OS Lite”. В моём варианте на операционной системе Ubuntu я просто запускаю приложение “Raspberry Pi Imager”

и выбираю из списка эту систему. Приложение само скачает нужный образ и запишет на карту.

В варианте с Windows вы можете самостоятельно скачать образ с ресурса “https://www.raspberrypi.org/downloads/raspberry-pi-os/” и записать на карту с помощью приложения “etcher” - скачать можно тут -  “https://www.balena.io/etcher/”. 

 

 

После записи образа на карту MicroSD размером в 32GB имеем следующую картину:

 

Был сделан раздел “boot” размером 268 мегабайт, раздел “rootfs” размером 1,6 гигабайт и целых 30 GB свободного места. Я полагаю при первом запуске это свободное место превратиться в полезное.

Теперь нужно зайти в раздел “boot” и создать там файл “ssh” просто и без расширения. В ubuntu я нажимаю на свободном месте в каталоге правой кнопкой и выбираю открыть в терминале - затем даю команду “nano ssh” оставляю всё пустое - сохраняю и выхожу. Я надеюсь вам не надо напоминать что сохранение в редакторе nano это “Ctrl+O” и выход “Ctrl+X”. Если же у вас WIndows то просто создайте текстовый файл а затем удалите расширение .txt - это всё мы делаем для успешного соединения с нашей малинкой по ssh протоколу.

Далее мы вставляем флешку в малинку - включаем её - и самое время узнать какой же IP адрес она получила от роутера. Ну то есть вы же понимаете что не нужно к малине подсоединить клавиатуру и монитор. Мы всё будем настраивать удалённо.

И так я зашёл в свой роутер и увидел в списке DHCP клиентов что малина получила адрес 192.168.5.108 - Отлично! Именно этот адрес мы будем использовать для соединения по SSH. Так как я в Ubuntu - мне достаточно нажать “Ctrl+Alt+T” и у меня откроется терминал в котором я просто наберу команду “ssh pi@192.168.5.108”, скрин ниже:

 

Ну а если вы на Windows то используем “putty” -  скачать можно тут (https://www.putty.org/)

Сразу меняем пароль у пользователя “pi” с помощью команды “passwd”. Иначе любой сможет подключиться по стандартному паролю.

Далее производим апгрейд системы командами:

sudo apt update

sudo apt upgrade -y

sudo reboot

 

После перезагрузки проверяем состояние накопителей командой “df -h”:

И видим что действительно то самое свободное место в 30гб перешло в root “/” раздел.

Далее давайте сменим имя хоста на более подходящее. Что-то на что мы посмотрим и сразу поймем что это малина с OpenMediaVault. Например “omvpi”. Для этого в терминале выполним следующие команды:

# меняем в файле “hostname”:

sudo nano /etc/hostname

# А также не забываем сменить в разделе 127.0.1.1. файла hosts:

sudo nano /etc/hosts

# перезагружаем малину:

sudo reboot

Отлично это мы просто установили Debian на архитектуре armv7l. Теперь будем ставить OpenMediaVault!

Добавим пользователя “pi” в группу “ssh”:

sudo adduser pi ssh

Хотя скрипт установки OMV сам это сделает но мы перестрахуемся.

Далее одной командой мы загрузим установщик OMV и запустим скрипт установки:

wget -O - https://github.com/OpenMediaVault-Plugin-Developers/installScript/raw/master/install | sudo bash

После этого скрипт сам отправит малинку в ребут:

Далее мы можем подключать в USB порт док-станцию с дисками. Пришло время зайти в WEB панель управления свежеустановленной OpenMediaVault.

Мы знаем какой IP адрес получает наша малинка, в моём случае 192.168.5.108 и поэтому просто набираем его в браузере:

По умолчанию в OpenMediaVault для авторизации в WEB панели используется логин “admin” и пароль “openmediavault”. Заходим и начинаем наводить порядок: 

Для начала сильно удивляемся что в системе уже установлены OMV-Extras:

Таким образом у нас уже возможность через WEB установить движок “Docker” и контейнер “Portainer”.

Но всё по порядку! Идем в раздел “General Settings” - меняем автологаут на 60 минут, порт web панели меняем на 90 так как порт 80 займёт контейнер “Nextcloud” - далее жмём “Save” и “Apply”:

 

На вкладке Web Administrator Password ОБЯЗАТЕЛЬНО меняем пароль на свой.

В разделе “Date & Time” Выбираем свой часовой пояс и жмём “Save” + “Apply”.

В разделе “Update Management” - Жмём “Check” - затем галочку на “Package information” чтобы выделить все пакеты - и жмём кнопку “+ Install”.

Далее мы переходим в раздел “Disks” - тут я сделаю “Wipe” обоим своим, подключенным по USB через док-станцию с алиэкспресс, HDD:

Кстати тут я столкнулся с одной проблемой - мой диск с 750GB не захотел вайпиться в “Quick” режиме, поэтому пришлось делать “Secure” а это очень долго. 

 

Теперь разметим файловую систему на обоих дисках. Идём в раздел “File Systems” - Жмём “+ Create”. В появившемся диалоге выбираем диск - назначаем лейбл - выбираем файловую систему (Ext4) и жмём “ОК”. Нужно будет дождаться окончания инициализации: 

 

 

После инициализации статус у дисков измениться на “Online”. Теперь жмём на каждом диске кнопку “Mount” и “Apply”:

И таким образом мы можем использовать эти диски как 2 устройства хранения. Но у меня была затея объединить их в зеркальный рейд. Для этого нужно снова в разделе “Disks” сделать wipe и далее в разделе “RAID Management” Создать Mirror рейд. Вот только OMV не делает RAID из дисков подключенных по USB! Поэтому второй диск 750 GB я буду использовать для бэкапа всех данных - что в итоге в принципе даже надежнее зеркального рейда. Для этих целей мы установим плагин “rsnapshot”. 

 

 

Но настраивать его мы будем чуть позже.

 

Но продолжим идти к главной цели. И так у нас есть теперь два подключенных хранилища. Использовать мы будем “hdd500” как основное и “hdd750” для бэкапа. Начнём с того создадим каталог.

В разделе “Shared Folders” жмём кнопку “+ Add” - в появившемся диалоге пишем название создаваемого каталога на диске “hdd500” а также даём нужные права в разделе “Permissions”.

Отлично каталог создан. Он пригодиться для обмена внутри локальной сети. Теперь давайте создадим каталог “appdata” таким же образом. Кстати будет удобно если будет отображаться столбец с абсолютным путём:

 

А также создадим директорию “volumes” для томов контейнеров. 

Прежде чем приступить к установке движка докер и контейнера с портейнером, нам нужен абсолютный путь до нашего хранилища. ведь мы же НЕ собираемся устанавливать контейнеры и тома (volumes) для них на раздел с Debian так как он у нас на Microsd карте - она медленная и там всего 32 гигабайта. Поэтому, перед установкой, путь установки докера по умолчанию “/var/lib/docker” мы заменим на “/srv/dev-disk-by-label-hdd500/appdata/docker”.

Далее устанавливаем докер через кнопку “Docker” - “+ Install”. И далее рядом через кнопку “Portainer” ставим портейнер. После чего перезагружаем малинку. Теперь у нас есть возможность устанавливать контейнеры и управлять ими через “Portainer”. Далее чтобы попасть в управление портейнером жмём кнопку “Open web” - придумываем пароль для админа портейнера - и далее жмём “Local” - и внизу кнопку “Connect” - после чего снова выбираем “Local”. Откроется панель управления контейнерами:

В которой мы видим что имеется один скаченный образ и один активный контейнер. этот единственный бегущий контейнер и есть сам портейнер. Кстати попасть в эту панель можно просто набрав адрес в барузере http://192.168.5.108:9000/#/dashboard так как этот контейнер работает на порту 9000.

Установка контейнера “DuckDNS”

Если у вас дома статический глобальный IP адрес от провайдера то установка самого контейнера “DuckDNS” вам не нужна. Нужно будет только получить на сайте https://www.duckdns.org/ само субдоменное имя используя свой IP адрес. В случае если у вас как у меня дома глобальный адрес меняется постоянно нужно чтобы субдоменное имя постоянно подстраивалось под новый IP адрес - вот как раз для этого мы и установим контейнер “DuckDNS”. Адрес в докерхабе следующий https://hub.docker.com/r/linuxserver/duckdns, сам контенер идентифицируется как “linuxserver/duckdns” - и очень хорошо что работает он не только на x86 платформе но и для arm. 

 

Итак приступаем!

Идём на сайт https://www.duckdns.org/ - ОБЯЗАТЕЛЬНО авторизируемся удобным способом. Я это делаю через учётную запись в github, вы можете через почту, это не принципиально. После авторизации у вас появляется возможность скопировать токен и добавить своё субдоменное имя:



Вписываем придуманное субдоменное имя “mycloud777” а также копируем токен.



Ресурс скажет нам что домен mycloud777.duckdns.org успешно добавлен.

Теперь идём на адрес портенера, в моём случае “http://192.168.5.108:9000/#/dashboard”, в вашем случае адрес другой но порт тоже 9000. Переходим в раздел “Stack” и жмём “+ Add stack””

 

Далее пишем название стэка “duckdns” и вставляем в раздел “Web editor” скрипт, который нужно взять на странице duckdns в докерхабе “https://hub.docker.com/r/linuxserver/duckdns” - там есть раздел “docker-compose” из которого мы и копируем скрипт:

 

Но разумеется скрипт нужно модифицировать под наши нужды:

 

---

version: "2.1"

services:

  duckdns:

    image: linuxserver/duckdns

    container_name: duckdns

    environment:

      - PUID=1000 #optional

      - PGID=1000 #optional

      - TZ=Europe/London

      - SUBDOMAINS=subdomain

      - TOKEN=token

      - LOG_FILE=false #optional

    volumes:

      - /path/to/appdata/config:/config #optional

    restart: unless-stopped

---

 

Что мы меняем первым делом - это PUID и PGID - это идентификация пользователя и его группы. Какой пользователь имеется в виду, ведь мы уже имели дело с пользователем “pi”, ещё имели с дело с пользователем “admin” с помощью которого заходим в WEB панель. Но всё таки это “pi”. для того чтобы узнать его PUID и PGID достаточно в терминале набрать “id pi” и в моём случае этот как раз 1000:

- PUID=1000 

- PGID=1000 

Далее временая зона - тут сами разберетесь: 

- TZ=Asia/Barnaul

Далее SUBDOMAINS - моём случае это “mycloud777” - то что мы вводили на сайте duckdns

- SUBDOMAINS=mycloud777

Далее токен:

 - TOKEN=cb637940-s823-7860-2231-lu6ccx4qwer1

Далее путь тома:

volumes:

     - /srv/dev-disk-by-label-hdd500/volumes:/config 

 

Ну и ещё добавим тег “arm32v7-latest” образу на всякий случай, вдруг он не поймёт сам на какой архитектуре разворачивается. 

 

Итого в итоге:

---

version: "2.1"

services:

 duckdns:

   image: linuxserver/duckdns:arm32v7-latest

   container_name: duckdns

   environment:

     - PUID=1000 #optional

     - PGID=1000 #optional

     - TZ=Asia/Barnaul

     - SUBDOMAINS=mycloud777

     - TOKEN=cb637940-s823-7860-2231-lu6ccx4qwer1

     - LOG_FILE=false #optional

   volumes:

     - /srv/dev-disk-by-label-hdd500/volumes/duckdns:/config #optional

   restart: unless-stopped

 

И если напротив строчек скрипта нет красных значков - можно нажать внизу на кнопку “Deploy the stack”:


 

Далее как видим в разделе “Containers” на стек “duckdns” успешно запущен и бежит:



 

 

Отлично эти мы добились что у нас есть постоянный буквенный адрес до сервера у нас дома - http://mycloud777.duckdns.org/. Но пока что никто не ответит браузеру на этот адрес потому что нужно в настройках вашего роутера, у которого выход в интернет, сделать перенаправление порта 80 c WAN сетки на 80 порт LAN сетки локального IP адреса машины с OpenMediaVault то есть на IP адрес 192.168.5.108 (в моём случае). Точно также с портом 443. 


 

А в нашем примере и этого мало потому что мы порт 80 оставили для контейнера “Nextcloud”. Так давайте устанавливать его!

Установка контейнера “Nextcloud” 

Для начала создаем скрипт для нового стека портейнера:

 

version: "2"

services:

  nextcloud:

    image: linuxserver/nextcloud

    container_name: nextcloud

    environment:

      - PUID=1000

      - PGID=1000

      - TZ=Asia/Barnaul

    volumes:

      - /srv/dev-disk-by-label-hdd500/volumes/nextcloud/config:/config

      - /srv/dev-disk-by-label-hdd500/volumes/nextcloud/data:/data

    depends_on:

      - mariadb

    restart: unless-stopped

  mariadb:

    image: yobasystems/alpine-mariadb:latest

    container_name: mariadb

    environment:

      - PUID=1000

      - PGID=1000

      - MYSQL_ROOT_PASSWORD=12345

      - TZ=Asia/Barnaul

    volumes:

      - /srv/dev-disk-by-label-hdd500/volumes/mariadb:/config

    restart: unless-stopped

  letsencrypt:

    image: linuxserver/letsencrypt

    container_name: letsencrypt

    cap_add:

      - NET_ADMIN

    environment:

      - PUID=1000

      - PGID=1000

      - TZ=Asia/Barnaul

      - URL=mycloud777.duckdns.org

      - SUBDOMAINS=wildcard

      - VALIDATION=duckdns

      - DUCKDNSTOKEN=97654867496t0877648659765854

    volumes:

      - /srv/dev-disk-by-label-hdd500/volumes/letsencrypt:/config

    ports:

      - 443:443

      - 80:80

    restart: unless-stopped

 

Вставляем скрипт в Web editor создания нового стека. Не забудьте написать имя стека.


 

 

И жмём “Deploy the stack” кнопку внизу. И ждём окончания процесса. После чего в разделе “Stacks” видим наши бегущие контейнеры:

 

Отлично! Но наш сервер пока не готов. Теперь нужно нырнуть в терминал на нашу малинку. Для удобства навигации установим пакет “mc”:

sudo apt install mc

Далее запустим mc:

sudo mc

и выходим в каталог где лежит том контейнера “letsencrypt”. Из скрипта для стека мы помним что прописывали путь ему вот такой - “/srv/dev-disk-by-label-hdd500/volumes/letsencrypt” - вот туда и идём:

 

Далее проходим в каталог “nginx/proxy-confs”, в котором нужно найти файл nextcloud.subdomain.conf.sample и сделать его дубль в файл nextcloud.subdomain.conf

 

И сделать это проще командой. Так что выходим из mc и набираем команды:

cd /srv/dev-disk-by-label-hdd500/volumes/letsencrypt/nginx/proxy-confs

sudo cp nextcloud.subdomain.conf.sample nextcloud.subdomain.conf

 

Далее нужно отредактировать этот файл:

sudo nano nextcloud.subdomain.conf

Нужно в строке proxy_max_temp_file_size  сделать значение на 0

 

как в скрине ниже:

 





 

После чего перезапускаем контейнер “letsencrypt”:

 

Теперь мы можем зайти на https://nextcloud.mycloud777.duckdns.org/ и настроить доступ до Nextcloud:

 

Всё работает! Мой сетап в итоге выглядит вот так:

Корпус малины стилизован под приставку NES, я его оставил так как удобно сделаны кнопки включения и ресет. 

После работы около месяца такой системы начал замечать некоторые особенности - в один прекрасный день я попытался сразу залить около 40 гигабайт - мой домашний роутер завис. То есть имейте ввиду что тут нужен надежный коммутатор. Ну и в целом, одноплатный компьютер всё-таки для таких задач пригоден - только если кто-то один использует это облако для документов или музыки. Файлы большого объёма передаются с трудом. Во первых спотыкаемся об мощность точки доступа - во вторых спотыкаемся об мощность процессора малинки. Хотя скорей всего если не применять SSL - нагрузка на роутер и на процессор малинки будет меньше. А вообще отличный способ пристроить к делу малинку и пару без дела валяющихся HDD. Всем спасибо. До новых встреч.


Навигация: