diff --git a/.dockerignore b/.dockerignore index c1e6609d6..ce78184b2 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,14 +1,18 @@ -.github -.phpunit.cache -.idea -output -assets/node_modules -docker/volumes -vendor -var - -public/build -public/uploads -!public/uploads/.gitkeep -public/bundles -public/manifest.json +* +!.yarnrc +!*.json +!*.lock +!*.php +!api +!.env +!assets +!bin +!config +!docker +!migrations +!phpunit.xml +!public +!src +!templates +!translations +assets/node_modules/ diff --git a/Dockerfile b/Dockerfile index 808b97597..485a107f1 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:jammy +FROM ubuntu:jammy AS koillection-base ARG DEBIAN_FRONTEND=noninteractive @@ -12,77 +12,125 @@ ENV COMPOSER_ALLOW_SUPERUSER=1 COPY ./ /var/www/koillection # Install some basics dependencies -RUN apt-get update && \ - apt-get install -y curl wget lsb-release software-properties-common gnupg2 && \ -# Add User and Group - addgroup --gid "$PGID" "$USER" && \ - adduser --gecos '' --no-create-home --disabled-password --uid "$PUID" --gid "$PGID" "$USER" && \ -# PHP - add-apt-repository ppa:ondrej/php && \ -# Nodejs - curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg && \ - NODE_MAJOR=21 && \ - echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" | tee /etc/apt/sources.list.d/nodesource.list && \ -# Install packages - apt-get update && \ - apt-get install -y \ - libnss3 \ - nss-plugin-pem \ +RUN set -eux ; \ + # Add User and Group + addgroup --gid "$PGID" "$USER" ; \ + adduser --gecos '' --no-create-home --disabled-password --uid "$PUID" --gid "$PGID" "$USER" ; \ + # Prepare apt for php installation + apt-get update -qq ; \ + apt-get install -qqy \ + --no-install-recommends \ + gnupg2 \ + software-properties-common \ + ; \ + # PHP + add-apt-repository ppa:ondrej/php ; \ + # Install packages + apt-get update -qq ; \ + apt-get install -qqy \ + --no-install-recommends \ ca-certificates \ - apt-transport-https \ + curl \ git \ - unzip \ + libnss3 \ nginx-light \ + nss-plugin-pem \ openssl \ php8.4 \ php8.4-apcu \ php8.4-curl \ - php8.4-pgsql \ - php8.4-mysql \ - php8.4-mbstring \ + php8.4-fpm \ php8.4-gd \ + php8.4-intl \ + php8.4-mbstring \ + php8.4-mysql \ + php8.4-pgsql \ php8.4-xml \ php8.4-zip \ - php8.4-fpm \ - php8.4-intl \ - nodejs && \ -#Install composer dependencies - curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer && \ - cd /var/www/koillection && \ - COMPOSER_MEMORY_LIMIT=-1 composer install --classmap-authoritative && \ - COMPOSER_MEMORY_LIMIT=-1 composer clearcache && \ -# Dump translation files for javascript - cd /var/www/koillection/ && \ - php bin/console app:translations:dump && \ -# Install javascript dependencies and build assets \ - corepack enable && \ - cd /var/www/koillection/assets && \ - yarn --version && \ - yarn install && \ - yarn build && \ -# Clean up - yarn cache clean --all && \ - rm -rf /var/www/koillection/assets/.yarn/cache && \ - rm -rf /var/www/koillection/assets/.yarn/install-state.gz && \ - rm -rf /var/www/koillection/assets/node_modules && \ - apt-get purge -y wget lsb-release software-properties-common git nodejs apt-transport-https ca-certificates gnupg2 unzip && \ - apt-get autoremove -y && \ - apt-get clean && \ - rm -rf /var/lib/apt/lists/* && \ - rm -rf /usr/local/bin/composer && \ -# Set permissions \ - sed -i "s/user = www-data/user = $USER/g" /etc/php/8.4/fpm/pool.d/www.conf && \ - sed -i "s/group = www-data/group = $USER/g" /etc/php/8.4/fpm/pool.d/www.conf && \ - chown -R "$USER":"$USER" /var/www/koillection && \ - chmod +x /var/www/koillection/docker/entrypoint.sh && \ -# Add nginx and PHP config files - cp /var/www/koillection/docker/default.conf /etc/nginx/nginx.conf && \ - cp /var/www/koillection/docker/php.ini /etc/php/8.4/fpm/conf.d/php.ini && \ + unzip \ + ; \ + #Install composer dependencies + curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer ; \ + cd /var/www/koillection ; \ + COMPOSER_MEMORY_LIMIT=-1 composer install --classmap-authoritative ; \ + COMPOSER_MEMORY_LIMIT=-1 composer clearcache ; \ + # Dump translation files for javascript + cd /var/www/koillection/ ; \ + php bin/console app:translations:dump ; \ + # Clean up + apt-get purge -y \ + ca-certificates \ + git \ + gnupg2 \ + software-properties-common \ + unzip \ + ; \ + apt-get autoremove -y ; \ + apt-get clean ; \ + rm -rf /var/lib/apt/lists/* ; \ + rm -rf /usr/local/bin/composer ; \ + # Set permissions \ + sed -i "s/user = www-data/user = $USER/g" /etc/php/8.4/fpm/pool.d/www.conf ; \ + sed -i "s/group = www-data/group = $USER/g" /etc/php/8.4/fpm/pool.d/www.conf ; \ + chown -R "$USER":"$USER" /var/www/koillection ; \ + chmod +x /var/www/koillection/docker/entrypoint.sh ; \ + # Add nginx and PHP config files + cp /var/www/koillection/docker/default.conf /etc/nginx/nginx.conf ; \ + cp /var/www/koillection/docker/php.ini /etc/php/8.4/fpm/conf.d/php.ini ; \ mkdir /run/php -# Install curl-impersonate -ADD https://github.com/lwthiker/curl-impersonate/releases/download/v0.6.1/libcurl-impersonate-v0.6.1.x86_64-linux-gnu.tar.gz /opt/ -RUN cd /opt && tar xvzf libcurl-impersonate-v0.6.1.x86_64-linux-gnu.tar.gz && rm libcurl-impersonate-v0.6.1.x86_64-linux-gnu.tar.gz +FROM node:21-bookworm AS build-node + +WORKDIR /app + +COPY ./assets/ ./assets + +COPY --from=koillection-base /var/www/koillection/assets/js/translations /app/assets/js/translations + +WORKDIR /app/assets + +RUN set -eux ; \ + mkdir -p /app/public/build/ ; \ + corepack enable ; \ + yarn --version ; \ + yarn install ; \ + yarn build ; + +FROM curlimages/curl:8.17.0 AS download-env + +# renovate: datasource=github-releases depName=lwthiker/curl-impersonate packageName=lwthiker/curl-impersonate +ENV CURL_IMPERSONATE_VERSION="0.6.1" + +WORKDIR /opt + +USER root + +RUN set -eux ; \ + # Determine architecture + ARCHITECTURE="$(uname -m)" ; \ + case $ARCHITECTURE in \ + x86_64) ARCHITECTURE="x86_64" ;; \ + aarch64 | armv8* | arm64) ARCHITECTURE="aarch64" ;; \ + *) \ + echo "(!) Architecture $ARCHITECTURE unsupported" \ + exit 1 \ + ;; \ + esac ;\ + FILE_NAME="libcurl-impersonate-v${CURL_IMPERSONATE_VERSION}.${ARCHITECTURE}-linux-gnu.tar.gz" ; \ + curl \ + --fail \ + --location \ + --output /tmp/${FILE_NAME} \ + --show-error \ + --silent \ + "https://github.com/lwthiker/curl-impersonate/releases/download/v${CURL_IMPERSONATE_VERSION}/${FILE_NAME}" \ + ; \ + tar xvzf /tmp/${FILE_NAME} -C /opt/ + +FROM koillection-base AS koillection-final + +COPY --from=build-node /app/public/build/ /var/www/koillection/public/build/ +COPY --from=download-env /opt/libcurl-impersonate* /opt/ EXPOSE 80