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

@@ -49,9 +49,10 @@ it('can modify message', function () {
timestamp: $this->timestamp
);
$record->setMessage('Modified message');
$modified = $record->withMessage('Modified message');
expect($record->getMessage())->toBe('Modified message');
expect($modified->getMessage())->toBe('Modified message');
expect($record->getMessage())->toBe('Original message'); // Original unverändert
});
it('can set channel after creation', function () {
@@ -62,9 +63,10 @@ it('can set channel after creation', function () {
timestamp: $this->timestamp
);
$record->setChannel('security');
$withChannel = $record->withChannel('security');
expect($record->getChannel())->toBe('security');
expect($withChannel->getChannel())->toBe('security');
expect($record->getChannel())->toBeNull(); // Original unverändert
});
it('can format timestamp', function () {
@@ -88,13 +90,14 @@ it('can add extra data', function () {
timestamp: $this->timestamp
);
$record->addExtra('request_id', 'req-123');
$record->addExtra('process_id', 5678);
$withExtra = $record->withExtra('request_id', 'req-123');
$withBoth = $withExtra->withExtra('process_id', 5678);
expect($record->hasExtra('request_id'))->toBeTrue();
expect($record->getExtra('request_id'))->toBe('req-123');
expect($record->getExtra('process_id'))->toBe(5678);
expect($record->hasExtra('non_existent'))->toBeFalse();
expect($withBoth->hasExtra('request_id'))->toBeTrue();
expect($withBoth->getExtra('request_id'))->toBe('req-123');
expect($withBoth->getExtra('process_id'))->toBe(5678);
expect($withBoth->hasExtra('non_existent'))->toBeFalse();
expect($record->hasExtra('request_id'))->toBeFalse(); // Original unverändert
});
it('can add multiple extras at once', function () {
@@ -111,12 +114,13 @@ it('can add multiple extras at once', function () {
'execution_time' => 0.123,
];
$record->addExtras($extras);
$withExtras = $record->withExtras($extras);
expect($record->getExtras())->toBe($extras);
expect($record->getExtra('server'))->toBe('web-01');
expect($record->getExtra('memory_usage'))->toBe(1024000);
expect($record->getExtra('execution_time'))->toBe(0.123);
expect($withExtras->getExtras())->toBe($extras);
expect($withExtras->getExtra('server'))->toBe('web-01');
expect($withExtras->getExtra('memory_usage'))->toBe(1024000);
expect($withExtras->getExtra('execution_time'))->toBe(0.123);
expect($record->getExtras())->toBe([]); // Original unverändert
});
it('returns default value for non-existent extra', function () {
@@ -140,16 +144,17 @@ it('maintains fluent interface for setters', function () {
);
$result = $record
->setMessage('New message')
->setChannel('custom')
->addExtra('key1', 'value1')
->addExtras(['key2' => 'value2']);
->withMessage('New message')
->withChannel('custom')
->withExtra('key1', 'value1')
->withExtras(['key2' => 'value2']);
expect($result)->toBe($record);
expect($record->getMessage())->toBe('New message');
expect($record->getChannel())->toBe('custom');
expect($record->getExtra('key1'))->toBe('value1');
expect($record->getExtra('key2'))->toBe('value2');
expect($result)->not->toBe($record); // Neues Objekt
expect($result->getMessage())->toBe('New message');
expect($result->getChannel())->toBe('custom');
expect($result->getExtra('key1'))->toBe('value1');
expect($result->getExtra('key2'))->toBe('value2');
expect($record->getMessage())->toBe('Test'); // Original unverändert
});
it('converts to array correctly', function () {
@@ -161,9 +166,9 @@ it('converts to array correctly', function () {
channel: 'test-channel'
);
$record->addExtra('request_id', 'req-456');
$withExtra = $record->withExtra('request_id', 'req-456');
$array = $record->toArray();
$array = $withExtra->toArray();
expect($array)->toHaveKeys([
'message',
@@ -177,7 +182,7 @@ it('converts to array correctly', function () {
]);
expect($array['message'])->toBe('Test message');
expect($array['context'])->toMatchArray(['user' => 'test', 'action' => 'login']);
expect($array['context'])->toMatchArray(['structured' => ['user' => 'test', 'action' => 'login']]);
expect($array['level'])->toBe(LogLevel::WARNING->value);
expect($array['level_name'])->toBe('WARNING');
expect($array['timestamp'])->toBe('2024-01-15 10:30:45');
@@ -250,12 +255,14 @@ it('overrides existing extras when adding with same key', function () {
timestamp: $this->timestamp
);
$record->addExtra('key', 'original');
expect($record->getExtra('key'))->toBe('original');
$withOriginal = $record->withExtra('key', 'original');
expect($withOriginal->getExtra('key'))->toBe('original');
$record->addExtra('key', 'modified');
expect($record->getExtra('key'))->toBe('modified');
$withModified = $withOriginal->withExtra('key', 'modified');
expect($withModified->getExtra('key'))->toBe('modified');
expect($withOriginal->getExtra('key'))->toBe('original'); // Vorherige Version unverändert
$record->addExtras(['key' => 'final']);
expect($record->getExtra('key'))->toBe('final');
$withFinal = $withModified->withExtras(['key' => 'final']);
expect($withFinal->getExtra('key'))->toBe('final');
expect($withModified->getExtra('key'))->toBe('modified'); // Vorherige Version unverändert
});