[Из песочницы] Вечный фотоархив для дома

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


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 использованием сертификатов, но пока не понял зачем.

© Habrahabr.ru