v0.2 — Открытый код · Лицензия MIT

Файловый менеджер, встраиваемый куда угодно

PHP ≥ 8.1 + Flysystem 3. Интерфейс Alpine.js. Local, S3, Cloudflare R2, SFTP. Встраивайте несколькими строками JavaScript.

PHP ≥ 8.1
Без фреймворков
~3 KB
Размер SDK
MIT
Открытая лицензия
16
Поддержка языков
Демо

Посмотрите в действии

Creating a FluxFiles share link with an expiry, a password and a download limit
Ссылка на файл — срок, пароль, лимит скачиваний
Creating a FluxFiles upload portal with a file limit, size cap and allowed file types
Порталы загрузки — без регистрации
FluxFiles links panel listing shared links with views, downloads and revoke
Управляйте ссылками и отзывайте их в любой момент
FluxFiles desktop file manager with image thumbnails
Сетка с мгновенными WebP-миниатюрами
FluxFiles browsing an S3 / R2 bucket with the local, S3 and SFTP disk switcher
Мультиоблако — S3 / R2 / SFTP в одном UI
FluxFiles managing a remote VPS deploy directory over SFTP, same UI as the S3 bucket
Удалённый VPS по SFTP — без FTP-клиента
Editing an nginx config file inside FluxFiles with syntax highlighting
Правьте конфиги на месте — без SSH и FTP
FluxFiles previewing a video inline in the detail panel
Просмотр видео, аудио и PDF без скачивания
FluxFiles Bucket Doctor health checks for an S3 bucket with CORS and IAM remediation
Bucket Doctor — проверки S3/R2 + исправления
FluxFiles activity log of file operations
Журнал действий — хранится в вашем бакете
FluxFiles trash with restore and delete forever
Корзина — восстановить или удалить навсегда
FluxFiles responsive mobile file manager
Адаптивно на мобильных
Преимущество · BYOB

Файлы ваших клиентов остаются в бакетах ваших клиентов

FluxFiles — встраиваемый файловый менеджер, в котором каждый арендатор подключает собственный бакет S3/R2, а вы не храните ни их данные, ни их учётные данные.

  • Суверенитет данных

    Файлы хранятся в облачном аккаунте и регионе самого клиента — создано для GDPR, комплаенса и корпоративных закупок.

  • Ноль данных и ключей в покое

    Учётные данные бакета шифруются AES-256-GCM внутри JWT и расшифровываются только во время выполнения — их никогда не пишут в базу или лог.

  • Затраты на хранение, масштабируемые до нуля

    Хранение и трафик оплачивает каждый клиент, а не вы. Никакого счёта за хранилище, растущего вместе с базой пользователей.

  • Без состояния и встраиваемо

    Никакой центральной базы. Встройте пикер в любое приложение через iframe или SDK; ваш бэкенд выпускает ограниченный краткоживущий токен.

Ваше SaaS-приложение
ограниченный JWT (шифр. ключи)
FluxFiles
расшифровка только в рантайме
Арендатор A
свой бакет
Арендатор B
свой бакет
Арендатор C
свой бакет

Как это работает: ваше приложение шифрует учётные данные бакета арендатора в краткоживущий JWT (HKDF-SHA256 + AES-256-GCM). FluxFiles расшифровывает их только для выполнения запрошенной операции.

Мультиарендность

Один токен на арендатора — у каждого свои правила

FluxFiles не хранит состояние: JWT, который выпускает ваш бэкенд, и есть конфигурация арендатора. Путь хранения, лимит размера файла, квота, число файлов, разрешённые типы, права — всё применяется на сервере. Никаких конфиг-файлов на арендатора и перезапусков.

// Your backend, per request — the token IS the tenant's config.
import { createToken } from '@fluxfiles/node';

const claims = tenant.plan === 'pro'
  // 100 MB/file · any type · 50 GB · unlimited files · own bucket
  ? { disks: ['s3'],    maxUploadMb: 100, allowedExt: null,
      maxStorageMb: 51200, maxFiles: 0 }
  // 5 MB/file · images only · 500 MB · 200 files
  : { disks: ['local'], maxUploadMb: 5,   allowedExt: ['jpg','png','webp'],
      maxStorageMb: 500,   maxFiles: 200 };

const token = createToken({
  secret: process.env.FLUXFILES_SECRET,
  userId: tenant.id,
  prefix: `tenant_${tenant.id}/`,   // isolates each tenant's files
  perms:  ['read', 'write', 'delete'],
  ...claims,
});
prefix disks / BYOB max_upload max_storage max_files allowed_ext perms

В связке с BYOB каждый арендатор размещается в собственном бакете.

Для кого

Создано для команд, выпускающих функции работы с файлами

Если вашему продукту нужны загрузки, FluxFiles встраивается — не делая вас хранителем данных ваших клиентов.

SaaS и мультиарендные приложения

Дайте каждому клиенту файловый менеджер на его собственном бакете. Ограничение токена по арендатору и суверенитет данных встроены.

Агентства и фрилансеры

Поставляйте каждому клиенту аккуратную медиатеку без развёртывания инфраструктуры хранения под каждый проект.

Интеграции с CMS и редакторами

Встройте выбор медиа в CKEditor, TinyMCE, Summernote или ваш редактор через iframe SDK.

Внутренние инструменты и дашборды

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

Возможности

Всё, что нужно современному файловому менеджеру

Создан для разработчиков, которым нужна гибкость.

Мульти-хранилище

Локальное, AWS S3, Cloudflare R2, SFTP через Flysystem v3 — меняйте в конфиге без правки кода.

Встраивайте куда угодно

iframe + postMessage SDK. Автономный UI на Alpine.js (без сборки). С любым фреймворком.

JWT авторизация + скоупинг

Префикс пути, права, белый список дисков, режим только владелец.

AI авто-теги

Claude / OpenAI vision — автоматический alt-текст, заголовок, теги.

Обрезка изображений

Инструмент обрезки с предустановками пропорций.

Оптимизация изображений

Автоматические WebP-варианты — миниатюра, средний, большой.

Предподписанные загрузки

Браузер загружает напрямую в S3/R2 — нулевая нагрузка на ваш сервер.

Загрузка частями

S3 multipart для файлов > 10МБ.

Полнотекстовый поиск

Индексированный поиск по именам, заголовкам, тегам — на файлах, без базы данных.

Массовые операции

Множественный выбор: перемещение, копирование, удаление, скачивание.

Кросс-диск перенос

Копирование/перемещение между Локальным ↔ S3 ↔ R2.

Корзина

Восстановимое удаление с автоочисткой.

SEO метаданные

Заголовок, alt, подпись, теги — метаданные S3 (облако) или sidecar JSON (локально). Полнотекстовый поиск.

Тёмный режим

Светлая / тёмная / авто в UI и SDK.

16 языков

По умолчанию английский. Локаль через SDK, URL (?locale=) или FLUXFILES_LOCALE. RTL для арабского.

Журнал аудита

Все действия записи логируются.

Ограничение скорости

Token bucket для каждого пользователя.

Квота хранилища

Лимиты для каждого пользователя через JWT claims.

BYOB бакеты

Свой S3/R2 пользователя — учётные данные в JWT (AES-256-GCM).

Обнаружение дубликатов

Совпадение SHA-256 пропускает лишние загрузки кроме принудительной перезаписи.

Обновление токена SDK

onTokenRefresh при 401 — объединённое обновление, повтор, updateToken().

Bucket Doctor

Диагностика любого диска S3/R2 — учётные данные, чтение/запись/удаление, presign, CORS, multipart — с готовыми к вставке исправлениями IAM и CORS. Подключайте BYOB-бакеты за минуты.

Node token SDK

Выпускайте токены FluxFiles из любого JS-бэкенда (Express, Next.js, Nuxt) с @fluxfiles/node — побайтово совместимо с PHP-ядром. PHP для выпуска токенов не нужен.

Диск SFTP

Третий драйвер после S3/R2 — превратите любой VPS или хостинг в файловый менеджер.

Редактор кода / конфигов

Редактируйте текст и конфиги (wp-config.php, .env) в браузере, как в cPanel.

Zip и распаковка

Скачайте выбранное как zip или распакуйте архив — защита от zip-slip и бомб.

Водяной знак

Накладывайте текст или логотип на лету для защиты превью — оригинал не меняется.

WebP + AVIF по запросу

Отдавайте любой размер изображения как кэшированный AVIF/WebP по одному URL (согласование через Accept), с готовым адаптивным srcset.

Права SFTP

Меняйте права Unix (chmod) на SFTP-дисках через диалог в стиле cPanel.

Панель использования

Хранилище с первого взгляда — квота и разбивка по типам и папкам.

Предпросмотр медиа

Встроенный просмотр фото, видео, аудио и PDF; приватные локальные медиа — безопасно.

Быстрая установка

Запуск за 2 минуты

composer require fluxfiles/fluxfiles
cp .env.example .env

# .env
FLUXFILES_SECRET=your-random-32-char-secret
FLUXFILES_ALLOWED_ORIGINS=https://yourapp.com

require_once 'vendor/autoload.php';

$token = fluxfiles_token(
    userId: 'user-123',
    perms: ['read', 'write', 'delete'],
    disks: ['local', 's3', 'r2'],
    prefix: 'user-123/',
    maxUploadMb: 10,
    allowedExt: null,
    ttl: 3600
);
composer require fluxfiles/laravel
php artisan vendor:publish --tag=fluxfiles-config

# .env — point the adapter at your FluxFiles server
FLUXFILES_ENDPOINT=https://fm.yourdomain.com
FLUXFILES_SECRET=your-secret-min-32-chars

# Optional: match CORS on the FluxFiles host
# FLUXFILES_ALLOWED_ORIGINS=https://yourapp.com

# Config: config/fluxfiles.php
npm install @fluxfiles/node

// Express / Next.js route — mint a token from your JS backend (no PHP)
import { createToken } from '@fluxfiles/node';

app.get('/fluxfiles-token', (req, res) => {
    const token = createToken({
        secret: process.env.FLUXFILES_SECRET, // >= 32 bytes
        userId: req.user.id,
        perms: ['read', 'write', 'delete'],
        prefix: `users/${req.user.id}`,
        ttl: 3600,
    });
    res.json({ token });
});
<!-- Demo: unpkg. In production, serve fluxfiles.js from your FluxFiles host -->
<script src="https://unpkg.com/fluxfiles@latest/fluxfiles.js"></script>

<script>
FluxFiles.open({
    endpoint: 'https://your-api.com',
    token: 'eyJhbGci...',
    disk: 'local',
    mode: 'picker',
    container: '#file-picker',
    onSelect: function(file) {
        console.log('Selected:', file.url);
    },
    async onTokenRefresh() {
        const r = await fetch('/api/auth/refresh-fluxfiles-token');
        const { token } = await r.json();
        return token;
    }
});
</script>
npm install @fluxfiles/react

import { FluxFilesModal } from '@fluxfiles/react';

<FluxFilesModal
    open={open}
    endpoint="https://your-api.com"
    token={token}
    onSelect={(file) => console.log(file)}
    onClose={() => setOpen(false)}
/>
npm install @fluxfiles/vue

<script setup>
import { FluxFilesModal } from '@fluxfiles/vue';
</script>

<FluxFilesModal
    v-model:open="open"
    endpoint="https://your-api.com"
    :token="token"
    @select="onSelect"
    @close="open = false"
/>
git clone https://github.com/thai-pc/fluxfiles.git
docker build -f fluxfiles/docker/Dockerfile.prod -t fluxfiles fluxfiles

docker run -p 8080:80 \\
  -e FLUXFILES_SECRET=your-random-32-char-secret \\
  fluxfiles

# UI: http://localhost:8080/public/index.html
git clone https://github.com/thai-pc/fluxfiles.git
cd fluxfiles
composer install -d packages/core
cp .env.example .env

cd packages/core
php -S localhost:8080 router.php

# UI:  http://localhost:8080/public/index.html
# API: http://localhost:8080/api/fm/list?disk=local&path=

Работает с

Laravel WordPress React / Next.js Vue / Nuxt CKEditor 4 TinyMCE Summernote Any framework

Интеграции

Готовые адаптеры для вашего стека

Официальные адаптеры нативно встраивают FluxFiles во фреймворки и редакторы, которыми вы уже пользуетесь.

Laravel
PHP
WordPress
Plugin
React
Component
Vue / Nuxt
Component
CKEditor 4
Plugin
TinyMCE
Plugin
Summernote
Plugin

Встраивание

Встройте в несколько строк

Подключите fluxfiles.js, передайте JWT, выпущенный на сервере, и разместите полноценный файловый менеджер — или модальное окно выбора файлов — на любой странице.

<script src="https://fm.example.com/fluxfiles.js"></script>

FluxFiles.open({
  endpoint: 'https://fm.example.com',
  token: 'eyJhbGci...',   // JWT from your backend
  disk: 'local',
  mode: 'picker',         // select & close
  theme: 'auto',
  onSelect(file) {
    // { url, key, name, size, disk, meta, variants }
    document.querySelector("#img").src = file.url;
  },
});
<div id="fm" style="height:600px"></div>

FluxFiles.open({
  endpoint: 'https://fm.example.com',
  token: 'eyJhbGci...',
  mode: 'browser',          // full manager, stays open
  container: '#fm',         // omit for a modal overlay
  disks: ['local', 's3', 'r2'],
});

FluxFiles.on('FM_EVENT', (e) => console.log(e.event));
FluxFiles.navigate('/photos/2024');
import { FluxFilesModal } from '@fluxfiles/react';

function Picker({ open, setOpen, token }) {
  return (
    <FluxFilesModal
      open={open}
      endpoint="https://fm.example.com"
      token={token}
      onSelect={(file) => console.log(file.url)}
      onClose={() => setOpen(false)}
    />
  );
}

Токены выпускаются на сервере — никогда не передавайте секрет в браузер.

Почему FluxFiles

Создан для того, о чём другие забыли

Свайп для сравнения
Функция FluxFiles elFinder Laravel-FM RichFilemanager Responsive FM
S3 + R2 + Локальное + SFTP
Встраивание в любой фреймворк
JWT авторизация + скоупинг
SEO метаданные
AI авто-теги
Обрезка изображений
Загрузка частями
Полнотекстовый поиск
Тёмный режим
16 языков
PHP ≥ 8.1
Активно поддерживается
Современный UI
против файловых API-SaaS

Self-hosted и встраиваемый — а не очередной SaaS для загрузок

Хостинговые файловые API хороши, но они хранят ваши данные и берут плату за использование. FluxFiles работает в вашем стеке, и каждый арендатор — на своём бакете.

Свайп для сравнения
Возможность FluxFiles Filestack Uploadcare Cloudinary Supabase Storage
Self-hosted (работает в вашей инфраструктуре)
BYOB — собственный бакет каждого клиента
Встраиваемый UI файлового менеджера
Открытый код (MIT)
Без SaaS-платы за хранение / за загрузку
Мультихранилище (S3 / R2 / локально)
Встроенное ограничение токена по арендатору

Сравнение отражает типичные предложения по умолчанию; каждый продукт силён в своей области. Ниша FluxFiles — сочетание встраиваемости, self-hosted и bring-your-own-bucket.

Продаваемые продукты

Больше, чем управление файлами — продавайте и принимайте их

Бесплатное ядро встраивает файловый менеджер. Платные модули превращают его в продукты, за которые платят ваши клиенты.

Pro

Branded Share

Отправьте брендовую самообслуживаемую ссылку на любой файл или папку — со сроком, паролем, лимитом загрузок и аналитикой. Ваш логотип, ваш домен.

  • Ссылки со сроком / защитой паролем
  • Лимиты загрузок + аналитика просмотров
  • Ограниченный токен — получателю не нужен аккаунт
Pro

Upload Portals

Публичная страница «пришлите нам файлы», которая попадает прямо в ваше хранилище. Идеально для агентств, фотографов и онбординга клиентов — загружающему не нужен аккаунт.

  • Публичный портал → ваш бакет
  • Лимиты размера / типа / срока по порталу
  • Анонимная загрузка, в области владельца
Enterprise

Compliance bundle

Антивирус, происхождение контента C2PA и хранение аудита — для регулируемых и корпоративных развёртываний.

WordPress

Один плагин вместо трёх

В WordPress FluxFiles — это и клиентский файловый портал, И медиа-менеджер — заменяя отдельные плагины папок, облака и offload.

Возможность FluxFiles FileBird WP Media Folder WP Offload
Медиа-папки
Хранилище S3 / R2 / SFTP
Offload + переписывание URL
Клиентские порталы загрузки
Брендовые ссылки
Типичная цена Одна лицензия $49/год $69/год платно

Папки + облако + offload + клиентские порталы в одном — вместо оплаты FileBird и WP Media Folder и WP Offload по отдельности.

Цены

Ядро бесплатно. Платите только за платные модули.

Ядро MIT бесплатно навсегда. Апгрейд до двух ключевых продуктов — Брендовые ссылки + Порталы загрузки — и далее.

Бесплатно (Ядро)

$0 навсегда

Полный файловый менеджер MIT, self-hosted.

Начать
  • Хранилище Local / S3 / R2 / SFTP, области JWT
  • WebP + AVIF по запросу + оптимизация изображений/PDF
  • Водяной знак, хук версий, панель использования, авто-теги ИИ
  • 7 адаптеров + BYO-embed терминал / PDF / office / э-подпись
Популярный

Pro

$79 /год

Отправляйте и принимайте файлы с клиентами.

СкороСкоро
  • Всё из бесплатного
  • Брендовые ссылки — со сроком / паролем / лимитом / аналитикой
  • Порталы загрузки — публичное «пришлите файлы», без аккаунта
  • Приоритетная поддержка + обновления

Studio

$299 /год

Создайте продукт на FluxFiles.

СкороСкоро
  • Всё из Pro
  • Версионирование + Webhooks (Zapier/Make/n8n)
  • ИИ-зрение + OCR (свой ключ)
  • Мультиарендные уровни + white-label

Enterprise

Индивидуально

Комплаенс, в масштабе.

Связаться с отделом продаж
  • Всё из Studio
  • Антивирус + происхождение C2PA + хранение аудита
  • SSO-мост + индивидуальный онбординг
  • SLA + приоритетная дорожная карта

Фикс-цена, безлимит сайтов — без оплаты за файл/вызов. Годовая экономит ~2 месяца; доступен вариант навсегда. Возврат 14 дней. НДС покупателя — при оплате.

Вопросы и ответы

Часто задаваемые вопросы

FluxFiles бесплатный и с открытым кодом?
Да — лицензия MIT, бесплатный самостоятельный хостинг, опубликован в Composer и npm. Без платных тарифов и лимитов использования.
Где хранятся мои файлы?
Там, куда вы укажете: локальный диск, AWS S3, Cloudflare R2 или удалённый сервер через SFTP — всё через Flysystem. Хранилище принадлежит вам — ничего не проходит через третьих лиц.
Как работает аутентификация?
Stateless JWT (HS256): вы выпускаете токен на сервере с детальными клеймами (права, диски, область пути, лимиты), поэтому каждый пользователь видит только то, что вы разрешили.
Нужен ли моим пользователям аккаунт FluxFiles?
Нет. FluxFiles доверяет JWT, выпущенному вашим приложением, поэтому подключается к вашей существующей аутентификации — отдельной системы пользователей не нужно.
Можно ли встроить его в моё приложение или редактор?
Да — iframe + JS SDK работает на любой странице, есть официальные адаптеры для Laravel, WordPress, React, Vue/Nuxt, CKEditor 4, TinyMCE и Summernote.
Что нужно для запуска?
PHP 8.1+ с несколькими распространёнными расширениями и Composer. Укажите диск, задайте секрет и разрешённые источники, затем запустите — работает на небольшом VPS.
Что входит в платные тарифы?
Ядро бесплатно (MIT). Платные тарифы открывают модули порталов: Брендовые ссылки (со сроком/паролем) и Порталы загрузки (публичное «пришлите файлы»), плюс Версионирование, Webhooks, ИИ-зрение/OCR и комплаенс-набор на старших тарифах.
Как активировать лицензию?
После покупки вы получаете ключ лицензии. Задайте FLUXFILES_LICENSE_KEY в окружении, и модули откроются — проверка офлайн (без phone-home), работает даже в air-gap.
Разовая оплата или подписка?
И то, и другое. Помесячно для старта без обязательств, ежегодно ради экономии (~2 месяца бесплатно) или разовая пожизненная. Истёкшая лицензия продолжает запускать вашу версию; приостанавливаются лишь обновления/поддержка.

Готовы встроить FluxFiles?

Добавьте готовый к продакшену файловый менеджер в своё приложение за считаные минуты — без привязки к фреймворку, лицензия MIT.