# Dockerfile para WhatsApp Bot Manager # Multi-stage build para optimizar imagen final # Stage 1: Builder FROM php:8.2-fpm-alpine AS builder # Instalar dependencias de compilación RUN apk add --no-cache \ $PHPIZE_DEPS \ git \ unzip \ libzip \ libzip-dev \ icu \ icu-dev \ icu-libs \ oniguruma-dev \ freetype-dev \ libjpeg-turbo-dev \ libpng-dev \ zlib-dev # Instalar extensiones PHP necesarias # Nota: curl viene incluido en la imagen base de PHP, solo necesitamos las libs del sistema RUN apk add --no-cache curl-dev \ && docker-php-ext-configure gd --with-freetype --with-jpeg \ && docker-php-ext-install -j$(nproc) \ pdo \ pdo_mysql \ mysqli \ zip \ intl \ mbstring \ gd \ pcntl \ opcache # Instalar Redis extension (versión fija para cache reproducible) # Se descarga por HTTPS de forma explícita: el filtro de red perimetral # responde 403 a los .tgz servidos por HTTP, lo que rompía "pecl install". RUN apk add --no-cache curl \ && curl -fsSL https://pecl.php.net/get/redis-6.0.2.tgz -o /tmp/redis-6.0.2.tgz \ && pecl install /tmp/redis-6.0.2.tgz \ && docker-php-ext-enable redis # Instalar Composer COPY --from=composer:2 /usr/bin/composer /usr/bin/composer # Stage 2: Runner FROM php:8.2-fpm-alpine # Metadata LABEL maintainer="U-Site.app" LABEL description="WhatsApp Bot Manager with Queue Processing" LABEL version="2.0" # Configurar zona horaria Colombia ENV TZ=America/Bogota # Instalar dependencias runtime RUN apk add --no-cache \ bash \ supervisor \ nginx \ curl \ wget \ libzip \ icu \ oniguruma \ freetype \ libjpeg-turbo \ libpng \ mysql-client \ redis \ ffmpeg \ openssl \ ca-certificates \ tzdata \ && cp /usr/share/zoneinfo/America/Bogota /etc/localtime \ && echo "America/Bogota" > /etc/timezone \ && update-ca-certificates \ # Parche OpenSSL: deshabilitar session tickets TLS 1.3 # Causa raíz del errno-56 'Connection reset by peer' con Meta/Facebook CDN && printf '\n[openssl_init]\nssl_conf = ssl_sect\n\n[ssl_sect]\nsystem_default = system_default_sect\n\n[system_default_sect]\nOptions = -SessionTicket\n' >> /etc/ssl/openssl.cnf # Copiar extensiones PHP desde builder COPY --from=builder /usr/local/lib/php/extensions/ /usr/local/lib/php/extensions/ COPY --from=builder /usr/local/etc/php/conf.d/ /usr/local/etc/php/conf.d/ # Copiar Composer desde builder COPY --from=composer:2 /usr/bin/composer /usr/bin/composer # Crear usuario para la aplicación y configurar grupos RUN addgroup -g 1000 -S www && \ adduser -u 1000 -S www -G www && \ addgroup www nginx # Configurar PHP COPY docker/php/php.ini /usr/local/etc/php/conf.d/custom.ini COPY docker/php/php-fpm.conf /usr/local/etc/php-fpm.d/www.conf # Configurar Nginx COPY docker/nginx/nginx.conf /etc/nginx/nginx.conf COPY docker/nginx/default.conf /etc/nginx/http.d/default.conf # Configurar Supervisor COPY docker/supervisor/supervisord.conf /etc/supervisor/supervisord.conf COPY docker/supervisor/programs.conf /etc/supervisor/conf.d/programs.conf # Crear directorios necesarios RUN mkdir -p \ /var/www/html \ /var/www/html/logs \ /var/www/html/uploads \ /var/log/supervisor \ /run/php \ /etc/nginx/ssl \ && chown -R www:www /var/www/html \ && chown -R www:www /var/log/supervisor # Configurar working directory WORKDIR /var/www/html # Copiar código fuente COPY --chown=www:www . . # Instalar dependencias PHP (si composer.json existe) RUN if [ -f composer.json ]; then \ composer install --no-dev --optimize-autoloader --no-interaction; \ fi # Dar permisos a directorios críticos RUN chmod -R 755 /var/www/html/logs \ && chmod -R 755 /var/www/html/uploads \ && chmod +x /var/www/html/worker.php \ # Marcar instalación completa → activa modo producción en config.php # Crear ambas variantes: con y sin punto (distintas partes del código usan cada una) && touch /var/www/html/installation_completed \ && touch /var/www/html/.installation_completed # Health check HEALTHCHECK --interval=30s --timeout=5s --start-period=30s --retries=3 \ CMD curl -f http://localhost/health.php || exit 1 # Exponer puertos EXPOSE 80 # Script de inicio COPY docker/entrypoint.sh /usr/local/bin/entrypoint.sh RUN chmod +x /usr/local/bin/entrypoint.sh ENTRYPOINT ["/usr/local/bin/entrypoint.sh"] CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/supervisord.conf"]