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

@@ -7,19 +7,19 @@ use App\Domain\Media\Image;
use App\Domain\Media\ImageRepository;
use App\Domain\Media\ImageVariantRepository;
use App\Framework\Core\PathProvider;
use App\Framework\Http\HttpRequest;
use App\Framework\Router\Result\FileResult;
use App\Framework\Exception\FrameworkException;
use App\Framework\Filesystem\FilePath;
use App\Framework\Http\MimeType;
use App\Framework\Core\ValueObjects\FileSize;
use App\Framework\Core\ValueObjects\Hash;
use App\Framework\Exception\FrameworkException;
use App\Framework\Filesystem\ValueObjects\FilePath;
use App\Framework\Http\HttpRequest;
use App\Framework\Http\MimeType;
use App\Framework\Router\Result\FileResult;
use App\Framework\Ulid\Ulid;
beforeEach(function () {
// Create test directory and file
$this->testDir = '/tmp/test_show_image';
if (!is_dir($this->testDir)) {
if (! is_dir($this->testDir)) {
mkdir($this->testDir, 0755, true);
}
@@ -118,7 +118,7 @@ it('throws exception when image not found in either repository', function () {
->andReturn(null);
// Act & Assert
expect(fn() => $this->controller->__invoke($filename, $request))
expect(fn () => $this->controller->__invoke($filename, $request))
->toThrow(FrameworkException::class, 'Image not found: nonexistent.jpg');
});
@@ -146,7 +146,7 @@ it('throws exception when image file does not exist on filesystem', function ()
->andReturn($missingFileImage);
// Act & Assert
expect(fn() => $this->controller->__invoke($filename, $request))
expect(fn () => $this->controller->__invoke($filename, $request))
->toThrow(FrameworkException::class, 'Image file not found on filesystem');
});
@@ -171,7 +171,7 @@ it('handles different image file extensions', function () {
'test.gif' => 'image/gif',
'test.webp' => 'image/webp',
'test.avif' => 'image/avif',
'test.unknown' => 'image/jpeg' // fallback
'test.unknown' => 'image/jpeg', // fallback
];
foreach ($extensions as $filename => $expectedMime) {
@@ -193,4 +193,4 @@ it('handles different image file extensions', function () {
// Clean up
unlink($testPath);
}
});
});