diff --git a/Dockerfile b/Dockerfile index f30ddd6..432b8af 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,99 +1,56 @@ -FROM cloudron/base:4.2.0@sha256:46da2fffb36353ef714f97ae8e962bd2c212ca091108d768ba473078319a47f4 as build +FROM cloudron/base:4.2.0@sha256:46da2fffb36353ef714f97ae8e962bd2c212ca091108d768ba473078319a47f4 as base -RUN mkdir -p /app/code /app/pkg -WORKDIR /app/code +FROM base AS build -RUN apt-get update && \ - apt install -y imagemagick ffmpeg libpq-dev libxml2-dev libxslt1-dev file git-core \ - g++ libprotobuf-dev protobuf-compiler pkg-config nodejs gcc autoconf \ - bison build-essential libssl-dev libyaml-dev libreadline6-dev \ - zlib1g-dev libncurses5-dev libffi-dev libgdbm-dev \ - nginx redis-server redis-tools postgresql postgresql-contrib \ - libidn11-dev libicu-dev libjemalloc-dev libjemalloc2 patchelf +# common deps to build libvips and ffmpeg +RUN apt update && \ + apt-get install -y --no-install-recommends autoconf automake libgdbm-dev libglib2.0-dev libgmp-dev libicu-dev libidn-dev libpq-dev libssl-dev libtool \ + meson nasm pkg-config shared-mime-info xz-utils libcgif-dev libexif-dev libexpat1-dev libgirepository1.0-dev libheif-dev libimagequant-dev libjpeg-turbo8-dev \ + liblcms2-dev liborc-dev libpng-dev libtiff-dev libwebp-dev libdav1d-dev liblzma-dev libmp3lame-dev libopus-dev libsnappy-dev libvorbis-dev libvpx-dev libx264-dev libx265-dev -# Install build tools and bundler dependencies from APT -RUN apt-get install -y --no-install-recommends \ - autoconf \ - automake \ - libgdbm-dev \ - libglib2.0-dev \ - libgmp-dev \ - libicu-dev \ - libidn-dev \ - libpq-dev \ - libssl-dev \ - libtool \ - meson \ - nasm \ - pkg-config \ - shared-mime-info \ - xz-utils \ - # libvips components - libcgif-dev \ - libexif-dev \ - libexpat1-dev \ - libgirepository1.0-dev \ - libheif-dev \ - libimagequant-dev \ - libjpeg-turbo8-dev \ - liblcms2-dev \ - liborc-dev \ - libpng-dev \ - libtiff-dev \ - libwebp-dev \ - # ffmpeg components - libdav1d-dev \ - liblzma-dev \ - libmp3lame-dev \ - libopus-dev \ - libsnappy-dev \ - libvorbis-dev \ - libvpx-dev \ - libx264-dev \ - libx265-dev +###### libvips compilation +FROM build AS libvips -# Apt update install non-dev versions of necessary components -RUN apt-get install -y --no-install-recommends \ - libexpat1 \ - libglib2.0-0 \ - libicu70 \ - libidn12 \ - libpq5 \ - libreadline8 \ - libssl3 \ - libyaml-0-2 \ - # libvips components - libcgif0 \ - libexif12 \ - libheif1 \ - libimagequant0 \ - libjpeg62 \ - libjpeg-turbo8 \ - liblcms2-2 \ - liborc-0.4-0 \ - libpng16-16 \ - libtiff5 \ - libwebp7 \ - libwebpdemux2 \ - libwebpmux3 \ - # ffmpeg components - libdav1d5 \ - libmp3lame0 \ - libopencore-amrnb0 \ - libopencore-amrwb0 \ - libopus0 \ - libsnappy1v5 \ - libtheora0 \ - libvorbis0a \ - libvorbisenc2 \ - libvorbisfile3 \ - libvpx7 \ - libx264-163 \ - libx265-199 +ARG VIPS_VERSION=8.15.3 +ARG VIPS_URL=https://github.com/libvips/libvips/releases/download -RUN rm -rf /var/cache/apt /var/lib/apt/lists +RUN mkdir -p /usr/local/libvips/src +RUN curl -L ${VIPS_URL}/v${VIPS_VERSION}/vips-${VIPS_VERSION}.tar.xz | tar xJ --strip-components 1 -C /usr/local/libvips/src/ -# install rbenv since we need ruby 3.3.5 +WORKDIR /usr/local/libvips/src + +RUN meson setup build --prefix /usr/local/libvips --libdir=lib -Ddeprecated=false -Dintrospection=disabled -Dmodules=disabled -Dexamples=false +RUN cd build && ninja && ninja install + +###### ffmpeg compilation +FROM build AS ffmpeg + +ARG FFMPEG_VERSION=7.1 +ARG FFMPEG_URL=https://ffmpeg.org/releases + +RUN mkdir -p /usr/local/ffmpeg/src +RUN curl -L ${FFMPEG_URL}/ffmpeg-${FFMPEG_VERSION}.tar.xz | tar xJ --strip-components 1 -C /usr/local/ffmpeg/src/ + +WORKDIR /usr/local/ffmpeg/src + +RUN ./configure --prefix=/usr/local/ffmpeg --toolchain=hardened --disable-debug \ + --disable-devices --disable-doc --disable-ffplay --disable-network --disable-static \ + --enable-ffmpeg --enable-ffprobe --enable-gpl --enable-libdav1d --enable-libmp3lame \ + --enable-libopus --enable-libsnappy --enable-libvorbis --enable-libvpx \ + --enable-libwebp --enable-libx264 --enable-libx265 --enable-shared --enable-version3 && \ + make -j$(nproc) && \ + make install + +##### Mastodon +FROM base AS mastodon + +RUN apt update && \ + apt-get install -y --no-install-recommends libexpat1 libglib2.0-0 libicu70 libidn12 libidn-dev libpq5 libreadline8 libssl3 libyaml-0-2 libcgif0 libexif12 libheif1 libimagequant0 libjpeg62 \ + libjpeg-turbo8 liblcms2-2 liborc-0.4-0 libpng16-16 libtiff5 libwebp7 libwebpdemux2 libwebpmux3 libdav1d5 libmp3lame0 libopencore-amrnb0 libopencore-amrwb0 libopus0 libsnappy1v5 libtheora0 \ + libvorbis0a libvorbisenc2 libvorbisfile3 libvpx7 libx264-163 libx265-199 && \ + rm -rf /var/cache/apt /var/lib/apt/lists + +# rbenv since we need specific ruby RUN mkdir -p /usr/local/rbenv && curl -LSs "https://github.com/rbenv/rbenv/archive/refs/tags/v1.3.0.tar.gz" | tar -xz -C /usr/local/rbenv --strip-components 1 -f - ENV PATH /usr/local/rbenv/bin:$PATH ENV RBENV_ROOT /home/cloudron/rbenv @@ -110,66 +67,8 @@ RUN mkdir -p /usr/local/node-${NODE_VERSION} && \ curl -L https://nodejs.org/dist/v${NODE_VERSION}/node-v${NODE_VERSION}-linux-x64.tar.gz | tar zxf - --strip-components 1 -C /usr/local/node-${NODE_VERSION} ENV PATH /usr/local/node-${NODE_VERSION}/bin:$PATH -# Create temporary libvips specific build layer from build layer -FROM build AS libvips - -# libvips version -ARG VIPS_VERSION=8.15.3 -# libvips download URL -ARG VIPS_URL=https://github.com/libvips/libvips/releases/download - -RUN mkdir -p /usr/local/libvips/src -# Download and extract libvips source code -RUN curl -L ${VIPS_URL}/v${VIPS_VERSION}/vips-${VIPS_VERSION}.tar.xz | tar xJ --strip-components 1 -C /usr/local/libvips/src/ - -WORKDIR /usr/local/libvips/src - -# Configure and compile libvips -RUN meson setup build --prefix /usr/local/libvips --libdir=lib -Ddeprecated=false -Dintrospection=disabled -Dmodules=disabled -Dexamples=false -RUN cd build && ninja && ninja install - -# Create temporary ffmpeg specific build layer from build layer -FROM build AS ffmpeg - -# ffmpeg version -ARG FFMPEG_VERSION=7.1 -# ffmpeg download URL -ARG FFMPEG_URL=https://ffmpeg.org/releases - -RUN mkdir -p /usr/local/ffmpeg/src -# Download and extract ffmpeg source code -RUN curl -L ${FFMPEG_URL}/ffmpeg-${FFMPEG_VERSION}.tar.xz | tar xJ --strip-components 1 -C /usr/local/ffmpeg/src/ - -WORKDIR /usr/local/ffmpeg/src - -# Configure and compile ffmpeg -RUN ./configure \ - --prefix=/usr/local/ffmpeg \ - --toolchain=hardened \ - --disable-debug \ - --disable-devices \ - --disable-doc \ - --disable-ffplay \ - --disable-network \ - --disable-static \ - --enable-ffmpeg \ - --enable-ffprobe \ - --enable-gpl \ - --enable-libdav1d \ - --enable-libmp3lame \ - --enable-libopus \ - --enable-libsnappy \ - --enable-libvorbis \ - --enable-libvpx \ - --enable-libwebp \ - --enable-libx264 \ - --enable-libx265 \ - --enable-shared \ - --enable-version3 && \ - make -j$(nproc) && \ - make install - -FROM build +RUN mkdir -p /app/code /app/pkg +WORKDIR /app/code # renovate: datasource=github-releases depName=tootsuite/mastodon versioning=semver extractVersion=^v(?.+)$ ARG MASTODON_VERSION=4.3.0 @@ -179,24 +78,17 @@ ENV NODE_ENV production ARG RAILS_SERVE_STATIC_FILES="true" ARG RUBY_YJIT_ENABLE="1" -ENV \ -# Optimize jemalloc 5.x performance - MALLOC_CONF="narenas:2,background_thread:true,thp:never,dirty_decay_ms:1000,muzzy_decay_ms:0" \ -# Enable libvips, should not be changed - MASTODON_USE_LIBVIPS=true \ -# Sidekiq will touch tmp/sidekiq_process_has_started_and_will_begin_processing_jobs to indicate it is ready. This can be used for a readiness check in Kubernetes - MASTODON_SIDEKIQ_READY_FILENAME=sidekiq_process_has_started_and_will_begin_processing_jobs +ENV MALLOC_CONF "narenas:2,background_thread:true,thp:never,dirty_decay_ms:1000,muzzy_decay_ms:0" +ENV MASTODON_USE_LIBVIPS true -# Copy libvips components to layer COPY --from=libvips /usr/local/libvips/bin /usr/local/bin COPY --from=libvips /usr/local/libvips/lib /usr/local/lib -# Copy ffpmeg components to layer COPY --from=ffmpeg /usr/local/ffmpeg/bin /usr/local/bin COPY --from=ffmpeg /usr/local/ffmpeg/lib /usr/local/lib +# Smoketest media processors RUN ldconfig && \ - # Smoketest media processors vips -v && \ ffmpeg -version && \ ffprobe -version @@ -215,11 +107,9 @@ RUN corepack enable && \ RUN yarn workspaces focus --production @mastodon/mastodon RUN yarn install -# Use Ruby on Rails to create Mastodon assets RUN ldconfig && \ SECRET_KEY_BASE_DUMMY=1 bundle exec rails assets:precompile && \ - # Cleanup temporary files - rm -rf /app/code/tmp; + rm -rf /app/code/tmp # Precompile bootsnap code for faster Rails startup RUN bundle exec bootsnap precompile --gemfile app/ lib/