如何在 n8n (Docker 版) 中正确配置和使用 yt-dlp

如何在 n8n (Docker 版) 中正确配置和使用 yt-dlp

本教程基于在 Docker 中运行的 n8n 实例,指导您如何永久性地在 n8n 环境中安装 yt-dlp,并配置 Cookie 文件以解决 YouTube 和 Bilibili 等网站的登录验证和反爬虫问题。

n8n Workflow Automation
自动化工作流示意图


📌 为什么这么复杂?

n8n 默认运行在一个”干净”的 Docker 容器中。您在服务器(宿主机)上安装的任何工具(如 yt-dlp),n8n 容器内部都无法访问。因此,我们必须构建一个自定义的 n8n 镜像,将 yt-dlp 作为 n8n 环境的一部分。

Docker Container Architecture
Docker 容器隔离示意图 - 展示宿主机和容器之间的关系


🚀 阶段一:永久性安装 yt-dlp 到 n8n

我们将使用 docker-compose 和一个 Dockerfile 来构建一个包含 yt-dlp 及其依赖(Python, ffmpeg)的 n8n 镜像。

步骤 1:创建 n8n 部署目录

在您的服务器上,创建一个新目录来存放您的配置文件。

1
2
3
# 例如,在 /root/ 目录下创建一个名为 n8n-custom 的目录
mkdir /root/n8n-custom
cd /root/n8n-custom

步骤 2:创建 Dockerfile

/root/n8n-custom 目录中,创建一个名为 Dockerfile 的文件。

1
nano Dockerfile

将以下内容粘贴到文件中。此配置基于 Alpine Linux(n8n 官方镜像的基础)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# -----------------------------------------------
# 自定义 n8n Dockerfile (Alpine 版)
# -----------------------------------------------

# 1. 使用 n8n 官方镜像作为基础
FROM n8nio/n8n:latest

# 2. 切换到 root 用户来安装软件
USER root

# 3. 使用 apk (Alpine 的包管理器) 安装依赖
# 我们需要 python3, py3-pip, 和 ffmpeg (对音视频处理至关重要)
RUN apk update && \
apk add python3 py3-pip ffmpeg && \
rm -rf /var/cache/apk/*

# 4. 使用 pip 安装 yt-dlp
# 我们使用 --break-system-packages 来绕过 Alpine 的系统保护
RUN pip3 install yt-dlp --break-system-packages

# 5. 切换回 n8n 默认的安全用户
USER node

Code Editor
Dockerfile 代码编辑示意图


步骤 3:创建 docker-compose.yml

在相同目录下,创建 docker-compose.yml 文件。

1
nano docker-compose.yml

将以下内容粘贴到文件中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
version: '3.8'

services:
n8n:
# 关键:不使用 'image:',而是 'build: .'
# 这告诉 Docker 使用当前目录的 Dockerfile 来构建镜像
build: .

# 保持您喜欢的容器名和端口
container_name: n8n_custom_service
ports:
- "9999:5678"

# 关键:将 n8n 的数据持久化到宿主机
volumes:
- n8n_data_custom:/home/node/.n8n

# (可选) 设置您的 Nginx 反代 URL
environment:
- N8N_PUBLIC_URL=https://n8n.your-domain.com
- N8N_PROTOCOL=https
- TZ=Asia/Shanghai
restart: unless-stopped

volumes:
# 定义一个 Docker 卷来安全地存储您的数据
n8n_data_custom:

步骤 4:构建并启动

/root/n8n-custom 目录下,运行 docker-compose

1
docker-compose up -d --build

Docker 会开始构建您的新镜像(这可能需要几分钟),然后启动 n8n。

Docker Build
Docker 构建过程示意图


yt-dlp 访问 YouTube 或 Bilibili 时,会因为服务器的机器人检测(如 “412 Precondition Failed” 或 “Sign in to confirm”)而失败。我们必须提供 Cookie。

  1. 在您的本地电脑(非服务器)的 Chrome / Firefox 浏览器上,安装一个 Cookie 导出插件(例如:Get cookies.txt
  2. 登录 youtube.com,点击插件图标,导出 Cookie,保存为 youtube_cookies.txt
  3. 登录 bilibili.com,点击插件图标,导出 Cookie,保存为 bilibili_cookies.txt

Browser Extension
浏览器 Cookie 导出插件示意图


您需要将这两个 .txt 文件上传到 n8n 的持久化数据目录。

2.1 找到数据卷路径

根据我们的 docker-compose.yml,卷名是 n8n_data_custom。由于您的目录是 n8n-custom,Docker 卷的真实名称可能是 n8n-custom_n8n_data_custom

1
2
# 运行此命令找到宿主机上的确切路径
docker volume inspect n8n-custom_n8n_data_custom | grep Mountpoint

您会得到一个路径,例如:/var/lib/docker/volumes/n8n-custom_n8n_data_custom/_data

使用 nano 和您上一步找到的路径,创建文件并粘贴 Cookie 内容。

1
2
3
4
5
6
7
# 创建 YouTube Cookie
nano /var/lib/docker/volumes/n8n-custom_n8n_data_custom/_data/youtube_cookies.txt
# (粘贴内容, 保存, 退出)

# 创建 Bilibili Cookie
nano /var/lib/docker/volumes/n8n-custom_n8n_data_custom/_data/bilibili_cookies.txt
# (粘贴内容, 保存, 退出)

您刚刚创建的文件归 root 用户所有。n8n 容器内的 node 用户没有权限读取(或写入)它们,会导致 Permission denied 错误。

我们必须在容器内更改这些文件的所有者。

1
2
3
# 强制使用 root 用户在容器内执行 chown (更改所有者)
docker exec --user root n8n_custom_service chown node:node /home/node/.n8n/youtube_cookies.txt
docker exec --user root n8n_custom_service chown node:node /home/node/.n8n/bilibili_cookies.txt

Security Lock
文件权限修复示意图


🎯 阶段三:在 n8n 中使用 yt-dlp

现在一切准备就绪。

步骤 1:找到 yt-dlp 的绝对路径

由于我们是通过 Dockerfile 安装的,我们需要知道它的确切路径。

1
docker exec n8n_custom_service which yt-dlp

它很可能会返回:/usr/bin/yt-dlp


步骤 2:在 “Execute Command” 节点中使用

在您的 n8n 工作流中,添加 Execute Command 节点。在 Command 字段中,您必须使用绝对路径和对应的 Cookie。

n8n Workflow
n8n 工作流配置示例

YouTube 示例(检查字幕):

1
/usr/bin/yt-dlp --cookies /home/node/.n8n/youtube_cookies.txt --list-subs "https://www.youtube.com/watch?v=EXAMPLE_VIDEO_ID"

Bilibili 示例(检查字幕):

1
/usr/bin/yt-dlp --cookies /home/node/.n8n/bilibili_cookies.txt --list-subs "https://www.bilibili.com/video/EXAMPLE_VIDEO_ID"

🎊 常用命令参考

下载视频(最高质量)

1
/usr/bin/yt-dlp --cookies /home/node/.n8n/youtube_cookies.txt -f "bestvideo+bestaudio" "VIDEO_URL" -o "/home/node/.n8n/downloads/%(title)s.%(ext)s"

仅下载音频

1
/usr/bin/yt-dlp --cookies /home/node/.n8n/youtube_cookies.txt -x --audio-format mp3 "VIDEO_URL" -o "/home/node/.n8n/downloads/%(title)s.%(ext)s"

下载字幕

1
/usr/bin/yt-dlp --cookies /home/node/.n8n/youtube_cookies.txt --write-subs --sub-lang zh-CN "VIDEO_URL"

🔧 故障排除

问题 1:Permission denied

解决方案:确保您已经执行了 chown 命令来修复 Cookie 文件权限。

问题 2:yt-dlp: command not found

解决方案:确保使用绝对路径 /usr/bin/yt-dlp,而不是 yt-dlp

问题 3:412 Precondition Failed

解决方案:Cookie 可能已过期,需要重新导出并上传新的 Cookie 文件。


✅ 总结

  • ✅ 构建了包含 yt-dlp 的自定义 n8n Docker 镜像
  • ✅ 配置了 YouTube 和 Bilibili 的 Cookie 文件
  • ✅ 修复了文件权限问题
  • ✅ 在 n8n 工作流中成功使用 yt-dlp

您的 n8n 现在已经完全配置好了,可以稳定地使用 yt-dlp 了!🎉


📚 参考资料

如何在 n8n (Docker 版) 中正确配置和使用 yt-dlp

https://xxc.li/2025/11/19/如何在n8n-Docker中正确配置和使用yt-dlp/

作者

Wilfred

发布于

2025-11-19

更新于

2025-11-19

许可协议

评论