20 апреля в 16:47

Частное облако для видео и фотографий за полчаса «на коленке»

Многие пользуются функцией синхронизации с облаком от крупных компаний, таких как Apple или Google, кто-то предпочитает Yandex, mail.ru и тому подобное. Мне эти варианты не приглянулись, предпочитаю свои данные хранить самостоятельно. Потому, однажды, решил сделать себе простенькое «облако».


Задача: синхронизировать устройства и дать возможность получить отснятый материал через web-браузер, авторизировавшись по паролю. Пароль этот раздать родным и близким.

Зачем это все нужно? Дело в том, что развелось, без меры, всевозможных «уполномоченных» и лиц, считающих себя таковыми. Это может быть сотрудник полиции, не особенно желающий следовать не то, что духу, но и букве закона, всевозможные сотрудники ЧОПов «Рога и Копыта», которым знание законов, да и вообще мозг, заменяет указ начальства, безумные вахтеры с одноименным синдромом, казаки, разноплановые активисты — перечислять можно ну очень долго.


Вся эта почтенная публика очень не любит, когда их художества снимают на видео. Во время съемки можно услышать «здесь снимать запрещено», «я должностное лицо», «убери камеру, да я тебя!», а то и вовсе поучаствовать в игре «не дай разбить свой гаджет и не получи кулаком в лицо».

Замечал, что когда звучит фраза «ведется прямая трансляция», пыл вышеперечисленных персонажей несколько угасает, тянущиеся к раздражающему устройству ручки опадают, а «ты» резко меняется на «вы». Облагораживает, в общем, волшебная фраза.

Из материальных средств у меня был под рукой смартфон под управлением Android, домашний сервер под управлением Debian GNU/Linux, и пара ноутбуков. Было решено, что хранить все яйца в одной корзинке не стоит, потому приобрел еще одно устройство и разместил его там, где до него точно не дотянутся загребущие ручки разнообразных полномочных.

Подготовка


Домашний сервер был готов изначально, система там стоит на LUKS, поэтому никаких дополнительных действий, кроме установки Syncthing, не потребовалось.

На втором сервере система работает с карты памяти, потому подключаю LUN с хранилки и доустанавливаю пакеты для поддержки MPIO:

#apt-get install multipath-tools

Активируем автостарт:

#systemctl enable multipath-tools

Проверяем доступность:

#multipath -l
000003333300000044444444400000000 dm-1 XXXXXXXXX
size=500G features='1 queue_if_no_path' hwhandler='0' wp=rw
|-+- policy='service-time 0' prio=0 status=active
| |- 0:0:2:1 sdd 8:48  active undef running
| |- 0:0:3:1 sde 8:64  active undef running
| |- 2:0:0:1 sdf 8:80  active undef running
| `- 2:0:1:1 sdg 8:96  active undef running
`-+- policy='service-time 0' prio=0 status=enabled
  |- 0:0:0:1 sdb 8:16  active undef running
  |- 0:0:1:1 sdc 8:32  active undef running
  |- 2:0:2:1 sdh 8:112 active undef running
  `- 2:0:3:1 sdi 8:128 active undef running

Отлично. Ставим ПО для работы с LUKS, зашифруем устройство, создадим файловую систему и смонтируем:

#apt-get install cryptsetup
#cryptsetup create data0-crypt /dev/dm-1
#mkfs.ext4 /dev/mapper/data0-crypt
#mount /dev/mapper/data0-crypt /home/videoupl

В /etc/crypttab запишем:

data0-crypt /dev/dm-1   none    luks

В /etc/fstab:

/dev/mapper/data0-crypt /home/videoupl  ext4    auto,rw 0       0

Пояснение: я создал отдельного пользователя, из-под которого на данном сервере будет работать syncthing.

Доустановил nginx и утилиты апача для работы с htpasswd:

#apt-get install nginx apache2-utils

Настройке nginx и получению сетрификатов с letsencrypt посвящено не мало статей, поэтому просто покажу конфиг /etc/nginx/sites-available/default:

Скрытый текст
server {
	listen 80 default_server;
	listen [::]:80 default_server;
	listen 443 ssl default_server;
	listen [::]:443 ssl default_server;
	ssl_certificate /etc/letsencrypt/live/mysuperpupersite.xyz/fullchain.pem;
	ssl_certificate_key /etc/letsencrypt/live/mysuperpupersite.xyz/privkey.pem;
	ssl_trusted_certificate /etc/letsencrypt/live/mysuperpupersite.xyz/chain.pem;
	
	ssl_stapling on;
	ssl_stapling_verify on;
	resolver 8.8.8.8 8.8.4.4;
	add_header Strict-Transport-Security "max-age=31536000";
	add_header Content-Security-Policy "block-all-mixed-content";	
	
	root /var/www/html;
	index index.html index.htm
	server_name _;
	include acme;
	location / {
		try_files $uri $uri/ =404;
	location ^~ /video/ {
    auth_basic            "Log in or GTFO";
    auth_basic_user_file  passwd/video;
    autoindex on;
    autoindex_exact_size off;
    autoindex_localtime on;
}
	location ^~ /photo/ {
    auth_basic            "Log in or GTFO";
    auth_basic_user_file  passwd/ph;
    autoindex on;
    autoindex_exact_size off;
    autoindex_localtime on;
}
	}
}


Соответственно, файлы с паролями будут находиться в /etc/nginx/passwd. Создаем файлы, задаем учетки:

  #touch /etc/nginx/passwd/{video,photo}
  #htpasswd -b /etc/nginx/passwd/video myname mysuperpassword
  #htpasswd -b /etc/nginx/passwd/photo myanorhtername myanorthersuperpassword

Чтобы nginx мог читать пользовательские файлы, добавим его в группу:

#usermod -aG videoupl www-data

Создадим пользовательские каталоги, смонтируем и перечитаем конфиг nginx:

#su videoupl
$mkdir ~/{video,photo};exit
#mount -o bind /home/videoupl/video /var/www/html/video
#mount -o bind /home/photoupl/photo /var/www/html/photo
#service nginx reload

И добавим точки монтирования в /etc/fstab:

/home/videoupl/video /var/www/html/video ext4 auto,rw,bind 0   0
/home/videoupl/photo /var/www/html/photo ext4 auto,rw,bind 0   0

Установка Syncthing на компьютеры


Здесь все весьма тривиально. На серверах под управление Debian, я добавил репозитарии и установил приложение, воспользовавшись инструкцией с сайта.

# Add the release PGP keys:
curl -s https://syncthing.net/release-key.txt | sudo apt-key add -

# Add the "stable" channel to your APT sources:
echo "deb https://apt.syncthing.net/ syncthing stable" | sudo tee /etc/apt/sources.list.d/syncthing.list

# Update and install syncthing:
sudo apt-get update
sudo apt-get install syncthing

На Void Linux, под которым работают ноутбуки, просто установил из репозитария:

xbps-install syncthing

Для автозапуска приложения, дописал в /etc/rc.local:

nohup su videoupl -c syncthing >/home/videoupl/sync.log &

Мобильное приложение


Здесь тоже все просто. Тем или иным путем, нам нужно установить Syncthing на свой смартфон. Я это сделал через F-Droid:



Папки лучше расшарить через web-интерфейс, явно указав пути:



Связываем устройства


Действия предельно простые. Заходим браузером по адресу http://localhost:8384/

Для доступа к безголовым машинам, можно пробросить порт. Я это делаю средствами ssh:

ssh -L 127.1:38384:127.1:8384 server1

В итоге, на время активности ssh-сессии, веб-интерфейс сервера будет доступен по ссылке http://localhost:38384/

Далее, меню «Действия» → «Показать ID», после чего сканируем QR-код из Syncthing на смартфоне.

Можно добавить, на одном из компьютеров все остальные, напрямую введя ID и указать это устройство в качестве «рекомендателя», после чего добавить его на смартфоне. Все остальные устройства подтянутся автоматом.

В настройках доступа расшаренной папки можно указать, какие из устройств будут иметь доступ. Вдруг нужно будет какое-то исключить из списка.



Также крайне рекомендую активировать хотя бы простую версионность, на случай, если файл будет удален с одного из устройств, скажем, под чутким руководством сотрудника полиции.



Итог


Вот так, из подручных материалов, собрали, по сути, отказоустойчивое «облако» для хранения и отдачи отснятого материала. При желании, можно добавить еще пару узлов, например компьютер на работе, или Raspberry Pi с шифрованным USB-HDD в гараже, главное, чтоб был доступ к Сети.







Если есть какие-либо дополнения и замечания, буду рад прочесть их в комментариях.

PS: на смартфоне в Syncthing крайне рекомендую выставить опцию «запускать с высоким приоритетом», чтобы система не прибила.
@mtex
карма
12,0
рейтинг 0,0

Комментарии (24)

  • 0
    Спасибо, пригодится
  • 0
    Клиент под Android очень капризный: в зависимости от ОС и наличия root может работать, но чаще всё же не работает с SD. Использую данную схему примерно год, пока прогресса нет.

    На ПК всё работает отлично.
    • 0
      Есть такое дело. Потому рекомендую настраивать не через гуй клиента, а через веб-морду, она прекрасно работает с SD. Клиент же в упор не желал видеть на моем рутованном апарате пути отличные от зашитых.
      • 0
        Через веб-морду тоже капризничает :( Причем уже очень долго, версия Андроид на телефоне сменилась с 5 на 6, версий самого клиента тоже уже куча прошла, а ничего не меняется.
  • +1
    Если решите воспользоваться VPS-ом для хранения данных и хотите, чтобы данные были зашифрованы рекомендую посмотреть на проект Mandos https://wiki.recompile.se/wiki/Mandos
    • 0
      Я обычно беру KVM, а туда уже ставлю Debian на LUKS. Но спасибо, что-то новое попробовать всегда интересно.
      • +2
        Хотя в случае VPS-ки смысла шифровать данные нету, т.к. ключ легко достается из памяти. Mandos имеет смысл ставить на dedicated-сервера
  • +2
    А почему бы не использовать owncloud, etc?
    • +1
      Syncthing — P2P, надежнее.
    • 0
      Согласен, тем более, что могильные клиенты и owncloud, и nextcloud из коробки умеют автоматически загружать фото/видео. А nextcloud, если не изменяет память, позволяет использовать федерацию в бесплатной версии, в отличии от owncloud'а.
    • 0
      Децентрализованность, отсутствие проблем с прохождением NAT.
    • НЛО прилетело и опубликовало эту надпись здесь
      • 0
        В моем случае прокинуть порты не проблема, как и получить белый айпишник.

        А вот для кого-то это может представлять определенные трудности. Допустим, не имеет человек доступа к серверному оборудованию, а из техники — смартфон и компьютеры дома и на работе.
        • НЛО прилетело и опубликовало эту надпись здесь
          • 0
            Мешает то, что, с высокой вероятностью, комп будет находиться за провайдерским или с рабочим NAT'ом. Если на работе еще можно порты пробросить, то с провайдером — хз. Некоторые, конечно, предлагают рублей за 200-300 белый IP.

            >При этом сложностей будет намного меньше, нежели с настройкой, что вы тут привели.

            Настройка здесь касается в подготовке шифрованного хранилища на сервере и настройки nginx'a для отдачи отснятого. В самом простом варианте достаточно просто установить Syncthing на всех устройствах и связать их.
  • +1

    ИМХО тут с путями что-то не так.


      #touch /etc/nginx/passwd/{video,photo}
      #htpasswd -b /etc/passwd/video myname mysuperpassword
      #htpasswd -b /etc/passwd/photo myanorhtername myanorthersuperpassword
    • 0
      Есть такое дело, пропустил nginx.
  • 0
    Гхм, тест с выдергиванием батарейки в процессе видеозаписи оно проходит?
    • 0
      Зависит от качества соединения. Если еспевает записанную на карту памяти часть файла записать, то проходит. При плохом качестве соединения, передать успевает гораздо меньшую часть.
  • 0
    Для NMDC, HTTP, FTP протоколов можно моим сайтом и плеером воспользоваться https://4pda.ru/forum/index.php?showtopic=580001. Самый крутой в интернетике.
    Жаль нет времени на разработку. Но периодически работаю над рефакторингом и оптимизацией и буду публиковать новые версии обязательно.
  • 0

    Синх вещчъ отличная, но андроидный клиент представляет собой жуткую костыльную оболочку над обычным исполняемым синхфингом. Связано все такими соплями, что у меня андроид начинал глючить до полного ступора — приходилось батарейку дергать.
    Перепрыгнул на ресилио синс — отличное быстрое незаметное приложение под андроид, но функционально обрезан.
    Жду нормальный апк для синхфинга

    • 0
      Я раньше пользовался btsync, но программа эта проприетарная, посему отдал предпочтение открытой syncthing.
      • 0
        Resilio sync новое имя для btsync, моркетинг
  • 0
    А я устал от чрезмерной нагрузкой syncthing на диск и проц и вернулся на btsync, который сча resilio sync, причем в котором убрали ограничение на 10 папок.

Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.