Перед каждым администратором сервера, вебмастером или владельцем небольшого проекта рано или поздно встает тривиальная задача: как быстро и безопасно загрузить на VDS файлы сайта, скачать свежий дамп базы данных или передать архив клиенту. Классический рефлекс из 2000-х годов — поднять FTP-сервер (vsftpd или ProFTPD). Однако в 2026 году этот подход создает сплошные проблемы с безопасностью и удобством.
В этой практической инструкции мы разберем современную и легковесную альтернативу — Filebrowser. Мы развернем его в Docker Compose за 5 минут, настроим безопасный Nginx Reverse Proxy с авто-SSL, снимем ограничения на размер загружаемых файлов и организуем удобный шеринг ссылок с защитой паролем.
1. Почему протокол FTP устарел и в чем проблема SFTP для клиентов
Протокол FTP (File Transfer Protocol) был разработан еще в 1971 году (RFC 114) — в эпоху, когда об информационной безопасности не думали. Эксплуатация FTP на современном VDS сопряжена с критическими недостатками:
- Передача паролей открытым текстом: Аутентификация в классическом FTP не шифруется. Любой перехват трафика между вашим компьютером и сервером раскрывает учетные данные. FTPS решает эту проблему лишь частично, создавая хаос с самоподписанными сертификатами.
- Кошмар с портами и NAT (Active/Passive mode): Для передачи данных FTP открывает случайный диапазон портов (PASV ports). Это заставляет сисадмина дырявить фаервол UFW/iptables диапазоном из сотен портов (например, 40000–50000), что ломает работу за корпоративными NAT и роутерами.
- Необходимость специального ПО: Чтобы зайти на FTP, пользователю нужно установить и настроить FileZilla, Total Commander или WinSCP. Передать файл клиенту или контент-менеджеру со смартфона становится неразрешимой задачей.
Многие администраторы переходят на SFTP (SSH File Transfer Protocol). С точки зрения шифрования это безупречно, но возникает другая фундаментальная проблема: «Каждый пользователь SFTP — это системный аккаунт Linux». Чтобы дать дизайнеру или копирайтеру доступ к папке с картинками, вам приходится создавать пользователя в /etc/passwd, настраивать сложный изолированный Chroot Jail в sshd_config и следить, чтобы он случайно не получил доступ к командной оболочке Bash.
⚠️ Чем опасен SFTP для сторонних пользователей
Малейшая ошибка в конфигурации ChrootDirectory в SSH позволяет непривилегированному пользователю обойти ограничения и прочитать конфигурационные файлы других проектов на сервере (например, .env или wp-config.php с паролями к базам данных).
2. Архитектура Filebrowser: почему 15 МБ RAM эффективнее Nextcloud
Когда сисадмины устают от FTP, первой мыслью часто бывает установка Nextcloud или ownCloud. Но Nextcloud — это тяжеловесный корпоративный комбайн:
- Стек требует PHP-FPM, СУБД (PostgreSQL или MariaDB), кэширование Redis, демоны очередей и планировщик cron.
- Потребление оперативной памяти стартует от 1.5–2 ГБ RAM, создавая постоянную фоновую нагрузку на процессор.
- На скромном VDS за 300–400 ₽ такой комбайн оставляет мало ресурсов для боевых сайтов и баз данных.
Filebrowser решает задачу изящно:
- Один бинарник на языке Go: Никаких интерпретаторов, внешних рантаймов и зависимостей.
- Микропотребление ресурсов: В режиме ожидания контейнер Filebrowser потребляет всего 15–20 МБ оперативной памяти и 0% CPU.
- Встроенная база SQLite: Все пользователи, хеши паролей и публичные ссылки хранятся в одном компактном файле
filebrowser.dbразмером в пару мегабайт. - Современный веб-интерфейс: Drag-and-drop загрузка папок целиком, встроенный редактор кода с подсветкой синтаксиса, встроенный просмотр изображений, аудио, видео и PDF прямо во вкладке браузера.
💡 Концепция «Окно в файловую систему»
В отличие от облачных хранилищ, Filebrowser не требует импорта или переиндексации файлов в закрытые хранилища. Он монтирует любую существующую директорию вашего VDS (например, /var/www или /backups) и работает с ней напрямую. Если скрипт на сервере создал файл, он мгновенно виден в веб-панели без ручной синхронизации.
3. Развертывание в Docker Compose с лимитами и привязкой к 127.0.0.1
Для развертывания создадим отдельную изолированную директорию /opt/filebrowser на сервере.
Подготовка структуры каталогов
Перед запуском контейнера выполните подготовительные команды в терминале:
sudo mkdir -p /opt/filebrowser/data
cd /opt/filebrowser
# КРИТИЧЕСКИ ВАЖНО: создать пустой файл базы данных заранее!
# Если не выполнить touch, Docker создаст директорию filebrowser.db, и контейнер упадет с ошибкой.
touch filebrowser.db
Манифест docker-compose.yml
Создайте конфигурационный файл docker-compose.yml со строгими ограничениями ресурсов и безопасной привязкой порта:
services:
filebrowser:
image: filebrowser/filebrowser:latest
container_name: filebrowser
restart: unless-stopped
# Привязка СТРОГО к 127.0.0.1 для исключения прямого доступа в обход фаервола
ports:
- "127.0.0.1:8080:80"
volumes:
# Папка, файлами которой вы хотите управлять (окно в файловую систему)
- /opt/filebrowser/data:/srv
# База данных SQLite с пользователями и настройками
- ./filebrowser.db:/database/filebrowser.db
environment:
- PUID=1000
- PGID=1000
# Лимиты ресурсов на верхнем уровне для защиты VDS от OOM Killer
mem_limit: 256m
cpus: 0.50
Запустите контейнер в фоновом режиме:
docker compose up -d
Убедитесь, что служба успешно запустилась и слушает локальный сокет:
docker compose ps
curl -I http://127.0.0.1:8080
4. Регламент безопасности: анализ незакрытых CVE и жесткий харденинг
31 августа 2026 года основной репозиторий Filebrowser был официально переведен в архивный режим с фиксацией версии v2.63.23 («There will be no further releases, bug fixes, or security fixes»). Это не означает, что инструмент нельзя использовать, но требует от сисадмина нулевого доверия и глубокого понимания незакрытых уязвимостей.
Матрица известных уязвимостей Filebrowser (≤ v2.63.23)
| Идентификатор CVE | Вектор атаки | Последствия уязвимости | Метод митигации |
|---|---|---|---|
| CVE-2025-52904 | Command Execution (Shell) | Обход ограничений Scope при включенном командном раннере и чтение любых системных файлов хоста. | Флаг --disable-exec=true |
| CVE-2026-82235 | Denial of Service (DoS) | Блокирующие системные вызовы при распаковке архивов с именованными каналами (FIFO/named pipes). | Лимиты ресурсов Compose |
| GHSA-7w29-q235-57m9 | Symlink Traversal | Символические ссылки позволяют обойти правила фильтрации путей (path deny rules). | Изолированный том /srv/data |
| GO-2026-6026 | JWT Session Replay | Токены авторизации не отзываются на сервере при смене пароля и остаются активными до истечения срока. | Перезапуск контейнера при утечке |
Инженерные правила защиты архивного стека:
- Проверка флага disable-exec: В новых установках он выключен, но при обновлении старых баз или конфигов убедитесь, что параметр
--disable-exec=trueактивен. Никогда не давайте пользователям веб-панели доступ к системной оболочке. - Монтирование строго выделенной папки: Никогда не пробрасывайте в контейнер корень сервера
/:/srv. Монтируйте исключительно целевую пользовательскую папку (например,/opt/filebrowser/data:/srv). - Альтернативы для высоких требований ИБ: Если корпоративная политика запрещает использование архивного ПО без регулярных патчей безопасности, рассмотрите форк с активной поддержкой Filebrowser Quantum либо разверните приватное объектное хранилище MinIO с гранулярными IAM-политиками и аудитом действий.
В сентябре 2026 года команда проекта объявила об архивации основного репозитория Filebrowser в связи со стабильностью ядра. Программа полностью пригодна к эксплуатации, однако сисадмину необходимо строго соблюдать три правила харденинга:
- Категорический запрет встроенного раннера команд (disable-exec):
В Filebrowser исторически присутствовала функция выполнения шелл-команд из интерфейса (Runner / Hooks). По умолчанию она отключена (
--disable-exec=true). Ни в коем случае не включайте флаг--disable-exec=false. Веб-панель должна служить только для операций с файлами, а не превращаться в веб-терминал с правами выполнения кода. - Особенности сессий на базе JWT: Аутентификация в Filebrowser построена на stateless JWT-токенах. Это означает, что при смене пароля ранее выданные сессионные токены продолжают жить до момента истечения своего тайм-аута. Если вы подозреваете утечку сессии, перезапустите контейнер либо удалите файл сессий в базе.
- Изоляция прав доступа к файлам (PUID / PGID):
По умолчанию файлы, загружаемые через интерфейс, получают владельца внутри контейнера. Переменные
PUID=1000иPGID=1000гарантируют, что файлы на диске VDS будут принадлежать вашему обычному системному пользователю, исключая конфликты прав с веб-сервером Nginx.
⚠️ Никогда не публикуйте порт 8080 наружу через 0.0.0.0:8080:80
Docker создает правила в цепочке PREROUTING iptables в обход стандартного фаервола UFW. Если написать 8080:80 вместо 127.0.0.1:8080:80, порт станет доступен любому боту во всем интернете без HTTPS-шифрования. Всегда проксируйте трафик через Nginx с валидным SSL-сертификатом!
5. Настройка Nginx Reverse Proxy: снятие лимита body_size и потоковая передача
Для удобного доступа по доменному имени (например, files.domain.ru) и защиты HTTPS-шифрованием настроим Nginx в качестве обратного прокси-сервера.
Особенности проксирования файловых менеджеров
Если использовать типовой конфиг Nginx, вы столкнетесь с двумя неприятными проблемами:
- Ошибка 413 Request Entity Too Large: По умолчанию Nginx запрещает передачу файлов крупнее 1 МБ.
- Зависание при загрузке тяжелых файлов: По умолчанию Nginx включает буферизацию (
proxy_request_buffering on) — он сначала полностью сохраняет 10-гигабайтный файл во временную папку/var/lib/nginx/bodyна диск сервера, и только потом начинает передавать его в контейнер. Диск сервера изнашивается двойной записью, а прогресс-бар в браузере замирает.
Эталонный конфигурационный файл Nginx
Для защиты от DoS-атак Slowloris (когда злоумышленник пытается исчерпать воркеры Nginx, передавая файл по 1 байту в секунду при отключенной буферизации), добавим зону лимитов limit_conn_zone $binary_remote_addr zone=addr:10m; в /etc/nginx/nginx.conf (в секцию http), а в виртуальном хосте настроим строгий client_body_timeout:
# В /etc/nginx/nginx.conf внутри блока http:
limit_conn_zone $binary_remote_addr zone=addr:10m;
Затем создайте виртуальный хост в /etc/nginx/sites-available/filebrowser.conf:
server {
listen 80;
server_name files.domain.ru;
# 1. Отключаем лимит на размер тела запроса (0 = без ограничений)
client_max_body_size 0;
# 2. Отключаем буферизацию для потоковой передачи больших файлов
proxy_request_buffering off;
proxy_buffering off;
# 3. Защита от Slowloris DoS: жесткий лимит времени на передачу тела запроса
# Если клиент перестает передавать байты более 30 секунд — соединение сбрасывается
client_body_timeout 30s;
client_header_timeout 30s;
# 4. Ограничение количества одновременных подключений с одного IP
limit_conn addr 15;
# 5. Таймауты ожидания ответа от бэкенда
proxy_connect_timeout 60s;
proxy_send_timeout 600s;
proxy_read_timeout 600s;
location / {
proxy_pass http://127.0.0.1:8080;
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;
# Поддержка WebSocket для интерактивного интерфейса
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
Активируйте сайт и проверьте конфигурацию:
sudo ln -s /etc/nginx/sites-available/filebrowser.conf /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
Выпуск бесплатного SSL-сертификата Let's Encrypt
Запустите Certbot для автоматической настройки HTTPS и HTTP/2:
sudo certbot --nginx -d files.domain.ru --redirect
6. Управление пользователями, правами доступа и публичными ссылками
После настройки Nginx откройте адрес https://files.domain.ru в браузере.
Первый вход и немедленная смена пароля
Стандартные учетные данные при первом запуске:
- Логин:
admin - Пароль:
admin
⚠️ Смените пароль admin сразу после первого входа!
Пароль по умолчанию знают все автоматические боты. Сразу перейдите в меню Settings → Profile Settings, введите надежный пароль длиной от 14 символов и сохраните изменения.
Создание изолированных пользователей (Scope)
Если вам нужно выдать доступ коллеге, дизайнеру или клиенту:
- Перейдите в раздел Settings → User Management → New.
- Укажите логин и пароль.
- В поле Scope укажите относительный путь к изолированной папке (например,
/uploads/client1). Пользователь не сможет выйти за пределы указанной папки. - Настройте матрицу разрешений (Permissions):
Allow creation— разрешение создавать файлы и папки.Allow deletion— разрешение удалять (снимите галочку для клиентов, чтобы они случайно не стерли данные).Allow modify— редактирование и переименование.Allow share— право делиться ссылками с внешними людьми.
Генерация публичных ссылок на скачивание
Чтобы отправить файл человеку, у которого нет учетной записи на вашем сервере:
- Наведите курсор на нужный файл или папку и нажмите кнопку Поделиться (Share).
- Выберите срок действия ссылки (1 час, 1 день, 1 неделя или бессрочно).
- При необходимости задайте отдельный защитный пароль.
- Скопируйте сгенерированную короткую ссылку и отправьте адресату. Получатель сможет скачать файл в один клик без авторизации.
7. Сравнение Filebrowser, SFTP, Nextcloud и MinIO
Выбирая инструмент для работы с файлами на сервере, важно понимать архитектурное предназначение каждого решения:
| Критерий | Filebrowser | SFTP (SSH) | Nextcloud | MinIO (S3) |
|---|---|---|---|---|
| Потребление RAM | 15–20 МБ | 5–10 МБ | 1.5–2 ГБ+ | 150–300 МБ |
| Интерфейс доступа | Веб-браузер (любое устройство) | Только FTP-клиент (FileZilla) | Веб, Desktop, Мобильное приложение | Веб-консоль, S3 API / CLI |
| Публичные ссылки | Да (с паролем и таймером) | Нет | Да (расширенные возможности) | Да (Presigned URLs) |
| Безопасность клиентов | Изоляция в папке (Scope) | Риск доступа к шеллу сервера | Изолированные пользователи | IAM-политики корзин |
| Идеальный сценарий | Управление файлами сайта и передача данных | Личный доступ сисадмина | Корпоративный офис и документы | Бэкапы и медиа-хранилище по API |
8. Регламент обслуживания и резервное копирование базы filebrowser.db
Поскольку Filebrowser хранит все пользовательские настройки и ссылки в единой базе SQLite, резервное копирование сводится к сохранению одного файла.
Горячий бэкап базы данных без остановки контейнера
Не копируйте файл базы обычной командой cp в момент активной работы, чтобы не получить поврежденный снимок. Используйте встроенную команду SQLite:
sqlite3 /opt/filebrowser/filebrowser.db ".backup '/opt/filebrowser/filebrowser_backup_$(date +%F).db'"
Проверка сетевой безопасности
После развертывания обязательно убедитесь, что порт контейнера 8080 не торчит наружу в интернет:
- Проверьте открытые порты с помощью утилиты Сканер портов онлайн от SysKit. Введите внешний IP вашего VDS и проверьте порт
8080. Статус обязан быть «Порт закрыт». - Проверьте валидность HTTPS-сертификата с помощью SSL Checker.
- Если вы создаете новых пользователей, сгенерируйте для них криптостойкие пароли в нашем Генераторе паролей онлайн.
🎯 Ищете быстрый VDS для файлового хранилища?
Разверните свой файловый сервер на скоростных NVMe VDS с неограниченным трафиком и защитой от сетевых атак у ведущих провайдеров.
Выбрать скоростной VDS для файловРекомендуемые VDS-провайдеры
Отказоустойчивые сервера с быстрыми NVMe и каналом до 1 Гбит/с
Timeweb Cloud — Скоростные NVMe VDS
Быстрые NVMe-диски и гигабитный канал связи для моментальной отдачи и загрузки тяжелых файлов любого объема.
Selectel — Корпоративная инфраструктура
Надежные серверы уровня Tier III с возможностью подключения объемных сетевых дисков для масштабных файловых архивов.
Beget — Простота и отказоустойчивость
Быстрое развертывание Docker в 1 клик, удобный мониторинг дискового пространства и бесплатные снимки системы.