Заметки 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. Всем спасибо. До новых встреч.