Ugrás a tartalomra
Rapcsány Krisztián Rapcsány Krisztián
← Összes projekt Szolgáltatás és API

Média- és fájlkiszolgáló rendszer (saját CDN)

Önálló szolgáltatás a képeknek, videóknak és fájloknak. Átveszi a platformtól a feltöltést, a feldolgozást és a kiszolgálást, hogy a fő rendszernek ne kelljen a nagy tartalmakkal foglalkoznia.

PHP Laravel 12 MySQL Üzenetsorok FFmpeg HLS streaming REST API OpenAPI
A feladat
Szerepem

Én terveztem és fejlesztettem 2026 márciusától.

Egy rendezvényes platformon rengeteg kép és videó van: klublogók, borítók, galériák, sztorik, promóciós videók. Ha ezeket a fő rendszer tárolja és szolgálja ki, lassul az oldal, a nagy fájlok feltöltése pedig sokszor megszakad.

Egy külön, biztonságos szolgáltatást akartam, ami optimalizálja a tartalmat, gyorsan kiszolgálja, a nagy videókat is megbízhatóan fogadja, és egyszerű API-n át használható.

A megoldás
01

Képek automatikusan

Feltöltéskor WebP konverzió és bélyegkép készül, profilonként beállított méretekkel és minőséggel (logó, borító, galéria, sztori és mások).

02

Videó streaming

Háttérben készül adaptív stream (480p, 720p, 1080p), egyszerűen beágyazható MP4, bélyegkép és előnézeti kép, hangerő-kiegyenlítéssel.

03

Feltöltő oldalak

Egyszer használatos, időkorlátos feltöltő linkek húzd-és-ejtsd felülettel és folyamatjelzővel, képre, videóra és bármilyen fájlra.

04

Nagy fájlok megszakadás nélkül

A feltöltés darabokban történik, darabonkénti újrapróbálással, így egy gigabájtos videó is megbízhatóan megérkezik.

05

Privát és publikus tartalom

A privát fájlok csak aláírt, időkorlátos címen érhetők el, a publikusak közvetlenül kiszolgálhatók.

06

API és visszajelzés

Kulcsos hozzáférés kulcsonkénti jogosultságokkal, dokumentált API, állapotlekérdezés és visszahívás (webhook) a feldolgozás végén.

Képernyőképek
Dokumentált API

Képek, fájlok és feltöltési munkamenetek végpontjai, kulcsos hozzáféréssel, OpenAPI leírással.

Márka- és ügyfélnevek, valamint személyes adatok nélkül (kivéve az alkalmazás áruházi képeit).

Ami különleges benne

Adaptív videó

480p, 720p és 1080p stream, ami csak lefelé skáláz, és álló meg fekvő videóra is jó. Mellé készül egy sima MP4 is, ha valaki egyszerűen be akarja ágyazni.

Egyszer használatos feltöltő linkek

A feltöltés 30 percig érvényes linken megy, húzd-és-ejtsd felülettel és folyamatjelzővel.

Privát fájlok aláírt linkkel

A privát fájl csak aláírt, időkorlátos címen érhető el, alapból 15 percig.

Kihívások, amikbe belefutottam
01

A közbeékelt hálózati réteg megölte a nagy feltöltéseket

A feltöltés egy kérésben ment, a közbeékelt réteg viszont nagyjából 100 MB-nál és 100 másodpercnél megszakította. Most 20 MB-os darabokban töltök fel, a szerver az utolsó lépésben fűzi össze őket, és ellenőrzi a méretet. Egy darab újraküldése biztonságos, ezért a böngésző négyszer újrapróbálja, egyre hosszabb várakozással.

02

Feltöltéssel ne lehessen kárt tenni

Letiltottam a futtatható és szerveroldali kiterjesztéseket (exe, php, js és a többi). A típust és a méretet az összefűzés után ellenőrzöm, a videó hosszára pedig van korlát.

03

A hiba ne vesszen el

A videófeldolgozás háttérben fut. Sikernél és hibánál is visszahívást küld az üzemeltető rendszernek, ötször újrapróbálva, és ha a feldolgozás elbukik, riasztás megy.

A motorháztető alatt

Darabolt feltöltés

20 MB-os darabok, amelyeket a szerver az utolsó lépésben fűz össze, majd ellenőriz. Egy darab ismételt elküldése biztonságos. Erre azért volt szükség, mert a közbenső hálózati réteg egy kérés méretét és idejét korlátozza, ami nagy videóknál megszakította a feltöltést.

Háttérfeldolgozó lánc

A videó feldolgozása üzenetsorban fut több lépésben, hiba esetén riasztással. A visszahívás sikernél és hibánál is megérkezik, növekvő várakozású újrapróbálással.

Biztonság

Futtatható és szerveroldali fájltípusok tiltása, típus- és méretellenőrzés, API-kulcs jogosultságok, aláírt URL-ek és maximális videóhossz.

Tárhelygazdálkodás

Lejárt feltöltési munkamenetek óránkénti takarítása, és opcionálisan a feldolgozott videók eredetijének törlése megadott idő után, tárhelyspórolás érdekében.

Valódi kód

Megszakadás-biztos feltöltés

A darabok sorszám szerint érkeznek, ugyanazon sorszám újraküldése felülírja a darabot, tehát az újrapróbálás ártalmatlan. Az összefűzés után a méretet ellenőrzi, és hiba esetén takarít.

UploadChunkController.php
// Re-sending the same index overwrites the part, so a retry is idempotent.
$request->file('chunk')->move($dir, sprintf('%06d.part', $index));

// ... later, in complete(): assemble the parts in order
$out = fopen($assembled, 'wb');

for ($i = 0; $i < $info['total_chunks']; $i++) {
    $part = $dir.'/'.sprintf('%06d.part', $i);

    if (! is_file($part)) {
        fclose($out);
        return response()->json(['success' => false, 'message' => "Missing chunk: {$i}"], 422);
    }

    $in = fopen($part, 'rb');
    stream_copy_to_stream($in, $out);
    fclose($in);
}
fclose($out);

if (filesize($assembled) !== $info['size']) {
    File::deleteDirectory($dir);
    return response()->json(['success' => false, 'message' => 'Size mismatch.'], 422);
}
Eredmény

A platform és az admin egy API-n keresztül kezeli a tartalmakat, a nehéz feldolgozás háttérben fut, a nagy fájlok pedig megszakadás nélkül megérkeznek.

A képek és videók lassítják a rendszeredet?

Ha a feltöltés megszakad, vagy az oldal lassú a nagy tartalmaktól, érdemes megnézni.

További projektek

Ajánlatot kérek →