Вечный фотоархив для дома

в 9:48, , рубрики: Cloud Commander, nginx, nginx сертификаты, node.js, raspberry pi3, Настройка Linux

Не понимаю желания ностальгировать на старые фотографии. Но девчонок не переделаешь, поэтому пришлось подумать про хранилище для всех, чтобы больше не приставали показать с компа карапузов и котиков. В публичное облако выкладывать все фотки подряд не хочется.

image

Теория

Ресурс работы SSD накопителя теоретически не ограничен, если не превышать количество циклов перезаписи в ячейку.

Задача

Сделать систему хранения и просмотра домашнего фотоархива с любого устройства в доме,
и убрать подальше на ближайшие 10 или 20 лет. При этом иметь возможность залить и посмотреть фотки с любого устройства подключенного к internet не использую публичные сервисы хранения и не устанавливая дополнительного клиентского ПО.

Выбор железок дело субъективное, но для себя сформулировал требование к малому формфактору. Кроме того все что скрыто от глаз в квартире, как правило лежит в пожароопасном месте, по этому хотелось питание в по USB, и минимум проводов.

В итоге закупил в известном китайском магазине набор Raspberry Pi 3b(малинка) — 2000р, алюминиевую коробочку usb-sata 2.5" — 500р, в обычном магазине SSD 240G 4100р. SD карточка на 64gb и тюбик древней КПТ-8 нашлись в ящике стола.

Неведомо почему, но у нас диск SSD убранный в коробочку usb-sata стоит на 80% дороже чем по отдельности.

Сборка миникомпьютера Raspberry Pi

Увлекательный конструктор, требует внимания и немного места на столе. Обязательный инструмент только крестовая отвёртка. Скачал Ubuntu MATE и Win32 Disk Imager с сайта Raspberry, записал на SD карточку образ системы. Ничего увлекательного, только кнопку Ок нажимать. Немного доработал радиаторы которые шли в комплекте с малинкой. Срезал скальпелем часть двустороннего скотча и намазал КПТ-8, затем аккуратно снял пинцетом защитную бумагу с оставшегося двухстороннего скотча и приклеил на свои места.

Подключил к телевизору, стал ставить систему и смотреть какой ток потребляет Raspberry Pi.
Потребление тока Raspberry Pi 3b не больше 0.8A.

Потребление коробочки usb-sata c SSD диском внутри в покое 0.1А в работе не больше 0.36А
После установки Ubuntu MATE, попробовал запустить на Raspberry видео. Быстро понял что жизнь не удалась. И вообще система в сборе была похожа на уличную кошку, к хвосту которой какие-то хулиганы привязали консервную банку.

Открыл на малинке SSH и отнёс всю конструкцию на антресоль.

sudo apt install openssh-server
sudo systemctl enable sshd

sudo ufw allow 22

ssh -X пользователь@ip_адрес_ Raspberry_Pi

Порт SSH открыть сразу не получилось. Управление фаерволом через программу gui не сработало, по этому использовал UFW.

Подключил всю систему к роутеру MTS RV6699. Питание по USB, данные по проводной сети. До этого мерил ток который RV6699 отдаёт на USB порт. USB на RV6699 спокойно отдаёт 1.5A и вся система завелась без проблем. Но на всякий случай выключил на малинке интерфейс Wifi.

ifconfig wlan0 down

Подключил usb диск. Устройство система увидела, но не смонтировала файловые системы. Исходя из желания даже в неясном будущем не привлекаться к процессу просмотра семейных фоток, диск заранее отформатировал в NTFS.

создал нового пользователя с именем user

adduser user

сделал папку Photo для подключения диска в домашней папке нового пользователя /home/user/

mkdir Photo

Посмотрел UUID раздела на usb диске.

sudo blkid

Смонтировал раздел в папку /home/user/Photo/, дописав в конец файла /etc/fstab строчку

UUID="7C26EDB626ED7216" /home/user/Photo/ ntfs rw,nls=utf8,gid=plugdev,umask=0000 0 0

На маршрутизаторе от МГТС RV6699 зафиксировал ip адрес малинки.

Настройка > LAN > Основные параметры 

Перезагрузил систему, проверил что всё запускается как надо.

Выбор интерфейса для загрузки и просмотра файлов в архиве

Ясно что доступ должен быть через броузер, без дополнительных надстроек и плагинов. Желательно быстрый и модный. Модный, чтобы кубики на которых собран интерфейс дольше не протухали. Ещё очень хотелось возможность просматривать и редактировать файлы прямо в броузере.

В итоге выбрал Cloud Commander. Быстрый, можно смотреть фотки в броузере, написан на node.js.

Установка

Просто Node.js поставить мало, у неё есть свой инсталятор для программ, который нужно поставить дополнительно.
Сначала ставим Node.js

sudo apt-get install nodejs

и установщик программ для неё

sudo apt-get install npm

Затем запускаем установку самого Cloud commander c помощью инсталятора npm. Установка тоже просит root прав.

sudo npm i cloudcmd -g

Запускаем Cloud commander

cloudcmd

Фиг там, не работает. Гуглим где проблема. В итоге:

sudo ln -s /usr/bin/nodejs /usr/bin/node

и снова..

$ cloudcmd
url: http://localhost:8000/

Ура работает!

Правим конфиг Cloud commander в папке /usr/local/lib/node_modules/cloudcmd/json/config.json
меняем параметр root, для того чтобы сразу открывался USB диск приделанный к папке /home/user/Photo/

"root": "/home/user/Photo/" 

Осталось открыть порт для доступа и настроить автозапуск.

Открываем порт для доступа.

sudo ufw allow 8000

Настраиваем автозапуск.

Создаём текстовый файл cloudcmdstart в /usr/sbin/local, чтобы использовать его для запуска Cloud commander.

  > cloudcmdstart

mcedit cloudcmdstart

Пишем текст в cloudcmdstart

#!/bin/sh

sudo -u user cloudcmd --root /home/user/Photo 

Копируем в /usr/sbin

sudo cp cloudcmdstart /usr/sbin/

сообщаем системе что файл cloudcmdstart можно запускать.

sudo chmod +x /usr/sbin/cloudcmdstart

После этого добавляем его в автозапуск при старте. Открываем файл /etc/rc.local

sudo mcedit /etc/rc.local

добавляем предпоследнюю строку.

/usr/sbin/cloudcmdwin

Сохраняем F2, выходим из редактора F10, перезагружаемся .

sudo reboot

Если всё ок, после перезгрузки открываем на телефоне подключенном к квартирному Wifi адрес.

http://ip_вашей_RaspberryPi:8000

Залил фоток с компа для проверки, скорость копирования файлов около 4мб (32мбит) в секунду, узкое место коробочка usb-sata.

Возможные проблемы в процессе

  1. USB диск только для чтения — проверьте маску в записи диска в файле fstab, должны быть все нули.
  2. apt-get install пишет ошибки — обновите систему из командной строки (примерно 1.5. часа) и не забудьте перед командой писать sudo
  3. утомляют древние тестовые радакторы — подключитесь ssh -X user@малинка, затем вызовите sudo gedit путь_к_файлу.
  4. Веб интерфейс не всегда удобен — https://winscp.net

Если доступ к архиву нужен только из дома, то на этом всё.

Если хочется пользоваться архивом везде, то читайте дальше — будет немного BDSM.

В Cloud commander нет возможности включить доступ по HTTPS по этому начинаем готовить костыли.

Первым делом создаём самодельный сертификат и ставим веб сервер Nginx.

Сертификаты это хитросделанные текстовые файлики которые нужны чтобы зашифровать трафик между вами и устройством.

Как сделать самому такой файлик чтобы не платить ежегодно разным Thawte и прочим VeriSign пошагово написано тут.

С самодельным сертификатом броузер будет ругаться и краснеть, но соединение зашифрует.

image

Всё необходимое для создания самодельного сертификата в Ubuntu MATE уже установлено.

sudo apt-get install nginx

Nginx устанавливается /etc/nginx, нам надо отредактировать его конфиг nginx.conf для включения запроса пароля при доступе к Cloud Commander.

sudo gedit /etc/nginx/nginx.conf 

В разделе http{ } добавляем строчки для включения проверки пароля и показываем путь к файлу с паролями htpasswd

http {
      .......................

        auth_basic           "closed site";
        auth_basic_user_file /home/user/htpasswd;

          }

Создадим файл с паролями для входа через Nginx

> htpasswd

Генерируем пароли с помощью формы на сайте http://seriyps.ru/crypt/htpasswd/ копируем в файл каждый аккаунт с новой строки.

Создаём файл с конфигурацией нашего нового сайта для защищенного доступа к Cloud commander и кладём его в папку /etc/nginx/sites-available

> cloudcmdsite.conf
gedit cloudcmdsite.conf
sudo cp  cloudcmdsite.conf /etc/nginx/sites-enabled

содержимое файла cloudcmdsite.conf

server {
    listen 443;
    client_max_body_size 712m;
    ssl                  on;
    ssl_certificate      /home/user/ssl/server.crt;
    ssl_certificate_key  /home/user/ssl/server.pem;
    server_name malinka.io;
    access_log /var/log/nginx/malinka.access.log;
    location / {

        proxy_pass    http://127.0.0.1:8000;

    }

}

В этом конфиге:
ssl_certificate /home/user/ssl/server.crt; -ваш публичный файлик сертификата
ssl_certificate_key /home/user/ssl/server.pem;- ваш секретный ключ от сертификата

проверяем что всё получилось.

sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Теперь надо настроить Cloud commander т.к. он из коробки работает от пользователя root.

 gedit /usr/local/lib/node_modules/cloudcmd/json/config.json

В файле меняем значение в строках:

"username": "user"
 "password": "шифр пароля пользователя user созданный в http://md5decrypt.net/en/Sha512/"
 "console": false

сохраняем.

открываем порт 443 на фаерволе.

sudo ufw allow 443

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

 sudo reboot

Пробрасываем порт на роутере RV6699

 > Настройка > NAT > Port Mapping

затем с телефона подключенного к Wifi заходим на https://ваш_внешний_ip: порт

Должен быть запрошен логин и пароль из файла htpasswd.

По итогу за небольшие деньги получил то хранилище для фоток которое не отсвечивает, не занимает места, и к которому можно прикрутить ещё миллион разных возможностей без особых извращений. Бонус к сводному времени дома на ближайшие 10 лет как хочется думать.
Убедился что такая система подходит исключительно для домашнего использования.

Почему это лучше чем готовый NAS?

Это дешевле. У меня появилась уверенность что система будет работать без активного охлаждения, и не сдохнет от перегрева когда подойдёт время копеечного китайского вентилятора. Возможность не просто заливать файлы с телефона, а просматривать их сразу в броузере. Cоздавать тестовые файлы и редактировать их. По моим ощущения работает быстрее чем диск google, но это моё субъективное мнение.

Что ещё можно сделать?

Прикрутить авторизацию на Nginx c использованием сертификатов, но пока не понял зачем.

Автор: MaxStirlits

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js