diff --git a/.env.production b/.env.production index 8187e88..7f98087 100644 --- a/.env.production +++ b/.env.production @@ -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 diff --git a/FrankenPHP.Alpine.Dockerfile b/FrankenPHP.Alpine.Dockerfile index a1ae152..25bfc08 100644 --- a/FrankenPHP.Alpine.Dockerfile +++ b/FrankenPHP.Alpine.Dockerfile @@ -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 @@ -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 " -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 " +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} @@ -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 \ @@ -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/* @@ -98,15 +99,14 @@ 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 \ @@ -114,26 +114,14 @@ RUN mkdir -p /var/log/supervisor /var/run/supervisor \ 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 \ @@ -141,37 +129,14 @@ RUN composer install \ --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 \ @@ -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 \ No newline at end of file diff --git a/FrankenPHP.Dockerfile b/FrankenPHP.Dockerfile index de62943..495c534 100644 --- a/FrankenPHP.Dockerfile +++ b/FrankenPHP.Dockerfile @@ -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 @@ -21,33 +19,34 @@ 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} AS base +FROM dunglas/frankenphp:${FRANKENPHP_VERSION}-php${PHP_VERSION} COPY --from=upstream /usr/local/bin/frankenphp /usr/local/bin/frankenphp -LABEL maintainer="SMortexa " -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 " +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 DEBIAN_FRONTEND=noninteractive \ 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} @@ -56,6 +55,9 @@ SHELL ["/bin/bash", "-eou", "pipefail", "-c"] RUN ln -snf /usr/share/zoneinfo/${TZ} /etc/localtime \ && echo ${TZ} > /etc/timezone +RUN echo "Acquire::http::No-Cache true;" >> /etc/apt/apt.conf.d/99custom && \ + echo "Acquire::BrokenProxy true;" >> /etc/apt/apt.conf.d/99custom + RUN apt-get update; \ apt-get upgrade -yqq; \ apt-get install -yqq --no-install-recommends --show-progress \ @@ -63,12 +65,14 @@ RUN apt-get update; \ curl \ wget \ vim \ + git \ + unzip \ ncdu \ procps \ - unzip \ ca-certificates \ supervisor \ libsodium-dev \ + && curl -fsSL https://bun.sh/install | BUN_INSTALL=/usr bash \ && install-php-extensions \ apcu \ bz2 \ @@ -86,7 +90,7 @@ RUN apt-get update; \ gd \ redis \ rdkafka \ - memcached \ + ffi \ ldap \ && apt-get -y autoremove \ && apt-get clean \ @@ -101,7 +105,7 @@ RUN arch="$(uname -m)" \ 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 \ @@ -109,34 +113,18 @@ RUN arch="$(uname -m)" \ RUN userdel --remove --force www-data \ && groupadd --force -g ${GROUP_ID} ${USER} \ - && useradd -ms /bin/bash --no-log-init --no-user-group -g ${GROUP_ID} -u ${USER_ID} ${USER} \ - && setcap -r /usr/local/bin/frankenphp - -RUN chown -R ${USER_ID}:${GROUP_ID} ${ROOT} /var/{log,run} \ - && chmod -R a+rw ${ROOT} /var/{log,run} + && useradd -ms /bin/bash --no-log-init --no-user-group -g ${GROUP_ID} -u ${USER_ID} ${USER} 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 \ @@ -144,56 +132,35 @@ RUN composer install \ --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,views,cache,testing} \ 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 \ No newline at end of file diff --git a/README.md b/README.md index b3d5aa3..a9d18c9 100644 --- a/README.md +++ b/README.md @@ -2,14 +2,14 @@

Laravel Docker Setup

- License - GitHub release (latest by date) - GitHub closed pull requests + License + GitHub release (latest by date) + GitHub closed pull requests
- GitHub Workflow Status - GitHub Workflow Status - GitHub Workflow Status - GitHub Workflow Status + GitHub Workflow Status + GitHub Workflow Status + GitHub Workflow Status + GitHub Workflow Status

@@ -74,7 +74,7 @@ This comprehensive stack provides a robust and observable environment for your p 1. Clone the repository: ``` -git clone --depth 1 git@github.com:exaco/laravel-octane-dockerfile.git +git clone --depth 1 git@github.com:exaco/laravel-docktane.git ``` 2. Copy the contents of the cloned directory, including the following items, into your Laravel project powered by Octane: - `deployment` directory @@ -206,8 +206,8 @@ issue, or a PR. ## Credits -- [SMortexa](https://github.com/smortexa) -- [All contributors](https://github.com/exaco/laravel-octane-dockerfile/graphs/contributors) +- [Mortexa](https://github.com/smortexa) +- [All contributors](https://github.com/exaco/laravel-docktane/graphs/contributors) ## License diff --git a/RoadRunner.Alpine.Dockerfile b/RoadRunner.Alpine.Dockerfile index dc8ac00..4741dee 100644 --- a/RoadRunner.Alpine.Dockerfile +++ b/RoadRunner.Alpine.Dockerfile @@ -1,41 +1,38 @@ -ARG PHP_VERSION=8.4.12 +ARG PHP_VERSION=8.4 ARG COMPOSER_VERSION=2.8 -ARG BUN_VERSION="latest" -ARG ROOT="/var/www/html" FROM composer:${COMPOSER_VERSION} AS vendor -FROM php:${PHP_VERSION}-cli-alpine AS base +FROM php:${PHP_VERSION}-cli-alpine -LABEL maintainer="SMortexa " -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 " +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 \ - WITH_HORIZON=false \ - WITH_SCHEDULER=false \ OCTANE_SERVER=roadrunner \ TZ=${TZ} \ - USER=octane \ - APP_ENV=${APP_ENV} \ - ROOT=${ROOT} \ + USER=laravel \ + ROOT=/var/www/html \ + APP_ENV=production \ COMPOSER_FUND=0 \ - COMPOSER_MAX_PARALLEL_HTTP=48 + COMPOSER_MAX_PARALLEL_HTTP=48 \ + WITH_HORIZON=false \ + WITH_SCHEDULER=false \ + WITH_REVERB=false WORKDIR ${ROOT} SHELL ["/bin/sh", "-eou", "pipefail", "-c"] RUN ln -snf /usr/share/zoneinfo/${TZ} /etc/localtime \ - && echo ${TZ} > /etc/timezone + && echo ${TZ} > /etc/timezone ADD --chmod=0755 https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions /usr/local/bin/ @@ -50,8 +47,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 \ @@ -69,7 +68,7 @@ RUN apk update; \ gd \ redis \ rdkafka \ - memcached \ + ffi \ ldap \ && docker-php-source delete \ && rm -rf /var/cache/apk/* /tmp/* /var/tmp/* @@ -82,7 +81,7 @@ 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 \ @@ -97,27 +96,15 @@ RUN mkdir -p /var/log/supervisor /var/run/supervisor \ 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/RoadRunner/supervisord.roadrunner.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/php.ini ${PHP_INI_DIR}/conf.d/99-octane.ini -COPY --link --chown=${USER_ID}:${GROUP_ID} deployment/octane/RoadRunner/.rr.prod.yaml ./.rr.yaml -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 - -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/RoadRunner/supervisord.roadrunner.conf /etc/supervisor/conf.d/ +COPY --link deployment/supervisord.*.conf /etc/supervisor/conf.d/ +COPY --link deployment/php.ini ${PHP_INI_DIR}/conf.d/99-octane.ini +COPY --link deployment/octane/RoadRunner/.rr.prod.yaml ./.rr.yaml +COPY --link deployment/start-container /usr/local/bin/start-container +COPY --link deployment/healthcheck /usr/local/bin/healthcheck +COPY --link composer.* ./ RUN composer install \ --no-dev \ @@ -125,37 +112,14 @@ RUN composer install \ --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 \ @@ -165,7 +129,7 @@ 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 \ @@ -173,11 +137,13 @@ RUN composer dump-autoload \ --no-dev RUN if composer show | grep spiral/roadrunner-cli >/dev/null; then \ - ./vendor/bin/rr get-binary --quiet; else \ + ./vendor/bin/rr get-binary --quiet && chmod +x rr; else \ echo "`spiral/roadrunner-cli` package is not installed. Exiting..."; exit 1; \ fi -RUN chmod +x rr +RUN bun run build + +USER ${USER} EXPOSE 8000 EXPOSE 6001 @@ -185,4 +151,4 @@ EXPOSE 8080 ENTRYPOINT ["start-container"] -HEALTHCHECK --start-period=5s --interval=2s --timeout=5s --retries=8 CMD healthcheck || exit 1 \ No newline at end of file +HEALTHCHECK --start-period=5s --interval=1s --timeout=3s --retries=10 CMD healthcheck || exit 1 \ No newline at end of file diff --git a/RoadRunner.Dockerfile b/RoadRunner.Dockerfile index b3375e8..e62ffc1 100644 --- a/RoadRunner.Dockerfile +++ b/RoadRunner.Dockerfile @@ -1,43 +1,45 @@ -ARG PHP_VERSION=8.4.12 +ARG PHP_VERSION=8.4 ARG COMPOSER_VERSION=2.8 -ARG BUN_VERSION="latest" -ARG ROOT="/var/www/html" FROM composer:${COMPOSER_VERSION} AS vendor -FROM php:${PHP_VERSION}-cli-bookworm AS base +FROM php:${PHP_VERSION}-cli-bookworm -LABEL maintainer="SMortexa " -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 " +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 APP_ENV -ARG ROOT ENV DEBIAN_FRONTEND=noninteractive \ TERM=xterm-color \ OCTANE_SERVER=roadrunner \ TZ=${TZ} \ - USER=octane \ - APP_ENV=${APP_ENV} \ - ROOT=${ROOT} \ + USER=laravel \ + ROOT=/var/www/html \ + APP_ENV=production \ COMPOSER_FUND=0 \ - COMPOSER_MAX_PARALLEL_HTTP=48 + COMPOSER_MAX_PARALLEL_HTTP=48 \ + WITH_HORIZON=false \ + WITH_SCHEDULER=false \ + WITH_REVERB=false WORKDIR ${ROOT} SHELL ["/bin/bash", "-eou", "pipefail", "-c"] RUN ln -snf /usr/share/zoneinfo/${TZ} /etc/localtime \ - && echo ${TZ} > /etc/timezone + && echo ${TZ} > /etc/timezone ADD --chmod=0755 https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions /usr/local/bin/ +RUN echo "Acquire::http::No-Cache true;" >> /etc/apt/apt.conf.d/99custom && \ + echo "Acquire::BrokenProxy true;" >> /etc/apt/apt.conf.d/99custom + RUN apt-get update; \ apt-get upgrade -yqq; \ apt-get install -yqq --no-install-recommends --show-progress \ @@ -45,12 +47,14 @@ RUN apt-get update; \ curl \ wget \ vim \ + git \ + unzip \ ncdu \ procps \ - unzip \ ca-certificates \ supervisor \ libsodium-dev \ + && curl -fsSL https://bun.sh/install | BUN_INSTALL=/usr bash \ && install-php-extensions \ apcu \ bz2 \ @@ -68,7 +72,7 @@ RUN apt-get update; \ gd \ redis \ rdkafka \ - memcached \ + ffi \ ldap \ && apt-get -y autoremove \ && apt-get clean \ @@ -83,7 +87,7 @@ RUN arch="$(uname -m)" \ 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 \ @@ -93,32 +97,17 @@ RUN userdel --remove --force www-data \ && groupadd --force -g ${GROUP_ID} ${USER} \ && useradd -ms /bin/bash --no-log-init --no-user-group -g ${GROUP_ID} -u ${USER_ID} ${USER} -RUN chown -R ${USER_ID}:${GROUP_ID} ${ROOT} /var/{log,run} \ - && chmod -R a+rw ${ROOT} /var/{log,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/RoadRunner/supervisord.roadrunner.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/php.ini ${PHP_INI_DIR}/conf.d/99-octane.ini -COPY --link --chown=${USER_ID}:${GROUP_ID} deployment/octane/RoadRunner/.rr.prod.yaml ./.rr.yaml -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 - -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/RoadRunner/supervisord.roadrunner.conf /etc/supervisor/conf.d/ +COPY --link deployment/supervisord.*.conf /etc/supervisor/conf.d/ +COPY --link deployment/php.ini ${PHP_INI_DIR}/conf.d/99-octane.ini +COPY --link deployment/octane/RoadRunner/.rr.prod.yaml ./.rr.yaml +COPY --link deployment/start-container /usr/local/bin/start-container +COPY --link deployment/healthcheck /usr/local/bin/healthcheck +COPY --link composer.* ./ RUN composer install \ --no-dev \ @@ -126,44 +115,21 @@ RUN composer install \ --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,views,cache,testing} \ 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 \ @@ -171,11 +137,13 @@ RUN composer dump-autoload \ --no-dev RUN if composer show | grep spiral/roadrunner-cli >/dev/null; then \ - ./vendor/bin/rr get-binary --quiet; else \ + ./vendor/bin/rr get-binary --quiet && chmod +x rr; else \ echo "`spiral/roadrunner-cli` package is not installed. Exiting..."; exit 1; \ fi -RUN chmod +x rr +RUN bun run build + +USER ${USER} EXPOSE 8000 EXPOSE 6001 @@ -183,4 +151,4 @@ 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 \ No newline at end of file diff --git a/Swoole.Alpine.Dockerfile b/Swoole.Alpine.Dockerfile index d778c12..2a39d9b 100644 --- a/Swoole.Alpine.Dockerfile +++ b/Swoole.Alpine.Dockerfile @@ -1,41 +1,38 @@ -ARG PHP_VERSION=8.4.12 +ARG PHP_VERSION=8.4 ARG COMPOSER_VERSION=2.8 -ARG BUN_VERSION="latest" -ARG ROOT="/var/www/html" FROM composer:${COMPOSER_VERSION} AS vendor -FROM php:${PHP_VERSION}-cli-alpine AS base +FROM php:${PHP_VERSION}-cli-alpine -LABEL maintainer="SMortexa " -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 " +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 \ - WITH_HORIZON=false \ - WITH_SCHEDULER=false \ OCTANE_SERVER=swoole \ TZ=${TZ} \ - USER=octane \ - APP_ENV=${APP_ENV} \ - ROOT=${ROOT} \ + USER=laravel \ + ROOT=/var/www/html \ + APP_ENV=production \ COMPOSER_FUND=0 \ - COMPOSER_MAX_PARALLEL_HTTP=48 + COMPOSER_MAX_PARALLEL_HTTP=48 \ + WITH_HORIZON=false \ + WITH_SCHEDULER=false \ + WITH_REVERB=false WORKDIR ${ROOT} SHELL ["/bin/sh", "-eou", "pipefail", "-c"] RUN ln -snf /usr/share/zoneinfo/${TZ} /etc/localtime \ - && echo ${TZ} > /etc/timezone + && echo ${TZ} > /etc/timezone ADD --chmod=0755 https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions /usr/local/bin/ @@ -51,7 +48,9 @@ RUN apk update; \ unzip \ ca-certificates \ supervisor \ + bash \ libsodium-dev \ + && curl -fsSL https://bun.sh/install | BUN_INSTALL=/usr bash \ && install-php-extensions \ apcu \ bz2 \ @@ -69,7 +68,7 @@ RUN apk update; \ gd \ redis \ rdkafka \ - memcached \ + ffi \ ldap \ swoole \ && docker-php-source delete \ @@ -83,7 +82,7 @@ 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 \ @@ -98,26 +97,14 @@ RUN mkdir -p /var/log/supervisor /var/run/supervisor \ 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/Swoole/supervisord.swoole.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/php.ini ${PHP_INI_DIR}/conf.d/99-octane.ini -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 - -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/Swoole/supervisord.swoole.conf /etc/supervisor/conf.d/ +COPY --link deployment/supervisord.*.conf /etc/supervisor/conf.d/ +COPY --link deployment/php.ini ${PHP_INI_DIR}/conf.d/99-octane.ini +COPY --link deployment/start-container /usr/local/bin/start-container +COPY --link deployment/healthcheck /usr/local/bin/healthcheck +COPY --link composer.* ./ RUN composer install \ --no-dev \ @@ -125,37 +112,14 @@ RUN composer install \ --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 \ @@ -165,16 +129,20 @@ 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 8080 ENTRYPOINT ["start-container"] -HEALTHCHECK --start-period=5s --interval=2s --timeout=5s --retries=8 CMD healthcheck || exit 1 \ No newline at end of file +HEALTHCHECK --start-period=5s --interval=1s --timeout=3s --retries=10 CMD healthcheck || exit 1 \ No newline at end of file diff --git a/Swoole.Dockerfile b/Swoole.Dockerfile index 0e9adc4..b475019 100644 --- a/Swoole.Dockerfile +++ b/Swoole.Dockerfile @@ -1,33 +1,32 @@ -ARG PHP_VERSION=8.4.12 +ARG PHP_VERSION=8.4 ARG COMPOSER_VERSION=2.8 -ARG BUN_VERSION="latest" -ARG ROOT="/var/www/html" FROM composer:${COMPOSER_VERSION} AS vendor -FROM php:${PHP_VERSION}-cli-bookworm AS base +FROM php:${PHP_VERSION}-cli-bookworm -LABEL maintainer="SMortexa " -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 " +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 DEBIAN_FRONTEND=noninteractive \ TERM=xterm-color \ OCTANE_SERVER=swoole \ TZ=${TZ} \ - USER=octane \ - APP_ENV=${APP_ENV} \ - ROOT=${ROOT} \ + USER=laravel \ + ROOT=/var/www/html \ + APP_ENV=production \ COMPOSER_FUND=0 \ - COMPOSER_MAX_PARALLEL_HTTP=48 + COMPOSER_MAX_PARALLEL_HTTP=48 \ + WITH_HORIZON=false \ + WITH_SCHEDULER=false \ + WITH_REVERB=false WORKDIR ${ROOT} @@ -38,6 +37,9 @@ RUN ln -snf /usr/share/zoneinfo/${TZ} /etc/localtime \ ADD --chmod=0755 https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions /usr/local/bin/ +RUN echo "Acquire::http::No-Cache true;" >> /etc/apt/apt.conf.d/99custom && \ + echo "Acquire::BrokenProxy true;" >> /etc/apt/apt.conf.d/99custom + RUN apt-get update; \ apt-get upgrade -yqq; \ apt-get install -yqq --no-install-recommends --show-progress \ @@ -45,12 +47,14 @@ RUN apt-get update; \ curl \ wget \ vim \ + git \ + unzip \ ncdu \ procps \ - unzip \ ca-certificates \ supervisor \ libsodium-dev \ + && curl -fsSL https://bun.sh/install | BUN_INSTALL=/usr bash \ && install-php-extensions \ apcu \ bz2 \ @@ -68,7 +72,7 @@ RUN apt-get update; \ gd \ redis \ rdkafka \ - memcached \ + ffi \ ldap \ swoole \ && apt-get -y autoremove \ @@ -84,7 +88,7 @@ RUN arch="$(uname -m)" \ 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 \ @@ -94,31 +98,16 @@ RUN userdel --remove --force www-data \ && groupadd --force -g ${GROUP_ID} ${USER} \ && useradd -ms /bin/bash --no-log-init --no-user-group -g ${GROUP_ID} -u ${USER_ID} ${USER} -RUN chown -R ${USER_ID}:${GROUP_ID} ${ROOT} /var/{log,run} \ - && chmod -R a+rw ${ROOT} /var/{log,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/Swoole/supervisord.swoole.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/php.ini ${PHP_INI_DIR}/conf.d/99-octane.ini -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 - -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/Swoole/supervisord.swoole.conf /etc/supervisor/conf.d/ +COPY --link deployment/supervisord.*.conf /etc/supervisor/conf.d/ +COPY --link deployment/php.ini ${PHP_INI_DIR}/conf.d/99-octane.ini +COPY --link deployment/start-container /usr/local/bin/start-container +COPY --link deployment/healthcheck /usr/local/bin/healthcheck +COPY --link composer.* ./ RUN composer install \ --no-dev \ @@ -126,53 +115,34 @@ RUN composer install \ --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,views,cache,testing} \ 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 8080 ENTRYPOINT ["start-container"] -HEALTHCHECK --start-period=5s --interval=2s --timeout=5s --retries=8 CMD healthcheck || exit 1 \ No newline at end of file +HEALTHCHECK --start-period=5s --interval=1s --timeout=3s --retries=10 CMD healthcheck || exit 1 \ No newline at end of file diff --git a/compose.production.yaml b/compose.production.yaml index 18df2e6..63362be 100644 --- a/compose.production.yaml +++ b/compose.production.yaml @@ -23,7 +23,6 @@ x-base: &base cache_from: - 'laravel/app:latest' args: - APP_ENV: 'production' # to load .env.production USER_ID: ${HOST_UID:-1000} GROUP_ID: ${HOST_GID:-1000} image: 'laravel/app:latest' diff --git a/deployment/supervisord.conf b/deployment/supervisord.conf index 18edfef..64559a4 100644 --- a/deployment/supervisord.conf +++ b/deployment/supervisord.conf @@ -1,8 +1,6 @@ [supervisord] nodaemon = true user = %(ENV_USER)s -logfile = /var/log/supervisor/supervisord.log -pidfile = /var/run/supervisord.pid [supervisorctl] diff --git a/static-build.Dockerfile b/static-build.Dockerfile index 7e7a19d..c92b5a9 100644 --- a/static-build.Dockerfile +++ b/static-build.Dockerfile @@ -1,8 +1,6 @@ -ARG PHP_VERSION=8.4.12 +ARG PHP_VERSION=8.4 ARG FRANKENPHP_VERSION=1.8 ARG COMPOSER_VERSION=2.8 -ARG BUN_VERSION="latest" -ARG ROOT="/var/www/html" FROM composer:${COMPOSER_VERSION} AS vendor @@ -21,33 +19,31 @@ 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} AS base +FROM dunglas/frankenphp:${FRANKENPHP_VERSION}-php${PHP_VERSION} COPY --from=upstream /usr/local/bin/frankenphp /usr/local/bin/frankenphp -LABEL maintainer="SMortexa " -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 " +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 DEBIAN_FRONTEND=noninteractive \ 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 + COMPOSER_MAX_PARALLEL_HTTP=48 + +ENV XDG_CONFIG_HOME=${ROOT}/.config XDG_DATA_HOME=${ROOT}/.data WORKDIR ${ROOT} @@ -56,6 +52,9 @@ SHELL ["/bin/bash", "-eou", "pipefail", "-c"] RUN ln -snf /usr/share/zoneinfo/${TZ} /etc/localtime \ && echo ${TZ} > /etc/timezone +RUN echo "Acquire::http::No-Cache true;" >> /etc/apt/apt.conf.d/99custom && \ + echo "Acquire::BrokenProxy true;" >> /etc/apt/apt.conf.d/99custom + RUN apt-get update; \ apt-get upgrade -yqq; \ apt-get install -yqq --no-install-recommends --show-progress \ @@ -63,12 +62,13 @@ RUN apt-get update; \ curl \ wget \ vim \ + unzip \ ncdu \ procps \ - unzip \ ca-certificates \ supervisor \ libsodium-dev \ + && curl -fsSL https://bun.sh/install | BUN_INSTALL=/usr bash \ && install-php-extensions \ apcu \ bz2 \ @@ -86,57 +86,25 @@ RUN apt-get update; \ gd \ redis \ rdkafka \ - memcached \ + ffi \ ldap \ && apt-get -y autoremove \ && apt-get clean \ && docker-php-source delete \ && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* /var/log/lastlog /var/log/faillog -RUN arch="$(uname -m)" \ - && case "$arch" in \ - armhf) _cronic_fname='supercronic-linux-arm' ;; \ - aarch64) _cronic_fname='supercronic-linux-arm64' ;; \ - x86_64) _cronic_fname='supercronic-linux-amd64' ;; \ - 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}" \ - -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 userdel --remove --force www-data \ && groupadd --force -g ${GROUP_ID} ${USER} \ && useradd -ms /bin/bash --no-log-init --no-user-group -g ${GROUP_ID} -u ${USER_ID} ${USER} \ && setcap -r /usr/local/bin/frankenphp -RUN chown -R ${USER_ID}:${GROUP_ID} ${ROOT} /var/{log,run} \ - && chmod -R a+rw ${ROOT} /var/{log,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/php.ini ${PHP_INI_DIR}/conf.d/99-octane.ini +COPY --link composer.* ./ RUN composer install \ --no-dev \ @@ -144,50 +112,28 @@ RUN composer install \ --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,views,cache,testing} \ storage/logs \ bootstrap/cache \ - && chown -R ${USER_ID}:${GROUP_ID} ${ROOT} \ - && chmod -R a+rw ${ROOT} + && chown -R ${USER_ID}:${GROUP_ID} ${ROOT} RUN composer dump-autoload \ --optimize \ --apcu \ --no-dev +RUN bun run build + ########################################### FROM --platform=linux/amd64 dunglas/frankenphp:static-builder-${FRANKENPHP_VERSION} AS static