File: /var/www/wsklad/SUPERVISOR_SETUP.md
# Конфигурация на Supervisor за Laravel Queue Workers
еСклад изпозлва **Laravel Queue Workers** за изпращане документите за продажба постъпили от мСклад към АжурL.
## 0. Променливи
За директория на приложението се приема `/var/www/esklad/`
За име на worker се приема `esklad-worker`. Необходими са различни конфигурационни файлове и имена на уъркъри за отделните инстанции на еСклад.
Горните стойности ще бъдат използвани в конфигурационния файл и `.env` файла.
## 1. Конфигурационен файл
Примерен конфигурационен файл за `Supervisor`:
`/var/www/esklad/supervisor-config/esklad-worker.conf`
```bash
[program:esklad-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/esklad/artisan queue:work --queue=ajur-sync --sleep=3 --tries=3 --max-time=3600
directory=/var/www/esklad
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
user=www-data
numprocs=2
redirect_stderr=true
stdout_logfile=/var/log/supervisor/esklad-worker.log
stdout_logfile_maxbytes=100MB
stdout_logfile_backups=2
stopwaitsecs=3600
```
**Описание на параметрите**
- **numprocs=2**: Стартира 2 процеса за по-голяма надеждност
- **queue=ajur-sync**: Обработва само задачи от опашката ajur-sync
- **tries=3**: Всяка задача ще се опита до 3 пъти
- **max-time=3600**: Работниците се рестартират на всеки час (предотвратява memory leaks)
- **user=www-data**: Стартира се с потребител www-data (същия като уеб сървъра)
- **autostart=true**: Стартира автоматично при стартиране на Supervisor
- **autorestart=true**: Рестартира се автоматично при срив
## 2. Стъпки за настройка
Изпълнете следните команди, за да настроите Supervisor:
```bash
# 1. Създаване на директория за логове
sudo mkdir -p /var/log/supervisor
# 2. Копиране на конфигурацията към Supervisor
sudo cp /var/www/esklad/supervisor-config/esklad-worker.conf /etc/supervisor/conf.d/
# 3. Задаване на правилни права
sudo chown root:root /etc/supervisor/conf.d/esklad-worker.conf
sudo chmod 644 /etc/supervisor/conf.d/esklad-worker.conf
# 4. Презареждане на конфигурацията на Supervisor
sudo supervisorctl reread
# 5. Добавяне на новите програми
sudo supervisorctl update
# 6. Стартиране на работниците
sudo supervisorctl start esklad-worker:*
# 7. Проверка на статуса
sudo supervisorctl status esklad-worker:*
```
## 3. Настойка на `.env` файла
```bash
QUEUE_CONNECTION=database
QUEUE_SUPERVISOR_WORKER_NAME=esklad-worker
AJUR_USERNAME=ajur_username
AJUR_PASSWORD=ajur_password
```
**Описание на параметрите**
- **QUEUE_CONNECTION**: Записите в опашката за изпълнение ще записват в база данни
- **QUEUE_SUPERVISOR_WORKER_NAME**: Името на worker-a, което приложението ще използва за проверка на статуса и работа с него
- **AJUR_USERNAME**: Ще се използва от worker-a за изпращане на записите към АжурL
- **AJUR_PASSWORD**: Ще се използва от worker-a за изпращане на записите към АжурL
## 4. Създаване на таблици в база данни
(файловете вече са част от сорс кода на еСклад и точка 1 и 2 не са необходими)
```bash
# 1. създава файл за миграция на таблица за записите в опашката
php artisan queue:table
# 2. създава файл за миграция на таблица за неуспешно обработените опашки
php artisan queue:failed-table
# 3. създава горните таблици
php artisan migrate
```
## 5. Настройка на `sudoers`
еСклад дава възможност за стартиране, спиране, рестарт и проверка на статуса на worker-ите. За тази цел е необходимо потребителят на уеб сървъра (`www-data`) да има права да използва командата `sudo` в комбинация със `supervisorctl`. За да разрешите това при работа с Linux сървър е необходимо да се добави следния ред в `/etc/sudoers`
```bash
www-data ALL=NOPASSWD: /usr/bin/supervisorctl status *, /usr/bin/supervisorctl start *, /usr/bin/supervisorctl stop *, /usr/bin/supervisorctl restart *
```
## 6. Полезни команди
```bash
# Проверка на статуса на всички програми
sudo supervisorctl status
# Рестартиране на всички queue работници
sudo supervisorctl restart esklad-worker:*
# Спиране на всички queue работници
sudo supervisorctl stop esklad-worker:*
# Стартиране на всички queue работници
sudo supervisorctl start esklad-worker:*
# Преглед на логовете в реално време
sudo supervisorctl tail -f esklad-worker:*
# Презареждане на конфигурацията след промени
sudo supervisorctl reread && sudo supervisorctl update
# Преглед на логовете на Supervisor
sudo tail -f /var/log/supervisor/esklad-worker.log
# Повторен опит за обработка на всички неуспешно изпълнени опашки
php artisan queue:retry all
```
## 7. Мониторинг
За да следите работата на queue работниците:
```bash
# Проверка дали работниците са стартирани
sudo supervisorctl status esklad-worker:*
# Проверка на брояча на задачите в базата
php artisan tinker --execute="echo 'Чакащи: ' . DB::table('jobs')->count(); echo ' / Неуспешни: ' . DB::table('failed_jobs')->count();"
# Преглед на логовете на работниците
sudo tail -f /var/log/supervisor/esklad-worker.log
# Преглед на Laravel логовете
tail -f /var/www/esklad/storage/logs/laravel.log
```
## 8. Спиране на текущ работещ artisan worker
Преди да стартирате Supervisor, спрете текущия работещ artisan worker:
```bash
# Намерете и спрете текущия queue worker
ps aux | grep "queue:work"
# След това спрете с: sudo kill [PID]
# Или спрете всички PHP artisan процеси:
sudo pkill -f "artisan queue:work"
```