Unified multi-node fetcher control plane + media automation for Synapse/Transmission/qBit/Deluge.
498
Conduit is a unified, multi-node fetcher control plane (Synapse, Transmission, qBittorrent, Deluge) and Sonarr/Radarr/Lidarr/Plex media lifecycle automation daemon — written in Rust, with a React + Tailwind web UI and a Flutter mobile client.
Conduit sits in front of your entire download and media stack — every fetcher node, every Sonarr/Radarr/Lidarr instance, Plex, and Ombi — and gives you one dashboard, one API, and one set of automation rules across all of it.
Source & full documentation: https://github.com/booksarestillbetter/conduit
docker run -d \
--name conduit \
--network host \
-e CONDUIT_BIND=0.0.0.0 \
-e CONDUIT_PORT=4242 \
-e TZ=UTC \
-v ./data:/data \
-v ./queue:/queue \
--restart unless-stopped \
booksarestillbetter/conduit:latest
services:
conduit:
image: booksarestillbetter/conduit:${TAG:-latest}
container_name: conduit
restart: unless-stopped
network_mode: "host"
environment:
- CONDUIT_BIND=0.0.0.0
- CONDUIT_PORT=4242
- CONDUIT_HTTP_PORT=4242
- CONDUIT_HTTPS_PORT=443
# SSL Mode: 'auto' (detects cert in /data/ssl), 'true', or 'false'
- CONDUIT_SSL_ENABLED=auto
# Set to 'true' to redirect HTTP to HTTPS when ports differ
- CONDUIT_SSL_REDIRECT=false
- CONDUIT_LOG=info
- TZ=${TZ:-UTC}
volumes:
# Data directory — holds db.sqlite, config.json, and an optional ssl/ directory for certs
- ${CONDUIT_DATA_DIR:-./data}:/data
# Queue directory — where classified downloads get staged/hardlinked for pickup
- ${CONDUIT_QUEUE_DIR:-./queue}:/queue
healthcheck:
test: ["CMD", "curl", "-f", "http://127.0.0.1:4242/api/health"]
interval: 30s
timeout: 5s
retries: 3
Once running, the web UI is available at http://<host>:4242 — the setup wizard walks you through adding your first fetcher node and Arr instance.
latest / <version> (e.g. 0.15.0) — multi-arch (linux/amd64, linux/arm64), built natively per-arch (no QEMU emulation).# Stage 1: Build Modern React UI
FROM node:22-alpine AS ui-builder
WORKDIR /app/web
COPY web/package*.json ./
RUN npm ci
COPY web/ ./
RUN npm run build
# Stage 2: Build Rust Backend Binary
FROM rust:1.94-slim-bookworm AS rust-builder
WORKDIR /app
RUN apt-get update && apt-get install -y pkg-config libssl-dev protobuf-compiler curl && rm -rf /var/lib/apt/lists/*
COPY Cargo.toml Cargo.lock* build.rs ./
COPY proto/ ./proto/
COPY crates/ ./crates/
COPY src/ ./src/
COPY --from=ui-builder /app/web/dist ./web/dist
RUN cargo build --release
# Stage 3: Minimal Production Container with Integrated Nginx Reverse Proxy
FROM debian:bookworm-slim
WORKDIR /app
RUN apt-get update && apt-get install -y \
ca-certificates \
tzdata \
curl \
nginx \
openssl \
&& rm -rf /var/lib/apt/lists/*
COPY --from=rust-builder /app/target/release/conduit /app/conduit
COPY docker/entrypoint.sh /app/entrypoint.sh
RUN chmod +x /app/entrypoint.sh
ENV CONDUIT_BIND="0.0.0.0"
ENV CONDUIT_PORT=4242
ENV CONDUIT_HTTP_PORT=4242
ENV CONDUIT_HTTPS_PORT=443
ENV CONDUIT_INTERNAL_PORT=42420
ENV CONDUIT_SSL_ENABLED=auto
ENV CONDUIT_CONFIG="/data/config.json"
ENV CONDUIT_DB="/data/db.sqlite"
VOLUME ["/data", "/queue", "/store"]
EXPOSE 80 443 4242 42420
HEALTHCHECK --interval=30s --timeout=5s --start-period=5s --retries=3 \
CMD curl -f http://127.0.0.1:42420/api/health || curl -f http://127.0.0.1:4242/api/health || exit 1
ENTRYPOINT ["/app/entrypoint.sh"]
Content type
Image
Digest
sha256:83d39ef00…
Size
118.7 MB
Last updated
6 days ago
docker pull booksarestillbetter/conduit