FROM node:22-bookworm-slim AS assets
WORKDIR /build
COPY package.json ./
RUN npm install --no-audit --no-fund
COPY resources ./resources
COPY public ./public
COPY vite.config.ts tsconfig.json ./
RUN npm run types:check && npm run build

FROM composer:2 AS vendor
WORKDIR /app
COPY composer.json ./
RUN composer install --no-dev --prefer-dist --no-interaction --no-progress --optimize-autoloader --no-scripts

FROM php:8.4-fpm-bookworm AS app
RUN apt-get update \
    && apt-get install -y --no-install-recommends libicu-dev libonig-dev libzip-dev libcurl4-openssl-dev unzip \
    && docker-php-ext-install -j"$(nproc)" pdo_mysql mbstring intl bcmath pcntl opcache curl \
    && pecl install redis \
    && docker-php-ext-enable redis \
    && rm -rf /var/lib/apt/lists/* /tmp/pear
WORKDIR /var/www/html
COPY docker/php/php.ini /usr/local/etc/php/conf.d/99-ztdeploy.ini
COPY docker/php/entrypoint.sh /usr/local/bin/ztdeploy-entrypoint
COPY . .
COPY --from=vendor /app/vendor ./vendor
COPY --from=assets /build/public/build ./public/build
RUN chmod +x artisan /usr/local/bin/ztdeploy-entrypoint \
    && rm -f .env \
    && mkdir -p storage/app/private storage/app/public storage/framework/cache/data storage/framework/sessions storage/framework/views storage/logs bootstrap/cache \
    && chown -R www-data:www-data storage bootstrap/cache
EXPOSE 9000
ENTRYPOINT ["ztdeploy-entrypoint"]
CMD ["php-fpm", "-F"]

FROM nginx:alpine AS web
COPY docker/nginx/default.conf /etc/nginx/conf.d/default.conf
COPY --from=app /var/www/html/public /var/www/html/public
RUN mkdir -p /var/www/html/storage/app/public \
    && ln -sfn /var/www/html/storage/app/public /var/www/html/public/storage
EXPOSE 8080
HEALTHCHECK --interval=30s --timeout=8s --start-period=20s --retries=5 CMD wget -qO- http://127.0.0.1:8080/up >/dev/null || exit 1
