Production checklist¶
Use this checklist before an Internet-facing launch and after material platform changes. It complements—not replaces—your organization’s deployment, security, privacy, and recovery standards.
Runtime and edge¶
-
APP_ENV=production. -
APP_DEBUG=false. - Canonical
APP_URLuses HTTPS and matches external routing. - TLS terminates at a maintained proxy/load balancer with correct forwarded headers.
-
/publicis the only exposed application document root. - Directory listing is disabled.
-
/upis used for a basic health probe; deeper dependency checks are monitored separately. - Web and queue processes run as non-root application users.
- PHP OPcache is enabled and resource limits are explicit.
- Frontend and MkDocs were built from the same release as Laravel code.
Secrets and encryption¶
- Generate a unique
APP_KEY; never reuse a development key. - Back up
APP_KEYin a separate protected secret store. - Keep database, SMTP, OAuth, and other secrets outside version control/image layers where possible.
- Restrict
.envfile permissions. - Set a credential/secret rotation procedure.
- Understand that losing
APP_KEYloses decryption access to TOTP and webhook secrets. - Use
APP_PREVIOUS_KEYSonly as part of a tested Laravel key-rotation process.
Sessions and browser security¶
-
SESSION_ENCRYPT=true. -
SESSION_SECURE_COOKIE=truebehind HTTPS. -
SESSION_HTTP_ONLY=true. -
SESSION_SAME_SITE=laxremains appropriate for sign-in/OAuth callbacks. -
SESSION_DOMAINis no broader than required. - CORS origins are empty for normal same-origin SPA operation or explicitly restricted.
- Reverse proxy preserves Authorization and CSRF headers.
- Authentication/security rate limit behavior was tested from the real edge IP topology.
Account policy¶
- Decide and document
OKATANA_REQUIRE_TWO_FACTORbefore onboarding. - Synchronize server/container clocks through reliable NTP.
- Test signup email verification and TOTP from outside the internal network.
- Document recovery for lost authenticators because there is no user recovery-code interface.
- Keep at least two owners per production organization.
- Test invited new and existing-account flows.
- Review OAuth/SSO verified-email and account-linking behavior if enabled.
Database and storage¶
- Use SQLite only when its single-node/write-concurrency profile is intentional.
- Restrict database network/firewall access.
- Use TLS for remote database links as appropriate.
- Migration role can create audit triggers; runtime role is appropriately restricted.
- Confirm audit update/delete triggers exist after migration.
- Persist
storage/app/private,storage/app/public, and the selected database. - Web and queue share the same storage where jobs need assets.
- Upload limits support 200 MB attachments and expected request overhead.
- Backups include database, both asset disks,
APP_KEY, configuration, and release identifier. - A restore drill has succeeded in an isolated environment.
Queues and mail¶
- Configure a real mail provider; do not use
MAIL_MAILER=log. - Authenticate/verify the from-domain according to provider policy.
- Run at least one supervised queue worker for asynchronous connections.
- Worker and web environment/configuration match.
- Restart workers during deployments.
- Monitor queue depth/age and
failed_jobs. - Test verification, invitation, assignment, mention, and document-comment email categories.
API and webhooks¶
- Set an appropriate API per-credential rate limit.
- Issue one minimally scoped credential per integration/environment.
- Store one-time tokens in a secret manager and test rotation.
- Set expirations where operationally supported.
- Keep
OKATANA_WEBHOOK_ALLOW_PRIVATE_NETWORKS=falseunless internal delivery is intentional. - Restrict application egress at the network layer in addition to the URL guard.
- Receivers verify HMAC over the raw body, validate timestamp freshness, and deduplicate delivery IDs.
- Monitor failed webhook deliveries and queue jobs.
- Decide whether Scalar/OpenAPI should be public.
Documentation¶
-
mkdocs build --strictpasses in release CI. -
/docs/loads static assets under the deployment subpath. -
/docs/apistill resolves to Scalar, not a generated directory. -
/docs/openapi.yamlmatches the deployed API. - Public static MkDocs content contains no internal secrets/hostnames.
- If documentation must be private, enforce
/docs/at the proxy;OKATANA_API_DOCS_PUBLICprotects Scalar/spec only.
Observability¶
Monitor at least:
- HTTP error and latency rates for
/app-apiand/api/v1separately; - database connectivity, locks, storage, and query latency;
- queue process health, depth, oldest job, and failures;
- mail provider rejection/bounce/rate-limit signals;
- webhook delivery status/latency;
- disk usage for private/public assets and logs;
- backup completion and restore verification;
- API
401,403,422, and429rates; - authentication/security throttle and TOTP clock-related errors.
Avoid logging request Authorization headers, session cookies, TOTP secrets/codes, invitation tokens, webhook secrets, or exported data bodies.
Release verification¶
Run in CI or the release workspace:
Then smoke-test the deployed release:
- Health and static assets.
- Sign-in/security flow.
- Organization/project read.
- Ticket create/edit/move/comment and private file download.
- Document create/publish/PDF.
- Notification and queued email.
- Scoped API request.
- Signed webhook delivery.
- Audit event visibility and immutability.
- Export download.
Rollback preparation¶
- Keep the prior application image/release artifact.
- Know whether each migration is backward compatible with the prior code.
- Back up before irreversible schema/data change.
- Do not assume
migrate:rollbackis safe: the audit-protection migration intentionally controls triggers, and down migrations may drop data-bearing tables/columns. - Restart workers with the same version as web during rollback.
- Validate encrypted secrets with the restored
APP_KEY.