HEX
Server: nginx/1.24.0
System: Linux rtfmfm 6.8.0-71-generic #71-Ubuntu SMP PREEMPT_DYNAMIC Tue Jul 22 16:52:38 UTC 2025 x86_64
User: neo (1001)
PHP: 7.4.33
Disabled: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
Upload Files
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"
```