vtinnovations / file-inspector
File cleanup and management utility.
Package info
github.com/vtinnovations/file-inspector
Type:contao-bundle
pkg:composer/vtinnovations/file-inspector
Requires
- php: ^8.2
- ext-curl: *
- ext-pdo: *
- ext-sodium: *
- contao/core-bundle: ^5.3
- doctrine/dbal: ^3.6 || ^4.0
- matthiasmullie/minify: ^1.3
- symfony/config: ^6.4 || ^7.0
- symfony/dependency-injection: ^6.4 || ^7.0
- symfony/event-dispatcher: ^6.4 || ^7.0
- symfony/finder: ^6.4 || ^7.0
- symfony/http-client: ^6.4 || ^7.0
- symfony/http-foundation: ^6.4 || ^7.0
- symfony/http-kernel: ^6.4 || ^7.0
- symfony/routing: ^6.4 || ^7.0
Requires (Dev)
- phpunit/phpunit: ^10.5 || ^11.0
Conflicts
- contao/manager-plugin: <2.0 || >=3.0
README
File Inspector ist ein Contao-Backend-Modul, das Dateien im Upload-Verzeichnis
(/files) findet, die nirgendwo mehr referenziert werden, fĂŒr jede Datei genau zeigt,
warum sie als verwendet oder unverwendet gilt, und das sichere AufrĂ€umen â mit
Sicherungskopie und Papierkorb â direkt aus dem Backend heraus ermöglicht. ZusĂ€tzlich
bietet es Werkzeuge zum Minifizieren von CSS/JS und zur Bildformat-Optimierung.
1. ProjektĂŒbersicht
File Inspector durchsucht die Contao-Datenbank (und optional den Projekt-Quellcode) nach Referenzen auf Dateien im Upload-Verzeichnis und stuft jede Datei als Referenziert, Unsicher oder Keine Referenz gefunden ein. Auf dieser Grundlage lassen sich unbenutzte Dateien geprĂŒft, exportiert und sicher gelöscht werden â mit einem integrierten Papierkorb fĂŒr den Fall, dass eine EinschĂ€tzung doch nicht zutraf.
2. Aktueller Implementierungsstatus
File Inspector ist eine vollstĂ€ndige, aktuelle native Implementierung â kein Prototyp, kein Platzhalter und kein reiner Nur-Lese-Zustand. Alle in diesem Dokument beschriebenen Funktionen sind end-to-end mit einer serverseitigen Umsetzung verbunden und wurden gegen den tatsĂ€chlichen Quellcode geprĂŒft.
3. UnterstĂŒtzte Framework- und Laufzeitversionen
- Contao 5.3 oder neuer
- PHP 8.2 oder neuer
- Symfony 6.4 oder 7.0
- Doctrine DBAL 3.6 oder 4.0
4. Systemvoraussetzungen
- PHP-Erweiterung
sodium(PrĂŒfung signierter Lizenzdaten) - PHP-Erweiterung
curl(gesicherte Kommunikation mit dem Lizenzdienst) - PHP-Erweiterung
pdo(Datenbankzugriff) - PHP-Erweiterung
zip(nur fĂŒr die Funktion Export & Löschen erforderlich) - PHP-Erweiterung
gd(fĂŒr Bildoptimierung; von Contao ohnehin vorausgesetzt) - PHP-Erweiterung
imagick(optional; nur nötig, um SVG-Dateien als Quelle fĂŒr die Bildoptimierung zu nutzen)
5. Installation
composer require vtinnovations/file-inspector
AnschlieĂend die Contao-Datenbankmigration ausfĂŒhren, um die benötigten Tabellen anzulegen:
php bin/console contao:migrate
Das Bundle registriert sich ĂŒber sein Contao-Manager-Plugin automatisch.
6. Composer-/Framework-Einrichtung
Das Paket ist als contao-bundle deklariert und wird vom Contao Manager automatisch
erkannt und geladen â es ist keine manuelle Bundle-Registrierung nötig.
7. Erforderliche ausfĂŒhrbare Programme und Konfiguration
AuĂer der Contao-Datenbankmigration (Schritt 5) ist keine zusĂ€tzliche Konfiguration erforderlich. Ignorierregeln, Aufbewahrungsrichtlinien und die Lizenz werden ĂŒber die Backend-OberflĂ€che verwaltet, nicht ĂŒber Konfigurationsdateien.
8. Dateisystemberechtigungen
Der PHP-Prozess benötigt Schreibzugriff auf folgende Verzeichnisse unterhalb von var/
(werden bei Bedarf automatisch angelegt):
var/fi_scans/,var/fi_scan_jobs/,var/fi_exports/,var/fi_bin/var/fi_settings.json,var/fi_retention.json,var/fi_minified.jsonvar/log/file_inspector/var/file_inspector/(Lizenzdaten, siehe Lizenzierung)
9. Backend- und Administrationszugriff
Das Modul erscheint im Contao-Backend unter System âș File Inspector. Der Zugriff wird ĂŒber die regulĂ€re Contao-Backend-Benutzergruppenverwaltung gesteuert â das Modul muss der jeweiligen Benutzergruppe wie jedes andere Backend-Modul zugewiesen werden. Die Lizenzverwaltung selbst befindet sich unter Contao âș Einstellungen âș File Inspector Licence management.
10. Frontend-Integration
Nicht zutreffend â File Inspector ist ausschlieĂlich ein Backend-Werkzeug und stellt keine Frontend-Module oder -Inhaltselemente bereit.
11. Navigationsmodule in der tatsÀchlichen Reihenfolge
| Reihenfolge | Bezeichnung im Backend | Zweck |
|---|---|---|
| 1 | đ File Inspector | Ăbersicht, Scan starten, Ergebnisse |
| 2 | đ Verwendung | File Usage Explorer |
| 3 | đ Minifizieren | CSS/JS minifizieren |
| 4 | đŒ Bilder optimieren | Bildformat-Konvertierung |
| 5 | đ Verlauf | Scan-Verlauf |
| 6 | đ Papierkorb | Gelöschte Dateien verwalten |
| 7 | â Ignorierregeln | Ausschluss von Ordnern/Endungen |
| 8 | đ Lizenz | Verweis auf Contao âș Einstellungen |
12. Verifizierte Funktionen aller wesentlichen Module
Normal Scan
Ein schneller, rein datenbankbasierter Scan. Er sammelt jede referenzierte Datei-UUID ĂŒber:
- DCA-Dateifelder â jede
tl_*-Spalte mitinputType: fileTreeodereval.files/eval.filesOnly. - HTML-/Textinhalte â EinfĂŒgemarken (
{{file::âŠ}},{{image::âŠ}}, âŠ), HTML-Attribute (src/href/data-*), CSS-url()-Aufrufe und bare Upload-Pfade in jedemtextarea-,codeEditor- oder Rich-Text-Feld.
Beide Quellen werden zeilenweise per Doctrine DBAL gestreamt, sodass der Speicherverbrauch auch bei groĂen Installationen konstant bleibt. Auf jeder Lizenzstufe verfĂŒgbar, einschlieĂlich der kostenlosen.
Deep Scan
Alles aus dem Normal Scan plus einem Durchsuchen der Projekt-Quelldateien (PHP,
Twig, HTML, JS, TS, CSS, SCSS, Less, JSON, YAML, XML, SVG, âŠ) unter src/,
templates/, config/, vendor/ und public/. Deep Scan ergÀnzt:
- Quelldatei-Referenzen â fest im Code, in Templates oder Konfiguration hinterlegte Dateipfade und UUIDs.
- CSS-AbhĂ€ngigkeitsauflösung â transitive
@import- /@use- /@forward- /url()-Ketten, sodass eine CSS-/SCSS-Teildatei, die nur von einer anderen Stylesheet eingebunden wird, weiterhin korrekt als verwendet gilt. - Unsicherheitserkennung â siehe unten.
Deep Scan ist langsamer und benötigt mehr Speicher. Nur auf der Pro-Stufe verfĂŒgbar.
Unsicherheitserkennung
Manche Dateien lassen sich weder als verwendet noch als unverwendet beweisen â etwa ein zur Laufzeit zusammengesetzter Dateiname oder ein Name, den mehrere Dateien teilen. Anstatt zu raten, markiert Deep Scan solche Dateien als Unsicher und dokumentiert den Grund: Fundstelle, ein kurzer Codeausschnitt und eine verstĂ€ndliche ErklĂ€rung â ein Dateiname als eigenstĂ€ndiges Literal, ein Teilpfad ohne Upload-PrĂ€fix, ein Dateiname neben einer Verkettung/Interpolation, oder ein Dateiname, der von mehreren Dateien geteilt wird (mehrdeutiger Treffer).
File Usage Explorer
Zeigt fĂŒr jede Datei, wo genau sie verwendet wird â vollstĂ€ndig aus einem gespeicherten Scan aufgebaut, ohne erneut zu scannen:
- Datenbankreferenzen mit sprechendem Tabellennamen, dem Titel des Datensatzes (soweit auflösbar), einer Hierarchie ĂŒbergeordneter DatensĂ€tze (z. B. Seite â Artikel â Inhaltselement) und einem Bearbeiten-Link, der den Datensatz in einem neuen Backend-Tab öffnet.
- Template-Referenzen (Twig /
.html5), nach Pfad angezeigt. - Weitere Quelldatei-Referenzen, nach Sprache gruppiert (PHP, JavaScript, CSS, âŠ).
Evidence Viewer
Jede Referenz basiert auf einem Beleg. Der Evidence Viewer stellt jeden Beleg als verstĂ€ndliches Typ-/Fundort-/Beschreibung-Tripel dar (Datenbank, Template, CSS, PHP, Twig, âŠ) statt roher interner Kennungen.
Export & Löschen
Bereinigt unreferenzierte Dateien sicher, in drei getrennten Anfragen, sodass ein ZIP-Download und eine Löschung niemals gekoppelt sind:
- Dateien auswĂ€hlen und einen ZIP-Export erstellen; eine BestĂ€tigungsseite zeigt Anzahl, GesamtgröĂe und hebt ausgewĂ€hlte Unsichere Dateien hervor.
- Das Archiv herunterladen.
- AusdrĂŒcklich Jetzt löschen bestĂ€tigen â oder abbrechen, wodurch der ausstehende Export verworfen wird, ohne etwas zu löschen.
Löschungen verschieben die Datei in den Papierkorb und entfernen ihren Eintrag aus
der Contao-Dateiverwaltung. Jede Löschung wird im PrĂŒfprotokoll unter
var/log/file_inspector/deletions.log festgehalten. Alle Pfade werden unmittelbar vor
jeder Verschiebung erneut geprĂŒft (Eingrenzung, Traversierung, symbolische Links); ein
einzelner Stapel ist auf 500 Dateien begrenzt. Nur auf der Pro-Stufe verfĂŒgbar.
Papierkorb
Gelöschte Dateien werden nicht zerstört, sondern in einen Papierkorb verschoben und dort aufbewahrt, bis sie manuell geleert werden (kein automatischer Ablauf). Eine Wiederherstellung bringt die Datei an ihren ursprĂŒnglichen Ort zurĂŒck und stellt ihren Dateiverwaltungs-Eintrag mit der ursprĂŒnglichen UUID wieder her, sodass jedes Inhaltselement, jede Galerie oder jeder Download, der auf sie verwiesen hat, weiterhin funktioniert â als wĂ€re sie nie gelöscht worden. Belegt bereits eine Datei den ursprĂŒnglichen Pfad, bietet die Wiederherstellung eine Auswahl zwischen Ersetzen und Ăberspringen (mit âFĂŒr alle anwendenâ). Die Wiederherstellung steht immer zur VerfĂŒgung, auch ohne Pro-Lizenz.
Scan-Verlauf
Jeder abgeschlossene Scan wird automatisch gespeichert. Vergangene Scans lassen sich mit Modus, Datum, Dauer und Ergebniszusammenfassung durchsuchen; jeder Scan kann erneut geöffnet werden, ohne neu zu scannen. Alte Scans werden automatisch bereinigt: eine feste Obergrenze hĂ€lt die letzten 50 Scans, eine von der Bedienperson konfigurierbare Alterrichtlinie (ĂŒber die Verlaufsseite, Pro-Stufe) kann frĂŒher eingreifen. Der zuletzt gespeicherte Scan wird von keiner der beiden Richtlinien jemals entfernt.
Ignorierregeln
SchlieĂt Ordner und Dateiendungen vom Scan aus â etwa files/archiv oder *.php.
Exakte Namen und Glob-Muster (*, ?, [âŠ]) werden unterstĂŒtzt; regulĂ€re AusdrĂŒcke
nicht. Konfigurierbar unter Ignorierregeln (Pro-Stufe). Standardwerte: Ordner
archive, backup, import, old, legacy; Endungen php, phar, phtml.
AJAX-Scan-Jobs
Scans laufen als inkrementelle Hintergrund-Jobs per AJAX, die die Arbeit in Stapeln (500 Upload-Dateien / 25 Quelldateien pro Anfrage) ĂŒber mehrere Anfragen verteilen. Das hĂ€lt jede Anfrage deutlich innerhalb ĂŒblicher PHP-Zeitlimits, zeigt einen Live-Fortschritt und blockiert das Backend nie durch eine einzelne lange Anfrage. Eine Sperrdatei verhindert zwei gleichzeitige Scans. Nur auf der Pro-Stufe verfĂŒgbar â auf der kostenlosen Stufe lĂ€uft ein Normal Scan weiterhin, jedoch synchron in einer einzigen blockierenden Anfrage ohne Fortschrittsanzeige.
Minifizieren (CSS/JS)
Listet jede CSS-/JS-Datei im Upload-Verzeichnis auf â unabhĂ€ngig vom Verwendungsstatus â
und minifiziert eine gewÀhlte Auswahl direkt an ihrem Speicherort (keine neue
.min.css-Datei). Nur Leerzeichen- und Kommentar-Minifizierung wird durchgefĂŒhrt, keine
VerhaltensĂ€nderungen. Vor jedem Ăberschreiben wird eine Sicherungskopie angelegt, sodass
eine fehlerhafte Minifizierung rĂŒckgĂ€ngig gemacht werden kann. Bereits minimale Dateien
bleiben unangetastet und werden als ĂŒbersprungen markiert. Nur auf der Pro-Stufe
verfĂŒgbar.
Bildoptimierung
Wandelt Bilder (JPEG, PNG, GIF, WebP, BMP oder SVG als Quelle) in WebP, AVIF oder ICO um, ohne die Originaldatei zu verĂ€ndern â die konvertierte Datei entsteht neu am selben Speicherort. WebP/AVIF stehen zur VerfĂŒgung, wenn die jeweilige Kodierfunktion in der GD-Erweiterung des Servers vorhanden ist; ICO ist immer verfĂŒgbar. SVG-Quellen erfordern zusĂ€tzlich die optionale Imagick-Erweiterung mit SVG-UnterstĂŒtzung. Auf dem jeweiligen Server nicht unterstĂŒtzte Kombinationen werden in der OberflĂ€che mit BegrĂŒndung deaktiviert angezeigt. Nur auf der Pro-Stufe verfĂŒgbar.
13. Berechtigungen und Zugriffskontrolle
Der Zugriff auf das Modul wird durch die regulĂ€re Contao-Backend-Benutzergruppenverwaltung gesteuert (Modulzuweisung wie bei jedem anderen Backend-Modul). Jede schreibende Aktion prĂŒft zusĂ€tzlich ein gĂŒltiges Contao-Anfrage-Token. Innerhalb des Moduls entscheidet die aktive Lizenz zusĂ€tzlich darĂŒber, welche Funktionen zur VerfĂŒgung stehen (siehe Abschnitt 14).
14. Lizenz- und Berechtigungsverhalten
File Inspector ist ein kommerziell lizenziertes Bundle. Auch die kostenlose Stufe erfordert eine aktivierte Lizenz. Die Lizenz wird ausschlieĂlich unter Contao âș Einstellungen âș File Inspector Licence management verwaltet â es gibt keine Lizenzseite innerhalb des Moduls selbst.
Eine Lizenz ist an exakte Hostnamen gebunden, die aus der Domain-Einstellung der
Root-Seiten stammen. example.com und www.example.com gelten als unterschiedliche
Domains. Eine Installation ohne konfigurierte Domain kann keine Lizenz aktivieren.
WĂ€hrend des normalen Betriebs kontaktiert das Bundle bei bestimmten lizenzbezogenen VorgĂ€ngen den Lizenzdienst unter v-t.one ĂŒber eine vertrauenswĂŒrdige HTTPS-Verbindung, um die Berechtigung zu prĂŒfen. Anfragen gehen ausschlieĂlich vom Server aus, niemals aus dem Browser; LizenzschlĂŒssel und weiteres Authentifizierungsmaterial erscheinen nicht in Browser-Ausgaben oder regulĂ€ren Protokollen.
VollstĂ€ndige Details â Aktivierung, tatsĂ€chliche LizenzzustĂ€nde und die Funktionsfreischaltungs-Tabelle â stehen in der eigenstĂ€ndigen Lizenzierung-Dokumentation.
15. Funktionsstatus-Tabelle
| Funktion | Status |
|---|---|
| Normal Scan | Free und Pro |
| Deep Scan | Nur Pro |
| Unsicherheitserkennung (Teil von Deep Scan) | Nur Pro |
| File Usage Explorer / Evidence Viewer | Free und Pro |
| Export & Löschen | Nur Pro |
| Papierkorb / Wiederherstellung | Free und Pro |
| Scan-Verlauf ansehen | Free und Pro |
| Scan-Verlauf löschen / Aufbewahrungsrichtlinie | Nur Pro |
| Ignorierregeln | Nur Pro |
| AJAX-Hintergrund-Scans | Bedingt â auf der kostenlosen Stufe lĂ€uft ein Normal Scan stattdessen synchron ohne Fortschrittsanzeige |
| Minifizieren (CSS/JS) | Nur Pro |
| Bildoptimierung | Nur Pro |
| Frontend-Module | Nicht zutreffend |
Die vollstĂ€ndige AufschlĂŒsselung nach Lizenzstufe steht in der Lizenzierung-Dokumentation.
16. Sicherheitsmodell
Jeder von der OberflĂ€che ĂŒbermittelte Dateipfad wird vor jeder DateisystemĂ€nderung geprĂŒft (Eingrenzung auf das Upload-Verzeichnis, Ablehnung von Traversierung und symbolischen Links) â unmittelbar vor jeder einzelnen Operation erneut. Jede geschĂŒtzte Funktion prĂŒft ihre eigene Berechtigung serverseitig, unabhĂ€ngig von der OberflĂ€che. Details stehen im eigenstĂ€ndigen Sicherheitsmodell.
17. Betriebssicherheit
LöschvorgĂ€nge sind nicht destruktiv (Papierkorb statt sofortigem Entfernen), ZIP-Export und Löschung sind in getrennte Anfragen aufgeteilt, und Minifizierung/Bildkonvertierung legen vor jeder Ănderung eine Sicherungskopie an bzw. erzeugen ausschlieĂlich neue Dateien, ohne die Quelle zu verĂ€ndern. SchreibvorgĂ€nge auf Dateien erfolgen atomar (temporĂ€re Datei plus Umbenennung).
18. Laufzeitverzeichnisse
Alle Laufzeitdaten liegen unterhalb von var/ (siehe Abschnitt 8 sowie
Architektur fĂŒr die vollstĂ€ndige
Ăbersicht).
19. Externe Kommunikation
Die einzige externe Serverkommunikation erfolgt mit dem Lizenzdienst unter v-t.one, ĂŒber vertrauenswĂŒrdige HTTPS-Verbindungen und ausschlieĂlich vom Server aus â niemals aus dem Browser der Bedienperson. Details stehen in der Lizenzierung.
20. Protokollierung und SchwÀrzung vertraulicher Daten
Betriebsprotokolle (Löschungen unter var/log/file_inspector/deletions.log,
Minifizierung und Bildoptimierung) enthalten Vorgang, Ergebnis, Zeitstempel und
betroffene Pfade â keine LizenzschlĂŒssel oder sonstigen vertraulichen Daten.
21. Deployment
File Inspector wird wie jedes andere Contao-Bundle ĂŒber Composer ausgeliefert. Nach
einem Deployment ist contao:migrate auszufĂŒhren (siehe Abschnitt 5). Bei einem
Mehr-Server-Betrieb muss var/file_inspector/ auf gemeinsam genutztem Speicher liegen,
damit alle Knoten denselben Lizenzstatus sehen.
22. Cache-Leerung
Nach einer Aktualisierung des Bundles den Contao-/Symfony-Cache wie ĂŒblich leeren:
php bin/console cache:clear
23. Tests
vendor/bin/phpunit
Die Testsuite (PHPUnit 10.5/11.0) deckt unter anderem die Scan-Pipeline, den Papierkorb, den Export-Workflow, Minifizierung, Bildoptimierung sowie die sicherheitskritischen Bereiche der Lizenz- und Berechtigungsverwaltung ab.
24. Fehlerbehebung
- Lizenz lĂ€sst sich nicht aktivieren: PrĂŒfen, ob mindestens einer Root-Seite dieser Installation eine Domain zugewiesen ist (siehe Lizenzierung).
- Deep Scan / Hintergrund-Scan nicht verfĂŒgbar: Diese Funktionen erfordern eine Pro-Lizenz.
- Minifizierung/Bildoptimierung fehlgeschlagen: Details stehen in
var/log/file_inspector/minify.logbzw.var/log/file_inspector/image_optimization.log. - Export & Löschen: Ein Löschvorgang ist niemals endgĂŒltig â gelöschte Dateien liegen im Papierkorb und lassen sich dort wiederherstellen.
25. TatsÀchliche bekannte EinschrÀnkungen
- âKeine Referenz gefundenâ bedeutet, dass in den durchsuchten Quellen keine Referenz erkannt wurde â nicht, dass eine Datei garantiert an keiner Stelle mehr verwendet wird. Zur Laufzeit dynamisch zusammengesetzte Pfade, externe Systeme oder nicht durchsuchte Drittanbieter-Erweiterungen können unentdeckt bleiben. DafĂŒr existiert der Status Unsicher.
- Normal Scan durchsucht keine Quelldateien; Referenzen, die ausschlieĂlich im Code oder in Templates liegen, erfordern einen Deep Scan.
- Deep Scan ĂŒberspringt Quelldateien ĂŒber einer konfigurierbaren GröĂe (Standard 5 MiB); Anzahl und GesamtgröĂe ĂŒbersprungener Dateien erscheinen im Scan-Bericht.
- Ignorierte Ordner und Endungen werden vollstÀndig von jedem Scan ausgeschlossen und nie gemeldet.
- Datenbank-Textfelder werden fĂŒr die Unsicherheitsanalyse nicht erneut durchsucht.
Stets eine Sicherungskopie behalten. Der eingebaute Export & Löschen-Workflow macht dies zum Standardweg.
26. Lizenz- und Urheberrechtsinformationen
Quellcode-Lizenz: LGPL-3.0-or-later. Siehe LICENSE.
Copyright: V&T Innovations Team (www.v-t.one).
Die Nutzung der Funktionen dieses Bundles erfordert unabhÀngig von der Quellcode-Lizenz eine aktivierte Lizenz (siehe Abschnitt 14 und Lizenzierung).
27. WeiterfĂŒhrende Dokumentation
- đŹđ§ English README
- Lizenzierung â Lizenzmodell, ZustĂ€nde und Funktionsfreischaltung
- Sicherheitsmodell â SchutzmaĂnahmen im Ăberblick
- Architektur â technische Dokumentation fĂŒr Entwicklerinnen und Entwickler, die das Bundle erweitern möchten