> ## 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 SEO on your own server

## What you need

* PHP 8.3+, with extensions: `mbstring`, `openssl`, `json`, `pdo_mysql`, `fileinfo`, `dom`, `libxml`, `curl`, `iconv`, `gd`
* MySQL 8+ (or compatible)
* A queue worker process 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 — this is the account you'll manage the whole instance from.</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** — it's the only thing standing between a real instance and every visitor being redirected back to the install wizard.
</Danger>

## Background processes

Two things need to run continuously outside the request/response cycle, or large parts of the app silently do nothing:

<Steps>
  <Step title="Queue worker">
    Audit reports and outbound webhook deliveries are both queued jobs, not run 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 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](/seo/admin-guide#integrations). Without it, you can still create tenant accounts manually from the Admin panel.
