* feat: ship public site with SEO and visuals Publish CMS content on public routes with responsive media, accessibility checks, and deterministic visual baselines. Co-authored-by: Cursor <cursoragent@cursor.com> * fix: make browser visual CI deterministic for media Mount host public storage into FrankenPHP so seeded fixtures are served, and replace PNG-as-JPG fixtures with real JPEGs so Chromium can render them. Co-authored-by: Cursor <cursoragent@cursor.com> * fix: serve public media on same-origin storage paths Pest Browser hosts on 127.0.0.1:port while Storage::url used http://localhost, so screenshots captured broken images. Use relative /storage URLs for media and absolutize only OG tags via url(). Co-authored-by: Cursor <cursoragent@cursor.com> * test: refresh visual baselines from CI Ubuntu screenshots Media now loads on same-origin /storage paths, so baselines must capture the rendered fixtures. Use full-page snapshots from the CI runner to keep Pest's exact snapshot match stable across environments. Co-authored-by: Cursor <cursoragent@cursor.com> --------- Co-authored-by: Cursor <cursoragent@cursor.com>
64 lines
1.7 KiB
Docker
64 lines
1.7 KiB
Docker
# syntax=docker/dockerfile:1
|
|
|
|
ARG PHP_VERSION=8.4
|
|
|
|
FROM composer:2 AS composer
|
|
WORKDIR /app
|
|
COPY composer.json composer.lock ./
|
|
RUN composer install \
|
|
--no-dev \
|
|
--prefer-dist \
|
|
--no-interaction \
|
|
--no-scripts \
|
|
--classmap-authoritative \
|
|
--ignore-platform-req=ext-intl
|
|
COPY . .
|
|
RUN mkdir -p bootstrap/cache storage/framework/cache storage/framework/sessions storage/framework/views storage/logs \
|
|
&& composer dump-autoload --optimize --classmap-authoritative --no-scripts
|
|
|
|
FROM node:22-bookworm-slim AS frontend
|
|
WORKDIR /app
|
|
COPY package.json package-lock.json ./
|
|
RUN npm ci
|
|
COPY vite.config.js ./
|
|
COPY resources ./resources
|
|
COPY public ./public
|
|
RUN npm run build
|
|
|
|
FROM dunglas/frankenphp:1-php${PHP_VERSION}-bookworm AS runtime
|
|
|
|
RUN install-php-extensions \
|
|
intl \
|
|
mbstring \
|
|
pdo_pgsql \
|
|
zip \
|
|
opcache \
|
|
pcntl \
|
|
bcmath \
|
|
sodium \
|
|
gd
|
|
|
|
RUN useradd --create-home --shell /usr/sbin/nologin --uid 1000 appuser
|
|
|
|
WORKDIR /app
|
|
|
|
COPY --from=composer --chown=appuser:appuser /app /app
|
|
COPY --from=frontend --chown=appuser:appuser /app/public/build /app/public/build
|
|
COPY docker/Caddyfile /etc/caddy/Caddyfile
|
|
|
|
RUN mkdir -p storage/framework/cache storage/framework/sessions storage/framework/views storage/logs bootstrap/cache \
|
|
&& chown -R appuser:appuser storage bootstrap/cache
|
|
|
|
COPY docker/entrypoint.sh /usr/local/bin/entrypoint.sh
|
|
RUN chmod +x /usr/local/bin/entrypoint.sh
|
|
|
|
USER appuser
|
|
|
|
EXPOSE 8000
|
|
|
|
HEALTHCHECK --interval=30s --timeout=5s --start-period=30s --retries=3 \
|
|
CMD curl -fsS http://127.0.0.1:8000/up || exit 1
|
|
|
|
ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]
|
|
CMD ["frankenphp", "run", "--config", "/etc/caddy/Caddyfile"]
|