SOP: deploying the dashboard
The ops dashboard deploys completely differently from the marketing sites — don’t mix the two models up.
The model
Section titled “The model”flowchart TD DEV[Make the change<br/>Claude Code, cloud clone] --> COMMIT[Commit on master] COMMIT --> PUSH[Push to origin master] PUSH --> GHA[GitHub Action runs the full deploy<br/>code + migrations + caches + queue restart] GHA --> HEALTH[Automatic health check on the login page] HEALTH --> LIVE[Live on Cloudways]- One branch:
master. That’s it. No staging, no main, no feature branches — this is an internal tool with no preview tier. This rule is absolute, even for automated agents: if a session lands you on any other branch, switch back tomasterbefore committing. - Push = deploy. The GitHub Action ships every push to
master(or run it manually from the Actions tab: “Deploy to Cloudways”). - Always push live. The owner doesn’t review dashboard changes before they ship — commit and push without asking.
- Commit before deploying — the deploy ships the committed state; uncommitted changes don’t go live.
- The deploy never deletes server files — files removed from git stay on the server until removed by hand.
- Fallback if the Action is down:
./deploy.shfrom a dev machine (dry-run by default;--liveto ship), or Cloudways’ “Deployment via Git → Pull” + the artisan commands by hand.
Ground rules that keep prod healthy
Section titled “Ground rules that keep prod healthy”- Timezone: the app stores UTC and displays Pacific. Never change the app timezone — reminders will go out an hour off.
- Cache/sessions/queue all run on the database — Redis is intentionally not used, and file-based cache breaks under the server’s permission model. Don’t “optimize” this.
- Texts only really send in production with sending unpaused; everywhere else they log.
Quick failure decoder
Section titled “Quick failure decoder”| Symptom | Cause / fix |
|---|---|
| Blank page / 403 | Webroot not pointed at public/ |
| 500 on every page | Missing APP_KEY or bad .env — check the Laravel log |
| DB errors | DB credentials wrong in .env |
| Assets broken | Re-publish assets + clear caches (filament:assets, optimize:clear) |
| Texts never send | Queue worker down, or message provider set to log |
| Reminders an hour off | App timezone was changed from UTC — change it back |
| Webhook “invalid signature” | Re-paste the signing secret in Admin → Integrations & API Keys |
| Plaid “Connect Chase” won’t open | Redirect URI not allow-listed in the Plaid dashboard, or wrong environment for the keys |
| Bank ledger empty after connect | No credentials saved, bank item in error status, or queue worker down |