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

@@ -35,7 +35,7 @@ final class ControllerNamingRule implements Rule
$shortName = $classReflection->getNativeReflection()->getShortName();
// Skip if not in Application namespace (controllers are in Application)
if (!str_starts_with($className, 'App\\Application\\')) {
if (! str_starts_with($className, 'App\\Application\\')) {
return [];
}
@@ -45,12 +45,13 @@ final class ControllerNamingRule implements Rule
foreach ($method->getAttributes() as $attribute) {
if (str_contains($attribute->getName(), 'Route')) {
$hasRouteAttribute = true;
break 2;
}
}
}
if (!$hasRouteAttribute) {
if (! $hasRouteAttribute) {
return []; // Not a controller
}
@@ -82,11 +83,12 @@ final class ControllerNamingRule implements Rule
foreach ($actionVerbs as $verb) {
if (str_starts_with($shortName, $verb)) {
$startsWithActionVerb = true;
break;
}
}
if (!str_starts_with($shortName, 'Show') && !$startsWithActionVerb) {
if (! str_starts_with($shortName, 'Show') && ! $startsWithActionVerb) {
$errors[] = RuleErrorBuilder::message(sprintf(
'Controller "%s" must start with "Show" (for views) or an action verb (Submit, Create, Update, Delete, Handle, Process, Execute).',
$shortName
@@ -107,14 +109,14 @@ final class ControllerNamingRule implements Rule
$shortName = $classReflection->getNativeReflection()->getShortName();
foreach ($classReflection->getNativeReflection()->getMethods() as $method) {
if (!$method->isPublic() || $method->isStatic()) {
if (! $method->isPublic() || $method->isStatic()) {
continue;
}
// Check for Route attribute
$routeAttributes = array_filter(
$method->getAttributes(),
fn($attr) => str_contains($attr->getName(), 'Route')
fn ($attr) => str_contains($attr->getName(), 'Route')
);
foreach ($routeAttributes as $routeAttr) {
@@ -126,7 +128,7 @@ final class ControllerNamingRule implements Rule
? $args['method']->name
: $args['method'];
if ($methodName !== 'GET' && !str_contains((string)$methodName, 'GET')) {
if ($methodName !== 'GET' && ! str_contains((string)$methodName, 'GET')) {
$violations[] = sprintf(
'Show controller "%s" has non-GET route in method "%s()". Show controllers should only handle GET requests. Use %s for POST/PUT/DELETE.',
$shortName,
@@ -138,7 +140,7 @@ final class ControllerNamingRule implements Rule
// Check return type (Show* should return ViewResult)
$returnType = $method->getReturnType();
if ($returnType && !str_contains($returnType->__toString(), 'ViewResult')) {
if ($returnType && ! str_contains($returnType->__toString(), 'ViewResult')) {
$violations[] = sprintf(
'Show controller "%s" method "%s()" should return ViewResult, not "%s".',
$shortName,