2024-10-16 07:41:14 +00:00
FROM cloudron/base:4.2.0@sha256:46da2fffb36353ef714f97ae8e962bd2c212ca091108d768ba473078319a47f4 as build
2020-01-06 19:21:25 +00:00
RUN mkdir -p /app/code /app/pkg
2018-10-30 15:46:13 +00:00
WORKDIR /app/code
2020-05-15 17:52:43 +00:00
RUN apt-get update && \
2020-12-01 17:59:25 +00:00
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 \
2024-10-16 07:41:14 +00:00
libidn11-dev libicu-dev libjemalloc-dev libjemalloc2 patchelf
# 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
2018-10-30 15:46:13 +00:00
2024-10-16 07:41:14 +00:00
# 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
RUN rm -rf /var/cache/apt /var/lib/apt/lists
# install rbenv since we need ruby 3.3.5
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 -
2022-11-14 21:31:10 +00:00
ENV PATH /usr/local/rbenv/bin:$PATH
2023-10-10 14:30:15 +00:00
ENV RBENV_ROOT /home/cloudron/rbenv
2024-10-16 07:41:14 +00:00
RUN mkdir -p " $( rbenv root) " /plugins/ruby-build && curl -LSs "https://github.com/rbenv/ruby-build/archive/refs/tags/v20241007.tar.gz" | tar -xz -C " $( rbenv root) " /plugins/ruby-build --strip-components 1 -f -
2022-11-14 21:31:10 +00:00
# install specific ruby version (https://github.com/mastodon/mastodon/blob/main/Dockerfile)
2024-10-16 07:41:14 +00:00
ARG RUBY_VERSION = 3 .3.5
2022-11-14 21:31:10 +00:00
RUN rbenv install ${ RUBY_VERSION }
2023-10-10 14:30:15 +00:00
ENV PATH ${ RBENV_ROOT } /versions/${ RUBY_VERSION } /bin:$PATH
2020-02-09 15:43:01 +00:00
RUN gem install --no-document bundler
2018-10-30 15:46:13 +00:00
2024-10-09 13:41:44 +00:00
ARG NODE_VERSION = 20 .18.0
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
2024-10-16 07:41:14 +00:00
# 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
2024-10-16 14:52:48 +00:00
# renovate: datasource=github-releases depName=tootsuite/mastodon versioning=semver extractVersion=^v(?<version>.+)$
ARG MASTODON_VERSION = 4 .3.0
2019-07-17 21:14:32 +00:00
ENV RAILS_ENV production
ENV NODE_ENV production
2024-10-16 07:41:14 +00:00
ARG RAILS_SERVE_STATIC_FILES = "true"
ARG RUBY_YJIT_ENABLE = "1"
2021-05-17 08:38:18 +00:00
2024-10-16 07:41:14 +00:00
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
2024-10-09 14:37:51 +00:00
2024-10-16 07:41:14 +00:00
# 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
2021-05-17 08:38:18 +00:00
2024-10-16 07:41:14 +00:00
RUN ldconfig && \
# Smoketest media processors
vips -v && \
ffmpeg -version && \
ffprobe -version
2024-10-08 13:38:40 +00:00
RUN curl -L https://github.com/tootsuite/mastodon/archive/v${ MASTODON_VERSION } .tar.gz | tar -xz --strip-components 1 -f - && \
2022-01-20 01:08:01 +00:00
bundle config --local set deployment 'true' && \
bundle config --local set without 'development test' && \
bundle config --local set silence_root_warning true && \
bundle install && \
2023-10-10 14:30:15 +00:00
bundle clean --force && \
2024-10-09 14:37:51 +00:00
rm -rf ~/.bundle /usr/local/bundle/cache
2024-10-16 07:41:14 +00:00
RUN corepack enable && \
corepack prepare --activate
2024-10-16 14:52:48 +00:00
RUN yarn workspaces focus --production @mastodon/mastodon
2024-10-09 14:37:51 +00:00
RUN yarn install
2018-10-30 15:46:13 +00:00
2024-10-16 07:41:14 +00:00
# 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;
# Precompile bootsnap code for faster Rails startup
RUN bundle exec bootsnap precompile --gemfile app/ lib/
2020-12-21 18:12:52 +00:00
# https://github.com/rubygems/bundler/issues/5245 means that bundle exec writes to Gemfile.lock
RUN ln -fs /run/mastodon/bullet.log /app/code/log/bullet.log && \
rm -rf /app/code/tmp && ln -fs /tmp/mastodon /app/code/tmp && \
mv /app/code/Gemfile.lock /app/code/Gemfile.lock.original && ln -s /run/mastodon/Gemfile.lock /app/code/Gemfile.lock
2019-07-17 21:14:32 +00:00
# add nginx config
2020-12-21 18:12:52 +00:00
RUN rm /etc/nginx/sites-enabled/* && \
ln -sf /dev/stdout /var/log/nginx/access.log && \
ln -sf /dev/stderr /var/log/nginx/error.log
2022-01-18 18:30:53 +00:00
COPY nginx_readonlyrootfs.conf /etc/nginx/conf.d/readonlyrootfs.conf
2019-07-17 21:14:32 +00:00
COPY nginx/mastodon.conf /etc/nginx/sites-available/mastodon
RUN ln -s /etc/nginx/sites-available/mastodon /etc/nginx/sites-enabled/mastodon
# add supervisor configs
2022-01-18 18:30:53 +00:00
COPY supervisor/* /etc/supervisor/conf.d/
2019-07-17 21:14:32 +00:00
RUN ln -sf /run/mastodon/supervisord.log /var/log/supervisor/supervisord.log
RUN ln -fs /app/data/env.production /app/code/.env.production
2018-10-30 15:46:13 +00:00
RUN ln -fs /app/data/system /app/code/public/system
2019-07-17 21:14:32 +00:00
2024-02-23 15:45:18 +00:00
COPY start.sh cleanup.sh config.sh env.template cache-env.sh.template /app/pkg/
2018-10-31 12:53:10 +00:00
2020-01-06 19:21:25 +00:00
CMD [ "/app/pkg/start.sh" ]