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

@@ -23,22 +23,23 @@ final readonly class IpAddress
return new self($ip);
}
public static function fromRequest(): ?self
public static function fromRequest(ServerEnvironment $server): ?self
{
$headers = [
'HTTP_CF_CONNECTING_IP', // Cloudflare
'HTTP_CLIENT_IP', // Proxy
'HTTP_X_FORWARDED_FOR', // Load balancer/proxy
'HTTP_X_FORWARDED', // Proxy
'HTTP_X_CLUSTER_CLIENT_IP', // Cluster
'HTTP_FORWARDED_FOR', // Proxy
'HTTP_FORWARDED', // Proxy
'REMOTE_ADDR', // Standard
$keys = [
ServerKey::HTTP_CF_CONNECTING_IP, // Cloudflare
ServerKey::HTTP_CLIENT_IP, // Proxy
ServerKey::HTTP_X_FORWARDED_FOR, // Load balancer/proxy
ServerKey::HTTP_X_FORWARDED, // Proxy
ServerKey::HTTP_X_CLUSTER_CLIENT_IP, // Cluster
ServerKey::HTTP_FORWARDED_FOR, // Proxy
ServerKey::HTTP_FORWARDED, // Proxy
ServerKey::REMOTE_ADDR, // Standard
];
foreach ($headers as $header) {
if (! empty($_SERVER[$header])) {
$ip = trim(explode(',', $_SERVER[$header])[0]);
foreach ($keys as $key) {
$value = $server->get($key);
if ($value !== null && $value !== '') {
$ip = trim(explode(',', $value)[0]);
if (self::isValid($ip)) {
return new self($ip);
}