- Add CloudronManifest.json with app metadata - Create Dockerfile with multi-stage build - Install Google Chrome (Chrome for Testing) since Ubuntu Noble doesn't have chromium package - Install required Chrome dependencies (libatk, libgtk, etc.) - Add start.sh script with Xvfb setup for headless Chrome - Copy entire Chrome installation directory for proper resource access - Add .gitignore and update README with installation instructions
122 lines
5.0 KiB
Docker
122 lines
5.0 KiB
Docker
# Build stage - create dummy packages and clone FlareSolverr
|
|
FROM --platform=amd64 cloudron/base:5.0.0@sha256:6bec2b5246567ef8b5b13ca0af756e2e596941e440d76b46635211cd84383922 AS build_image
|
|
|
|
# Build dummy packages to skip installing them and their dependencies
|
|
RUN apt-get update && \
|
|
apt-get install -y --no-install-recommends equivs git && \
|
|
equivs-control libgl1-mesa-dri && \
|
|
printf 'Section: misc\nPriority: optional\nStandards-Version: 3.9.2\nPackage: libgl1-mesa-dri\nVersion: 99.0.0\nDescription: Dummy package for libgl1-mesa-dri\n' >> libgl1-mesa-dri && \
|
|
equivs-build libgl1-mesa-dri && \
|
|
mv libgl1-mesa-dri_*.deb /libgl1-mesa-dri.deb && \
|
|
equivs-control adwaita-icon-theme && \
|
|
printf 'Section: misc\nPriority: optional\nStandards-Version: 3.9.2\nPackage: adwaita-icon-theme\nVersion: 99.0.0\nDescription: Dummy package for adwaita-icon-theme\n' >> adwaita-icon-theme && \
|
|
equivs-build adwaita-icon-theme && \
|
|
mv adwaita-icon-theme_*.deb /adwaita-icon-theme.deb && \
|
|
git clone --depth 1 https://github.com/FlareSolverr/FlareSolverr.git /tmp/flaresolverr && \
|
|
rm -rf /var/lib/apt/lists/*
|
|
|
|
# Runtime stage
|
|
FROM --platform=amd64 cloudron/base:5.0.0@sha256:6bec2b5246567ef8b5b13ca0af756e2e596941e440d76b46635211cd84383922
|
|
|
|
WORKDIR /app/code/flaresolverr
|
|
|
|
# Copy dummy packages from build stage
|
|
COPY --from=build_image /libgl1-mesa-dri.deb /
|
|
COPY --from=build_image /adwaita-icon-theme.deb /
|
|
|
|
# Install dummy packages and runtime dependencies
|
|
RUN dpkg -i /libgl1-mesa-dri.deb && \
|
|
dpkg -i /adwaita-icon-theme.deb && \
|
|
apt-get update && \
|
|
apt-get install -y --no-install-recommends \
|
|
wget \
|
|
xz-utils \
|
|
unzip \
|
|
xvfb \
|
|
dumb-init \
|
|
procps \
|
|
curl \
|
|
vim \
|
|
xauth \
|
|
ca-certificates \
|
|
libatk1.0-0 \
|
|
libatk-bridge2.0-0 \
|
|
libcups2 \
|
|
libdrm2 \
|
|
libgtk-3-0 \
|
|
libgbm1 \
|
|
libasound2t64 \
|
|
libxss1 \
|
|
libxrandr2 \
|
|
libxcomposite1 \
|
|
libxdamage1 \
|
|
libxfixes3 \
|
|
libxkbcommon0 \
|
|
libxshmfence1 && \
|
|
# Download Google Chrome .deb package and extract the binary
|
|
# Chrome works as a drop-in replacement for Chromium in FlareSolverr
|
|
wget -q -O /tmp/chrome.deb "https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb" && \
|
|
mkdir -p /tmp/chrome-extract && \
|
|
cd /tmp/chrome-extract && \
|
|
dpkg-deb -x ../chrome.deb . && \
|
|
# Copy entire Chrome installation directory (Chrome needs its resources)
|
|
mkdir -p /opt/google && \
|
|
cp -r opt/google/chrome /opt/google/ && \
|
|
# Create symlink to chrome binary
|
|
ln -sf /opt/google/chrome/chrome /usr/local/bin/chromium && \
|
|
# Download chromedriver from Chrome for Testing
|
|
# Get latest stable version and download matching chromedriver
|
|
CHROMEDRIVER_VERSION=$(curl -s https://googlechromelabs.github.io/chrome-for-testing/LATEST_RELEASE_STABLE) && \
|
|
wget -q -O /tmp/chromedriver.zip "https://storage.googleapis.com/chrome-for-testing-public/${CHROMEDRIVER_VERSION}/linux64/chromedriver-linux64.zip" && \
|
|
unzip -q -o /tmp/chromedriver.zip -d /tmp && \
|
|
find /tmp -name "chromedriver" -type f -executable -exec cp {} /usr/local/bin/chromedriver \; && \
|
|
chmod +x /usr/local/bin/chromium /usr/local/bin/chromedriver && \
|
|
# Create chromium-browser symlink (FlareSolverr looks for chromium-browser)
|
|
ln -sf /usr/local/bin/chromium /usr/local/bin/chromium-browser && \
|
|
ln -sf /usr/local/bin/chromium /usr/bin/chromium && \
|
|
ln -sf /usr/local/bin/chromium-browser /usr/bin/chromium-browser && \
|
|
# Move chromedriver to app directory (FlareSolverr expects it there)
|
|
mv /usr/local/bin/chromedriver /app/code/chromedriver && \
|
|
chmod +x /app/code/chromedriver && \
|
|
# Clean up
|
|
rm -rf /tmp/chrome* /tmp/chromedriver* /var/lib/apt/lists/* && \
|
|
rm -f /usr/lib/x86_64-linux-gnu/libmfxhw* && \
|
|
rm -f /usr/lib/x86_64-linux-gnu/mfx/* && \
|
|
rm -f /libgl1-mesa-dri.deb /adwaita-icon-theme.deb
|
|
|
|
# Copy FlareSolverr code from build stage
|
|
COPY --from=build_image /tmp/flaresolverr/src /app/code/flaresolverr
|
|
COPY --from=build_image /tmp/flaresolverr/requirements.txt /app/code/flaresolverr/
|
|
COPY --from=build_image /tmp/flaresolverr/package.json /app/code/flaresolverr/
|
|
|
|
# Install Python dependencies
|
|
# Using --break-system-packages is acceptable in a Docker container
|
|
RUN pip3 install --break-system-packages --no-cache-dir -r /app/code/flaresolverr/requirements.txt && \
|
|
rm -rf /root/.cache/pip
|
|
|
|
# Set proper ownership
|
|
RUN chown -R cloudron:cloudron /app/code/flaresolverr
|
|
|
|
# Copy start script
|
|
COPY start.sh /app/code/start.sh
|
|
RUN chmod +x /app/code/start.sh && chown cloudron:cloudron /app/code/start.sh
|
|
|
|
# Set environment variables
|
|
ENV LANG=en_US.UTF-8
|
|
ENV TZ=UTC
|
|
ENV LOG_LEVEL=info
|
|
ENV PORT=8191
|
|
ENV HOST=0.0.0.0
|
|
|
|
# Expose port
|
|
EXPOSE 8191
|
|
|
|
# Use dumb-init to handle signals properly (avoids zombie chromium processes)
|
|
ENTRYPOINT ["/usr/bin/dumb-init", "--"]
|
|
|
|
# Run as cloudron user
|
|
USER cloudron
|
|
|
|
CMD ["/app/code/start.sh"]
|
|
|