Configurar Supervisor para Queues en Laravel con Docker

Si tus colas de Laravel no se procesan en Docker, aquí tienes la solución rápida. Usando Supervisor dentro de tu contenedor, podrás manejar workers de forma estable y automática.

Modificaciones Necesarias

1. docker/apache/Dockerfile

FROM php:8.2-apache

RUN apt-get update && apt-get install -y \
    supervisor \ # ¡Clave!
    libpng-dev \
    libjpeg-dev \
    libfreetype6-dev \
    libonig-dev \
    libxml2-dev \
    zip \
    unzip \
    git \
    curl \
    && docker-php-ext-configure gd --with-freetype --with-jpeg \
    && docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd \
    && a2enmod rewrite \
    && apt-get clean && rm -rf /var/lib/apt/lists/*

COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

# Script de inicio personalizado
COPY docker/start.sh /usr/local/bin/start.sh
RUN chmod +x /usr/local/bin/start.sh

WORKDIR /var/www/html
EXPOSE 80
CMD ["/usr/local/bin/start.sh"] # Reemplaza el CMD por defecto

2. docker/start.sh

Este script ahora inicia Supervisor (que maneja las colas) y Apache.

#!/bin/bash
set -e

if [ ! -d "vendor" ]; then
    composer install --optimize-autoloader
fi

chmod -R 777 /var/www/html/storage /var/www/html/bootstrap/cache 2>/dev/null || true

php artisan config:cache 2>/dev/null || true
php artisan route:cache 2>/dev/null || true

# Inicia Supervisor para manejar los workers
/usr/bin/supervisord -c /etc/supervisor/supervisord.conf

# Inicia Apache (el proceso principal)
exec apache2-foreground

3. docker/supervisor/laravel-worker.conf
Define cómo se comportarán tus workers. Este ejemplo levanta 8 procesos.

[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/html/artisan queue:work --sleep=3 --tries=3 --max-time=3600
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
user=www-data
numprocs=8
redirect_stderr=true
stdout_logfile=/var/www/html/storage/logs/worker.log
stopwaitsecs=3600

4. docker-compose.yml
Monta la configuración de Supervisor y asegura que start.sh sea ejecutable.

services:
  db:
    image: mysql:8.0
    container_name: laravel-db
    restart: unless-stopped
    environment:
      MYSQL_DATABASE: ${DB_DATABASE}
      MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
      MYSQL_PASSWORD: ${DB_PASSWORD}
      MYSQL_USER: ${DB_USERNAME}
    volumes:
      - dbdata:/var/lib/mysql
    networks:
      - laravel-network

  app:
    build:
      context: .
      dockerfile: docker/apache/Dockerfile
    container_name: laravel-app
    restart: unless-stopped
    ports:
      - "8000:80"
    volumes:
      - .:/var/www/html
      - ./docker/apache/000-default.conf:/etc/apache2/sites-available/000-default.conf
      - ./docker/supervisor:/etc/supervisor/conf.d
    networks:
      - laravel-network
    depends_on:
      - db

networks:
  laravel-network:
    driver: bridge

volumes:
  dbdata:
    driver: local

5. docker/apache/000-default.conf

<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/html/public

    <Directory /var/www/html/public>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Reconstruye y levanta tus contenedores:

docker-compose down
docker-compose up --build -d

Verifica que los workers estén corriendo:

docker-compose exec app supervisorctl status

Deberías ver: laravel-worker:laravel-worker_00 RUNNING


Listo. Ahora tus colas se procesarán automáticamente, los workers se reiniciarán si fallan, y tendrás un control centralizado. Olvídate de ejecutar queue:work manualmente.

¿Problemas? Revisa los logs: 

docker-compose logs app y docker-compose exec app tail -f storage/logs/worker.log.

Subscribe
Notify of
guest

This site uses Akismet to reduce spam. Learn how your comment data is processed.

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments