# Laravel Horizon + Supervisor en MacOs con Laravel Herd + Brew

## Escenario
El indicado en el título, fue probado con Laravel 12 y para una app en la que se necesita trabajar de forma constante desde un Mac. 

> Yo para emular ciertas cosas, lo uso en desarrollo, pero cuando termino, desactivo las tareas mmediante configuración (`.env`)

### Instalar Supervisor

Necesitamos instalar **Supervisor** 

```
brew install supervisor
```

En Mac con brew, veremos que el fichero de configuración es `/opt/homebrew/etc/supervisord.conf` el cual, al final hace un include `files = /opt/homebrew/etc/supervisor.d/*.ini`

Dicho esto, tenemos claro que el fichero de configuración para nuestro despliegue (o los diferentes despliegues) sera incluido en ese directorio, como por ejemplo para una de mis apps, `/opt/homebrew/etc/supervisor.d/swissknife.ini`

Ejemplo básico para una app sencilla, teniendo en cuenta que quiero especificar indubitadamente la versión de php

```bash
[program:swissknife]
process_name=%(program_name)s
command="/Users/abkrim/Library/Application Support/Herd/bin/php" /Users/abkrim/SitesLR12/swissknife/artisan horizon
autostart=true
autorestart=true
user=abkrim
numprocs=1
redirect_stderr=true
stdout_logfile=/Users/abkrim/SitesLR12/swissknife/storage/logs/horizon.log
stderr_logfile=/Users/abkrim/SitesLR12/swissknife/storage/logs/horizon.err.log
stopwaitsecs=3600
```

#### Para iniciarlo y activarlo al reinicio
```
brew services start supervisor
```

### Debug de problemas

A veces, puede que hagamos cambios en el fichero de configuración y no consigamos que funcione.

Para ello paramos el servicio de brew y lo cargamos de forma manual

```
brew services stop supervisor
supervisord -n -c  /opt/homebrew/etc/supervisord.conf

Error: %(process_num) must be present within process_name when numprocs > 1 in section 'program:swissknife' (file: '/opt/homebrew/etc/supervisor.d/swissknife.ini')
For help, use /opt/homebrew/bin/supervisord -h
```

Mira, un error de configuración que deja el servicio de nuestra app, sin cargarse.

Con eso podemos corregir el tema, y volver a cargar de forma automática nuestro supervisor.

```
supervisord -n -c  /opt/homebrew/etc/supervisord.conf

2025-02-28 12:20:38,341 WARN For [program:swissknife], redirect_stderr=true but stderr_logfile has also been set to a filename, the filename has been ignored
2025-02-28 12:20:38,342 INFO Included extra file "/opt/homebrew/etc/supervisor.d/swissknife.ini" during parsing
2025-02-28 12:20:38,353 INFO RPC interface 'supervisor' initialized
2025-02-28 12:20:38,353 CRIT Server 'unix_http_server' running without any HTTP authentication checking
2025-02-28 12:20:38,353 INFO supervisord started with pid 65213
2025-02-28 12:20:39,361 INFO spawned: 'swissknife' with pid 65218
2025-02-28 12:20:40,735 INFO success: swissknife entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
``` 

Matamos el proceso, y ya podemos reiniciar con brew.

```
brew services start supervisor
==> Successfully started `supervisor` (label: homebrew.mxcl.supervisor)
```

Y a disfrutar de Horizon+Laravel



##### Aviso
Esta documentación y su contenido, no implica que funcione en tu caso o determinados casos. 
También implica que tienes conocimientos sobre lo que trata, y que en cualquier caso tienes copias de seguridad.
El contenido el contenido se entrega, tal y como está, sin que ello implique ningún obligación ni responsabilidad por parte de [Castris](https://castris.com)

Si necesitas soporte profesional puedes contratar con Castris [soporte profesional](https://intranet.castris.com/store/soporte-profesional).