FROM php:8.2-fpm-alpine

ENV TZ=America/Sao_Paulo

# Supervisor ENV Variables
ENV SV_MONITOR_START=true
ENV SV_NGINX_START=true
ENV SV_PHPFPM_START=true
ENV SV_CROND_START=false

# Install compile programs
RUN apk add --no-cache libpq-dev\
    && docker-php-ext-configure pgsql -with-pgsql=/usr/local/pgsql\
    && docker-php-ext-install -j$(nproc) bcmath pdo_mysql pdo_pgsql pcntl opcache\
    && docker-php-source delete

# Install supervisor
RUN apk add --no-cache supervisor

COPY /etc/supervisord.conf /etc/supervisord.conf
COPY /etc/supervisor.d/crond.ini /etc/supervisor.d/crond.ini

# Disable access.log on php-fpm
# https://github.com/docker-library/php/blob/master/8.2/buster/fpm/Dockerfile
RUN sed -i -e 's|access.log =.*|;access.log = /proc/self/fd/2|'  /usr/local/etc/php-fpm.d/docker.conf

# Setup PHP-FPM Config Settings
# pm = dynamic (default)
ENV PHP_FPM_PM_MAX_CHILDREN=5
ENV PHP_FPM_PM_START_SERVERS=2
ENV PHP_FPM_PM_MIN_SPARE_SERVERS=1
ENV PHP_FPM_PM_MAX_SPARE_SERVERS=3
ENV PHP_FPM_PM_MAX_REQUESTS=5000
RUN echo 'pm.max_children = ${PHP_FPM_PM_MAX_CHILDREN}' >> /usr/local/etc/php-fpm.d/zz-docker.conf
RUN echo 'pm.start_servers = ${PHP_FPM_PM_START_SERVERS}' >> /usr/local/etc/php-fpm.d/zz-docker.conf
RUN echo 'pm.min_spare_servers = ${PHP_FPM_PM_MIN_SPARE_SERVERS}' >> /usr/local/etc/php-fpm.d/zz-docker.conf
RUN echo 'pm.max_spare_servers = ${PHP_FPM_PM_MAX_SPARE_SERVERS}' >> /usr/local/etc/php-fpm.d/zz-docker.conf
RUN echo 'pm.max_requests = ${PHP_FPM_PM_MAX_REQUESTS}' >> /usr/local/etc/php-fpm.d/zz-docker.conf

# PHP OPcache (Default disabled)
ENV PHP_OPCACHE_ENABLE=0
ENV PHP_OPCACHE_ENABLE_CLI=0
ENV PHP_OPCACHE_MEMORY_CONSUMPTION=256
ENV PHP_OPCACHE_BUFFER=64
ENV PHP_OPCACHE_MAX_FILES=32531
ENV PHP_OPCACHE_TIMESTAMPS=0
RUN echo '[opcache]' > /usr/local/etc/php/10-opcache.ini
RUN echo 'opcache.enable = ${PHP_OPCACHE_ENABLE}' >> /usr/local/etc/php/conf.d/zz-opcache.ini
RUN echo 'opcache.memory_consumption = ${PHP_OPCACHE_MEMORY_CONSUMPTION}' >> /usr/local/etc/php/conf.d/zz-opcache.ini
RUN echo 'opcache.interned_strings_buffer = ${PHP_OPCACHE_BUFFER}' >> /usr/local/etc/php/conf.d/zz-opcache.ini
RUN echo 'opcache.max_accelerated_files = ${PHP_OPCACHE_MAX_FILES}' >> /usr/local/etc/php/conf.d/zz-opcache.ini
RUN echo 'opcache.validate_timestamps = ${PHP_OPCACHE_TIMESTAMPS}' >> /usr/local/etc/php/conf.d/zz-opcache.ini
RUN echo 'opcache.enable_cli = ${PHP_OPCACHE_ENABLE_CLI}' >> /usr/local/etc/php/conf.d/zz-opcache.ini

CMD ["supervisord", "-n", "-j", "/tmp/supervisord.pid", "-c", "/etc/supervisord.conf"]

######################################## NGINX ########################################
# Install base system packages
RUN apk add --no-cache nginx

COPY etc/nginx.conf /etc/nginx.conf
COPY etc/supervisor.d/nginx.ini /etc/supervisor.d/nginx.ini
COPY etc/supervisor.d/php-fpm.ini /etc/supervisor.d/php-fpm.ini

WORKDIR /app

EXPOSE 80
#######################################################################################


######################################## REDIS ########################################
# Install REDIS
RUN apk --no-cache add --virtual .build-deps $PHPIZE_DEPS \
    && pecl install redis \
    && docker-php-ext-enable redis.so \
    && apk del --purge .build-deps


#######################################################################################

# PHP OPcache
ENV PHP_OPCACHE_ENABLE=0
ENV PHP_OPCACHE_ENABLE_CLI=0
# Defaults
#ENV PHP_OPCACHE_MEMORY_CONSUMPTION=256
#ENV PHP_OPCACHE_BUFFER=64
#ENV PHP_OPCACHE_MAX_FILES=32531
#ENV PHP_OPCACHE_TIMESTAMPS=0

ARG APP_VERSION=prod
ENV APP_VERSION=$APP_VERSION


######################################## WREDIS ########################################
# Supervisor: wredis is disabled by default
ENV SV_WREDIS_START=false
ENV SV_WREDIS_PROC_NUM=3
COPY /etc/supervisor.d/wredis.ini /etc/supervisor.d/wredis.ini
#######################################################################################

######################################## CRON ########################################
# Supervisor: crond is disabled by default
# Load www-data crontab
COPY --chown=www-data crontab.txt /tmp
RUN set -ex && crontab -u www-data /tmp/crontab.txt
#######################################################################################


RUN chown www-data:www-data /app

COPY --chown=www-data src /app

WORKDIR /app

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

RUN set -ex \
    && apk add --no-cache --virtual .composer-deps git

RUN if [ "$APP_VERSION" != "dev" ]; \
    then \
        su -s /bin/sh www-data -c 'composer install --no-dev --classmap-authoritative'; \
    else \
        su -s /bin/sh www-data -c 'composer install'; \
    fi

# Xdebug - ALERT - Xdebug MUST be installed in development environment only
RUN if [ "$APP_VERSION" != "prod" ]; then apk --no-cache add --virtual .build-deps $PHPIZE_DEPS; fi
RUN if [ "$APP_VERSION" != "prod" ]; then apk add --update linux-headers; fi
RUN if [ "$APP_VERSION" != "prod" ]; then pecl install xdebug; fi
RUN if [ "$APP_VERSION" != "prod" ]; then echo "xdebug.mode=coverage" >> /usr/local/etc/php/conf.d/xdebug.ini; fi
RUN if [ "$APP_VERSION" != "prod" ]; then docker-php-ext-enable xdebug; fi


# Adicionando configurações de upload e POST no PHP
# Adicionando configurações de upload, POST e limite de memória no PHP
RUN echo "upload_max_filesize = 100M" >> /usr/local/etc/php/conf.d/uploads.ini \
    && echo "post_max_size = 100M" >> /usr/local/etc/php/conf.d/uploads.ini \
    && echo "memory_limit = 512M" >> /usr/local/etc/php/conf.d/memory-limit.ini



ENTRYPOINT ./entrypoint.sh