Ürün — FluxFiles

Özellikler

Modern bir dosya yöneticisinin ihtiyacı olan her şey

Esneklik isteyen geliştiriciler için tasarlandı.

Çoklu depolama

Yerel, AWS S3, Cloudflare R2, SFTP — Flysystem v3 ile. Yapılandırmayla değiştirin.

Her yere gömün

iframe + postMessage SDK. Bağımsız UI Alpine.js (derleme yok). Her framework ile çalışır.

JWT kimlik doğrulama + kapsam

Kullanıcı başına yol öneki, izinler, disk beyaz listesi, yalnızca sahip modu — veya viewer/editor/admin rol ön ayarıyla başlayın.

ACL rol ön ayarları

viewer/editor/admin/superadmin ön ayarlarından token üretin — tek bir parametre, doğru izin, disk ve kapsam claim'lerini elle bir araya getirmek yerine otomatik açar.

AI otomatik etiket

Claude / OpenAI vision — otomatik alt metin, başlık, etiketler.

Görüntü kırpma

En-boy oranı ön ayarlı satır içi kırpma aracı.

Görüntü optimizasyonu

Otomatik WebP varyantları — küçük, orta, büyük.

Ön imzalı yüklemeler

Tarayıcı doğrudan S3/R2'ye yükler — sunucunuzda sıfır bant genişliği.

Parçalı yükleme

10MB üzeri dosyalar için S3 multipart.

Tam metin arama

İsim, başlık, etiketlerde dizinli arama — varsayılan olarak dosya tabanlı, isteğe bağlı olarak kendi SQL veritabanınız arka uç olarak.

Veritabanı destekli meta veri

İsteğe bağlı FLUXFILES_STORAGE_BACKEND=db modu — meta veriler, arama/klasör indeksi ve denetim günlüğü JSON yan dosyaları yerine kendi MySQL/PostgreSQL/SQLite veritabanınızda tutulur. Dosya baytları her iki durumda da depolamada kalır.

Toplu işlemler

Çoklu seçim: taşıma, kopyalama, silme, indirme.

Diskler arası transfer

Yerel ↔ S3 ↔ R2 arasında kopyalama/taşıma.

Çöp kutusu

Kurtarılabilir silme, otomatik temizleme.

SEO meta verileri

Başlık, alt, açıklama, etiketler — S3 nesne meta verisi (bulut) veya sidecar JSON (yerel). Tam metin arama.

Karanlık mod

Açık / koyu / otomatik — UI ve SDK'da.

16 dil

Varsayılan İngilizce. SDK, URL (?locale=) veya FLUXFILES_LOCALE ile ayarlayın. Arapça RTL.

Denetim günlüğü

Tüm yazma işlemleri kaydedilir.

Hız sınırlama

Kullanıcı başına token bucket API koruması.

Depolama kotası

JWT claims ile kullanıcı başına limitler.

BYOB kovaları

Kullanıcılar kendi S3/R2'sini ekler — kimlik bilgileri JWT'de şifreli (AES-256-GCM).

Yinelenen algılama

SHA-256 eşleşmesi zorla yazma dışında gereksiz yüklemeleri atlar.

SDK belirteci yenileme

401'de onTokenRefresh — birleşik yenileme, yeniden deneme, updateToken().

Bucket Doctor

Herhangi bir S3/R2 diskini teşhis edin — kimlik bilgileri, okuma/yazma/silme, presign, CORS, multipart — yapıştırmaya hazır IAM ve CORS düzeltmeleriyle. BYOB bucket'larını dakikalar içinde ekleyin.

SFTP diski

S3/R2'den sonra 3. sürücü — herhangi bir VPS veya hosting'i dosya yöneticisine dönüştürün.

Kod / yapılandırma düzenleyici

Metin ve yapılandırma dosyalarını (wp-config.php, .env) tarayıcıda düzenleyin.

Zip ve Çıkarma

Seçimi zip olarak indirin veya arşivi yerinde çıkarın — zip-slip & bomb korumalı.

Filigran

Önizleme koruması için anında metin/logo filigranı — kaynak dosyaya dokunulmaz.

İstek üzerine WebP + AVIF

Herhangi bir görsel boyutunu tek bir URL üzerinden önbelleklenmiş AVIF/WebP olarak sunun (Accept ile pazarlıklı), hazır duyarlı srcset ile.

SFTP izinleri

SFTP disklerinde Unix dosya izinlerini (chmod) cPanel tarzı pencereyle değiştirin.

SSH terminali

Ücretsiz terminal_pty_url claim'i ile kendi ttyd / gotty / wetty'nizi SFTP disklerinde uygulama içi terminal olarak gömün — FluxFiles kendi kabuğunu (shell) sunmaz.

Tek tıkla Git dağıtımı

Dosya yöneticisinden doğrudan SFTP sunucunuzdaki bir Git deposunu pull ve reset edin — sabit biçim, keyfi bir kabuk değil, hook'lar varsayılan olarak kapalı.

Kullanım panosu

Depolamayı bir bakışta görün — kota artı türe ve klasöre göre dağılım.

Medya önizleme

Satır içi görsel, video, ses ve PDF önizleme; özel yerel medya güvenli akış.

Hızlı kurulum

2 dakikada hazır

composer require fluxfiles/fluxfiles
cp vendor/fluxfiles/fluxfiles/.env.example vendor/fluxfiles/fluxfiles/.env
# vendor/fluxfiles/fluxfiles/.env  (read only from inside the package)
# Real environment variables win over this file and are preferred in production
# (Composer may remove a vendor .env on update).
FLUXFILES_SECRET=<output of: openssl rand -hex 32>
FLUXFILES_ALLOWED_ORIGINS=https://yourapp.com
<?php
require_once 'vendor/autoload.php';
// embed.php is not autoloaded — require it for fluxfiles_token()
require_once 'vendor/fluxfiles/fluxfiles/embed.php';

$token = fluxfiles_token([
    'user'   => 'user-123',
    'perms'  => ['read', 'write', 'delete'],
    'disks'  => ['local'],     // s3 / r2 need their own credentials in .env
    'prefix' => 'user-123/',
    'ttl'    => 3600,
]);
php vendor/bin/fluxfiles serve --port=8080
# then open http://127.0.0.1:8080/public/
composer require fluxfiles/laravel
php artisan vendor:publish --tag=fluxfiles-config
php artisan storage:link
# .env — proxy mode is the default: the API runs through your Laravel routes,
# no separate FluxFiles server is needed.
FLUXFILES_SECRET=<output of: openssl rand -hex 32>

# Only for FLUXFILES_MODE=standalone (FluxFiles on its own server):
# FLUXFILES_MODE=standalone
# FLUXFILES_ENDPOINT=https://fm.yourdomain.com
<?php
// app/FluxFiles/TenantClaims.php — REQUIRED: without a claims resolver
// <x-fluxfiles> renders "not available".
namespace App\FluxFiles;

use FluxFiles\Laravel\ClaimsResolver;
use Illuminate\Contracts\Auth\Authenticatable;

class TenantClaims implements ClaimsResolver
{
    public function resolve(Authenticatable $user): array
    {
        return [
            'prefix' => 'users/' . $user->getAuthIdentifier(),
        ];
    }
}
// config/fluxfiles.php
'claims_resolver' => \App\FluxFiles\TenantClaims::class,
// Laravel 11 / 12 — bootstrap/app.php: exclude the proxy routes from CSRF (else 419)
->withMiddleware(function (Middleware $middleware) {
    $middleware->validateCsrfTokens(except: ['api/fm/*']);
})

// Laravel 10 — app/Http/Middleware/VerifyCsrfToken.php
// protected $except = ['api/fm/*'];
<x-fluxfiles disk="local" mode="picker" height="600px" />
# Not yet on WordPress.org — install the release zip:
# 1. Download fluxfiles-<version>.zip from https://github.com/thai-pc/fluxfiles/releases
# 2. Plugins -> Add New -> Upload Plugin -> Activate
# 3. Settings -> FluxFiles: set the JWT secret (>= 32 bytes) and storage
# 4. Add the shortcode (or the FluxFiles block) to any page or post:
[fluxfiles]
npm install @fluxfiles/node   # Node >= 16
// 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 });
});
pip install fluxfiles-token
# FastAPI / Django / Flask route — mint a token from your Python backend (no PHP)
import os

from fastapi import Depends
from fluxfiles_token import create_token

@app.get("/fluxfiles-token")
def fluxfiles_token(user=Depends(current_user)):
    token = create_token(
        secret=os.environ["FLUXFILES_SECRET"],  # >= 32 bytes
        user_id=user.id,
        perms=["read", "write", "delete"],
        prefix=f"users/{user.id}",
        ttl=3600,
    )
    return {"token": token}
{
  "mcpServers": {
    "fluxfiles": {
      "command": "npx",
      "args": ["-y", "@fluxfiles/mcp"],
      "env": {
        "FLUXFILES_URL": "<your FluxFiles URL>",
        "FLUXFILES_TOKEN": "<scoped JWT>"
      }
    }
  }
}
# Claude Code (Node >= 18)
claude mcp add fluxfiles -e FLUXFILES_URL=<your FluxFiles URL> -e FLUXFILES_TOKEN=<scoped JWT> -- npx -y @fluxfiles/mcp
# Read-only by default. Opt in to writes:
FLUXFILES_MCP_WRITE=1
# and to move_to_trash:
FLUXFILES_MCP_DELETE=1

Ajan yalnızca JWT'sinin izin verdiği şeylere dokunabilir — diskleri, yol öneki ve izinleri. Ona dar kapsamlı, salt okunur bir token verin.

npm install fluxfiles
<!-- or load a pinned CDN build (never @latest) -->
<script src="https://unpkg.com/fluxfiles@1.0.1/fluxfiles.js"></script>
<div id="file-picker" style="height:600px"></div>

<script>
FluxFiles.open({
    endpoint: 'https://your-fluxfiles-host',
    token: 'eyJhbGci...',   // JWT minted by your backend
    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"
/>
docker run -p 8080:80 \
  -e FLUXFILES_SECRET="$(openssl rand -hex 32)" \
  -e FLUXFILES_ALLOWED_ORIGINS=https://yourapp.com \
  -v fluxfiles-data:/app/packages/core/storage \
  ghcr.io/thai-pc/fluxfiles:1.1
# UI: http://localhost:8080/public/
git clone https://github.com/thai-pc/fluxfiles.git
cd fluxfiles/packages/core
composer install
cp .env.example .env
# packages/core/.env — the placeholder secret is rejected, set a real one
FLUXFILES_SECRET=<output of: openssl rand -hex 32>
FLUXFILES_ALLOWED_ORIGINS=http://localhost:8080
# print dev tokens (run from the repo root)
php packages/core/tests/generate-token.php
php -S localhost:8080 router.php

# UI: http://localhost:8080/public/index.html?token=<token>
# ?token= is dev-only — it is stripped from the URL on boot.
# Real apps pass the JWT via the SDK / postMessage, never in a URL.

Canlıya alırken: en az 32 baytlık bir FLUXFILES_SECRET ile FLUXFILES_ALLOWED_ORIGINS (veya FLUXFILES_FRAME_ANCESTORS) ayarlayın. Paket kökünü web document root yapın ve nginx'te /_fluxfiles/ ile .env erişimini engelleyin. Ana JWT'yi asla URL'ye koymayın — adaptörler onu postMessage ile iletir. DEPLOYMENT.md

Şunlarla çalışır

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

Entegrasyonlar

Yığınınız için hazır adaptörler

Resmi adaptörler, FluxFiles'ı zaten kullandığınız çerçevelere ve editörlere yerel olarak gömer.

CKEditor veya TinyMCE'yi kendi depolamanızla kullanın; CKBox ya da Tiny Drive aboneliği gerekmez. FluxFiles dosyalara göz atmak ve eklemek için bir araç çubuğu düğmesi ekler; bu ürünlerin özellik özellik yerine geçmez.

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

Gömme

Birkaç satırda gömün

fluxfiles.js'i yükleyin, sunucuda üretilen bir JWT geçirin ve herhangi bir sayfaya tam bir dosya yöneticisi — ya da dosya seçme penceresi — yerleştirin.

<!-- npm install fluxfiles, or a pinned CDN build -->
<script src="https://unpkg.com/fluxfiles@1.0.1/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)}
    />
  );
}

Token'lar sunucu tarafında üretilir — secret'ınızı asla tarayıcıya göndermeyin.

Neden FluxFiles

Başkalarının unuttuğu şeyler için tasarlandı

Karşılaştırmak için kaydırın
Özellik FluxFiles elFinder Laravel-FM RichFilemanager Responsive FM
S3 + R2 + Yerel + SFTP ✓ ⚠ ⚠ ⚠ ✗
Her framework'e gömme ✓ ⚠ ✗ ⚠ ✗
JWT kimlik doğrulama + kapsam ✓ ✗ ✗ ✗ ✗
SEO meta verileri ✓ ✗ ✗ ✗ ✗
AI otomatik etiket ✓ ✗ ✗ ✗ ✗
Görüntü kırpma ✓ ✓ ✗ ✗ ✗
Parçalı yükleme ✓ ✗ ✗ ✗ ✗
Tam metin arama ✓ ✗ ✗ ✗ ✗
Karanlık mod ✓ ✗ ⚠ ✗ ✗
16 dil ✓ ✓ ✗ ✗ ✗
PHP ≥ 8.1 ✓ ✓ ✗ ✓ ✓
Aktif olarak bakımı yapılıyor ✓ ✓ ⚠ ✗ ✗
Modern UI ✓ ✗ ⚠ ✗ ✗
Yetenek FluxFiles Filestack Uploadcare Cloudinary Supabase Storage
Kendi sunucunuzda (altyapınızda çalışır) ✓ ✗ ✗ ✗ ⚠
BYOB — her müşterinin kendi bucket'ı ✓ ⚠ ⚠ ✗ ✗
Gömülebilir dosya yöneticisi arayüzü ✓ ✓ ✓ ⚠ ✗
Açık kaynak (MIT) ✓ ✗ ✗ ✗ ✓
Depolama / yükleme başına SaaS ücreti yok ✓ ✗ ✗ ✗ ⚠
Çoklu depolama (S3 / R2 / yerel) ✓ ⚠ ✗ ✗ ✗
Kiracı başına yerleşik jeton kapsamı ✓ ⚠ ⚠ ⚠ ⚠

Karşılaştırma tipik varsayılan sunumları yansıtır; her ürün kendi alanında öne çıkar. FluxFiles'ın nişi gömülebilir, kendi sunucusunda ve bring-your-own-bucket birleşimidir.

Karşılaştırma November 2026 tarihi itibarıyla günceldir, bağımsız olarak hazırlanmıştır — bir düzeltme bildirmek için GitHub deposuna bakın.

SSS

Sıkça sorulan sorular

Kimlik doğrulama nasıl çalışır?
Durumsuz JWT (HS256): sunucuda ayrıntılı talep'lerle (izinler, diskler, yol kapsamı, limitler) bir token üretirsiniz; böylece her kullanıcı yalnızca izin verdiğinizi görür.
Kullanıcılarımın FluxFiles hesabına ihtiyacı var mı?
Hayır. FluxFiles kendi uygulamanızın verdiği JWT'ye güvenir, böylece mevcut kimlik doğrulamanıza doğrudan bağlanır — ayrı bir kullanıcı sistemi yok.
Çalıştırmak için neye ihtiyacım var?
PHP 8.1+ (8.1–8.5 test edildi); gd, curl, json, openssl, mbstring, fileinfo (Extract için zip) ve Composer 2 gerekir — ya da ghcr.io/thai-pc/fluxfiles Docker imajı. Bir diske yönlendirin, bir secret ve izinli origin'leri ayarlayın, ardından yayınlayın — küçük bir VPS'te çalışır.
Farklı kullanıcılar farklı izinlere sahip olabilir mi?
Evet. İnce ayarlı claim'lerle (okuma/yazma/silme, disk, yol öneki, yükleme sınırları, izin verilen uzantılar, owner-only) bir token oluşturun veya her claim'i tek tek yazmak yerine tokeni tek satırda sınırlamak için dört yerleşik rol ön ayarından birini — viewer, editor, admin, superadmin — kullanın.
Veritabanı çalıştırmam gerekiyor mu?
Hayır. Varsayılan olarak tüm meta veriler (dosya bilgisi, arama dizini, denetim günlüğü) dosyalarınızın yanında JSON yardımcı dosyaları olarak durur — kurulacak veya yedeklenecek ekstra bir şey yoktur. Bu kayıtları kendi MySQL, PostgreSQL veya SQLite veritabanınızda tutmayı tercih ederseniz, isteğe bağlı FLUXFILES_STORAGE_BACKEND=db modu bunları oraya taşır; dosya baytları her durumda depolama alanınızda kalır.
Herhangi bir kullanım sınırı var mı?
Çekirdeğin kendisi yapay bir sınır koymaz — aylık aktif kullanıcı üst sınırı yoktur, zorunlu yükseltme uyarısı yoktur. Kendi sınırlarınızı JWT claim'leri üzerinden siz belirlersiniz: kullanıcı başına depolama kotaları, yükleme boyutu/uzantı kısıtlamaları ve yerleşik bir hız sınırlayıcı (varsayılan olarak dakikada 60 okuma / 10 yazma, yapılandırılabilir).