Sign inSign up

booksarestillbetter/conduit

By booksarestillbetter

•Updated 6 days ago

Unified multi-node fetcher control plane + media automation for Synapse/Transmission/qBit/Deluge.

Image
0

498

booksarestillbetter/conduit repository overview

⁠Conduit

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⁠


⁠Quick Start (docker run)

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

⁠Quick Start (docker-compose)

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.

⁠Tags

  • latest / <version> (e.g. 0.15.0) — multi-arch (linux/amd64, linux/arm64), built natively per-arch (no QEMU emulation).

⁠Dockerfile

# 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"]

Tag summary

Content type

Image

Digest

sha256:83d39ef00…

Size

118.7 MB

Last updated

6 days ago

docker pull booksarestillbetter/conduit