Skip to content

SOP: deploying the dashboard

The ops dashboard deploys completely differently from the marketing sites — don’t mix the two models up.

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 to master before 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.sh from a dev machine (dry-run by default; --live to ship), or Cloudways’ “Deployment via Git → Pull” + the artisan commands by hand.
  • 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.
SymptomCause / fix
Blank page / 403Webroot not pointed at public/
500 on every pageMissing APP_KEY or bad .env — check the Laravel log
DB errorsDB credentials wrong in .env
Assets brokenRe-publish assets + clear caches (filament:assets, optimize:clear)
Texts never sendQueue worker down, or message provider set to log
Reminders an hour offApp 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 openRedirect URI not allow-listed in the Plaid dashboard, or wrong environment for the keys
Bank ledger empty after connectNo credentials saved, bank item in error status, or queue worker down