Про недооценённые утилиты - dufs

Зайчатки разума

Записная книжка айтишника

Про недооценённые утилиты - dufs

2024-01-21 23:31:04 — Evgeniy Shumilov

  Иногда бывает такое, что тебе для конкретной задачи не хватает определённого инструмента. Ты его ищешь, ищешь, ищешь, потом уже устаёшь и перестаёшь искать, а спустя несколько лет случайно натыкаешься на него и понимаешь - вот оно! Именно то, что нужно и именно в том виде, который и требовалось. И тогда радость от обретения куда больше, чем если бы ты нашёл его сразу.

  Из таких случаев мне навскидку вспомнилось несколько - MySecureShell и tinc, о которых я уже писал , lnav, о котором я возможно ещё напишу, mosh и вот, недавно - dufs.


  Итак, что же это такое? dufs - это утилита, которая предоставляет доступ к директории с файлами или к конкретному файлу средствами WebDAV, и http/https. Причём есть описанное API, с помощью которого можно легко и просто манипулировать файлами, есть простенький web интерфейс, возможность скачать содержимое директории как архив, создавать и редактировать текстовые файлы, есть также возможность ограничения доступа для различных пользователей. Всё это упаковано в исполнимый файл размером чуть более 4х мегабайт, что в современных реалиях более, чем приемлемо.

  Для чего я использую теперь эту утилиту:

  • отправка собранных iso файлов прямо из скрипта сборки с помощью curl в сторону NAS
  • возможность быстро получить доступ к нужной директории на удалённом компьютере или смартфоне
  • монтирование удалённых ресурсов в локальную файловую систему прямо через virtualhost и nginx, выступающий в роли reverse proxy
  • средство для быстрой возможности удаления просмотренного/прослушанного контента на медиа шаре: посмотрел несколько фильмов - быстро пробежался по списку и поудалял прямо со смартфона сидя на диване
  • шара для быстрой синхронизации фотографий со смартфона в рамках локальной сети (наелся уже NextCloud - очень хотелось чего-то попроще и побыстрее)

  Примеры запуска утилиты приводить не буду, они указаны в README.md проекта достаточно подробно и они достаточно просты. Лучше опишу практическое применение.

Пример запуска в Docker

  Это просто/удобно/быстро, если нужно поднять например, сетевой ресурс для синхронизации контента со смартфонов. На всякий случай приведу сразу пример запуска двух вариантов контейнера - с самоподписанным ssl сертификатом (на порту 5001) и без него (на порту 5000). Зачем запускать сервис без сертификата, если можно с ним? Элементарно - можно проксировать обращение на него с другого хоста, на котором запущен nginx в режиме reverse proxy.

  Создание самоподписанного (self signed) сертификата:

openssl req -new -newkey rsa:4096 -x509 -sha256 -days 365 -nodes -out ss.crt -keyout ss.key

  В директории /opt/dufs создам директорию cert и положу файлы сертификата и ключа, полученные в результате выполнения указанной выше команды туда. Далее создаём файл docker-compose.yaml

version: '3.3'
services:
  dufs:
    image: sigoden/dufs
    hostname: dufs
    container_name: dufs
    restart: always
    environment:
      - TZ=Asia/Yekaterinburg
    volumes:
      - './data:/data'
    ports:
      - '5000:5000'
    user: 10001:10001
    command: /data -A --enable-cors -a user1:pass1@/directory1:rw -a user2:pass2@/directory2:rw

    logging:
      driver: "json-file"
      options:
        max-size: "64m"

  dufstls:
    image: sigoden/dufs
    hostname: dufstls
    container_name: dufstls
    restart: always
    environment:
      - TZ=Asia/Yekaterinburg
    volumes:
      - './data:/data'
      - './cert:/cert'
    ports:
      - '5001:5000'
    user: 10001:10001
    command: /data -A --enable-cors --tls-cert /cert/ss.crt --tls-key /cert/ss.key -a user1:pass1@/directory1:rw -a user2:pass2@/directory2:rw

    logging:
      driver: "json-file"
      options:
        max-size: "64m"

  Что сразу может броситься в глаза - использование пароля открытым текстом. Да, в документации из репозитория заявлено, что можно использовать хеши sha-512:

# DUFS supports the use of sha-512 hashed password.

# Create hashed password
$ mkpasswd  -m sha-512 -s
Password: 123456
$6$qCAVUG7yn7t/hH4d$BWm8r5MoDywNmDP/J3V2S2a6flmKHC1IpblfoqZfuK.LtLBZ0KFXP9QIfJP8RqL8MCw4isdheoAMTuwOz.pAO/

# Use hashed password
dufs -a 'admin:$6$qCAVUG7yn7t/hH4d$BWm8r5MoDywNmDP/J3V2S2a6flmKHC1IpblfoqZfuK.LtLBZ0KFXP9QIfJP8RqL8MCw4isdheoAMTuwOz.pAO/@/:rw'

# Two important things for hashed passwords:
# 1. Dufs only supports sha-512 hashed passwords, so ensure that the password string always starts with `$6$`.
# 2. Digest authentication does not function properly with hashed passwords.

  Но как видим, нас предупреждают сразу, что аутентификация не будет работать с данным типом паролей. Я проверил с basic авторизацией в web интерфейсе и действительно, не работает. Будем надеяться, что в будущих версиях это исправят. В любом случае я не собираюсь использовать этот сервис в качестве production, а для домашних нужд в закрытой сети и этого более, чем достаточно. Не забудьте изменить соответствующим образом владельца и права на docker-compose.yml, если дорожите этими паролями.

  Также обратите внимание на строки "user: 10001:10001" - от имени данного пользователя будет запущен сервис dufs и соответственно доступ он сможет получить лишь к тем директориям и файлам, которые имеют соответствующие uid и gid.

Использование на мобильном устройстве

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

  Первое (и это тоже в своём роде недооценённая утилита, но уже для Android) - это FolderSync - масса настроек, односторонняя и двусторонняя синхронизация, маски, привязка к конкретным сетям wifi, планирование - одним словом я этой утилитой пользуюсь уже не помню сколько лет и очень доволен. И да, у неё есть масса поддерживаемых типов удалённого хранилища, WebDAV входит в их число. Так что и какой-нибудь яндекс диск также можно при желании подключить. Самое главное, что делает это приложение - незаметно для меня проводит синхронизацию, ведёт лог синхронизаций и делает это исключительно когда я дома, не пытаясь насиловать 4g соединение.

  Второе приложение - X-Plore. Им я пользовался ещё в эпоху расцвета Symbian смартфонов, а это было примерно около 20 лет тому назад. Затем это приложение перекочевало и на Android, чему я был несказанно рад. В нём тоже есть возможность подключить "облачные" сетевые ресурсы, в том числе и по протоколу WebDAV. С мобильного устройства удобно подключиться к шаре извне, когда находишься не дома. Например, если нужно найти какой-нибудь файл или документ, находящийся на домашнем сервере.

  Есть правда одно но - у FolderSync есть как бесплатная, так и платная версия. У X-Plore тоже. Я когда-то честно купил и первое и второе из уважения к разработчикам, но в свете санкций теперь честно приобретённое стало недоступно жителям Белоруси и РФ. Для решения этого вопроса тоже существуют различные обходные пути, но приводить их тут я не буду.

Использование с внешним существующим доменом.

  Я пользуюсь nginx и certbot на недорогой виртуальной машине, к которой мой кластер виртуализации подключен через VPN (всё тот же tinc). Предположим, что у нас есть домен domain.com и мы хотим для доступа к шаре сделать доменное имя sub.domain.com. Для начала создаём вируалхост в /etc/nginx/sites-available/sub.domain.com.conf:

server {
    listen 80;
    server_name sub.domain.com;

    location / {
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_pass http://10.20.30.40:5000;
    }
}

  Очевидно, что dufs в соответствии с данным примером должен у нас быть доступен по адресу 10.20.30.40 и занимать порт по умолчанию 5000.

  Далее создаём симлинк на файл конфигурации и проверяем его корректность:

ln -s /etc/nginx/sites-available/sub.domain.com.conf /etc/nginx/sites-enabled/sub.domain.com.conf
$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
$ sudo nginx -s reload

  Создаём let's encrypt сертификат с помощью certbot (у вас может быть иной способ получения сертификата):

certbot -d sub.domain.com --nginx

  Если всё сделано корректно, то после этого из того же X-Plore можно будет подключиться к сетевому ресурсу через webdav с помощью указанного вами логина, пароля и адреса https://sub.domain.com. Совсем несложно, верно?

Монтирование сетевого ресурса в linux

  Как давний приверженец debian-based систем опишу способ для них. Для начала нам потребуется установить пакет davfs2 и добавить пользователя в нужную группу:

sudo apt -y update && sudo apt -y install davfs2
sudo add user davfs2

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

  Затем нужно раскомментировать в конфигурационном файле /etc/davfs2/davfs2.conf две строки и заменить во второй 1 на 0:

dav_group       davfs2
use_locks       0

  Монтируем:

$ sudo mount -t davfs -o uid=user,gid=user http://10.20.30.40:5000 /home/user/mnt/share
Please enter the username to authenticate with server
http://10.11.11.201:5000 or hit enter for none.
  Username: user
Please enter the password to authenticate user evgeniy with server
http://10.11.11.201:5000 or hit enter for none.
  Password:  
$

  Проверяем:

http://10.20.30.40:5000 on /home/user/mnt/share type fuse (rw,nosuid,nodev,relatime,user_id=10001,group_id=10001,allow_other,max_read=16384,uid=10001,gid=10001,_netdev,helper=davfs)

  Всё, теперь можно работать с ресурсом как с частью локальной файловой системы. Что радует, на работоспособность не влияют кратковременные отключения от сети, например, переключение с точки 2.4GHz на 5GHz, уход в спящий режим и пробуждение и т.п..

Теги: shell, instruments

comments powered by Disqus