From 7271c8c6f1416cf136c6a3be71eda18c56032d84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20B=C3=B6hmer?= Date: Sun, 10 Mar 2024 19:50:21 +0100 Subject: [PATCH] Restructured frankenphp structure --- {frankenphp => .docker/frankenphp}/Caddyfile | 0 .../frankenphp}/conf.d/app.dev.ini | 0 .../frankenphp}/conf.d/app.ini | 0 .../frankenphp}/conf.d/app.prod.ini | 0 .../frankenphp}/docker-entrypoint.sh | 3 +- .../frankenphp}/worker.Caddyfile | 0 Dockerfile | 123 ++++++++---------- compose.override.yaml | 41 ------ compose.prod.yaml | 10 -- compose.yaml | 63 --------- 10 files changed, 57 insertions(+), 183 deletions(-) rename {frankenphp => .docker/frankenphp}/Caddyfile (100%) rename {frankenphp => .docker/frankenphp}/conf.d/app.dev.ini (100%) rename {frankenphp => .docker/frankenphp}/conf.d/app.ini (100%) rename {frankenphp => .docker/frankenphp}/conf.d/app.prod.ini (100%) rename {frankenphp => .docker/frankenphp}/docker-entrypoint.sh (97%) rename {frankenphp => .docker/frankenphp}/worker.Caddyfile (100%) delete mode 100644 compose.override.yaml delete mode 100644 compose.prod.yaml delete mode 100644 compose.yaml diff --git a/frankenphp/Caddyfile b/.docker/frankenphp/Caddyfile similarity index 100% rename from frankenphp/Caddyfile rename to .docker/frankenphp/Caddyfile diff --git a/frankenphp/conf.d/app.dev.ini b/.docker/frankenphp/conf.d/app.dev.ini similarity index 100% rename from frankenphp/conf.d/app.dev.ini rename to .docker/frankenphp/conf.d/app.dev.ini diff --git a/frankenphp/conf.d/app.ini b/.docker/frankenphp/conf.d/app.ini similarity index 100% rename from frankenphp/conf.d/app.ini rename to .docker/frankenphp/conf.d/app.ini diff --git a/frankenphp/conf.d/app.prod.ini b/.docker/frankenphp/conf.d/app.prod.ini similarity index 100% rename from frankenphp/conf.d/app.prod.ini rename to .docker/frankenphp/conf.d/app.prod.ini diff --git a/frankenphp/docker-entrypoint.sh b/.docker/frankenphp/docker-entrypoint.sh similarity index 97% rename from frankenphp/docker-entrypoint.sh rename to .docker/frankenphp/docker-entrypoint.sh index bdddc3ac..6a3a8f9a 100644 --- a/frankenphp/docker-entrypoint.sh +++ b/.docker/frankenphp/docker-entrypoint.sh @@ -57,4 +57,5 @@ if [ "$1" = 'frankenphp' ] || [ "$1" = 'php' ] || [ "$1" = 'bin/console' ]; then setfacl -dR -m u:www-data:rwX -m u:"$(whoami)":rwX var fi -exec docker-php-entrypoint "$@" +#exec docker-php-entrypoint "$@" +exec "$@" \ No newline at end of file diff --git a/frankenphp/worker.Caddyfile b/.docker/frankenphp/worker.Caddyfile similarity index 100% rename from frankenphp/worker.Caddyfile rename to .docker/frankenphp/worker.Caddyfile diff --git a/Dockerfile b/Dockerfile index 009ede2b..489ca40e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,81 +1,41 @@ -#syntax=docker/dockerfile:1.4 - -# Versions -FROM dunglas/frankenphp:1-php8.3 AS frankenphp_upstream - -# The different stages of this Dockerfile are meant to be built into separate images -# https://docs.docker.com/develop/develop-images/multistage-build/#stop-at-a-specific-build-stage -# https://docs.docker.com/compose/compose-file/#target +FROM debian:bookworm-slim -# Base FrankenPHP image -FROM frankenphp_upstream AS frankenphp_base +RUN apt-get update && apt-get -y install apt-transport-https lsb-release ca-certificates curl zip mariadb-client file acl \ + && curl -sSLo /usr/share/keyrings/deb.sury.org-php.gpg https://packages.sury.org/php/apt.gpg \ + && sh -c 'echo "deb [signed-by=/usr/share/keyrings/deb.sury.org-php.gpg] https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list' \ + && apt-get update && apt-get upgrade -y \ + && apt-get install -y apache2 php8.3 php8.3-fpm php8.3-opcache php8.3-curl php8.3-gd php8.3-mbstring php8.3-xml php8.3-bcmath php8.3-intl php8.3-zip php8.3-xsl php8.3-sqlite3 php8.3-mysql gpg \ + && apt-get -y autoremove && apt-get clean autoclean && rm -rf /var/lib/apt/lists/*; +# Create workdir and set permissions if directory does not exists +RUN mkdir -p /app WORKDIR /app -# persistent / runtime deps -# hadolint ignore=DL3008 -RUN apt-get update && apt-get install -y --no-install-recommends \ - acl \ - file \ - gettext \ - git \ - && rm -rf /var/lib/apt/lists/* +# Copy config files for php and caddy +ENV PHP_INI_DIR="/etc/php/8.3/" +COPY --link .docker/frankenphp/conf.d/app.ini $PHP_INI_DIR/conf.d/ +COPY --chmod=755 .docker/frankenphp/docker-entrypoint.sh /usr/local/bin/docker-entrypoint +COPY --link .docker/frankenphp/Caddyfile /etc/caddy/Caddyfile +COPY --link .docker/frankenphp/conf.d/app.prod.ini $PHP_INI_DIR/conf.d/ +COPY --link .docker/frankenphp/worker.Caddyfile /etc/caddy/worker.Caddyfile -RUN set -eux; \ - install-php-extensions \ - @composer \ - apcu \ - intl \ - opcache \ - zip \ - ; +#RUN mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini" -# https://getcomposer.org/doc/03-cli.md#composer-allow-superuser -ENV COMPOSER_ALLOW_SUPERUSER=1 +# Install node and yarn +RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - +RUN echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list +RUN curl -sL https://deb.nodesource.com/setup_18.x | bash - && apt-get update && apt-get install -y nodejs yarn && apt-get -y autoremove && apt-get clean autoclean && rm -rf /var/lib/apt/lists/* -###> recipes ### -###> doctrine/doctrine-bundle ### -RUN install-php-extensions pdo_pgsql -###< doctrine/doctrine-bundle ### -###< recipes ### +# Install FrankenPHP +COPY --from=dunglas/frankenphp:1-php8.3 /usr/local/bin/frankenphp /usr/local/bin/frankenphp -COPY --link frankenphp/conf.d/app.ini $PHP_INI_DIR/conf.d/ -COPY --link --chmod=755 frankenphp/docker-entrypoint.sh /usr/local/bin/docker-entrypoint -COPY --link frankenphp/Caddyfile /etc/caddy/Caddyfile - -ENTRYPOINT ["docker-entrypoint"] - -HEALTHCHECK --start-period=60s CMD curl -f http://localhost:2019/metrics || exit 1 -CMD [ "frankenphp", "run", "--config", "/etc/caddy/Caddyfile" ] - -# Dev FrankenPHP image -FROM frankenphp_base AS frankenphp_dev - -ENV APP_ENV=dev XDEBUG_MODE=off -VOLUME /app/var/ - -RUN mv "$PHP_INI_DIR/php.ini-development" "$PHP_INI_DIR/php.ini" - -RUN set -eux; \ - install-php-extensions \ - xdebug \ - ; - -COPY --link frankenphp/conf.d/app.dev.ini $PHP_INI_DIR/conf.d/ - -CMD [ "frankenphp", "run", "--config", "/etc/caddy/Caddyfile", "--watch" ] - -# Prod FrankenPHP image -FROM frankenphp_base AS frankenphp_prod - -ENV APP_ENV=prod +# And configure it ENV FRANKENPHP_CONFIG="import worker.Caddyfile" -RUN mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini" - -COPY --link frankenphp/conf.d/app.prod.ini $PHP_INI_DIR/conf.d/ -COPY --link frankenphp/worker.Caddyfile /etc/caddy/worker.Caddyfile +# Install composer +ENV COMPOSER_ALLOW_SUPERUSER=1 +COPY --from=composer:latest /usr/bin/composer /usr/bin/composer # prevent the reinstallation of vendors at every changes in the source code COPY --link composer.* symfony.* ./ @@ -84,11 +44,38 @@ RUN set -eux; \ # copy sources COPY --link . ./ -RUN rm -Rf frankenphp/ +# Install composer and yarn dependencies for Part-DB RUN set -eux; \ mkdir -p var/cache var/log; \ composer dump-autoload --classmap-authoritative --no-dev; \ composer dump-env prod; \ composer run-script --no-dev post-install-cmd; \ chmod +x bin/console; sync; + +RUN yarn install --network-timeout 600000 && yarn build && yarn cache clean && rm -rf node_modules/ + +# Use docker env to output logs to stdout +ENV APP_ENV=docker +ENV DATABASE_URL="sqlite:///%kernel.project_dir%/uploads/app.db" + +USER root + +ENTRYPOINT ["docker-entrypoint"] +CMD ["frankenphp", "run", "--config", "/etc/caddy/Caddyfile"] + +# https://httpd.apache.org/docs/2.4/stopping.html#gracefulstop +STOPSIGNAL SIGWINCH + +VOLUME ["/var/www/html/uploads", "/var/www/html/public/media"] + +HEALTHCHECK --start-period=60s CMD curl -f http://localhost:2019/metrics || exit 1 + +# See https://caddyserver.com/docs/conventions#file-locations for details +ENV XDG_CONFIG_HOME /config +ENV XDG_DATA_HOME /data + +EXPOSE 80 +EXPOSE 443 +EXPOSE 443/udp +EXPOSE 2019 \ No newline at end of file diff --git a/compose.override.yaml b/compose.override.yaml deleted file mode 100644 index a1c02e0e..00000000 --- a/compose.override.yaml +++ /dev/null @@ -1,41 +0,0 @@ -# Development environment override -services: - php: - build: - context: . - target: frankenphp_dev - volumes: - - ./:/app - - ./frankenphp/Caddyfile:/etc/caddy/Caddyfile:ro - - ./frankenphp/conf.d/app.dev.ini:/usr/local/etc/php/conf.d/app.dev.ini:ro - # If you develop on Mac or Windows you can remove the vendor/ directory - # from the bind-mount for better performance by enabling the next line: - #- /app/vendor - environment: - MERCURE_EXTRA_DIRECTIVES: demo - # See https://xdebug.org/docs/all_settings#mode - XDEBUG_MODE: "${XDEBUG_MODE:-off}" - extra_hosts: - # Ensure that host.docker.internal is correctly defined on Linux - - host.docker.internal:host-gateway - tty: true - -###> symfony/mercure-bundle ### -###< symfony/mercure-bundle ### - -###> doctrine/doctrine-bundle ### - database: - ports: - - "5432" -###< doctrine/doctrine-bundle ### - -###> symfony/mailer ### - mailer: - image: axllent/mailpit - ports: - - "1025" - - "8025" - environment: - MP_SMTP_AUTH_ACCEPT_ANY: 1 - MP_SMTP_AUTH_ALLOW_INSECURE: 1 -###< symfony/mailer ### diff --git a/compose.prod.yaml b/compose.prod.yaml deleted file mode 100644 index f0db05da..00000000 --- a/compose.prod.yaml +++ /dev/null @@ -1,10 +0,0 @@ -# Production environment override -services: - php: - build: - context: . - target: frankenphp_prod - environment: - APP_SECRET: ${APP_SECRET} - MERCURE_PUBLISHER_JWT_KEY: ${CADDY_MERCURE_JWT_SECRET} - MERCURE_SUBSCRIBER_JWT_KEY: ${CADDY_MERCURE_JWT_SECRET} diff --git a/compose.yaml b/compose.yaml deleted file mode 100644 index aa6ad1e0..00000000 --- a/compose.yaml +++ /dev/null @@ -1,63 +0,0 @@ -services: - php: - image: ${IMAGES_PREFIX:-}app-php - restart: unless-stopped - environment: - SERVER_NAME: ${SERVER_NAME:-localhost}, php:80 - MERCURE_PUBLISHER_JWT_KEY: ${CADDY_MERCURE_JWT_SECRET:-!ChangeThisMercureHubJWTSecretKey!} - MERCURE_SUBSCRIBER_JWT_KEY: ${CADDY_MERCURE_JWT_SECRET:-!ChangeThisMercureHubJWTSecretKey!} - TRUSTED_PROXIES: ${TRUSTED_PROXIES:-127.0.0.0/8,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16} - TRUSTED_HOSTS: ^${SERVER_NAME:-example\.com|localhost}|php$$ - # Run "composer require symfony/orm-pack" to install and configure Doctrine ORM - DATABASE_URL: postgresql://${POSTGRES_USER:-app}:${POSTGRES_PASSWORD:-!ChangeMe!}@database:5432/${POSTGRES_DB:-app}?serverVersion=${POSTGRES_VERSION:-15}&charset=${POSTGRES_CHARSET:-utf8} - # Run "composer require symfony/mercure-bundle" to install and configure the Mercure integration - MERCURE_URL: ${CADDY_MERCURE_URL:-http://php/.well-known/mercure} - MERCURE_PUBLIC_URL: https://${SERVER_NAME:-localhost}/.well-known/mercure - MERCURE_JWT_SECRET: ${CADDY_MERCURE_JWT_SECRET:-!ChangeThisMercureHubJWTSecretKey!} - # The two next lines can be removed after initial installation - SYMFONY_VERSION: ${SYMFONY_VERSION:-} - STABILITY: ${STABILITY:-stable} - volumes: - - caddy_data:/data - - caddy_config:/config - ports: - # HTTP - - target: 80 - published: ${HTTP_PORT:-80} - protocol: tcp - # HTTPS - - target: 443 - published: ${HTTPS_PORT:-443} - protocol: tcp - # HTTP/3 - - target: 443 - published: ${HTTP3_PORT:-443} - protocol: udp - -# Mercure is installed as a Caddy module, prevent the Flex recipe from installing another service -###> symfony/mercure-bundle ### -###< symfony/mercure-bundle ### - -###> doctrine/doctrine-bundle ### - database: - image: postgres:${POSTGRES_VERSION:-16}-alpine - environment: - POSTGRES_DB: ${POSTGRES_DB:-app} - # You should definitely change the password in production - POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-!ChangeMe!} - POSTGRES_USER: ${POSTGRES_USER:-app} - volumes: - - database_data:/var/lib/postgresql/data:rw - # You may use a bind-mounted host directory instead, so that it is harder to accidentally remove the volume and lose all your data! - # - ./docker/db/data:/var/lib/postgresql/data:rw -###< doctrine/doctrine-bundle ### - -volumes: - caddy_data: - caddy_config: -###> symfony/mercure-bundle ### -###< symfony/mercure-bundle ### - -###> doctrine/doctrine-bundle ### - database_data: -###< doctrine/doctrine-bundle ###