---
suivi: 1229
date: 2026-08-06
sujet: Restauration limite upload DCE 500 Mo (annulation baisse erronée #1227)
chantier: appels-offres / php-ovh / securite-depots
type: fix
statut: poussé
hash: 98c961b8
fichiers:
  - .user.ini
  - app/Services/AoDocumentService.php
  - app/Support/UploadDocumentAllowlist.php
  - resources/js/Components/AppelsOffres/AoDocumentsSection.vue
  - docs/deploy/ovh-php-config.md
  - .cursor/rules/deploiement-ovh.mdc
  - database/data/journal_mises_a_jour_post_2026_06_12.php
  - public/build/
  - docs/suivi/SUIVI_1229_restauration_limite_upload.md
---

# SUIVI #1229 — Restauration limite upload 500 Mo

## PROMPT ENVOYÉ

Restaurer la capacité d'upload à 500 Mo — annulation de la réduction erronée du
#1227 (`.user.ini` 128M/130M, DCE 120 Mo). Preuve web 06/08 :
`upload=512M post=520M sapi=fpm-fcgi`. Restaurer EXACTEMENT les valeurs
pré-#1227 via git. Porter `PHP_SAFE_MAX_KB`. Règle Cursor CLI≠web. Conserver
`.htaccess` + MIME #1227. Journal + build + push.

## FICHES LUES

- `#1227` — réduction DCE / `.user.ini` motivée par mesure #1115 (en réalité
  **CLI**) ; `.htaccess` + allowlist MIME à **conserver**.
- `#1228` — diag marches public (hors périmètre ; pas de déplacement ici).
- `#1115` — source de la valeur 128M (CLI) mal réutilisée au #1227.

## ERREUR DE MESURE

| Contexte | upload | post | sapi |
|----------|--------|------|------|
| CLI (#1115) | ~128M | ~130M | `cli` — `.user.ini` **non lu** |
| Web (06/08/2026) | **512M** | **520M** | `fpm-fcgi` — `.user.ini` **effectif** |

Abaisser les limites applicatives sur la foi d'une mesure CLI = piège corrigé
dans `.cursor/rules/deploiement-ovh.mdc`.

## PREUVE GIT — `.user.ini` avant #1227

```
git show 963e4910^:.user.ini
```

```
; Configuration PHP OVH — uploads documents AO (DCE jusqu'à 500 Mo)
; Placer à la racine du projet (même niveau que public/). Vérifier avec : php -i | grep upload_max_filesize

upload_max_filesize = 512M
post_max_size = 520M
memory_limit = 512M
max_execution_time = 300
max_input_time = 300
```

Restauré **ligne pour ligne** (pas de `max_file_uploads` dans la version
d'origine).

## OBJET 2 — LIMITES

| Écran | Limite #1227 | Limite rétablie | Fichier:ligne |
|-------|--------------|-----------------|---------------|
| AO DCE (service) | 120 Mo / 120000 Ko | **500 Mo / 512000 Ko** | `AoDocumentService.php:46-47` |
| AO DCE (UI fallback) | `?? 120` | **`?? 500`** | `AoDocumentsSection.vue:33` |
| `.user.ini` | 128M / 130M / mem 256M | **512M / 520M / mem 512M** | `.user.ini` |
| `PHP_SAFE_MAX_KB` | 120000 | **512000** | `UploadDocumentAllowlist.php` |
| GED / marché / avenant / juridique | 20 Mo | 20 Mo (inchangé) | — |
| Réservation | 50 Mo | 50 Mo | — |
| Contact | 5 Mo | 5 Mo | — |
| Estimatif MOE | 50 Mo | 50 Mo | — |

### Sort de `PHP_SAFE_MAX_KB`

**Conservée à 512000.** Rôle : filet dans `fileRules($maxKb)` —
`min($maxKb, PHP_SAFE_MAX_KB)` pour qu'aucun appelant ne demande plus que le
plafond WEB `.user.ini`. Les écrans restent à 5–50 Mo métier. Laisser 120000
aurait bloqué tout appel futur au-delà de 120 Mo malgré PHP à 512M — exactement
le piège. Le DCE passe par `AoDocumentService` (pas `fileRules`), mais la
constante doit rester alignée pour cohérence.

## OBJET 3 — Règle Cursor

Ajoutée dans `.cursor/rules/deploiement-ovh.mdc` (section « Limites PHP —
CLI ≠ web (#1229) ») — texte demandé par le prompt.

## NON TOUCHÉ (#1227 intact)

- `storage/app/public/.htaccess` (toujours suivi git)
- `AllowedDocumentUpload` + MIME allowlist (hors constante plafond)
- Validation MIME GED / marché / avenant / contact / réservation / juridique
- `config/filesystems.php`, symlink, chemins stockage

## DÉPLOIEMENT-TEST

```text
git pull origin main
php artisan optimize:clear
php artisan view:clear
php artisan journal:sync
```

Attendre **≥ 5 min** (`user_ini.cache_ttl`) avant le test 1.

1. Page web : `upload=512M post=520M sapi=fpm-fcgi`
2. DCE > 200 Mo accepté
3. UI annonce 500 Mo
4. Fichier > limite → message clair
5. txt renommé `.pdf` → refusé (non-régression MIME #1227)
6. Dépôt / foncier / tâches / GED inchangés
7. `git ls-files storage/app/public/.htaccess` → suivi

## LEÇON

Mesure PHP sans `PHP_SAPI` = mesure inutilisable pour les uploads web. Ne jamais
abaisser une limite métier parce qu'une CLI affiche moins : vérifier
`sapi=fpm-fcgi` d'abord.
