Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .env.production
Original file line number Diff line number Diff line change
Expand Up @@ -29,10 +29,10 @@ PGADMIN_DEFAULT_PASSWORD="123456"

BROADCAST_CONNECTION=reverb

CACHE_STORE=redis
CACHE_STORE=failover
CACHE_PREFIX="${APP_NAME}_"

QUEUE_CONNECTION=redis
QUEUE_CONNECTION=failover

SESSION_DRIVER=redis
SESSION_LIFETIME=180
Expand Down
105 changes: 36 additions & 69 deletions FrankenPHP.Alpine.Dockerfile
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
ARG PHP_VERSION=8.4.12
ARG FRANKENPHP_VERSION=1.9.1
ARG PHP_VERSION=8.4
ARG FRANKENPHP_VERSION=1.9
ARG COMPOSER_VERSION=2.8
ARG BUN_VERSION="latest"
ARG ROOT="/var/www/html"

FROM composer:${COMPOSER_VERSION} AS vendor

Expand All @@ -21,32 +19,33 @@ RUN CGO_ENABLED=1 \
--with github.com/dunglas/frankenphp/caddy=./caddy/ \
--with github.com/dunglas/caddy-cbrotli

FROM dunglas/frankenphp:${FRANKENPHP_VERSION}-php${PHP_VERSION}-alpine AS base
FROM dunglas/frankenphp:${FRANKENPHP_VERSION}-php${PHP_VERSION}-alpine

COPY --from=upstream /usr/local/bin/frankenphp /usr/local/bin/frankenphp

LABEL maintainer="SMortexa <[email protected]>"
LABEL org.opencontainers.image.title="Laravel Octane Dockerfile"
LABEL org.opencontainers.image.description="Production-ready Dockerfile for Laravel Octane"
LABEL org.opencontainers.image.source=https://github.com/exaco/laravel-octane-dockerfile
LABEL maintainer="Mortexa <[email protected]>"
LABEL org.opencontainers.image.title="Laravel Docker Setup"
LABEL org.opencontainers.image.description="Production-ready Docker Setup for Laravel"
LABEL org.opencontainers.image.source=https://github.com/exaco/laravel-docktane
LABEL org.opencontainers.image.licenses=MIT

ARG USER_ID=1000
ARG GROUP_ID=1000
ARG TZ=UTC
ARG ROOT
ARG APP_ENV

ENV TERM=xterm-color \
OCTANE_SERVER=frankenphp \
TZ=${TZ} \
USER=octane \
ROOT=${ROOT} \
APP_ENV=${APP_ENV} \
USER=laravel \
ROOT=/var/www/html \
APP_ENV=production \
COMPOSER_FUND=0 \
COMPOSER_MAX_PARALLEL_HTTP=48 \
XDG_CONFIG_HOME=${ROOT}/.config \
XDG_DATA_HOME=${ROOT}/.data
WITH_HORIZON=false \
WITH_SCHEDULER=false \
WITH_REVERB=false

ENV XDG_CONFIG_HOME=${ROOT}/.config XDG_DATA_HOME=${ROOT}/.data

WORKDIR ${ROOT}

Expand All @@ -66,8 +65,10 @@ RUN apk update; \
procps \
unzip \
ca-certificates \
bash \
supervisor \
libsodium-dev \
&& curl -fsSL https://bun.sh/install | BUN_INSTALL=/usr bash \
&& install-php-extensions \
apcu \
bz2 \
Expand All @@ -85,7 +86,7 @@ RUN apk update; \
gd \
redis \
rdkafka \
memcached \
ffi \
ldap \
&& docker-php-source delete \
&& rm -rf /var/cache/apk/* /tmp/* /var/tmp/*
Expand All @@ -98,80 +99,44 @@ RUN arch="$(apk --print-arch)" \
x86) _cronic_fname='supercronic-linux-386' ;; \
*) echo >&2 "error: unsupported architecture: $arch"; exit 1 ;; \
esac \
&& wget -q "https://github.com/aptible/supercronic/releases/download/v0.2.29/${_cronic_fname}" \
&& wget -q "https://github.com/aptible/supercronic/releases/download/v0.2.38/${_cronic_fname}" \
-O /usr/bin/supercronic \
&& chmod +x /usr/bin/supercronic \
&& mkdir -p /etc/supercronic \
&& echo "*/1 * * * * php ${ROOT}/artisan schedule:run --no-interaction" > /etc/supercronic/laravel

RUN addgroup -g ${GROUP_ID} ${USER} \
&& adduser -D -G ${USER} -u ${USER_ID} -s /bin/sh ${USER} \
&& setcap -r /usr/local/bin/frankenphp
&& adduser -D -G ${USER} -u ${USER_ID} -s /bin/sh ${USER}

RUN mkdir -p /var/log/supervisor /var/run/supervisor \
&& chown -R ${USER_ID}:${GROUP_ID} ${ROOT} /var/log /var/run \
&& chmod -R a+rw ${ROOT} /var/log /var/run

RUN cp ${PHP_INI_DIR}/php.ini-production ${PHP_INI_DIR}/php.ini

USER ${USER}

COPY --link --chown=${USER_ID}:${GROUP_ID} --from=vendor /usr/bin/composer /usr/bin/composer

COPY --link --chown=${USER_ID}:${GROUP_ID} deployment/supervisord.conf /etc/
COPY --link --chown=${USER_ID}:${GROUP_ID} deployment/octane/FrankenPHP/supervisord.frankenphp.conf /etc/supervisor/conf.d/
COPY --link --chown=${USER_ID}:${GROUP_ID} deployment/supervisord.*.conf /etc/supervisor/conf.d/
COPY --link --chown=${USER_ID}:${GROUP_ID} deployment/start-container /usr/local/bin/start-container
COPY --link --chown=${USER_ID}:${GROUP_ID} deployment/healthcheck /usr/local/bin/healthcheck
COPY --link --chown=${USER_ID}:${GROUP_ID} deployment/php.ini ${PHP_INI_DIR}/conf.d/99-octane.ini

RUN chmod +x /usr/local/bin/start-container /usr/local/bin/healthcheck

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

FROM base AS common

USER ${USER}

COPY --link --chown=${USER_ID}:${GROUP_ID} . .
COPY --link --from=vendor /usr/bin/composer /usr/bin/composer
COPY --link deployment/supervisord.conf /etc/
COPY --link deployment/octane/FrankenPHP/supervisord.frankenphp.conf /etc/supervisor/conf.d/
COPY --link deployment/supervisord.*.conf /etc/supervisor/conf.d/
COPY --link deployment/start-container /usr/local/bin/start-container
COPY --link deployment/healthcheck /usr/local/bin/healthcheck
COPY --link deployment/php.ini ${PHP_INI_DIR}/conf.d/99-octane.ini
COPY --link composer.* ./

RUN composer install \
--no-dev \
--no-interaction \
--no-autoloader \
--no-ansi \
--no-scripts \
--no-progress \
--audit

###########################################
# Build frontend assets with Bun
###########################################

FROM oven/bun:${BUN_VERSION} AS build

ARG ROOT

WORKDIR ${ROOT}

COPY --link package.json bun.lock* ./

RUN bun install --frozen-lockfile

COPY --link --from=common ${ROOT} .

RUN bun run build

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

FROM common AS runner

USER ${USER}

ENV WITH_HORIZON=false \
WITH_SCHEDULER=false \
WITH_REVERB=false

COPY --link --chown=${USER_ID}:${GROUP_ID} --from=build ${ROOT}/public public
COPY --link . .

RUN mkdir -p \
storage/framework/sessions \
Expand All @@ -181,19 +146,21 @@ RUN mkdir -p \
storage/logs \
bootstrap/cache \
&& chown -R ${USER_ID}:${GROUP_ID} ${ROOT} \
&& chmod -R a+rw ${ROOT}
&& chmod +x /usr/local/bin/start-container /usr/local/bin/healthcheck

RUN composer dump-autoload \
--optimize \
--apcu \
--no-dev

RUN bun run build

USER ${USER}

EXPOSE 8000
EXPOSE 443
EXPOSE 443/udp
EXPOSE 2019
EXPOSE 8080

ENTRYPOINT ["start-container"]

HEALTHCHECK --start-period=5s --interval=2s --timeout=5s --retries=8 CMD healthcheck || exit 1
HEALTHCHECK --start-period=5s --interval=1s --timeout=3s --retries=10 CMD healthcheck || exit 1
Loading