Repository navigation
10 Production Checklist
Mikhail Deynekin edited this page Nov 6, 2026
·
1 revision
A deploy checklist, in the order that avoids surprises. Each item is something that has gone wrong in a real deployment of this pattern.
-
mode = monitor -
auto_migrate = truefor the first run (or apply../migrations/schema.sqlyourself) - the dashboard shows live statistics
-
php_shield_incidentsis filling with type, severity, endpoint and field
- read a week of incidents; disable rules that only fire on your own content editors
- set
trusted_ipsto your own networks and monitoring, nothing wider - set
trusted_proxiesto exactly the proxies in front of PHP - verify the client address with a forged
X-Forwarded-For(see Reverse proxies)
-
auto_migrate = false— no DDL on the request path -
migrations/schema.sqlapplied, schema drift checked (tools/db-selftest.php) - the database user of the shield has no
DROP,GRANTorFILEprivilege -
DatabaseRateLimiter::prune()andcleanup()are scheduled
-
rate_limiter = redisif more than one PHP worker can accept requests - Redis is not reachable from the internet
- a Redis outage was tested: requests must still pass (fail open) and be logged
-
ip_reputation.enabled = truewithblock_scorehigh (for example 90) for the first days - keys live in the environment (
ABUSEIPDB_API_KEY,ABUSEIPDB_RU_API_KEY), never in the tree -
tools/live-abuseipdb.phpanswers once, and the quota window is understood - the second provider is configured as a fallback
-
admin.password_hashset from the environment; an empty hash disables login - HTTPS only,
cookie_secureresolved from$_SERVER['HTTPS'] - path restricted at the web-server level (allowlist, VPN or HTTP auth)
- no secret in the dashboard's configuration file (
/public/admin/config.phpis git-ignored)
-
SecurityHeaders::send()called early in the request - the 403/429 response body is JSON or HTML as your clients expect —
inspect()gives you the status, the reason and a detail string
- switch to
mode = block - watch the 403/429 rate for a day; an unexpected spike is a false positive, not a win
- add the monitor to your alerting: incident rate, block count, reputation provider errors
- document the rollback: one configuration key back to
monitor
$config['mode'] = 'monitor'; // stop blocking immediately, keep observingNothing else changes: blocks already issued stay until they expire, and unblockIp() clears them if
you need that too. There is no migration to undo.
repository · releases · MIT