mirror of
https://github.com/calibrain/shelfmark.git
synced 2026-04-19 21:39:17 -04:00
Adding support for an external CloudFlare bypasser service and introducing a new Docker image build with a dedicated target. Key Changes - Added `cloudflare_bypasser_external.py` for external bypasser integration. - Updated Docker Compose files to support the new service. - Introduced a new Docker target for building a separate image for the external bypasser. - Refactored relevant modules to utilize the external bypasser when configured. - Documentation and configuration updates to reflect new options and Docker targets. Impact - Users can now choose between internal and external CloudFlare bypassing. - New Docker image and target streamline deployment of the external bypasser. - Improved modularity and maintainability. - No breaking changes for existing workflows. Testing - Manual and E2E tests performed for both bypasser modes. - Docker Compose setups and new image build verified for development and production. Notes Please review the new configuration options and Docker targets. Update your environment and deployment scripts as needed. Feedback and suggestions are welcome!
144 lines
4.4 KiB
Docker
144 lines
4.4 KiB
Docker
# Use python-slim as the base image
|
|
FROM python:3.10-slim AS base
|
|
|
|
# Add build argument for version
|
|
ARG BUILD_VERSION
|
|
ENV BUILD_VERSION=${BUILD_VERSION}
|
|
|
|
# Set shell to bash with pipefail option
|
|
SHELL ["/bin/bash", "-o", "pipefail", "-c"]
|
|
|
|
# Consistent environment variables grouped together
|
|
ENV DEBIAN_FRONTEND=noninteractive \
|
|
DOCKERMODE=true \
|
|
PYTHONUNBUFFERED=1 \
|
|
PYTHONDONTWRITEBYTECODE=1 \
|
|
PYTHONIOENCODING=UTF-8 \
|
|
PIP_NO_CACHE_DIR=1 \
|
|
PIP_DISABLE_PIP_VERSION_CHECK=1 \
|
|
PIP_DEFAULT_TIMEOUT=100 \
|
|
NAME=Calibre-Web-Automated-Book-Downloader \
|
|
PYTHONPATH=/app \
|
|
# UID/GID will be handled by entrypoint script, but TZ/Locale are still needed
|
|
LANG=en_US.UTF-8 \
|
|
LANGUAGE=en_US:en \
|
|
LC_ALL=en_US.UTF-8 \
|
|
APP_ENV=prod
|
|
|
|
# Set ARG for build-time expansion (FLASK_PORT), ENV for runtime access
|
|
ENV FLASK_PORT=8084
|
|
|
|
# Configure locale, timezone, and perform initial cleanup in a single layer
|
|
# User/group creation is removed
|
|
RUN apt-get update && \
|
|
apt-get install -y --no-install-recommends \
|
|
# For locale
|
|
locales tzdata \
|
|
# For healthcheck
|
|
curl \
|
|
# For entrypoint
|
|
dumb-init \
|
|
# For debug
|
|
zip iputils-ping \
|
|
# For user switching
|
|
sudo && \
|
|
# Cleanup APT cache *after* all installs in this layer
|
|
apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false && \
|
|
apt-get clean && \
|
|
rm -rf /var/lib/apt/lists/* && \
|
|
# Default to UTC timezone but will be overridden by the entrypoint script
|
|
ln -snf /usr/share/zoneinfo/UTC /etc/localtime && echo UTC > /etc/timezone && \
|
|
# Configure locale
|
|
sed -i '/en_US.UTF-8/s/^# //g' /etc/locale.gen && \
|
|
locale-gen en_US.UTF-8 && \
|
|
echo "LC_ALL=en_US.UTF-8" >> /etc/environment && \
|
|
echo "LANG=en_US.UTF-8" > /etc/locale.conf
|
|
|
|
# Set working directory
|
|
WORKDIR /app
|
|
|
|
# Install Python dependencies using pip
|
|
# Upgrade pip first, then copy requirements and install
|
|
# Copying requirements-base.txt separately leverages build cache
|
|
COPY requirements-base.txt .
|
|
RUN pip install --no-cache-dir -r requirements-base.txt && \
|
|
# Clean root's pip cache
|
|
rm -rf /root/.cache
|
|
|
|
# Copy application code *after* dependencies are installed
|
|
COPY . .
|
|
|
|
# Final setup: permissions and directories in one layer
|
|
# Only creating directories and setting executable bits.
|
|
# Ownership will be handled by the entrypoint script.
|
|
RUN mkdir -p /var/log/cwa-book-downloader /cwa-book-ingest && \
|
|
chmod +x /app/entrypoint.sh /app/tor.sh /app/genDebug.sh
|
|
|
|
# Expose the application port
|
|
EXPOSE ${FLASK_PORT}
|
|
|
|
# Add healthcheck for container status
|
|
# This will run as root initially, but check localhost which should work if the app binds correctly.
|
|
HEALTHCHECK --interval=60s --timeout=60s --start-period=60s --retries=3 \
|
|
CMD curl -s http://localhost:${FLASK_PORT}/request/api/status > /dev/null || exit 1
|
|
|
|
# Use dumb-init as the entrypoint to handle signals properly
|
|
ENTRYPOINT ["/usr/bin/dumb-init", "--"]
|
|
|
|
|
|
FROM base AS cwa-bd
|
|
|
|
RUN apt-get update && \
|
|
apt-get install -y --no-install-recommends \
|
|
# For dumb display
|
|
xvfb \
|
|
# For screen recording
|
|
ffmpeg \
|
|
# --- Chromium ---
|
|
chromium \
|
|
# --- ChromeDriver ---
|
|
chromium-driver \
|
|
# For tkinter (pyautogui)
|
|
python3-tk
|
|
|
|
# install additional dependencies
|
|
COPY requirements-cwa-bd.txt .
|
|
RUN pip install --no-cache-dir -r requirements-cwa-bd.txt && \
|
|
# Clean root's pip cache
|
|
rm -rf /root/.cache
|
|
|
|
# Add this line to grant read/execute permissions to others
|
|
RUN chmod -R o+rx /usr/bin/chromium && \
|
|
chmod -R o+rx /usr/bin/chromedriver && \
|
|
chmod -R o+w /usr/local/lib/python3.10/site-packages/seleniumbase/drivers/
|
|
|
|
# Default command to run the application entrypoint script
|
|
CMD ["/app/entrypoint.sh"]
|
|
|
|
FROM cwa-bd AS cwa-bd-tor
|
|
|
|
ENV USING_TOR=true
|
|
|
|
# Install Tor and dependencies
|
|
RUN apt-get update && \
|
|
apt-get install -y --no-install-recommends \
|
|
# --- Tor ---
|
|
tor \
|
|
# --- iptables ---
|
|
iptables && \
|
|
update-alternatives --set iptables /usr/sbin/iptables-legacy && \
|
|
update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy && \
|
|
# Cleanup APT cache *after* all installs in this layer
|
|
apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false && \
|
|
apt-get clean && \
|
|
rm -rf /var/lib/apt/lists/*
|
|
|
|
# Override the default command to run Tor
|
|
CMD ["/app/entrypoint.sh"]
|
|
|
|
FROM base AS cwa-bd-extbp
|
|
|
|
ENV USING_EXTERNAL_BYPASSER=true
|
|
|
|
CMD ["/app/entrypoint.sh"]
|