Dufs на VPS: руководство по развёртыванию файлового сервера

Подробная инструкция — от установки до production-конфигурации за 20 минут

Версия: v0.46.0 GitHub: 10 500+ Язык: Rust Лицензия: MIT / Apache-2.0 Обновлено: Август 2026

Содержание

  1. Что такое Dufs
  2. Системные требования
  3. Подготовка сервера
  4. Установка Dufs
  5. Первый запуск
  6. Конфигурационный файл
  7. Контроль доступа
  8. Nginx reverse proxy
  9. SSL-сертификат
  10. Systemd-сервис
  11. Docker-развёртывание
  12. WebDAV
  13. Сценарии использования
  14. API и автоматизация
  15. Логирование и мониторинг
  16. Обновление
  17. Резервное копирование
  18. Безопасность
  19. Решение проблем
  20. Итоговая архитектура

1. Что такое Dufs

Dufs (Distinctive Utility File Server) — это легковесный файловый сервер с открытым исходным кодом, написанный на языке Rust. Проект разработан sigoden и распространяется под двойной лицензией MIT / Apache-2.0.

Репозиторий: https://github.com/sigoden/dufs

Возможности

  • Раздача статических файлов (read-only режим)
  • Загрузка файлов и папок через браузер (Drag & Drop)
  • Создание, редактирование, поиск файлов прямо из веб-интерфейса
  • Скачивание папок одним ZIP-архивом
  • Возобновляемые загрузки и скачивания (resumable)
  • Полноценная поддержка WebDAV
  • Гибкий контроль доступа (по пользователям, директориям, операциям)
  • Встроенная поддержка HTTPS/TLS
  • Работа через unix-сокет
  • Health check endpoint для мониторинга
  • CORS для интеграции с фронтенд-приложениями
  • Рендеринг SPA (React, Vue, Svelte)

Сравнение с альтернативами

ПараметрDufsNginx autoindexFileBrowserNextcloud
Размер бинарника~8 МБчасть nginx~30 МБ200+ МБ
Потребление RAM5–15 МБ2–5 МБ30–50 МБ512 МБ+
ЗависимостинетнетнетPHP, MySQL, Redis
WebDAVмодуль
Upload из браузера
Время настройки1 командаконфигконфигчасы

2. Системные требования

Минимальные

  • ОС: Linux (x86_64, aarch64, armv7), macOS, Windows
  • RAM: 32 МБ свободно
  • Диск: 10 МБ под бинарник + место под файлы
  • CPU: любой, даже 1 vCPU

Рекомендуемые для production

  • ОС: Ubuntu 22.04 / 24.04 LTS, Debian 12, AlmaLinux 9
  • RAM: 512 МБ (с запасом под ОС и nginx)
  • Диск: SSD, от 20 ГБ
  • CPU: 1–2 vCPU
  • Сеть: белый IPv4-адрес

Что понадобится: VPS с root-доступом (или sudo), доменное имя направленное на IP сервера (для HTTPS), SSH-клиент, ~15 минут времени.

3. Подготовка сервера

Подключаемся по SSH и выполняем базовую настройку:

ssh root@ваш_ip_адрес

# Обновляем систему
apt update && apt upgrade -y

# Устанавливаем базовые утилиты
apt install -y curl wget git ufw certbot python3-certbot-nginx

# Настраиваем файрвол
ufw allow OpenSSH
ufw allow 'Nginx Full'
ufw enable
ufw status

Создаём системного пользователя для Dufs (безопаснее, чем запускать от root):

useradd -r -s /usr/sbin/nologin -d /srv/dufs dufs
mkdir -p /srv/dufs/files
chown -R dufs:dufs /srv/dufs
chmod 750 /srv/dufs

4. Установка Dufs

Способ 1: готовый бинарник (рекомендуется)

# Определяем архитектуру
ARCH=$(uname -m)
case $ARCH in
  x86_64)  ARCH_TAG="x86_64-unknown-linux-musl" ;;
  aarch64) ARCH_TAG="aarch64-unknown-linux-musl" ;;
  armv7l)  ARCH_TAG="armv7-unknown-linux-musleabihf" ;;
esac

# Скачиваем последнюю версию
VERSION="v0.46.0"
wget "https://github.com/sigoden/dufs/releases/download/${VERSION}/dufs-${VERSION}-${ARCH_TAG}.tar.gz"

# Распаковываем и устанавливаем
tar xzf "dufs-${VERSION}-${ARCH_TAG}.tar.gz"
mv dufs /usr/local/bin/dufs
chmod +x /usr/local/bin/dufs

# Проверяем
dufs --version
# Вывод: dufs 0.46.0

# Убираем за собой
rm -f "dufs-${VERSION}-${ARCH_TAG}.tar.gz"

Способ 2: через Cargo

# Устанавливаем Rust
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source $HOME/.cargo/env

# Компилируем
cargo install dufs

# Копируем бинарник
cp ~/.cargo/bin/dufs /usr/local/bin/

Способ 3: Docker

# Устанавливаем Docker
curl -fsSL https://get.docker.com | sh

# Запускаем контейнер
docker run -d \
  --name dufs \
  --restart unless-stopped \
  -v /srv/dufs/files:/data \
  -p 127.0.0.1:5000:5000 \
  sigoden/dufs /data -A

Способ 4: из исходников

git clone https://github.com/sigoden/dufs.git
cd dufs
cargo build --release
cp target/release/dufs /usr/local/bin/

5. Первый запуск и знакомство

Минимальный запуск (read-only)

dufs /srv/dufs/files

Вывод в терминале:

2026-08-02T10:00:00Z INFO  dufs: Listening on http://0.0.0.0:5000

Открываем в браузере: http://ваш_ip:5000 — видим список файлов.

Полнофункциональный запуск

dufs /srv/dufs/files \
  --allow-upload \
  --allow-delete \
  --allow-search \
  --allow-archive \
  -p 5000

Флаг -A (allow all)

dufs /srv/dufs/files -A

⚠️ Внимание: Флаг -A включает ВСЕ операции: upload, delete, search, archive, edit. Удобно для тестирования, опасно для production без аутентификации.

6. Конфигурация через файл

Для production удобнее использовать конфигурационный файл вместо длинной командной строки.

mkdir -p /etc/dufs
nano /etc/dufs/config.yaml

Содержимое файла /etc/dufs/config.yaml:

# Конфигурация Dufs

# Директория для раздачи
serve-path: /srv/dufs/files

# Сетевые настройки
bind: 127.0.0.1
port: 5000

# Префикс пути (если сервер за прокси на подпути)
# path-prefix: /files

# Скрытые файлы и директории
hidden: .git,.env,*.log,*.lock,.htaccess

# Аутентификация
auth:
  - admin:Str0ngP@ss2026!@/:rw
  - viewer:Read0nly!@/:r
  - uploader:Upload123!@/uploads:rw

# Разрешённые операции (глобально)
allow-upload: true
allow-delete: true
allow-search: true
allow-archive: true
allow-symlink: false

# CORS (если нужно для фронтенда)
enable-cors: false

# Сжатие ZIP
compress: low

# Логирование
log-file: /var/log/dufs/access.log

# TLS (если не используем nginx как прокси)
# tls-cert: /etc/letsencrypt/live/files.example.ru/fullchain.pem
# tls-key: /etc/letsencrypt/live/files.example.ru/privkey.pem

Запуск с конфигом:

dufs -c /etc/dufs/config.yaml

7. Контроль доступа (аутентификация)

Синтаксис правил

-a пользователь:пароль@путь:права

Где права:

  • r — только чтение (скачивание, просмотр)
  • w — запись (загрузка, создание)
  • rw — чтение и запись (включая удаление)

Примеры

# Один администратор с полными правами на всё
dufs /srv/dufs/files -a admin:MyP@ss@/:rw

# Несколько пользователей с разными правами
dufs /srv/dufs/files \
  -a admin:S3cret@/:rw \
  -a editor:Ed1t@/docs:rw \
  -a guest:Gu3st@/public:r

# Разные директории — разные пользователи
dufs /srv/dufs/files \
  -a alice:pass1@/projects/alice:rw \
  -a bob:pass2@/projects/bob:rw \
  -a manager:pass3@/projects:r

Проверка через curl

# Без авторизации — 401
curl -I http://127.0.0.1:5000/
# HTTP/1.1 401 Unauthorized

# С авторизацией — 200
curl -u admin:MyP@ss http://127.0.0.1:5000/
# HTTP/1.1 200 OK

# Digest auth (безопаснее)
curl --digest -u admin:MyP@ss http://127.0.0.1:5000/

8. Настройка Nginx как reverse proxy

⚠️ Важно: В production никогда не выставляем Dufs напрямую в интернет. Nginx берёт на себя TLS, rate limiting, логирование и защиту.

Установка Nginx

apt install -y nginx
systemctl enable nginx

Конфигурация виртуального хоста

nano /etc/nginx/sites-available/dufs
# /etc/nginx/sites-available/dufs
# Reverse proxy для Dufs

# Rate limiting zone
limit_req_zone $binary_remote_addr zone=dufs_limit:10m rate=10r/s;

# Ограничение размера загрузки (2 ГБ)
client_max_body_size 2G;

server {
    listen 80;
    listen [::]:80;
    server_name files.example.ru;

    # Редирект на HTTPS
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name files.example.ru;

    # SSL
    ssl_certificate /etc/letsencrypt/live/files.example.ru/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/files.example.ru/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;

    # Заголовки безопасности
    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header X-XSS-Protection "1; mode=block" always;
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

    # Логи
    access_log /var/log/nginx/dufs_access.log;
    error_log /var/log/nginx/dufs_error.log;

    # Таймауты для больших файлов
    proxy_connect_timeout 300;
    proxy_send_timeout 300;
    proxy_read_timeout 300;
    send_timeout 300;

    # Буферизация
    proxy_buffering off;
    proxy_request_buffering off;

    location / {
        limit_req zone=dufs_limit burst=20 nodelay;

        proxy_pass http://127.0.0.1:5000;
        proxy_http_version 1.1;

        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        # Для WebDAV
        proxy_set_header Destination $http_destination;

        # Поддержка больших файлов
        client_max_body_size 0;
    }

    # Защита служебных endpoint
    location /__dufs__/ {
        allow 127.0.0.1;
        deny all;
        proxy_pass http://127.0.0.1:5000;
    }
}

Активация

ln -s /etc/nginx/sites-available/dufs /etc/nginx/sites-enabled/
rm -f /etc/nginx/sites-enabled/default
nginx -t
systemctl reload nginx

9. SSL-сертификат Let’s Encrypt

# Убедитесь, что DNS записи A указывают на ваш IP
# files.example.ru → 185.xxx.xxx.xxx

# Получаем сертификат
certbot --nginx -d files.example.ru

# Автопродление (проверяем)
certbot renew --dry-run

# Статус таймера автопродления
systemctl status certbot.timer

После certbot перезапускаем nginx:

systemctl reload nginx

10. Systemd-сервис (автозапуск)

Создаём unit-файл:

nano /etc/systemd/system/dufs.service
[Unit]
Description=Dufs File Server
Documentation=https://github.com/sigoden/dufs
After=network.target
Wants=network-online.target

[Service]
Type=simple
User=dufs
Group=dufs

# Запуск
ExecStart=/usr/local/bin/dufs -c /etc/dufs/config.yaml

# Перезапуск при падении
Restart=always
RestartSec=5

# Безопасность (sandboxing)
NoNewPrivileges=true
ProtectSystem=strict
ProtectHome=true
PrivateTmp=true
PrivateDevices=true
ProtectKernelTunables=true
ProtectKernelModules=true
ProtectControlGroups=true

# Доступ только к рабочей директории
ReadWritePaths=/srv/dufs/files
ReadOnlyPaths=/etc/dufs

# Ограничение ресурсов
LimitNOFILE=65536
MemoryMax=256M
CPUQuota=80%

# Логирование через journald
StandardOutput=journal
StandardError=journal
SyslogIdentifier=dufs

[Install]
WantedBy=multi-user.target

Активация и управление

# Перечитываем systemd
systemctl daemon-reload

# Включаем автозапуск
systemctl enable dufs

# Запускаем
systemctl start dufs

# Проверяем статус
systemctl status dufs

Ожидаемый вывод:

● dufs.service - Dufs File Server
     Loaded: loaded (/etc/systemd/system/dufs.service; enabled)
     Active: active (running) since Sun 2026-08-02 10:15:00 UTC; 5s ago
   Main PID: 12345 (dufs)
      Tasks: 4 (limit: 4915)
     Memory: 8.2M
        CPU: 12ms
     CGroup: /system.slice/dufs.service
             └─12345 /usr/local/bin/dufs -c /etc/dufs/config.yaml

Полезные команды

systemctl stop dufs       # остановить
systemctl restart dufs    # перезапустить
journalctl -u dufs -f     # логи в реальном времени
journalctl -u dufs --since "1 hour ago"  # логи за час

11. Развёртывание через Docker (альтернатива)

docker-compose.yml

mkdir -p /opt/dufs && cd /opt/dufs
nano docker-compose.yml
version: "3.8"

services:
  dufs:
    image: sigoden/dufs:latest
    container_name: dufs
    restart: unless-stopped
    ports:
      - "127.0.0.1:5000:5000"
    volumes:
      - /srv/dufs/files:/data
    command: >
      /data
      --allow-upload
      --allow-delete
      --allow-search
      --allow-archive
      -a admin:Str0ngP@ss2026!@/:rw
      -a viewer:Read0nly!@/:r
    environment:
      - TZ=Europe/Moscow
    mem_limit: 256m
    cpus: 1.0
    read_only: true
    tmpfs:
      - /tmp
    security_opt:
      - no-new-privileges:true
    healthcheck:
      test: ["CMD", "wget", "-q", "--spider", "http://127.0.0.1:5000/__dufs__/health"]
      interval: 30s
      timeout: 5s
      retries: 3
      start_period: 10s

  nginx:
    image: nginx:alpine
    container_name: dufs-nginx
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx.conf:/etc/nginx/conf.d/default.conf:ro
      - /etc/letsencrypt:/etc/letsencrypt:ro
    depends_on:
      - dufs

Запуск

docker compose up -d
docker compose logs -f dufs
docker compose ps

12. WebDAV: подключение как сетевого диска

Dufs из коробки поддерживает WebDAV. Это позволяет монтировать хранилище как диск в ОС.

Windows (Проводник)

  1. Откройте «Этот компьютер» → «Подключить сетевой диск»
  2. Папка: https://files.example.ru/
  3. Введите логин/пароль при запросе

macOS (Finder)

  1. Finder → Cmd+K
  2. Адрес: https://files.example.ru/
  3. Подключиться как «Зарегистрированный пользователь»

Linux (davfs2)

apt install -y davfs2

mkdir -p /mnt/dufs
mount -t davfs https://files.example.ru/ /mnt/dufs

# Для автозагрузки — в /etc/fstab:
# https://files.example.ru/ /mnt/dufs davfs rw,user,noauto 0 0

Через curl

# Список файлов (PROPFIND)
curl -X PROPFIND -u admin:pass https://files.example.ru/ -H "Depth: 1"

# Загрузка файла
curl -T ./report.pdf -u admin:pass https://files.example.ru/docs/report.pdf

# Создание папки
curl -X MKCOL -u admin:pass https://files.example.ru/new-folder/

# Удаление
curl -X DELETE -u admin:pass https://files.example.ru/old-file.txt

# Перемещение
curl -X MOVE -u admin:pass https://files.example.ru/file.txt \
  -H "Destination: https://files.example.ru/archive/file.txt"

13. Практические сценарии использования

Сценарий 1: публичная раздача файлов (read-only)

dufs /srv/dufs/public -b 127.0.0.1 -p 5001 --allow-search --allow-archive

Без аутентификации — любой может смотреть и скачивать. Загрузка запрещена.

Сценарий 2: личный файлообменник

dufs /srv/dufs/private \
  -b 127.0.0.1 -p 5000 \
  -a admin:MyS3cret!@/:rw \
  --allow-upload \
  --allow-delete \
  --allow-search \
  --allow-archive \
  --hidden .git,.env,*.tmp

Сценарий 3: приём файлов от клиентов (drop-box)

# Клиенты могут только загружать, но не видеть чужие файлы
dufs /srv/dufs/inbox \
  -b 127.0.0.1 -p 5002 \
  -a client1:pass1@/:w \
  -a client2:pass2@/:w \
  --allow-upload

Сценарий 4: хостинг статического сайта

dufs /var/www/mysite \
  -b 127.0.0.1 -p 5003 \
  --render-index \
  --hidden .git

Сценарий 5: SPA-приложение (React/Vue)

dufs /var/www/spa-app \
  -b 127.0.0.1 -p 5004 \
  --render-spa

Все маршруты, не найденные как файлы, вернут index.html.

Сценарий 6: раздача одного большого файла

dufs /srv/iso/ubuntu-24.04.iso -b 127.0.0.1 -p 5005 --allow-hash

Клиент может проверить целостность:

curl "https://files.example.ru/ubuntu-24.04.iso?hash"
# Вывод: sha256: a1b2c3d4...

14. Работа с API (скрипты и автоматизация)

Загрузка файла из скрипта

#!/bin/bash
# upload.sh — загрузка бэкапа на Dufs

SERVER="https://files.example.ru"
USER="admin"
PASS="Str0ngP@ss2026!"
FILE="/var/backups/db-$(date +%Y%m%d).sql.gz"

curl -T "$FILE" \
  -u "$USER:$PASS" \
  "$SERVER/backups/$(basename $FILE)" \
  --progress-bar

echo "Загружено: $FILE"

Скачивание папки как ZIP

curl -u admin:pass \
  -o project-archive.zip \
  "https://files.example.ru/projects/myproject?zip"

Поиск файлов

# Найти все .pdf
curl -u admin:pass "https://files.example.ru?q=*.pdf"

# JSON-вывод для парсинга
curl -u admin:pass "https://files.example.ru?q=*.pdf&json"

Возобновляемая загрузка (для больших файлов)

# Узнаём, сколько уже загружено
OFFSET=$(curl -sI -u admin:pass "$SERVER/bigfile.iso" | \
  tr -d '\r' | sed -n 's/content-length: //p')

# Докачиваем
dd skip=$OFFSET if=bigfile.iso status=none ibs=1 | \
  curl -X PATCH \
    -u admin:pass \
    -H "X-Update-Range: append" \
    --data-binary @- \
    "$SERVER/bigfile.iso"

Health check для мониторинга

#!/bin/bash
# check_dufs.sh — для cron или Zabbix

RESPONSE=$(curl -s -o /dev/null -w "%{http_code}" \
  http://127.0.0.1:5000/__dufs__/health)

if [ "$RESPONSE" != "200" ]; then
    echo "ALERT: Dufs не отвечает! HTTP $RESPONSE" | \
      mail -s "Dufs DOWN" admin@example.ru
    systemctl restart dufs
fi

15. Логирование и мониторинг

Настройка logrotate

nano /etc/logrotate.d/dufs
/var/log/dufs/access.log {
    daily
    missingok
    rotate 30
    compress
    delaycompress
    notifempty
    create 0640 dufs dufs
    postrotate
        systemctl kill -s HUP dufs.service 2>/dev/null || true
    endscript
}

Просмотр логов

# Через journald
journalctl -u dufs -f

# Из файла (если указан --log-file)
tail -f /var/log/dufs/access.log

# Статистика: топ IP за сегодня
journalctl -u dufs --since today | \
  grep -oP '\d+\.\d+\.\d+\.\d+' | \
  sort | uniq -c | sort -rn | head -20

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

# Текущее потребление
systemctl status dufs | grep Memory

# Или
ps aux | grep dufs

# Открытые соединения
ss -tnp | grep 5000

16. Обновление Dufs

#!/bin/bash
# update_dufs.sh

NEW_VERSION="v0.47.0"  # изменить на актуальную
ARCH_TAG="x86_64-unknown-linux-musl"

echo "Останавливаю dufs..."
systemctl stop dufs

echo "Скачиваю ${NEW_VERSION}..."
wget -q "https://github.com/sigoden/dufs/releases/download/${NEW_VERSION}/dufs-${NEW_VERSION}-${ARCH_TAG}.tar.gz" \
  -O /tmp/dufs-new.tar.gz

echo "Распаковываю..."
tar xzf /tmp/dufs-new.tar.gz -C /tmp/

echo "Заменяю бинарник..."
cp /usr/local/bin/dufs /usr/local/bin/dufs.bak
mv /tmp/dufs /usr/local/bin/dufs
chmod +x /usr/local/bin/dufs

echo "Запускаю..."
systemctl start dufs

echo "Проверяю..."
sleep 2
systemctl is-active dufs && \
  echo "✅ Обновление успешно: $(dufs --version)" || \
  echo "❌ Ошибка!"

rm -f /tmp/dufs-new.tar.gz

17. Резервное копирование

#!/bin/bash
# backup_dufs.sh — ежедневный бэкап файлов и конфига

BACKUP_DIR="/var/backups/dufs"
DATE=$(date +%Y%m%d_%H%M)

mkdir -p "$BACKUP_DIR"

# Архив файлов
tar czf "$BACKUP_DIR/files_$DATE.tar.gz" -C /srv/dufs/files .

# Конфиг
cp /etc/dufs/config.yaml "$BACKUP_DIR/config_$DATE.yaml"

# Ротация: храним 7 дней
find "$BACKUP_DIR" -name "*.tar.gz" -mtime +7 -delete
find "$BACKUP_DIR" -name "*.yaml" -mtime +7 -delete

echo "Бэкап создан: $BACKUP_DIR"

Добавляем в cron:

crontab -e

# Ежедневно в 03:00
0 3 * * * /opt/scripts/backup_dufs.sh >> /var/log/dufs/backup.log 2>&1

18. Безопасность: чек-лист

  • Dufs слушает только 127.0.0.1 (не 0.0.0.0)
  • Nginx как reverse proxy с TLS
  • SSL-сертификат Let’s Encrypt
  • Аутентификация включена (-a)
  • Пароли сложные, хранятся в конфиге (не в командной строке)
  • Запуск от непривилегированного пользователя (dufs)
  • Systemd sandboxing (NoNewPrivileges, ProtectSystem)
  • Rate limiting в nginx
  • Файрвол (ufw) — открыты только 22, 80, 443
  • Скрыты служебные файлы (--hidden .git,.env)
  • allow-symlink: false (защита от выхода за корень)
  • Регулярные обновления
  • Health check + мониторинг
  • Бэкапы

Fail2ban для защиты от брутфорса

apt install -y fail2ban

Создаём фильтр /etc/fail2ban/filter.d/dufs.conf:

[Definition]
failregex = ^<HOST> .* ".*" 401
ignoreregex =

Создаём jail /etc/fail2ban/jail.d/dufs.conf:

[dufs]
enabled = true
port = http,https
filter = dufs
logpath = /var/log/nginx/dufs_access.log
maxretry = 5
bantime = 3600
findtime = 600
systemctl restart fail2ban

19. Решение проблем

ПроблемаПричинаРешение
Address already in useПорт занятss -tnlp | grep 5000, убить процесс или сменить порт
Permission deniedНет прав на директориюchown -R dufs:dufs /srv/dufs/files
502 Bad GatewayDufs не запущенsystemctl status dufs
413 Entity Too LargeЛимит nginxclient_max_body_size 0; в конфиге nginx
Загрузка обрываетсяТаймаутУвеличить proxy_read_timeout в nginx
WebDAV не работаетНет заголовка DestinationПроверить proxy_set_header Destination
Файлы не видныСкрыты через --hiddenПроверить паттерны в конфиге
Высокий CPU при ZIPСжатие на лету--compress none или low

Диагностика

# Проверить, слушает ли dufs
ss -tnlp | grep dufs

# Проверить ответ локально
curl -v http://127.0.0.1:5000/__dufs__/health

# Проверить через nginx
curl -vk https://files.example.ru/__dufs__/health

# Логи nginx
tail -50 /var/log/nginx/dufs_error.log

# Логи dufs
journalctl -u dufs -n 50 --no-pager

# Проверить конфиг nginx
nginx -t

# SELinux (если RHEL/AlmaLinux)
ausearch -m avc -ts recent

20. Итоговая архитектура

Заключение

Dufs — идеальный выбор для VPS, когда нужен быстрый, безопасный и минималистичный файловый сервер без раздутого стека зависимостей. Один бинарник на 8 МБ заменяет связку Apache + PHP + MySQL + Nextcloud для 90% задач файлообмена.

Эта связка (Dufs + Nginx + Let’s Encrypt + systemd) обеспечивает:

  • Мгновенный старт и минимальное потребление ресурсов
  • Полноценную безопасность (TLS, auth, sandboxing, rate limit)
  • Удобный веб-интерфейс + WebDAV + API
  • Автоматический перезапуск и мониторинг
  • Простоту обновления (один бинарник)

⏱ Время от нуля до production: 15–20 минут.

Dufs v0.46.0 · github.com/sigoden/dufs · Август 2026