daycry / maintenancemode
Maintenance mode for CodeIgniter 4
v3.0.0
2026-05-08 09:40 UTC
Requires
- php: >=8.2
- codeigniter4/settings: ^2.2
Requires (Dev)
This package is auto-updated.
Last update: 2026-05-08 09:47:22 UTC
README
Production-grade maintenance mode for CodeIgniter 4 โ typed, testable, and ready for distributed deployments.
Package
Quality
Community
Highlights
- ๐ก Timing-safe bypass โ
hash_equals()for every secret/cookie comparison. - ๐ฆ Multiple bypass paths โ IP / CIDR (IPv4 + IPv6), URL secret, signed cookie, route allow-list.
- ๐ Scheduled windows โ
--start/--end, auto-deactivation on the next request. - ๐ฆ Pluggable storage โ
cache(Redis/Memcached/file via CI4 Cache) orfiledriver, switch with one config flag. - ๐ Framework events โ
maintenance.activated,.deactivated,.bypassed,.access_denied,.scheduled.expired. - ๐งฑ JSON or HTML โ content-negotiated 503 (or 302 redirect) per request.
- ๐งช 149 unit tests, PHPStan + Psalm + Rector clean, PHP 8.2 / 8.3 / 8.4.
Install
composer require daycry/maintenancemode php spark mm:publish
Then wire the filter in app/Config/Filters.php:
public array $aliases = [ 'maintenance' => \Daycry\Maintenance\Filters\Maintenance::class, ]; public array $globals = [ 'before' => ['maintenance'], ];
Quick start
# Activate (with an allow-listed IP, a secret URL bypass, and a 30 min ETA) php spark mm:down --message "Upgrading the database" \ --ip "203.0.113.5" \ --secret "ops-token" \ --duration 30 # Inspect state php spark mm:status # Bring the site back up php spark mm:up
# Schedule a window php spark mm:down --start "2026-05-10 02:00" --end "2026-05-10 04:00" # Skip 503 for healthchecks (config option) $config->bypassRoutes = ['/health', '/api/webhooks/*']; # Force JSON response on /api/* routes $config->jsonRoutes = ['/api/*']; # Render a custom view for THIS window php spark mm:down --render errors/html/branded_503 # Redirect to a status page instead of 503 php spark mm:down --redirect https://status.example.com
Documentation
Everything else lives in docs/:
- Installation & first run
- Full configuration reference
- CLI commands
- Bypass methods & priority
- Filter & framework events
- Storage drivers (cache / file)
- Architecture
- Security model
- Troubleshooting ยท FAQ ยท Upgrade guide ยท Roadmap
Examples
- Basic maintenance
- Scheduled window
- JSON 503 for APIs
- Slack / PagerDuty notifications
- Multi-tenant (planned)
- Cloudflare / CDN trusted proxies (planned)
Quality bar
This package treats the toolchain as part of the contract. Every push runs:
| Workflow | Tool | What it guards |
|---|---|---|
| PHPUnit | PHPUnit ยท matrix PHP 8.2 / 8.3 / 8.4 + lowest-deps | Behaviour |
| Code Style | PHP-CS-Fixer (CodeIgniter 4 ruleset) | Formatting |
| PHPStan | PHPStan level 6 | Static types |
| Psalm | Psalm error level 6 | Static types & dead code |
| Rector | Rector dry-run | Refactor drift |
| CodeQL | GitHub CodeQL (Actions) | Supply-chain (workflow injection, secret leaks) |
Reproduce them locally with composer ci.
Contributing
Bug reports, feature requests and PRs are welcome. Please read CONTRIBUTING.md and the Code of Conduct first. For security issues, follow SECURITY.md โ please don't file them as public issues.
License
MIT ยท made for the CodeIgniter 4 community.