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

@@ -15,15 +15,53 @@ final class ForProcessor implements DomProcessor
{
public function __construct(
private Container $container,
) {}
) {
}
public function process(DomWrapper $dom, RenderContext $context): DomWrapper
{
$forNodes = $dom->document->querySelectorAll('for[var][in]');
// Debug: show a snippet of HTML around select elements
$selects = $dom->document->querySelectorAll('select');
foreach ($selects as $idx => $select) {
$html = $dom->document->saveHTML($select);
$snippet = substr($html, 0, 200);
}
// Debug: show all <for> elements in document
$allForElements = $dom->document->querySelectorAll('for');
foreach ($allForElements as $idx => $forEl) {
$attrs = [];
foreach ($forEl->attributes as $attr) {
$attrs[] = $attr->name . '="' . $attr->value . '"';
}
}
// Support both syntaxes: var/in (old) and items/as (new)
$forNodesOld = $dom->document->querySelectorAll('for[var][in]');
$forNodesNew = $dom->document->querySelectorAll('for[items][as]');
// Merge both nodesets
$forNodes = [];
foreach ($forNodesOld as $node) {
$forNodes[] = $node;
}
foreach ($forNodesNew as $node) {
$forNodes[] = $node;
}
foreach ($forNodes as $node) {
$var = $node->getAttribute('var');
$in = $node->getAttribute('in');
// Detect which syntax is being used
if ($node->hasAttribute('items') && $node->hasAttribute('as')) {
// New syntax: <for items="arrayName" as="itemVar">
$in = $node->getAttribute('items');
$var = $node->getAttribute('as');
} else {
// Old syntax: <for var="itemVar" in="arrayName">
$var = $node->getAttribute('var');
$in = $node->getAttribute('in');
}
$output = '';
// Resolve items from context data or model
@@ -81,7 +119,7 @@ final class ForProcessor implements DomProcessor
}
// Replace for node with processed output
if (!empty($output)) {
if (! empty($output)) {
try {
$replacement = $dom->document->createDocumentFragment();
@$replacement->appendXML($output);
@@ -218,6 +256,7 @@ final class ForProcessor implements DomProcessor
// Find row with placeholders (template row)
if (str_contains($rowHtml, '{{')) {
$content = $rowHtml;
break 2;
}
}