どこにでも埋め込めるファイルマネージャー
PHP ≥ 8.1 + Flysystem 3。Alpine.js UI。Local、S3、Cloudflare R2、SFTP。数行の JavaScript で埋め込み。
実際の動作を確認
お客様のファイルは、お客様自身のバケットに保存
FluxFiles は埋め込み可能なファイルマネージャー。各テナントが自分の S3/R2 バケットを接続し、あなたが彼らのデータや認証情報を保存することは一切ありません。
-
データ主権
ファイルは顧客自身のクラウドアカウントとリージョンに保存——GDPR・コンプライアンス・企業調達に最適。
-
保存時はデータも認証情報もゼロ
バケットの認証情報は JWT 内で AES-256-GCM 暗号化され、実行時のみ復号——データベースやログには一切書き込みません。
-
ストレージコストはゼロまでスケール
ストレージと転送量は各顧客に課金され、あなたには課金されません。ユーザー増加で膨らむ請求はありません。
-
ステートレスで埋め込み可能
中央データベース不要。iframe か SDK でピッカーを任意のアプリに埋め込み、あなたのバックエンドがスコープ付きの短命トークンを発行します。
仕組み:アプリがテナントのバケット認証情報を短命の JWT(HKDF-SHA256 + AES-256-GCM)に暗号化。FluxFiles は要求された操作の実行時のみ復号します。
テナントごとに1つのトークン — それぞれ独自のルール
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,
}); BYOB と組み合わせれば各テナントを自分のバケットに分離できます。
ファイル機能を提供するチームのために
アップロードが必要な製品なら、FluxFiles をそのまま組み込めます — 顧客データの「管理人」になることなく。
SaaS・マルチテナントアプリ
各顧客に自分のバケット上のファイルマネージャーを提供。テナント単位のトークン制限とデータ主権を標準装備。
代理店・フリーランス
プロジェクトごとにストレージ基盤を立てずに、洗練されたメディアライブラリを各クライアントへ。
CMS・エディタ連携
iframe SDK で CKEditor、TinyMCE、Summernote、または自作エディタにメディアピッカーを追加。
社内ツール・ダッシュボード
管理画面にアップロード・プレビュー・監査付きファイル操作を半日で追加。
モダンなファイルマネージャーに必要なすべて
柔軟性を求める開発者のために構築。
マルチストレージ
ローカル、AWS S3、Cloudflare R2, SFTP — Flysystem v3経由。設定で切替、コード変更不要。
どこにでも埋め込み
iframe + postMessage SDK。スタンドアロンUIはAlpine.js(ビルド不要)。どのフレームワークでも可。
JWT認証 + スコーピング
ユーザーごとのパスプレフィックス、権限、ディスクホワイトリスト、owner-onlyモード。
AI自動タグ
Claude / OpenAI vision — altテキスト、タイトル、タグを自動生成。
画像クロップ
アスペクト比プリセット付きインラインクロップツール。
画像最適化
WebPバリアント自動生成 — サムネイル、中、大。
署名付きアップロード
ブラウザからS3/R2に直接アップロード — サーバー帯域ゼロ。
チャンクアップロード
10MB超ファイル向けS3マルチパート。
全文検索
ファイル名・タイトル・タグを索引検索 — ファイルベースでデータベース不要。
一括操作
複数選択して移動、コピー、削除、ダウンロード。
クロスディスク転送
ローカル ↔ S3 ↔ R2間のコピー/移動。
ゴミ箱
復元可能な削除、自動パージ。
SEOメタデータ
タイトル、alt、キャプション、タグ — クラウドはS3オブジェクトメタデータ、ローカルはsidecar JSON。全文検索。
ダークモード
UIとSDKでライト/ダーク/自動。
16言語
デフォルトは英語。SDK、URL (?locale=)、またはFLUXFILES_LOCALEで指定。アラビア語はRTL。
監査ログ
すべての書き込み操作を記録。
レート制限
ユーザーごとのトークンバケット。
ストレージクォータ
JWTクレームによるユーザーごとの制限。
BYOBバケット
ユーザー自身のS3/R2 — 認証情報はJWT内で暗号化(AES-256-GCM)。
重複検出
SHA-256一致で冗長アップロードをスキップ(強制上書き除く)。
SDKトークン更新
401時にonTokenRefresh — 更新の集約、再試行、updateToken()で事前更新。
バケットドクター
任意の S3/R2 ディスクを診断——認証情報、読み/書き/削除、署名付き URL、CORS、マルチパート——貼り付けるだけの IAM・CORS 修正付き。BYOB バケットを数分で導入。
Node トークン SDK
@fluxfiles/node で任意の JS バックエンド(Express、Next.js、Nuxt)から FluxFiles トークンを発行——PHP コアとバイト互換。トークン発行に PHP 不要。
SFTP ディスク
S3/R2 に次ぐ3つ目のドライバー。あらゆる VPS や共有ホストをファイル管理に。
コード / 設定エディタ
設定・テキストファイル(wp-config.php、.env など)をブラウザで編集(cPanel風)。
Zip と展開
選択をzipでダウンロード、またはその場で展開。zip-slip・爆弾対策済み。
ウォーターマーク
プレビュー保護のため文字やロゴの透かしを動的に付与。元ファイルは無変更。
オンデマンド WebP + AVIF
1つの URL で任意サイズの画像をキャッシュ済み AVIF/WebP として配信(Accept ネゴシエーション)、レスポンシブ srcset 付き。
SFTP 権限
cPanel風ダイアログでSFTPディスクのUnix権限(chmod)を変更。
使用状況ダッシュボード
ストレージを一目で把握。容量に加え、種類別・フォルダ別の内訳。
メディアプレビュー
画像・動画・音声・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= 対応フレームワーク
インテグレーション
あなたのスタックに差し込めるアダプター
公式アダプターで、すでに使っているフレームワークやエディターに FluxFiles をネイティブ統合できます。
組み込み
数行で組み込み
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 | elFinder | Laravel-FM | RichFilemanager | Responsive FM |
|---|---|---|---|---|---|
| S3 + R2 + Local + SFTP | ✓ | ⚠ | ⚠ | ⚠ | ✗ |
| あらゆるフレームワークに埋め込み | ✓ | ⚠ | ✗ | ⚠ | ✗ |
| JWT認証 + スコーピング | ✓ | ✗ | ✗ | ✗ | ✗ |
| SEOメタデータ | ✓ | ✗ | ✗ | ✗ | ✗ |
| AI自動タグ | ✓ | ✗ | ✗ | ✗ | ✗ |
| 画像クロップ | ✓ | ✓ | ✗ | ✗ | ✗ |
| チャンクアップロード | ✓ | ✗ | ✗ | ✗ | ✗ |
| 全文検索 | ✓ | ✗ | ✗ | ✗ | ✗ |
| ダークモード | ✓ | ✗ | ⚠ | ✗ | ✗ |
| 16言語 | ✓ | ✓ | ✗ | ✗ | ✗ |
| PHP ≥ 8.1 | ✓ | ✓ | ✗ | ✓ | ✓ |
| 積極的にメンテナンス中 | ✓ | ✓ | ⚠ | ✗ | ✗ |
| モダンUI | ✓ | ✗ | ⚠ | ✗ | ✗ |
セルフホストで埋め込み可能——もう一つのアップロード SaaS ではない
ホスト型ファイル API も優れていますが、データを保存し従量課金です。FluxFiles はあなたのスタックで動作し、各テナントが自分のバケットを使います。
| 機能 | FluxFiles | Filestack | Uploadcare | Cloudinary | Supabase Storage |
|---|---|---|---|---|---|
| セルフホスト(自社インフラで動作) | ✓ | ✗ | ✗ | ✗ | ⚠ |
| BYOB——各顧客が自分のバケット | ✓ | ⚠ | ⚠ | ✗ | ✗ |
| 埋め込み可能なファイルマネージャー UI | ✓ | ✓ | ✓ | ⚠ | ✗ |
| オープンソース(MIT) | ✓ | ✗ | ✗ | ✗ | ✓ |
| ストレージ/アップロード課金の SaaS 料金なし | ✓ | ✗ | ✗ | ✗ | ⚠ |
| マルチストレージ(S3 / R2 / ローカル) | ✓ | ⚠ | ✗ | ✗ | ✗ |
| テナント単位のトークンスコープを標準装備 | ✓ | ⚠ | ⚠ | ⚠ | ⚠ |
比較は一般的なデフォルト提供内容を反映しています。各製品はそれぞれの領域で優れています。FluxFiles のニッチは、埋め込み可能・セルフホスト・自前バケットの組み合わせです。
販売可能な製品
ファイル管理だけでなく——送受信も
無料コアはファイルマネージャーを埋め込む。有料モジュールはそれをクライアントが対価を払う製品に変える。
Branded Share
任意のファイルやフォルダへ、ブランド付きのセルフサービスリンクを送信——有効期限、パスワード、ダウンロード上限、閲覧分析付き。あなたのロゴ、あなたのドメイン。
- 有効期限/パスワード保護リンク
- ダウンロード上限 + 閲覧分析
- スコープ付きトークン——受信者はアカウント不要
Upload Portals
公開の「ファイルを送って」ページがそのままストレージへ。代理店、写真家、クライアント導入に最適——アップロード者はアカウント不要。
- 公開ポータル → あなたのバケット
- ポータルごとのサイズ/種類/期限制限
- 匿名アップロード、所有者スコープ
Compliance bundle
ウイルススキャン、C2PA コンテンツ来歴、監査保持——規制対象・エンタープライズ向け。
WordPress
3つの代わりに1つのプラグイン
WordPress では、FluxFiles はクライアントファイルポータルであり、メディアマネージャーでもある——個別のフォルダ・クラウド・オフロードプラグインを置き換える。
| 機能 | FluxFiles | FileBird | WP Media Folder | WP Offload |
|---|---|---|---|---|
| メディアフォルダ | — | |||
| S3 / R2 / SFTP ストレージ | — | |||
| オフロード + URL 書き換え | — | — | ||
| クライアントアップロードポータル | — | — | — | |
| ブランド共有リンク | — | — | — | |
| 一般的な価格 | 1ライセンス | $49/年 | $69/年 | 有料 |
フォルダ + クラウド + オフロード + クライアントポータルを1つに——FileBird と WP Media Folder と WP Offload を別々に買う代わりに。
料金
コアは無料。有料モジュールにだけ課金。
MIT コアは永久無料。2つの主力製品——ブランド共有 + アップロードポータル——とその先へアップグレード。
無料(コア)
完全な MIT ファイルマネージャー、セルフホスト。
はじめる- Local / S3 / R2 / SFTP ストレージ、JWTスコープ
- オンデマンド WebP + AVIF + 画像/PDF 最適化
- 透かし、バージョンフック、使用状況ダッシュボード、AI自動タグ
- 7つのアダプター + BYO-embed ターミナル / PDF / office / 電子署名
Pro
クライアントとファイルを送受信。
近日公開近日公開- 無料版のすべて
- ブランド共有——有効期限/パスワード/上限/分析付きリンク
- アップロードポータル——公開の「ファイルを送って」、アカウント不要
- 優先サポート + アップデート
Studio
FluxFiles 上で製品を構築。
近日公開近日公開- Pro のすべて
- バージョン管理 + Webhooks(Zapier/Make/n8n)
- AI ビジョン + OCR(自前キー)
- マルチテナント権限階層 + ホワイトラベル
Enterprise
コンプライアンス、大規模に。
営業に問い合わせ- Studio のすべて
- ウイルススキャン + C2PA 来歴 + 監査保持
- SSO ブリッジ + カスタム導入
- SLA + 優先ロードマップ
定額・サイト無制限——ファイル/呼び出し課金なし。年額は約2か月分お得。買い切りも可能。14日間返金。購入者側のVATは決済時に処理。
FAQ