# syntax=docker/dockerfile:1
ARG PHP_IMAGE=php:8.3.35-fpm-bookworm
ARG NODE_IMAGE=node:24-bookworm-slim
ARG NGINX_IMAGE=nginx:1.30.5-alpine
ARG RESTIC_IMAGE=restic/restic:0.19.1

FROM ${PHP_IMAGE} AS php-base
RUN apt-get update \
    && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends libfreetype6-dev libjpeg62-turbo-dev libpng-dev libwebp-dev libicu-dev libzip-dev unzip msmtp \
    && docker-php-ext-configure gd --with-freetype --with-jpeg --with-webp \
    && docker-php-ext-install -j2 bcmath exif gd intl pcntl pdo_mysql sockets zip \
    && rm -rf /var/lib/apt/lists/*
COPY docker/php/post76.ini /usr/local/etc/php/conf.d/post76.ini
COPY docker/php/fpm.conf /usr/local/etc/php-fpm.d/zzz-post76.conf
WORKDIR /var/www/html

FROM php-base AS vendor
COPY --from=composer:2 /usr/bin/composer /usr/local/bin/composer
COPY composer.json composer.lock ./
RUN COMPOSER_HOME=/tmp/composer composer install --no-dev --no-scripts --no-interaction --prefer-dist --no-progress --no-autoloader
COPY app ./app
COPY database/seeders ./database/seeders
RUN mkdir -p database/factories
RUN COMPOSER_HOME=/tmp/composer composer dump-autoload --no-dev --classmap-authoritative --no-scripts --no-interaction

FROM ${NODE_IMAGE} AS frontend
WORKDIR /build
COPY package.json package-lock.json ./
RUN npm ci --no-audit --no-fund
COPY vite.config.js ./
COPY resources ./resources
COPY public ./public
RUN npm run build

FROM php-base AS application
COPY --chown=www-data:www-data artisan composer.json composer.lock ./
COPY --chown=www-data:www-data app ./app
COPY --chown=www-data:www-data bootstrap ./bootstrap
COPY --chown=www-data:www-data config ./config
COPY --chown=www-data:www-data database/migrations ./database/migrations
COPY --chown=www-data:www-data database/seeders ./database/seeders
COPY --chown=www-data:www-data resources/views ./resources/views
COPY --chown=www-data:www-data routes ./routes
COPY --chown=www-data:www-data public ./public
COPY --chown=www-data:www-data docker/RuntimeEnvironment.php docker/entrypoint.php docker/healthcheck.php docker/metrics.php ./docker/
COPY --from=vendor --chown=www-data:www-data /var/www/html/vendor ./vendor
COPY --from=frontend --chown=www-data:www-data /build/public/build ./public/build
RUN mkdir -p bootstrap/cache storage/app/private storage/app/public storage/framework/cache/data storage/framework/sessions storage/framework/views storage/logs \
    && chown -R www-data:www-data bootstrap/cache storage
USER www-data
ENTRYPOINT ["php", "docker/entrypoint.php"]
CMD ["app"]

FROM ${NGINX_IMAGE} AS web
COPY docker/nginx/nginx.conf /etc/nginx/nginx.conf
COPY docker/nginx/http.conf.template /etc/nginx/templates/default.conf.template
COPY docker/nginx/locations.conf docker/nginx/fastcgi.conf /etc/nginx/includes/
COPY --from=application /var/www/html/public /var/www/html/public
USER nginx
EXPOSE 8080 8443

FROM ${RESTIC_IMAGE} AS backup
COPY docker/backup/entrypoint.sh /usr/local/bin/post76-backup
RUN mkdir -p /cache /capture /uploads /keys /configuration /restore /redis /legacy/attachment /legacy/avatar
ENTRYPOINT ["sh", "/usr/local/bin/post76-backup"]
