> ## Documentation Index
> Fetch the complete documentation index at: https://docs.azvian.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Installation

> Set up Azvian Mailer on your own server

## What you need

* PHP 8.3+, with extensions: `zip`, `mbstring`, `openssl`, `json`, `pdo_mysql`, `fileinfo`, `dom`, `libxml`, `curl`, `iconv`
* MySQL 8+ (or compatible)
* A queue worker and a cron entry — see [Background processes](#background-processes) below

## Steps

<Steps>
  <Step title="Upload the release and point your document root at public/">
    `storage/`, `bootstrap/cache/`, and `.env` all need to be writable by your web server user before you start — the installer writes `.env` directly.
  </Step>

  <Step title="Visit your domain">
    You're redirected straight to the install wizard. Four steps:

    <Steps>
      <Step title="Environment requirements">Confirms PHP version, required extensions, and writable folders.</Step>
      <Step title="Database & mail configuration">Enter your database credentials and mail settings.</Step>
      <Step title="License activation">Enter the license key from your purchase confirmation.</Step>
      <Step title="Admin account">Create your own login.</Step>
    </Steps>
  </Step>
</Steps>

<Danger>
  Once installed, `storage/installed` exists and the wizard can never be re-run through the browser — reinstalling means deleting that file and re-running migrations yourself. **Never delete this file on a real, already-installed site.**
</Danger>

## Background processes

<Steps>
  <Step title="Queue worker">
    Campaign sends, automation steps, and outbound webhook deliveries are all queued jobs, not sent inline on the request.

    ```bash theme={null}
    php artisan queue:work
    ```

    Run it under a process supervisor (systemd, Supervisor) so it survives restarts — and **restart it after every code deploy**, since a long-running worker keeps old class definitions loaded in memory until restarted.
  </Step>

  <Step title="Scheduler cron">
    Drives scheduled campaign sends, automation step processing, and the daily license/update checks. Nothing time-based works without it.

    ```bash theme={null}
    * * * * * cd /path/to/your/install && php artisan schedule:run >> /dev/null 2>&1
    ```
  </Step>
</Steps>

## Optional: Stripe billing

If you want tenant self-service billing, add your Stripe keys under [Admin → Integrations](/mailer/admin-guide#integrations) — see [Billing](/mailer/billing) for the webhook endpoint you'll need to register in your Stripe dashboard.
