Files
send/AGENTS.md

33 lines
2.7 KiB
Markdown
Raw Normal View History

2025-12-18 10:09:38 -05:00
# Send.cabillot.eu
Ce projet est une application PHP dont le but est simple :
* Une page HTML d'index principale avec un simple champ pour ajouter un fichier et un boutton `upload`.
* Une page PHP d'administration, ou je peux consulter tout les fichiers envoyes.
Seul les fichiers de moins de 10G sont acceptes.
Les fichiers doivent ensuite etre accessible publiquement via un path hashé qui n'est pas fourni a l'utilisateur qui envoyé le fichier.
Seul la page d'administration permet de voir les liens des fichiers.
## Implementation
L'application tourne via un container dans un cluster kubernetes.
Le serveur utilise doit etre frankenphp.
Les 2 pages web (index et admin) doivent jolies mais ne doivent pas avoir de dependances exterieurs (css, js).
Je pense que seul la page d'administration a besoin de PHP, surement tout le code peut aller dans ce fichier sans besoin d'eclater la logique sur differents fichiers.
## MVP livré
- [`public/index.html`](public/index.html) : page statique avec styles inline, formulaire `multipart/form-data` pointant vers `/admin.php?action=upload`, texte explicatif sur la limite de 10GB et bannière de statut alimentée par `?status=`.
- [`public/admin.php`](public/admin.php) : unique point d'entrée PHP, protège l'accès via HTTP Basic Auth (variables d'environnement `ADMIN_USER` / `ADMIN_PASS`), assure la création de `/upload`, gère `POST action=upload`, stocke les fichiers sous `/upload/YYYY/MM/DD/<hash>/<timestamp-nom>` (hash aléatoire hex), valide les erreurs PHP et la taille <10GB, puis redirige vers la page précédente sans révéler le hash. La vue GET affiche formulaire, état des uploads (nom original, date UTC, taille lisible, MIME `finfo`, slug hashé, lien `/files/...`).
- [`public/php.ini`](public/php.ini) : règles d'upload (10GB) et réglages runtime (`memory_limit`, `max_execution_time`, etc.).
- [`public/files/.gitkeep`](public/files/.gitkeep) : marqueur du répertoire monté côté serveur pour exposer les fichiers uploadés.
## Notes d'exploitation
- Volume : `/upload` doit être persistant et monté également sous `/app/public/files` dans le container FrankenPHP afin que les URLs `/files/...` servent les documents.
- Sécurité : ne jamais exposer l'URL hashée à l'uploadeur. Seule la page admin affiche les liens.
- Limites : `MAX_FILE_BYTES` défini à 10GiB. Les formulaires refusent les fichiers plus gros et redirigent avec `status=toolarge`.
- Authentification : sans variables d'environnement, l'app retourne 500. Fournir `ADMIN_USER` et `ADMIN_PASS` via Kubernetes secrets.
- Journalisation / suivi : les erreurs d'upload utilisent les codes PHP standards et redirigent avec un statut générique pour éviter les fuites d'information.