Queue worker setup
==================

This document explains how to run Laravel queue workers for Skinbase and suggested Supervisor / systemd configs included in `deploy/`.

1) Choose a queue driver
------------------------

Pick a driver in your `.env`, for example using the database driver (simple to run locally):

```
QUEUE_CONNECTION=database
```

Or use Redis for production:

```
QUEUE_CONNECTION=redis
```

2) Database queue (if using database driver)
-------------------------------------------

Create the jobs table and run migrations:

```bash
php artisan queue:table
php artisan migrate
```

3) Supervisor (recommended for many setups)
-------------------------------------------

We provide an example Supervisor config at `deploy/supervisor/skinbase-queue.conf`.

The example worker listens on the application queues currently used by Skinbase features, including AI and discovery jobs:

```text
forum-security,forum-moderation,vision,recommendations,discovery,mail,default
```

If you split workloads across dedicated workers, make sure any queues configured through `VISION_QUEUE`, `RECOMMENDATIONS_QUEUE`, or `DISCOVERY_QUEUE` are explicitly covered by at least one worker process.

To use it on a Debian/Ubuntu server:

```bash
# copy the file to supervisor's config directory
sudo cp deploy/supervisor/skinbase-queue.conf /etc/supervisor/conf.d/skinbase-queue.conf
# make sure the logs dir exists
sudo mkdir -p /var/log/skinbase
sudo chown www-data:www-data /var/log/skinbase
# tell supervisor to reload configs and start
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start skinbase-queue
# check status
sudo supervisorctl status skinbase-queue
```

Adjust the `command` and `user` in the conf to match your deployment (path to PHP, project root and user).

4) systemd alternative
----------------------

If you prefer systemd, an example unit is at `deploy/systemd/skinbase-queue.service`.

```bash
sudo cp deploy/systemd/skinbase-queue.service /etc/systemd/system/skinbase-queue.service
sudo systemctl daemon-reload
sudo systemctl enable --now skinbase-queue.service
sudo systemctl status skinbase-queue.service
```

Adjust `WorkingDirectory` and `User` in the unit to match your deployment.

5) Helpful artisan commands
---------------------------

- Start a one-off worker (foreground):

```bash
php artisan queue:work --sleep=3 --tries=3
```

- Restart all workers gracefully (useful after deployments):

```bash
php artisan queue:restart
```

- Inspect failed jobs:

```bash
php artisan queue:failed
php artisan queue:retry {id}
php artisan queue:flush
```

6) Logging & monitoring
-----------------------

- Supervisor example logs to `/var/log/skinbase/queue.log` (see `deploy/supervisor/skinbase-queue.conf`).
- Use `journalctl -u skinbase-queue` for systemd logs.

7) Notes and troubleshooting
---------------------------

- Ensure `QUEUE_CONNECTION` in `.env` matches the driver you've configured.
- If using `database` driver, the `jobs` and `failed_jobs` tables must exist.
- The mailable used for contact submissions is queued; if the queue worker is not running mails will accumulate in the queue table (or Redis).
- AI auto-tagging, embedding generation, vector index repair, and recommendation cache regeneration are all queued. If you move them onto dedicated queues, the shipped example worker commands must be updated to consume those queue names.

8) AI and discovery queue checklist
-----------------------------------

If you are enabling the recommendation AI stack in production, verify all of the following:

- `QUEUE_CONNECTION` is backed by a real worker-capable driver such as `redis` or `database`
- `VISION_QUEUE`, `RECOMMENDATIONS_QUEUE`, and `DISCOVERY_QUEUE` either stay on `default` or are present in a worker `--queue=` list
- `UPLOAD_QUEUE_DERIVATIVES=true` has workers online before you enable it, otherwise upload post-processing will stall
- `php artisan queue:restart` is run after deploys so workers pick up new code and config

See `docs/recommendation-ai-production.md` for a stack-specific runbook.

Questions or prefer a different process manager? Tell me your target host and I can produce exact commands tailored to it.
