[Из песочницы] Вечный фотоархив для дома
Не понимаю желания ностальгировать на старые фотографии. Но девчонок не переделаешь, поэтому пришлось подумать про хранилище для всех, чтобы больше не приставали показать с компа карапузов и котиков. В публичное облако выкладывать все фотки подряд не хочется.
Теория
Ресурс работы 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.
Возможные проблемы в процессе
- USB диск только для чтения — проверьте маску в записи диска в файле fstab, должны быть все нули.
- apt-get install пишет ошибки — обновите систему из командной строки (примерно 1.5. часа) и не забудьте перед командой писать sudo
- утомляют древние тестовые радакторы — подключитесь ssh -X user@малинка, затем вызовите sudo gedit путь_к_файлу.
- Веб интерфейс не всегда удобен — https://winscp.net
Если доступ к архиву нужен только из дома, то на этом всё.
Если хочется пользоваться архивом везде, то читайте дальше — будет немного BDSM.
В Cloud commander нет возможности включить доступ по HTTPS по этому начинаем готовить костыли.
Первым делом создаём самодельный сертификат и ставим веб сервер Nginx.
Сертификаты это хитросделанные текстовые файлики которые нужны чтобы зашифровать трафик между вами и устройством.
Как сделать самому такой файлик чтобы не платить ежегодно разным Thawte и прочим VeriSign пошагово написано тут.
С самодельным сертификатом броузер будет ругаться и краснеть, но соединение зашифрует.
Всё необходимое для создания самодельного сертификата в 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 использованием сертификатов, но пока не понял зачем.