Многие пользуются функцией синхронизации с облаком от крупных компаний, таких как 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 крайне рекомендую выставить опцию «запускать с высоким приоритетом», чтобы система не прибила.
Поделиться с друзьями
-->

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


  1. malinichev
    20.04.2017 16:55

    Спасибо, пригодится


  1. 14th
    20.04.2017 17:57

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

    На ПК всё работает отлично.


    1. mtex
      20.04.2017 17:58

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


      1. isden
        21.04.2017 08:57

        Через веб-морду тоже капризничает :( Причем уже очень долго, версия Андроид на телефоне сменилась с 5 на 6, версий самого клиента тоже уже куча прошла, а ничего не меняется.


  1. KonstantinSpb
    20.04.2017 19:31
    +1

    Если решите воспользоваться VPS-ом для хранения данных и хотите, чтобы данные были зашифрованы рекомендую посмотреть на проект Mandos https://wiki.recompile.se/wiki/Mandos


    1. mtex
      20.04.2017 21:18

      Я обычно беру KVM, а туда уже ставлю Debian на LUKS. Но спасибо, что-то новое попробовать всегда интересно.


      1. KonstantinSpb
        21.04.2017 00:04
        +2

        Хотя в случае VPS-ки смысла шифровать данные нету, т.к. ключ легко достается из памяти. Mandos имеет смысл ставить на dedicated-сервера


  1. keydon2
    21.04.2017 02:59
    +2

    А почему бы не использовать owncloud, etc?


    1. isden
      21.04.2017 08:58
      +1

      Syncthing — P2P, надежнее.


    1. Bobromir
      21.04.2017 09:49

      Согласен, тем более, что могильные клиенты и owncloud, и nextcloud из коробки умеют автоматически загружать фото/видео. А nextcloud, если не изменяет память, позволяет использовать федерацию в бесплатной версии, в отличии от owncloud'а.


    1. mtex
      21.04.2017 09:52

      Децентрализованность, отсутствие проблем с прохождением NAT.


    1. rockin
      21.04.2017 14:26

      С тем же вопросом в каменты спустился
      Сам уже минимум года-два три использую owncloud, минусов нет вообще.

      Внизу написано про NAT — так ведь прикол в том, что NAT на вашем оборудовании находится. Там же, за ним и owncloud развёрнут. В чём проблемы-то? Или порты прокинуть стоит титанических усилий?

      Что насчёт поддержки мобильных яблочек? Сам не пользуюсь, но у owncloud имеется и адекватно работает.


      1. mtex
        21.04.2017 15:31

        В моем случае прокинуть порты не проблема, как и получить белый айпишник.

        А вот для кого-то это может представлять определенные трудности. Допустим, не имеет человек доступа к серверному оборудованию, а из техники — смартфон и компьютеры дома и на работе.


        1. rockin
          21.04.2017 19:11

          Я что-то не понял насчёт трудностей. Если у человека есть комп дома и на работе, что куда-то (на любой из них) мешает воткнуть owncloud?
          При этом сложностей будет намного меньше, нежели с настройкой, что вы тут привели. Там всё вылизано уже до неприличия.


          1. mtex
            22.04.2017 16:19

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

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

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


  1. MustDie95
    21.04.2017 09:47
    +1

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


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


    1. mtex
      21.04.2017 09:48

      Есть такое дело, пропустил nginx.


  1. mickvav
    21.04.2017 13:18

    Гхм, тест с выдергиванием батарейки в процессе видеозаписи оно проходит?


    1. mtex
      21.04.2017 18:09

      Зависит от качества соединения. Если еспевает записанную на карту памяти часть файла записать, то проходит. При плохом качестве соединения, передать успевает гораздо меньшую часть.


  1. Master255
    21.04.2017 15:56

    Для NMDC, HTTP, FTP протоколов можно моим сайтом и плеером воспользоваться https://4pda.ru/forum/index.php?showtopic=580001. Самый крутой в интернетике.
    Жаль нет времени на разработку. Но периодически работаю над рефакторингом и оптимизацией и буду публиковать новые версии обязательно.


  1. pfg21
    22.04.2017 16:08

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


    1. mtex
      22.04.2017 16:09

      Я раньше пользовался btsync, но программа эта проприетарная, посему отдал предпочтение открытой syncthing.


      1. pfg21
        24.04.2017 10:58

        Resilio sync новое имя для btsync, моркетинг