northernco/maintenance-mode-bundle
A lightweight maintenance-mode bundle for Laravel/PHP applications. Easily enable or disable maintenance mode, display a customizable maintenance page, and control access for allowed users during deployments or downtime.
This is a Symfony bundle, not a Laravel package — the repo is NorthernMaintenanceModeBundle, and the naming convention (*Bundle, northernco/...-bundle) is a giveaway. If you're a Laravel developer looking for php artisan down, this is not the package for you; look at laravel/framework's built-in maintenance mode or spatie/laravel-maintenance instead.
If you're in a Symfony app:
composer require northernco/maintenance-mode-bundleconfig/bundles.php:
NorthernCo\MaintenanceModeBundle\NorthernMaintenanceModeBundle::class => ['all' => true],
config/packages/northern_maintenance_mode.yaml). Expect keys for enabled state, HTTP status code, retry-after header, allow-listed IPs, and a template/redirect target.Where to look first: the bundle's Resources/config/ (service definitions) and its event subscriber / kernel listener — that's where the 503 behavior and IP bypass logic will actually live. There is no meaningful public documentation signal from a 1-star, 0-dependent package; read the source.
Because the package is essentially unproven, treat the following as the patterns a maintenance-mode bundle should support, and verify each against the source before depending on it:
enabled: '%env(bool:MAINTENANCE_MODE)%' so ops can flip it per-environment without a deploy. This is the single most valuable integration point — confirm the bundle exposes it.allowed_ips config key; if absent, fork or override the listener.templates/maintenance.html.twig) so the 503 body matches your brand and includes a Retry-After header hint.app:maintenance:on|off, use it from deploys; if not, a one-line cache:clear after editing the env var is your fallback. Consider a small custom command that toggles a marker file — it's often more reliable than config edits under deploy automation.kernel.request listener with a high priority (before routing/auth) returning a Response(503, ...). Verify the bundle's listener priority; if it runs after the firewall, users hit auth errors before seeing maintenance./healthz or /metrics paths so your load balancer doesn't pull instances out of rotation because you put them in maintenance.Typical day-to-day workflow with a bundle like this: enable in staging for a schema-migration window → verify via allow-listed IP → flip the env var in production → run migrations → flip back → cache:clear if config is cached.
kernel.request subscriber yourself — you'll get better test coverage and no supply-chain risk.enabled flag or the IP list, run bin/console cache:clear (in the right env, --env=prod) or your change silently does nothing. This trips up almost everyone the first time._profiler, _wdt, or asset requests. Confirm those paths are excluded, otherwise the Symfony debug toolbar and your maintenance page's own CSS 503.Retry-After, not 200 or 404. Search engine crawlers and CDNs (Cloudflare, Fastly) treat these very differently. Check the bundle sets the header correctly.kernel.request listener never fires for console commands — good, you want migrations and commands to run during maintenance. Don't "fix" this.TrustedProxies / TrustedHeaders configured at the framework level — the bundle cannot solve this for you.MaintenanceModeEnabledEvent, a configurable response factory, or a MaintenanceCheckerInterface you can decorate. If none of these exist, you'll be editing vendor code — a hard no for production.symfony/framework-bundle's own framework.php_errors and a hand-rolled listener; scheb/maintenance-bundle (though similarly niche); or a generic 503 middleware in your public/index.php front controller. For Laravel, php artisan down --render="errors::503" --secret="..." covers nearly every use case this bundle would."northernco/maintenance-mode-bundle": "1.0.0" not ^1.0) and commit the composer lock so a silent retag can't break you.How can I help you explore Laravel packages today?