Обзор self-hosted файловых менеджеров для сервера
Сравнение FileBrowser, Filestash, SFTPGo и Cloud Commander по поддержке протоколов, авторизации и безопасности. Узнайте, как безопасно настроить доступ к файлам на VPS.
Что такое self-hosted файловый менеджер и чем он не является
Self-hosted файловый менеджер — это веб-интерфейс для дерева каталогов, которое уже существует на вашем VPS (виртуальном выделенном сервере). Вы авторизуетесь, видите /srv/files в том же виде, в котором данные лежат на диске, и можете загружать, переименовывать, скачивать файлы или отправлять кому-либо ссылку. Никакие данные не копируются во вторую систему, поэтому файл, который вы перетащили в браузер, — это тот же самый файл, который ls отобразит секундой позже.
Результаты поиска часто смешивают это понятие с программным обеспечением для других задач. Инструменты синхронизации хранят копию каждого файла на каждом устройстве — именно для этого нужен self-hosted аналог Dropbox. Объектное хранилище вообще не имеет дерева каталогов, оно использует бакеты и API, поэтому развертывание MinIO для S3-совместимого объектного хранилища решает другую задачу. Панели администрирования серверов управляют машиной, а не файлами, и это относится к сравнению Cockpit и Webmin.
Файловый менеджер нужен, когда коллеге требуется забрать с сервера один архив объемом 300 MB или когда вы хотите исправить опечатку в конфигурационном файле с телефона. Задача невелика, и инструменты для нее тоже.
При чтении учитывайте один факт. Это веб-приложение с правами на чтение и запись в вашей файловой системе, которое слушает порт. Каждый вариант ниже — это, по сути, выбор того, к какой части вашего диска этот процесс получит доступ.
Проект FileBrowser переведен в архив, ознакомьтесь с этим перед установкой
FileBrowser, проект filebrowser/filebrowser, остается решением, которое предлагают большинство руководств. Его README теперь начинается с уведомления:
Проект File Browser переведен в архив 2026-09-01. Последний запланированный релиз уже выпущен. Дальнейших релизов, исправлений ошибок или обновлений безопасности не будет.
Код под лицензией Apache 2.0 продолжит работать. Обновления безопасности прекращены. Для данной категории ПО это критично, так как основная задача программы — предоставление доступа на запись к файловой системе по протоколу HTTP.
Разработчики описали рекомендации по дальнейшему использованию, и им стоит следовать при выборе любого аналогичного инструмента: не открывайте доступ к приложению напрямую из интернета, размещайте его за reverse proxy, который выполняет TLS termination (transport layer security) и собственную аутентификацию, держите функцию выполнения команд (command runner) отключенной и запускайте приложение с ограниченными правами в контейнере, подключив только ту директорию, которую необходимо обслуживать.
Одна строка в этом README важнее остальных. Сессии представляют собой автономные JWT (JSON web tokens), а не идентификаторы на стороне сервера, поэтому их невозможно отозвать. Утекший токен сессии остается валидным до истечения срока действия, и смена пароля не аннулирует его. Если вы продолжаете использовать FileBrowser, именно внешний уровень аутентификации берет на себя основную задачу по обеспечению безопасности.
FileBrowser Quantum: форк, который продолжает развиваться
Активная разработка переместилась в форк FileBrowser Quantum (gtsteffaniak/filebrowser), который публикуется как образ gtstef/filebrowser. В нем конфигурация перестроена вокруг единого файла config.yaml вместо прежнего сочетания флагов командной строки и настроек базы данных. Документированный способ быстрого запуска:
docker run -d \
-v $(pwd):/srv \
-p 80:80 \
gtstef/filebrowser:betaЭта команда открывает текущую директорию по адресу http://localhost, а данные для первого входа — admin / admin. Измените их до того, как контейнер станет доступен извне, за пределами вашей машины.
Для постоянного экземпляра используйте Compose, монтируйте директорию с данными, а не отдельный файл базы данных, и привязывайте порт к localhost:
services:
filebrowser:
image: gtstef/filebrowser:beta
user: "1000:1000"
volumes:
- /srv/files:/folder
- ./data:/home/filebrowser/data
ports:
- 127.0.0.1:8080:80
restart: unless-stoppedКонфигурация находится в /home/filebrowser/data/config.yaml, а база данных — в /home/filebrowser/data/filebrowser.sqlite. В версии 2.0.0 изменился формат базы данных и выполняется однократная миграция, поэтому документация требует монтирования директории: при монтировании одного файла мигратору некуда сохранить новый файл. Пути внутри config.yaml — это пути внутри контейнера, поэтому источник в конфигурации записывается как /folder, а не /srv/files. Ошибка в этом приведет к пустому списку файлов без сообщений об ошибках, так как директория фактически отсутствует.
Проект публикует образы latest и stable размером около 60 МБ с включенным FFmpeg для создания миниатюр видео, а также stable-slim размером около 15 МБ, содержащий только ядро. Это показатели со страницы установки на август 2026 года. Фиксируйте выбранный тег. latest меняется без предупреждения, а файловый менеджер, который меняет формат конфигурации во время работы контейнера, — это плохой сценарий для начала дня.
Для этой задачи это самый мощный из компактных инструментов. Он обслуживает несколько источников с правилами включения и исключения, поэтому один экземпляр может предоставлять доступ к /srv/media и /srv/docs с разными областями видимости. Общие ссылки имеют срок действия и могут быть анонимными или ограниченными для конкретного пользователя. Аутентификация поддерживает OIDC (OpenID Connect), LDAP (lightweight directory access protocol), пароль с двухфакторной проверкой и режим прокси-заголовков. Режим прокси позволяет разместить его за единой системой входа (SSO) от самостоятельно развернутого сервера Authentik вместо ведения второго списка пользователей.
Filestash: единый интерфейс для уже имеющегося хранилища
Filestash имеет иную архитектуру. Это фронтенд, который подключается к бэкенду, причем список поддерживаемых бэкендов обширен: FTP, SFTP (SSH file transfer protocol), S3, SMB, WebDAV, IPFS и еще около двадцати других. Это решение подходит, если файлы находятся не на том сервере, где запущен интерфейс.
mkdir -p /srv/filestash && cd /srv/filestash
curl -O https://downloads.filestash.app/latest/docker-compose.yml
docker compose up -dОбраз называется machines/filestash:latest. Откройте http://your_domain:8334; на первом экране потребуется задать пароль администратора. Сделайте это немедленно, так как до установки пароля консоль администратора доступна любому, кто обнаружит открытый порт.
Прежде чем выстраивать работу, разберитесь в модели идентификации. Filestash не хранит базу данных пользователей в привычном понимании. Учетные данные сохраняются в вашем браузере с помощью зашифрованных, аутентифицированных и доступных только по HTTP (HTTP only) файлов cookie. На стороне сервера ничего не хранится, за исключением случаев использования функции общего доступа (share): тогда Filestash сохраняет постоянную зашифрованную версию ваших учетных данных. «Пользователи» здесь — это учетные записи хранилищ: идентификация происходит на стороне бэкенда, в учетной записи SFTP или ключе S3, а не в самом Filestash.
Такая архитектура лаконична, но имеет свою цену. На странице с тарифами указано, что бесплатная версия для self-hosted развертывания распространяется по лицензии AGPL v3 (GNU Affero General Public License) и ограничена 3 пользователями. Поддержка SSO (SAML, OIDC и LDAP) с управлением доступом на основе ролей (RBAC) доступна в платной версии для self-hosted развертывания по цене от 50 долларов в месяц по состоянию на август 2026 года. Если вы планировали использовать Filestash бесплатно в связке с корпоративной системой SSO, ознакомьтесь с этой страницей, прежде чем проектировать архитектуру решения.
SFTPGo: сервер протоколов с веб-интерфейсом
SFTPGo — наиболее функциональное решение в этом обзоре, которое часто рекомендуют по неверным причинам. Оно поддерживает SFTP, HTTP/S, FTP/S и WebDAV, работая с локальными файловыми системами (в том числе зашифрованными), S3-совместимыми объектными хранилищами, Google Cloud Storage, Azure Blob Storage или другими SFTP-серверами.
Бинарные файлы, пакеты для Debian и Ubuntu, а также образ контейнера доступны для загрузки. Актуальная строка для APT-репозитория и ключ подписи находятся на странице установки в документации SFTPGo. Использование контейнера — самый быстрый способ запуска; замените tag на нужную версию:
docker run --name some-sftpgo -p 8080:8080 -p 2022:2022 -d "drakkan/sftpgo:tag"SFTP слушает порт 2022, а веб-интерфейсы — 8080. Подключите /srv/sftpgo как том (volume), иначе учетные записи и файлы исчезнут при пересоздании контейнера, так как домашние директории пользователей по умолчанию находятся в /srv/sftpgo/data/<username>.
Существует два веб-интерфейса, и разница между ними — это то, что часто упускают в обзорах. WebAdmin, доступный по адресу /web/admin, предназначен для администрирования: здесь создаются пользователи, группы, виртуальные папки и правила событий, а также настраиваются квоты, лимиты пропускной способности и ограничения по времени доступа. WebClient, доступный по адресу /web/client, предназначен для конечных пользователей: здесь можно просматривать файлы, изменять свои учетные данные, настраивать двухфакторную аутентификацию и создавать общие ссылки (shares).
Эти общие ссылки — лучшие в данном сравнении. Пользователь может создавать HTTP/S-ссылки для доступа к файлам и папкам, ограничивать количество загрузок и выгрузок, защищать ссылку паролем, ограничивать доступ по IP-адресу источника и устанавливать дату автоматического истечения срока действия.
Почему же стоит проявлять осторожность? Основной фокус системы — модель учетных записей и сервер протоколов, а не удобство просмотра файлов. Выбирайте SFTPGo, если другим пользователям нужны полноценные учетные записи с квотами, если данные загружаются по SFTP или FTPS из систем, которые вы не контролируете, или если один бакет должен отображаться в домашних директориях нескольких пользователей. Виртуальные папки решают последнюю задачу: папка, размещенная на локальном диске, S3, GCS, Azure Blob, SFTP или HTTP, монтируется в несколько учетных записей с индивидуальной квотой для каждого пользователя на общую папку. Если вам нужна просто страница для просмотра файлов через /srv/files, это решение будет избыточным.
Еще два факта, которые стоит знать. Community-версия распространяется по лицензии AGPL-3.0 с дополнительными условиями; также существует коммерческая Enterprise-версия. В открытой сборке доступен вход через OIDC, который сопоставляет пользователей провайдера идентификации с администраторами и пользователями SFTPGo для обоих веб-интерфейсов. Вы также можете глобально отключить клиентский интерфейс с помощью параметра enable_web_client в конфигурационном файле httpd или для конкретного пользователя, добавив HTTP в список запрещенных протоколов этого пользователя. Таким образом, файловый менеджер может быть доступен одному человеку, но не всем остальным.
Cloud Commander: двухпанельный интерфейс и терминал для одного пользователя
Cloud Commander — это файловый менеджер на базе Node.js с лицензией MIT, выполненный в двухпанельном стиле, со встроенным редактором, консолью и терминалом. Установите его глобально с помощью npm i cloudcmd -g или запустите опубликованный контейнер:
docker run -it --rm -v ~:/root -v /:/mnt/fs -w=/root -p 8000:8000 coderaiser/cloudcmdИзучите эту команду перед запуском. Флаг -v /:/mnt/fs монтирует всю файловую систему хоста в контейнер, а пример ~/.cloudcmd.json поставляет "root": "/", "auth": false и "console": true. Такая комбинация означает, что любой, кто получит доступ к порту 8000, получит доступ ко всему вашему диску и командной консоли на сервере. Это разумные настройки по умолчанию для ноутбука, но плохие для VPS.
Ограничьте область доступа. Контейнер считывает /root/.cloudcmd.json, который опубликованная команда предоставляет через монтирование вашей домашней директории, поэтому оставьте монтирование конфигурации, а остальное уберите:
docker run -d --name cloudcmd \
-v ~/.cloudcmd.json:/root/.cloudcmd.json \
-v /srv/files:/srv/files \
-w=/srv/files \
-p 127.0.0.1:8000:8000 \
coderaiser/cloudcmdВ этом файле конфигурации установите "root" в /srv/files, "auth" в true с использованием "username" и "password", а "console" и "terminal" в false, если только вам действительно не нужен доступ к оболочке из браузера. Существуют также эквиваленты для командной строки, включая --root, --auth, --username, --password и --prefix.
Будьте реалистичны в отношении того, что это за инструмент. Одна пара учетных данных, отсутствие разграничения прав пользователей, квот и ссылок для общего доступа. Это персональный инструмент, поэтому привяжите его к localhost, как показано выше, и подключайтесь через туннель:
ssh -L 8000:127.0.0.1:8000 you@your-vpsЗатем откройте http://127.0.0.1:8000 на своей локальной машине. Файловый менеджер никогда не будет доступен публично, а единственным компонентом, открытым для интернета, останется SSH-демон, который вы уже защитили на своем VPS.
Почему Nextcloud не подходит для этой задачи
Nextcloud — качественное ПО, но оно предназначено для других целей. Это платформа для совместной работы: PHP-приложение, база данных, фоновые задания, клиенты для синхронизации и магазин приложений. Использование его только для просмотра /srv/files через веб-интерфейс — это избыточное количество компонентов для простой задачи, и здесь возникает фундаментальное несоответствие. Nextcloud хранит метаданные файлов в таблице базы данных, а не считывает содержимое директории при каждом запросе. Поэтому файлы, записанные через rsync или cron-задание, могут оставаться невидимыми в интерфейсе до тех пор, пока не завершится сканирование, что сопровождается sudo -u www-data php occ files:scan --all. Обычный файловый менеджер просто считывает содержимое директории при загрузке страницы, поэтому такой задержки не существует.
Используйте Nextcloud для того, с чем он справляется хорошо: календари, контакты, синхронизация и обмен данными с пользователями, которым нужен десктопный клиент. В Nextcloud на VPS с Docker, TLS и резервным копированием описана настройка такого решения. Если вы уже используете Nextcloud и вам нужно лишь просматривать существующую директорию, включите приложение External Storage и на этом остановитесь. Второе веб-приложение с правами записи на тот же диск — это еще один компонент, который нужно обновлять и защищать.
Как запустить сервис, не предоставляя доступ ко всему серверу
Никогда не указывайте в качестве пути /. Процесс может читать и записывать всё, к чему имеет доступ его учетная запись, поэтому украденный токен сессии превращается в полный доступ к файловой системе. Обслуживайте только одну директорию, /srv/files, и создайте её специально для этой цели.
Запускайте процесс от имени пользователя без прав root и монтируйте только то, что необходимо. В Compose используйте user: "1000:1000" и по одному bind mount на каждую директорию, добавив :ro для всего, во что приложению не нужно записывать данные:
volumes:
- /srv/files:/folder
- /srv/media:/media:roОбычно после этого изменения просмотр файлов работает, а загрузка завершается ошибкой permission denied, так как идентификатор пользователя внутри контейнера не является владельцем директории на хосте. Сравните их: docker exec filebrowser id выводит пользователя контейнера, а ls -ln /srv/files — числовой идентификатор владельца на хосте. Исправьте это с помощью sudo chown -R 1000:1000 /srv/files. Это та же проблема с правами владения, для решения которой существуют PUID и PGID в образах Docker.
Привязывайте опубликованный порт к localhost, 127.0.0.1:8080:80, а не к 8080:80. Docker записывает свои правила netfilter раньше правил ufw, поэтому открытый порт остается доступным из Интернета, даже если ufw deny 8080 активен. Установите reverse proxy перед приложением для TLS. При использовании обычного HTTP cookie сессии передается по сети в открытом виде, а этот cookie — это доступ к файловой системе. Если вы только начинаете работать с Compose, в Docker Compose на VPS описана структура файлов, на которую опираются эти примеры.
Добавьте уровень аутентификации, если встроенные средства приложения недостаточно надежны. HTTP basic auth на стороне прокси достаточно для экземпляра с одним пользователем. Если пользователей больше одного, используйте OIDC или forward auth через провайдера идентификации, чтобы отзыв одной учетной записи закрывал доступ везде.
Отключите лишние функции. Любой файловый менеджер, предлагающий оболочку (shell), выполнение команд или терминал в браузере, предоставляет возможность удаленного выполнения кода (RCE) любому, у кого есть валидная сессия. Рекомендация FileBrowser — держать функцию выполнения команд отключенной, а в примере конфигурации Cloud Commander консоль включена. Принимайте решение осознанно, а не по умолчанию.
Что ломается в первую очередь и какие ошибки вы увидите
listen tcp :80: bind: permission denied. Linux резервирует порты ниже 1024 для привилегированных процессов. В документации FileBrowser Quantum указан порт 80: это допустимо внутри контейнера, но приведет к ошибке при запуске бинарного файла от имени непривилегированного пользователя на хосте. Укажите порт выше 1024 в config.yaml, а обработку 443 порта оставьте за прокси-сервером.
Загрузка файлов не работает, хотя просмотр каталогов доступен. Для отображения списка файлов нужны права r-x, для записи в каталог — w. Веб-интерфейс выдает общую ошибку, поэтому в первую очередь проверяйте права доступа в файловой системе, а не логи приложения.
413 Request Entity Too Large. Эта ошибка исходит от nginx, а не от файлового менеджера. Значение client_max_body_size по умолчанию составляет 1 MB, поэтому прокси-сервер отклоняет загрузку файла большего размера до того, как запрос дойдет до приложения. Установите client_max_body_size 4096m; в блоке server или используйте 0, чтобы отключить проверку.
Загруженные файлы получают неверную группу. Новые файлы принадлежат пользователю, от имени которого запущен процесс, независимо от прав родительского каталога. Это нарушает работу второго сервиса, который читает ту же структуру файлов. Назначьте обоим сервисам общую группу и установите бит setgid для каталога с помощью sudo chmod g+s /srv/files: тогда новые файлы будут наследовать группу каталога.
Все работает при прямом подключении к порту, но ломается за прокси. Если приложение обслуживается по подпути, оно формирует ссылки на основе префикса, о котором его нужно уведомить. В Cloud Commander для этого есть --prefix. Если такой опции нет, выделите приложению отдельный поддомен и проксируйте корневой путь.
Какой self-hosted файловый менеджер выбрать?
- Один VPS, одна или две директории, обмен ссылками с истекающим сроком действия и, возможно, SSO в будущем: FileBrowser Quantum.
- Файлы хранятся в другом месте (S3-бакет, SFTP-хост или NAS по протоколу SMB), и вам нужен единый веб-интерфейс для доступа к ним: Filestash (в рамках ограничений бесплатной версии).
- Другим пользователям нужны учетные записи, квоты и загрузка файлов по SFTP или FTPS: SFTPGo (веб-клиент здесь рассматривается как полезное дополнение, а не основная причина выбора).
- Персональный инструмент с редактором и терминалом, доступ к которому осуществляется через SSH-туннель и который никогда не публикуется в Интернете: Cloud Commander.
- Nextcloud уже запущен, и нужно открыть доступ к существующей директории: используйте приложение External Storage, не устанавливая новое ПО.
Что бы вы ни выбрали, способ развертывания важнее самого выбора. Одна директория, пользователь без прав root, порт, привязанный к localhost, и аутентификация перед приложением. Файловый менеджер, настроенный таким образом, — это удобство. То же самое ПО, направленное на / с общим паролем, превращается в удаленную оболочку с приятным интерфейсом.
FAQ
Безопасно ли использовать FileBrowser в 2026 году?
В README проекта filebrowser/filebrowser указано, что разработка File Browser прекращена 2026-09-01, новые релизы, исправления ошибок и патчи безопасности не выпускаются. Код продолжает работать, но использование ПО без обновлений, имеющего права на запись в файловую систему, со временем становится всё более рискованным. Если вы решили оставить его, следуйте рекомендациям разработчиков: не открывайте доступ напрямую в Интернет, используйте reverse proxy для TLS и собственной аутентификации, отключите функцию выполнения команд и запускайте приложение в непривилегированном контейнере, смонтировав только ту директорию, с которой нужно работать. Учтите, что сессии основаны на автономных JWT, а не на серверных идентификаторах, поэтому их нельзя отозвать, а смена пароля не аннулирует уже выданные токены. Для новой установки используйте форк FileBrowser Quantum, доступный как образ gtstef/filebrowser, где разработка продолжается.
Может ли self-hosted файловый менеджер использовать мой существующий SSO?
FileBrowser Quantum поддерживает OIDC, LDAP и режим работы через proxy-заголовки, поэтому он может работать за существующим провайдером идентификации без создания отдельной базы пользователей. Интеграция OpenID Connect в SFTPGo доступна в open source версии и позволяет сопоставлять пользователей провайдера с администраторами и пользователями SFTPGo как в интерфейсе WebAdmin, так и в WebClient. Исключение — Filestash: согласно странице с ценами, SSO (SAML, OIDC и LDAP) доступен в платной self-hosted версии по цене от $50 в месяц по состоянию на август 2026 года, в то время как бесплатная версия распространяется по лицензии AGPL v3 и ограничена 3 пользователями. Если приложение вообще не поддерживает SSO, используйте в качестве альтернативы forward authentication на уровне reverse proxy: это защитит страницу входа, но не изменит внутренние права доступа самого приложения.
В каком из этих решений есть ссылки на файлы с истекающим сроком действия?
Наиболее полная реализация представлена в SFTPGo. Пользователь создает HTTP/S-ссылку через WebClient, где можно ограничить количество скачиваний и загрузок, установить пароль, ограничить доступ по IP-адресу источника и задать дату автоматического истечения срока действия. FileBrowser Quantum поддерживает общие ссылки с ограничением по времени, доступ к которым может быть анонимным или ограниченным конкретным пользователем, а также позволяет настраивать права на просмотр, редактирование и загрузку для каждой ссылки. В Filestash также есть функция обмена файлами; это единственный случай, когда сервер хранит постоянную зашифрованную копию учетных данных хранилища, так как ссылка должна работать даже после завершения сессии в браузере. В Cloud Commander функции обмена ссылками отсутствуют.
Безопасно ли указывать файловому менеджеру путь / если я единственный пользователь?
Нет, и дело здесь не в доверии к самому себе. Процесс получает права на чтение и запись ко всему, к чему имеет доступ учетная запись, от имени которой он запущен. Любой взлом сессии, кража cookie, неисправленная уязвимость в обработчике загрузок или использование повторно скомпрометированного пароля приведут к доступу к /etc, вашим SSH-ключам и директориям данных всех сервисов. Ограничьте область монтирования одной директорией: /srv/files вместо /. С Cloud Commander это наиболее критично, так как в официальной команде Docker для него монтируется корень хоста в /mnt/fs, а в примере конфигурации задано "root": "/" с "auth": false. Измените оба параметра, прежде чем контейнер начнет принимать соединения на любом интерфейсе, кроме localhost.