Build your application
Your environment’s build commands run each time you deploy. Typically, they install your production dependencies, compile your frontend assets, and cache your application’s configuration:php artisan optimize as part of your build rather than in your deploy commands, so the cached files are baked into your deployment. If you are using Inertia SSR with one of Laravel’s starter kits, use npm run build:ssr in place of npm run build.
If your application installs private Composer packages, configure your credentials before you run composer install. The build commands documentation shows how. And, if you prefer Yarn, pnpm, or Bun over npm, take a look at Using Yarn, PNPM, or Bun.
Attach a database
Nearly every Laravel application needs a database. To add one, click Add database on your environment’s infrastructure canvas, then create or attach a Laravel MySQL or Laravel Serverless Postgres database. The database must be in the same region as your environment. Once you attach the database, Cloud injectsDB_HOST, DB_USERNAME, DB_PASSWORD, DB_DATABASE, and the rest of your connection details into your environment, so Laravel connects to it without any additional configuration. Redeploy your environment so the new variables take effect.
Because Cloud resets your environment’s filesystem on every deployment, SQLite is not supported in production. If you have been using SQLite locally, Cloud’s MySQL and Postgres databases are a great fit.
Using your database as a cache
Most Laravel applications don’t need a dedicated cache. For light to medium workloads, Laravel’sdatabase cache and session drivers work great. They also keep your infrastructure simple, since there’s one less resource to manage and pay for. To use them, point both drivers at your database in your environment variables:
CACHE_STORE for you, so Laravel starts using the cache right away.
Run migrations
Database migrations belong in your environment’s deploy commands. Cloud runs these commands just before your new deployment goes live, so your database schema is ready by the time the new code starts serving requests:queue:restart or horizon:terminate yourself, since Cloud restarts your queue workers and manages Horizon for you after every deployment. You should also avoid running optimize:clear and storage:link during deployment. The unnecessary build and deploy commands documentation explains why.
Environment variables
Cloud writes your environment variables to a.env file before your application starts, so Laravel reads them exactly the way it does on your local machine. You can manage these values from your environment’s settings.
In addition to the variables Cloud injects for your attached resources, you may define any variables your application needs. If you define a variable that Cloud also injects, your value takes precedence. Remember to redeploy after changing your environment variables so your application picks up the new values.
Store files in object storage
Your environment’s filesystem is ephemeral. Cloud resets it each time you deploy. In addition, each replica of your application has its own disk, so a file written while handling one request may not be visible to the next. For user uploads and any other files your application needs to keep, attach a bucket to your environment. Cloud injectsFILESYSTEM_DISK along with the bucket’s S3-compatible credentials, so you can work with your files through Laravel’s Storage facade just like you would locally. Before you do, add the league/flysystem-aws-s3-v3 package to your application’s dependencies:
Process queued jobs
Managed queues are the easiest way to process your application’s queued jobs on Cloud. Cloud provisions the queue for you and automatically scales its workers based on how many jobs are waiting, so you do not need to manage any queue infrastructure yourself. Managed queues require a recent version of Laravel and theaws/aws-sdk-php package. You can find the exact requirements in the managed queue documentation.
When you deploy a managed queue, Cloud sets QUEUE_CONNECTION=cloud for your environment. From then on, any job dispatched without an explicit connection is sent to your managed queue, including jobs that the database or redis driver previously processed.
If you would rather keep using your own queue driver, you may run queue:work processes on your App cluster or on a dedicated worker cluster instead.
Schedule tasks
To run your application’s scheduled tasks, enable the Scheduler toggle on your App cluster or on a worker cluster. Cloud then invokesschedule:run every minute, just like a traditional cron entry.
If your App cluster runs multiple replicas, you should use Laravel’s onOneServer method for any task that should run only once. Otherwise, the task runs on every replica.
And, if your environment scales to zero, don’t worry: Cloud automatically wakes your environment so your scheduled tasks keep running on time.
