Checklist
Go through the list before the first release to production and after larger changes of the infrastructure.
-
CI_ENVIRONMENT = production, debug toolbar gone, no error details on an error page. - Document root is
public/;.env,writable/not reachable. - HTTPS only, HSTS at the web server,
app.baseURLwithhttps://,cookie.secure = true. -
Config\App::$proxyIPsset when behind a proxy; the audit log shows real client IPs. -
app.CSPEnabled = true, response headers checked in the browser (CSP,frame-ancestors 'none',nosniff, HSTS). - Global
csrf(exceptapi/*with the API,sso/*/callbackwith SAML),secureheadersand Shield’sauth-ratesfilter active (php spark filter:check GET admin,php spark filter:check GET login). - New
encryption.keyand ownanvil.auditKeyfor production, kept in a secret store and backed up; no secret in the repository. -
composer install --no-dev,migrate --all,anvil:publishdone;anvil:workflow:checkpasses. - Cron for
anvil:tick,anvil:prune,anvil:audit:verify(andanvil:api:review), queue worker running. - Real cache handler; shared cache, sessions and file storage with several servers.
- Virus scanner configured and reachable, upload limits in
php.inimatch$fileMaxSize. -
logger.threshold = 5, logs forwarded, alerts on security events. - Database user restricted on the audit tables; backup and restore tested.
- Administrator password changed, two-factor
required (
anvil.mfaRequired = true) or panels restricted to single sign-on;Config\Anvil::$shieldGroupFallback = falseonce roles are maintained in Anvil.