uncompressed

LackoftacticsMIT更新放缓

一套加固版 Docker Compose 配置,把 Jellyfin 媒体服务器、Sonarr/Radarr 自动下载和 qBittorrent 打包部署,通过 VPN 命名空间隔离与零信任入口保护家庭影音栈。

My arr stack. Hardened Docker Compose config for Jellyfin + Sonarr/Radarr + qBittorrent with VPN namespace isolation and zero-trust ingress.

v1.0.0发布于 2026-04-04 21:23 UTC217star9fork同步于 2026-11-07 07:34 UTC

怎么上手

由 README 提炼,执行前请确认
curl -L https://github.com/Lackoftactics/uncompressed/archive/main.tar.gz | tar xz
cd uncompressed-main && ./setup.sh
硬件要求按 README 说明

README 未说明具体硬件或显存要求,仅要求宿主机运行 Docker + Compose,作者在 Unraid 上运行

有 Docker 镜像
下载:源码 zip·GitHub Releases(安装包)本站不镜像安装包

项目说明

由 README 自动翻译提炼

一套加固的 Docker Compose 媒体栈,用 VPN 网络命名空间隔离 qBittorrent,并通过 Tailscale 实现零信任入口

一套加固版 Docker Compose 配置,把 Jellyfin 媒体服务器、Sonarr/Radarr 自动下载和 qBittorrent 打包部署,通过 VPN 命名空间隔离与零信任入口保护家庭影音栈。

核心能力

  • qBittorrent 运行在 gluetun 网络命名空间内,无独立网卡
  • 仅 Jellyfin 暴露 8096 端口,其余服务只经 Traefik 访问
  • Traefik 绑定 Tailscale IP 的 443,不暴露公网
  • 划分 traefik_proxy、arr_internal、vpn_network 三个隔离网络
  • Autoheal 配合健康检查自动重启故障容器

容易踩的坑

需自备 Tailscale 账号、ProtonVPN WireGuard 密钥和 Cloudflare 域名及限定权限的 API Token;手动部署时每个 compose 栈需各自的 .env 软链接,否则读不到配置;需先创建 traefik_proxy 网络并按 infra 再 arr 的顺序启动

内容由模型根据 README 生成,可能不完整或不准确,以官方文档为准。看原文 README

最近发版

1 个版本v1.0.0
  1. v1.0.0v1.0.0 — Initial Release最新正式版2026-04-04 · 2026-04-04 21:23 UTC

    Self-healing, high-quality media pipeline. 10 containers, 2 Docker Compose stacks.

    What's included

    • arr stack — Gluetun, qBittorrent, Jellyfin, Sonarr, Radarr, Prowlarr, Overseerr, Bazarr, Autoheal
    • infra stack — Traefik v2.10.7 reverse proxy with auto HTTPS

    Highlights

    • VPN namespace isolation (kernel-level, not firewall rules)
    • Zero-trust ingress via Tailscale + Traefik
    • Three-layer self-healing: health checks, autoheal, dependency ordering
    • Hardware transcoding via Intel Quick Sync
    • All images pinned to specific versions

    Requirements

    • Docker + Compose
    • Tailscale account
    • ProtonVPN with WireGuard keys
    • Domain on Cloudflare DNS

    See README for setup instructions.

用户点评

登录用户的真实使用记录,可按版本和硬件筛选
共 0 条

    还没有人点评。第一个说出真实体验的人最有价值。

    README 原文

    未翻译

    uncompressed

    My arr stack. Hardened Docker Compose config for Jellyfin + Sonarr/Radarr + qBittorrent with VPN namespace isolation and zero-trust ingress.

    I run this on Unraid. It took a few months to get the networking right — most guides just slap a firewall rule on the VPN and call it a day. I wanted actual isolation, not "it probably works." Here's what I landed on.

    My family uses Seerr to request movies/shows and Infuse on Apple TV to watch them.

    Prerequisites

    • Docker + Compose

    • Tailscale account. Open these ports in your Tailscale ACL for the host running this stack: tcp:80, tcp:443 (Traefik, bound to your Tailscale IP) and tcp:8096 (Jellyfin direct, for LAN clients like Infuse / Apple TV). Nothing else is published to the host.

    • ProtonVPN account with WireGuard keys (P2P-enabled servers in NL/CH).

    • Domain on Cloudflare DNS with a scoped API token (not the Global API Key). Create the token at dash.cloudflare.com → My Profile → API Tokens with these permissions on the target zone:

      • Zone → Zone → Read
      • Zone → DNS → Edit

      This is the minimum required for the ACME DNS-01 challenge. See .env.example for the full variable list.

    Quick Start

    Fast track — download and run the guided setup wizard (no git required):

    curl -L https://github.com/Lackoftactics/uncompressed/archive/main.tar.gz | tar xz
    cd uncompressed-main && ./setup.sh
    

    Or with git (gives you git pull for future updates):

    git clone https://github.com/Lackoftactics/uncompressed.git
    cd uncompressed && ./setup.sh
    

    Manual setup — if you prefer to do it yourself:

    cp .env.example .env              # fill in secrets, domain, Tailscale IP, WG keys, CF token
    ln -s ../.env arr/.env            # each compose stack reads its own .env
    ln -s ../.env infra/.env
    docker network create traefik_proxy
    

    Then start the stack (from the repo root — no cd needed):

    docker compose -f infra/docker-compose.yml up -d  # traefik first
    docker compose -f arr/docker-compose.yml up -d     # media pipeline (9 containers)
    

    Each compose file declares env_file: ./.env, resolved relative to its own directory — so arr/docker-compose.yml needs arr/.env. Symlinking keeps one source of truth at the repo root.

    Networking & Security

    This is the part that's actually interesting. The services themselves are standard — the value is in how they're wired together.

    VPN namespace isolation — qBittorrent doesn't just "use" the VPN. It runs inside gluetun's network namespace (network_mode: service:gluetun), meaning it shares gluetun's entire network stack. The container has no network interface of its own. An init script (10-config.sh) additionally forces BIND_TO_INTERFACE: tun0 as defense in depth. If the VPN drops, there is no path for traffic to take — it's a kernel boundary, not a firewall rule that could be misconfigured.

    No published ports, with one exception — only Jellyfin publishes :8096 to the host so LAN clients (Infuse, Apple TV) can hit it directly. Everything else is reachable only through Traefik over the Docker network — there's no way to hit Sonarr/Radarr/Prowlarr/etc. by going to host:port and bypassing TLS + security headers.

    Tailscale-only ingress — Traefik binds to ${TAILSCALE_IP}:443, not 0.0.0.0:443. You must be on the Tailscale mesh to reach any service. No ports face the public internet. HTTPS certs are auto-renewed via Cloudflare DNS challenge.

    Three isolated networks — traefik_proxy for HTTPS ingress, arr_internal (marked internal: true) for service-to-service, vpn_network for tunnel traffic. Port forwarding from ProtonVPN is automatic — gluetun gets the forwarded port and pushes it to qBittorrent's API.

    Architecture

    Cloudflare is used only as the ACME DNS-01 challenge target for cert renewal — control plane, not in the user-traffic path.

    What's in the stack

    arr/ — Gluetun, qBittorrent, Jellyfin, Sonarr, Radarr, Prowlarr, Seerr, Bazarr, Autoheal. Every container has an endpoint-specific health check. Autoheal restarts anything that fails. depends_on: service_healthy prevents cascading startup issues.

    infra/ — Traefik v2.10.7 reverse proxy with auto HTTPS via Cloudflare DNS challenge.

    License

    MIT