Skip to content

Commit 0aa8ca6

Browse files
committed
Pull out media server and handling into separate container
1 parent 0d6bc6c commit 0aa8ca6

37 files changed

Lines changed: 1697 additions & 95 deletions

.dockerignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,4 @@ _build
44
deps
55
.elixir_ls
66
priv
7+
native/philomena/target

config/runtime.exs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ config :philomena,
2727
image_url_root: System.fetch_env!("IMAGE_URL_ROOT"),
2828
badge_url_root: System.fetch_env!("BADGE_URL_ROOT"),
2929
mailer_address: System.fetch_env!("MAILER_ADDRESS"),
30+
mediaproc_addr: System.fetch_env!("MEDIAPROC_ADDR"),
3031
tag_file_root: System.fetch_env!("TAG_FILE_ROOT"),
3132
site_domains: System.fetch_env!("SITE_DOMAINS"),
3233
tag_url_root: System.fetch_env!("TAG_URL_ROOT"),

docker-compose.yml

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ services:
3030
- IMAGE_URL_ROOT=/img
3131
- BADGE_URL_ROOT=/badge-img
3232
- TAG_URL_ROOT=/tag-img
33+
- MEDIAPROC_ADDR=mediaproc:1500
3334
- OPENSEARCH_URL=http://opensearch:9200
3435
- REDIS_HOST=valkey
3536
- DATABASE_URL=ecto://postgres:postgres@postgres/philomena_dev
@@ -52,6 +53,7 @@ services:
5253
- app_deps_data:/srv/philomena/deps
5354
- app_native_data:/srv/philomena/priv/native
5455
depends_on:
56+
- mediaproc
5557
- postgres
5658
- opensearch
5759
- valkey
@@ -89,6 +91,18 @@ services:
8991
- .:/srv/philomena
9092
attach: false
9193

94+
mediaproc:
95+
build:
96+
context: .
97+
dockerfile: ./docker/mediaproc/Dockerfile
98+
attach: false
99+
deploy:
100+
resources:
101+
limits:
102+
cpus: '4'
103+
memory: 8gb
104+
pids: 8192
105+
92106
web:
93107
build:
94108
context: .

docker/app/Dockerfile

Lines changed: 2 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,12 @@
11
FROM elixir:1.18.1-alpine
22

3-
ADD https://api.github.com/repos/philomena-dev/FFmpeg/git/refs/heads/release/6.1 /tmp/ffmpeg_version.json
4-
RUN (echo "https://github.com/philomena-dev/prebuilt-ffmpeg/raw/master"; cat /etc/apk/repositories) > /tmp/repositories \
5-
&& cp /tmp/repositories /etc/apk/repositories \
6-
&& apk update --allow-untrusted \
7-
&& apk add inotify-tools build-base git ffmpeg ffmpeg-dev npm nodejs file-dev libjpeg-turbo-dev libpng-dev gifsicle optipng libjpeg-turbo-utils librsvg rsvg-convert imagemagick postgresql16-client wget rust cargo --allow-untrusted \
3+
RUN apk add inotify-tools build-base git npm nodejs postgresql16-client wget rust cargo \
84
&& mix local.hex --force \
95
&& mix local.rebar --force
106

11-
ADD https://api.github.com/repos/philomena-dev/cli_intensities/git/refs/heads/master /tmp/cli_intensities_version.json
12-
RUN git clone --depth 1 https://github.com/philomena-dev/cli_intensities /tmp/cli_intensities \
13-
&& cd /tmp/cli_intensities \
14-
&& make -j$(nproc) install
15-
16-
ADD https://api.github.com/repos/philomena-dev/mediatools/git/refs/heads/master /tmp/mediatools_version.json
17-
RUN git clone --depth 1 https://github.com/philomena-dev/mediatools /tmp/mediatools \
18-
&& ln -s /usr/lib/librsvg-2.so.2 /usr/lib/librsvg-2.so \
19-
&& cd /tmp/mediatools \
20-
&& make -j$(nproc) install
21-
227
COPY docker/app/run-development /usr/local/bin/run-development
238
COPY docker/app/run-test /usr/local/bin/run-test
24-
COPY docker/app/safe-rsvg-convert /usr/local/bin/safe-rsvg-convert
259
COPY docker/app/purge-cache /usr/local/bin/purge-cache
2610
ENV PATH=$PATH:/root/.cargo/bin
2711
EXPOSE 5173
28-
CMD run-development
12+
CMD ["/usr/local/bin/run-development"]

docker/mediaproc/Dockerfile

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
FROM rust:1.83-slim
2+
3+
RUN apt update \
4+
&& apt install -y build-essential git libmagic-dev libturbojpeg0-dev libpng-dev \
5+
gifsicle optipng libjpeg-turbo-progs librsvg2-bin librsvg2-dev file imagemagick \
6+
libx264-dev libx265-dev libvpx-dev libdav1d-dev libaom-dev libopus-dev \
7+
libmp3lame-dev libvorbis-dev libwebp-dev libjxl-dev yasm wget
8+
9+
ADD https://api.github.com/repos/philomena-dev/FFmpeg/git/refs/heads/release/7.1 /tmp/ffmpeg_version.json
10+
ADD https://api.github.com/repos/philomena-dev/cli_intensities/git/refs/heads/master /tmp/cli_intensities_version.json
11+
ADD https://api.github.com/repos/philomena-dev/mediatools/git/refs/heads/master /tmp/mediatools_version.json
12+
13+
RUN wget -qO /tmp/FFmpeg.tar.gz https://github.com/philomena-dev/FFmpeg/archive/refs/heads/release/7.1.tar.gz \
14+
&& wget -qO /tmp/cli_intensities.tar.gz https://github.com/philomena-dev/cli_intensities/archive/refs/heads/master.tar.gz \
15+
&& wget -qO /tmp/mediatools.tar.gz https://github.com/philomena-dev/mediatools/archive/refs/heads/master.tar.gz
16+
17+
RUN cd /tmp \
18+
&& tar -xf FFmpeg.tar.gz \
19+
&& tar -xf cli_intensities.tar.gz \
20+
&& tar -xf mediatools.tar.gz \
21+
&& cd /tmp/FFmpeg-release-7.1 \
22+
&& ./configure \
23+
--prefix=/usr \
24+
--disable-everything \
25+
--disable-stripping \
26+
--disable-static \
27+
--disable-ffplay \
28+
--disable-doc \
29+
--disable-htmlpages \
30+
--disable-manpages \
31+
--disable-podpages \
32+
--disable-txtpages \
33+
--disable-protocols \
34+
--enable-shared \
35+
--enable-pic \
36+
--enable-pthreads \
37+
--enable-gpl \
38+
--enable-avfilter \
39+
--enable-bsf=extract_extradata \
40+
--enable-decoder=aac,apng,av1,gif,h264,hevc,jpeg2000,jpegxl,libaom-av1,libdav1d,libvorbis,libvpx_vp8,libvpx_vp9,mp3,mjpeg,opus,png,vorbis,vp8,vp9,webvtt \
41+
--enable-demuxer=apng,gif,image2,image_gif_pipe,image_jpeg_pipe,image_png_pipe,image_webp_pipe,matroska,mjpeg,mjpeg_2000,mov,webm \
42+
--enable-encoder=aac,apng,gif,jpegxl,libmp3lame,libaom-av1,libvorbis,libopus,libvpx_vp8,libvpx_vp9,libx265,libx264,opus,mjpeg,png,vorbis,webvtt \
43+
--enable-filter=concat,palettegen,paletteuse,scale,setpts,setsar,settb,split,trim \
44+
--enable-libaom \
45+
--enable-libjxl \
46+
--enable-libdav1d \
47+
--enable-libopus \
48+
--enable-libmp3lame \
49+
--enable-libvpx \
50+
--enable-libvorbis \
51+
--enable-libx264 \
52+
--enable-libx265 \
53+
--enable-libwebp \
54+
--enable-muxer=apng,image2,gif,matroska,mp4,webp,webm \
55+
--enable-parser=aac,gif,h264,hevc,jpeg2000,jpegxl,mjpeg,opus,png,vorbis,vp8,vp9,webp \
56+
--enable-protocol=concat,data,file,subfile \
57+
&& make -j$(nproc) install \
58+
&& cd /tmp/cli_intensities-master \
59+
&& make -j$(nproc) install \
60+
&& cd /tmp/mediatools-master \
61+
&& make -j$(nproc) install
62+
63+
COPY native/philomena /tmp/philomena
64+
COPY docker/mediaproc/safe-rsvg-convert /usr/bin/safe-rsvg-convert
65+
66+
RUN cd /tmp/philomena \
67+
&& cargo build --release -p mediaproc_server \
68+
&& cp target/release/mediaproc_server /usr/bin/mediaproc_server
69+
70+
# Set up unprivileged user account
71+
RUN useradd -ms /bin/bash mediaproc
72+
USER mediaproc
73+
WORKDIR /home/mediaproc
74+
ENV RUST_LOG=trace
75+
CMD ["/usr/bin/mediaproc_server", "0.0.0.0:1500"]

lib/philomena/native.ex

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@ defmodule Philomena.Native do
1212
@spec camo_image_url(String.t()) :: String.t()
1313
def camo_image_url(_uri), do: :erlang.nif_error(:nif_not_loaded)
1414

15+
@spec async_process_command(String.t(), String.t(), [String.t()]) :: :ok
16+
def async_process_command(_server_addr, _program, _arguments),
17+
do: :erlang.nif_error(:nif_not_loaded)
18+
1519
@spec zip_open_writer(Path.t()) :: {:ok, reference()} | {:error, atom()}
1620
def zip_open_writer(_path), do: :erlang.nif_error(:nif_not_loaded)
1721

lib/philomena_media/analyzers/gif.ex

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ defmodule PhilomenaMedia.Analyzers.Gif do
33

44
alias PhilomenaMedia.Analyzers.Analyzer
55
alias PhilomenaMedia.Analyzers.Result
6+
alias PhilomenaMedia.Remote
67

78
@behaviour Analyzer
89

@@ -20,7 +21,7 @@ defmodule PhilomenaMedia.Analyzers.Gif do
2021
end
2122

2223
defp stats(file) do
23-
case System.cmd("mediastat", [file]) do
24+
case Remote.cmd("mediastat", [file]) do
2425
{output, 0} ->
2526
[_size, frames, width, height, num, den] =
2627
output

lib/philomena_media/analyzers/jpeg.ex

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ defmodule PhilomenaMedia.Analyzers.Jpeg do
33

44
alias PhilomenaMedia.Analyzers.Analyzer
55
alias PhilomenaMedia.Analyzers.Result
6+
alias PhilomenaMedia.Remote
67

78
@behaviour Analyzer
89

@@ -20,7 +21,7 @@ defmodule PhilomenaMedia.Analyzers.Jpeg do
2021
end
2122

2223
defp stats(file) do
23-
case System.cmd("mediastat", [file]) do
24+
case Remote.cmd("mediastat", [file]) do
2425
{output, 0} ->
2526
[_size, _frames, width, height, num, den] =
2627
output

lib/philomena_media/analyzers/png.ex

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ defmodule PhilomenaMedia.Analyzers.Png do
33

44
alias PhilomenaMedia.Analyzers.Analyzer
55
alias PhilomenaMedia.Analyzers.Result
6+
alias PhilomenaMedia.Remote
67

78
@behaviour Analyzer
89

@@ -20,7 +21,7 @@ defmodule PhilomenaMedia.Analyzers.Png do
2021
end
2122

2223
defp stats(file) do
23-
case System.cmd("mediastat", [file]) do
24+
case Remote.cmd("mediastat", [file]) do
2425
{output, 0} ->
2526
[_size, frames, width, height, num, den] =
2627
output

0 commit comments

Comments
 (0)