Задача: синхронизировать устройства и дать возможность получить отснятый материал через 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)
14th
20.04.2017 17:57Клиент под Android очень капризный: в зависимости от ОС и наличия root может работать, но чаще всё же не работает с SD. Использую данную схему примерно год, пока прогресса нет.
На ПК всё работает отлично.mtex
20.04.2017 17:58Есть такое дело. Потому рекомендую настраивать не через гуй клиента, а через веб-морду, она прекрасно работает с SD. Клиент же в упор не желал видеть на моем рутованном апарате пути отличные от зашитых.
isden
21.04.2017 08:57Через веб-морду тоже капризничает :( Причем уже очень долго, версия Андроид на телефоне сменилась с 5 на 6, версий самого клиента тоже уже куча прошла, а ничего не меняется.
KonstantinSpb
20.04.2017 19:31+1Если решите воспользоваться VPS-ом для хранения данных и хотите, чтобы данные были зашифрованы рекомендую посмотреть на проект Mandos https://wiki.recompile.se/wiki/Mandos
mtex
20.04.2017 21:18Я обычно беру KVM, а туда уже ставлю Debian на LUKS. Но спасибо, что-то новое попробовать всегда интересно.
KonstantinSpb
21.04.2017 00:04+2Хотя в случае VPS-ки смысла шифровать данные нету, т.к. ключ легко достается из памяти. Mandos имеет смысл ставить на dedicated-сервера
keydon2
21.04.2017 02:59+2А почему бы не использовать owncloud, etc?
Bobromir
21.04.2017 09:49Согласен, тем более, что могильные клиенты и owncloud, и nextcloud из коробки умеют автоматически загружать фото/видео. А nextcloud, если не изменяет память, позволяет использовать федерацию в бесплатной версии, в отличии от owncloud'а.
rockin
21.04.2017 14:26С тем же вопросом в каменты спустился
Сам уже минимум года-два три использую owncloud, минусов нет вообще.
Внизу написано про NAT — так ведь прикол в том, что NAT на вашем оборудовании находится. Там же, за ним и owncloud развёрнут. В чём проблемы-то? Или порты прокинуть стоит титанических усилий?
Что насчёт поддержки мобильных яблочек? Сам не пользуюсь, но у owncloud имеется и адекватно работает.mtex
21.04.2017 15:31В моем случае прокинуть порты не проблема, как и получить белый айпишник.
А вот для кого-то это может представлять определенные трудности. Допустим, не имеет человек доступа к серверному оборудованию, а из техники — смартфон и компьютеры дома и на работе.rockin
21.04.2017 19:11Я что-то не понял насчёт трудностей. Если у человека есть комп дома и на работе, что куда-то (на любой из них) мешает воткнуть owncloud?
При этом сложностей будет намного меньше, нежели с настройкой, что вы тут привели. Там всё вылизано уже до неприличия.mtex
22.04.2017 16:19Мешает то, что, с высокой вероятностью, комп будет находиться за провайдерским или с рабочим NAT'ом. Если на работе еще можно порты пробросить, то с провайдером — хз. Некоторые, конечно, предлагают рублей за 200-300 белый IP.
>При этом сложностей будет намного меньше, нежели с настройкой, что вы тут привели.
Настройка здесь касается в подготовке шифрованного хранилища на сервере и настройки nginx'a для отдачи отснятого. В самом простом варианте достаточно просто установить Syncthing на всех устройствах и связать их.
Master255
21.04.2017 15:56Для NMDC, HTTP, FTP протоколов можно моим сайтом и плеером воспользоваться https://4pda.ru/forum/index.php?showtopic=580001. Самый крутой в интернетике.
Жаль нет времени на разработку. Но периодически работаю над рефакторингом и оптимизацией и буду публиковать новые версии обязательно.
pfg21
22.04.2017 16:08Синх вещчъ отличная, но андроидный клиент представляет собой жуткую костыльную оболочку над обычным исполняемым синхфингом. Связано все такими соплями, что у меня андроид начинал глючить до полного ступора — приходилось батарейку дергать.
Перепрыгнул на ресилио синс — отличное быстрое незаметное приложение под андроид, но функционально обрезан.
Жду нормальный апк для синхфинга
malinichev
Спасибо, пригодится