feat(Production): Complete production deployment infrastructure

- Add comprehensive health check system with multiple endpoints
- Add Prometheus metrics endpoint
- Add production logging configurations (5 strategies)
- Add complete deployment documentation suite:
  * QUICKSTART.md - 30-minute deployment guide
  * DEPLOYMENT_CHECKLIST.md - Printable verification checklist
  * DEPLOYMENT_WORKFLOW.md - Complete deployment lifecycle
  * PRODUCTION_DEPLOYMENT.md - Comprehensive technical reference
  * production-logging.md - Logging configuration guide
  * ANSIBLE_DEPLOYMENT.md - Infrastructure as Code automation
  * README.md - Navigation hub
  * DEPLOYMENT_SUMMARY.md - Executive summary
- Add deployment scripts and automation
- Add DEPLOYMENT_PLAN.md - Concrete plan for immediate deployment
- Update README with production-ready features

All production infrastructure is now complete and ready for deployment.
This commit is contained in:
2025-10-25 19:18:37 +02:00
parent caa85db796
commit fc3d7e6357
83016 changed files with 378904 additions and 20919 deletions

View File

@@ -14,7 +14,6 @@ use App\Framework\Http\RequestIdGenerator;
use App\Framework\Http\ServerEnvironment;
use App\Framework\Http\UploadedFile;
use App\Framework\Http\UploadedFiles;
use App\Framework\Http\Uri;
use InvalidArgumentException;
/**
@@ -175,26 +174,14 @@ final readonly class HttpRequestParser
if (in_array($method, ['POST', 'PUT', 'PATCH'])) {
if (str_contains($contentType, 'multipart/form-data')) {
error_log("HttpRequestParser: Detected multipart/form-data");
error_log("HttpRequestParser: rawBody length = " . strlen($rawBody));
error_log("HttpRequestParser: \$_POST count = " . count($_POST));
error_log("HttpRequestParser: \$_FILES count = " . count($_FILES));
// For multipart/form-data, PHP automatically populates $_POST and $_FILES
// and makes php://input empty. Use $_POST and $_FILES directly in this case.
if (strlen($rawBody) === 0 && (! empty($_POST) || ! empty($_FILES))) {
error_log("HttpRequestParser: Using \$_POST fallback for multipart/form-data");
error_log("HttpRequestParser: \$_POST = " . json_encode($_POST));
error_log("HttpRequestParser: \$_FILES = " . json_encode($_FILES));
error_log("HttpRequestParser: \$_FILES empty? " . (empty($_FILES) ? 'YES' : 'NO'));
$parsedBody = $_POST;
// Also handle $_FILES if available
if (! empty($_FILES)) {
error_log("HttpRequestParser: Creating UploadedFiles from \$_FILES");
$uploadedFiles = UploadedFiles::fromFilesArray($_FILES);
} else {
error_log("HttpRequestParser: \$_FILES is empty, using empty UploadedFiles");
}
} else {
// Extract boundary
@@ -239,7 +226,7 @@ final readonly class HttpRequestParser
);
// Generate request ID
$requestId = $this->requestIdGenerator->generate();
$requestId = $this->requestIdGenerator->generate($headers);
// Create the request
return new HttpRequest(