More robust
This commit is contained in:
34
README.md
34
README.md
@@ -23,15 +23,15 @@ project/
|
||||
├── public/
|
||||
│ ├── assets/ # Sources CSS/JS (servis minifiés via /min/@file)
|
||||
│ └── uploads/
|
||||
│ └── media/ # Images converties en PNG (sans perte)
|
||||
│ └── media/ # Images publiées (JPG conservé, PNG/WebP normalisés en PNG)
|
||||
└── tmp/
|
||||
├── cache/ # Cache F3 (pages publiques + assets minifiés)
|
||||
└── uploads/ # Transit Web::receive() — vidé après chaque upload
|
||||
└── uploads/ # Transit Web::receive() — nettoyé après chaque upload
|
||||
```
|
||||
|
||||
## Philosophie des dossiers runtime
|
||||
|
||||
Le projet garde la même logique en local et dans Docker :
|
||||
Le projet sépare les données persistantes du runtime jetable :
|
||||
|
||||
- `tmp/` = runtime temporaire, recréable
|
||||
- `db/` = base SQLite persistante
|
||||
@@ -42,14 +42,14 @@ Autrement dit, `tmp/` peut être vidé sans perte métier. Les données à sauve
|
||||
|
||||
## Fonctionnalités F3 utilisées
|
||||
|
||||
- **Routage nommé** — `config.ini [routes]`, `$f3->alias()`
|
||||
- **Cache HTTP + serveur** — `$f3->expire()` sur les routes publiques, `Cache::reset('.url')` à la mutation
|
||||
- **Routage nommé** — `config.ini [routes]`, filtre `alias` dans les templates, `reroute('@route')` dans les contrôleurs
|
||||
- **Cache HTTP + serveur** — TTL déclarés directement dans `[routes]`, `Cache::reset('.url')` à la mutation
|
||||
- **Assets minifiés** — `Web::minify()` via `AssetController` (`GET /min/@file`)
|
||||
- **Upload** — `Web::receive()` avec callback de validation taille
|
||||
- **Images** — `Image` (chargement, conversion PNG, dimensions), `Base::write()` pour l'écriture
|
||||
- **Markdown** — `Markdown::instance()->convert()`
|
||||
- **Upload** — `Web::receive()` avec contrôle de taille, puis validation MIME/dimensions côté modèle
|
||||
- **Images** — normalisation des médias via GD (`JPG` conservé, `PNG/WebP` convertis en `PNG` pour préserver la transparence)
|
||||
- **Markdown** — `Markdown::instance()->convert()` + reconstruction DOM en liste blanche
|
||||
- **Slugs** — `Web::instance()->slug()`
|
||||
- **Session** — `$f3->set('JAR', …)`, token CSRF dans `SESSION.csrf_token`
|
||||
- **Session** — `$f3->set('JAR', …)`, hooks `beforeRoute()` sur les contrôleurs protégés, token CSRF créé seulement sur les vues qui contiennent des formulaires
|
||||
- **Logging** — `Log` de F3 avec fallback `file_put_contents`
|
||||
- **ORM** — `DB\SQL\Mapper` : `paginate()`, `copyfrom()`, `cast()`, `find()`
|
||||
|
||||
@@ -115,7 +115,7 @@ cp config.local.ini.example config.local.ini
|
||||
docker compose up -d --build
|
||||
```
|
||||
|
||||
Docker monte les mêmes dossiers runtime que le développement local. Seuls les répertoires persistants restent séparés de `tmp/`.
|
||||
Docker ne monte que les dossiers persistants (`db/`, `logs/`, `public/uploads/media/`) et laisse `tmp/` dans le conteneur pour qu'il reste réellement éphémère.
|
||||
|
||||
Si `config.local.ini` n'existe pas, le conteneur démarre avec les valeurs par défaut de `app/config.ini`.
|
||||
|
||||
@@ -128,6 +128,20 @@ docker compose exec app php scripts/create-admin.php admin
|
||||
# mot de passe : 10 caractères minimum
|
||||
```
|
||||
|
||||
## Cache public et navigation
|
||||
|
||||
Les pages publiques (`/` et `/posts/@slug`) restent cacheables parce que leur rendu n'accède ni à la session, ni au token CSRF. La navigation publique affiche donc un lien statique vers la connexion / l'administration, tandis que les vues d'administration restent session-aware.
|
||||
|
||||
## Médias et limites d'upload
|
||||
|
||||
- Formats acceptés à l'entrée : `JPG`, `PNG`, `WebP`
|
||||
- Taille max du fichier reçu : `10 Mo`
|
||||
- Dimensions max : `8000 × 8000 px`
|
||||
- Limite de surface : `40 mégapixels`
|
||||
- Sortie publiée : `JPG` pour les sources JPEG, `PNG` pour les sources PNG/WebP
|
||||
|
||||
La médiathèque admin est paginée et le picker dans l'éditeur charge seulement les images les plus récentes pour éviter de charger toute la bibliothèque en mémoire à chaque formulaire.
|
||||
|
||||
## Reverse proxy Caddy
|
||||
|
||||
### Caddy sur le même hôte
|
||||
|
||||
Reference in New Issue
Block a user