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

mtex 20 апреля в 16:47 14,4k
Многие пользуются функцией синхронизации с облаком от крупных компаний, таких как 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 крайне рекомендую выставить опцию «запускать с высоким приоритетом», чтобы система не прибила.
Проголосовать:
+25
Сохранить: