douyin_tiktok_download_api (DTK) 自建部署教程
本文记录在 Windows 11 + WSL2 (Ubuntu) 环境下,使用 Docker Compose 部署
evil0ctal/douyin_tiktok_download_api(新版 v5.x,内部代号 DTK)的完整过程。
一、项目简介
DTK 是一个抖音/TikTok 无水印视频解析 API,提供:
- 视频链接解析(无水印下载地址)
- 作品详情、评论、作者资料等接口
- Web 控制台
- API 文档(Swagger)
官方仓库:https://github.com/Evil0ctal/Douyin_TikTok_Download_API
二、环境要求
| 项目 | 说明 |
|---|---|
| 操作系统 | Windows 11 + WSL2 (Ubuntu 22.04+) |
| Docker | 20.10+ |
| Docker Compose | v2.0+ |
| 内存 | 建议 2GB+ |
| 磁盘 | 建议 10GB+(含镜像和数据) |
三、安装 Docker
3.1 安装 Docker
# 更新包索引
sudo apt update
# 安装 Docker
sudo apt install -y docker.io
# 启动 Docker 并设置开机自启
sudo systemctl start docker
sudo systemctl enable docker
# 将当前用户加入 docker 组(免 sudo)
sudo usermod -aG docker $USER
newgrp docker
3.2 安装 Docker Compose 插件
由于 Ubuntu 源里可能没有 docker-compose-plugin,手动安装:
mkdir -p ~/.docker/cli-plugins
curl -SL https://github.com/docker/compose/releases/latest/download/docker-compose-linux-x86_64 -o ~/.docker/cli-plugins/docker-compose
chmod +x ~/.docker/cli-plugins/docker-compose
# 验证
docker compose version
国内网络如果拉取慢,可使用镜像加速:
sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": [ "https://docker.1ms.run", "https://docker.xuanyuan.me", "https://docker.m.daocloud.io" ] } EOF sudo systemctl daemon-reload sudo systemctl restart docker
四、部署服务
4.1 创建项目目录
mkdir -p ~/tiktok
cd ~/tiktok
4.2 生成密钥
openssl rand -base64 48
复制输出的密钥,后面要用。
4.3 创建 docker-compose.yml
nano docker-compose.yml
写入以下内容(替换 <你的密钥> 为上一步生成的密钥):
services:
douyin_tiktok_download_api:
image: evil0ctal/douyin_tiktok_download_api:latest
container_name: douyin_tiktok_download_api
restart: always
ports:
- "8080:8000"
environment:
TZ: Asia/Shanghai
DTK_SECRET_KEY: "<你的密钥>"
DTK_DATABASE_URL: "postgresql+asyncpg://dtk:dtk123@postgres:5432/dtk"
DTK_BIND_HOST: "0.0.0.0"
DTK_BIND_PORT: "8000"
depends_on:
migrate:
condition: service_completed_successfully
redis:
condition: service_started
volumes:
- ./data:/app/data
worker:
image: evil0ctal/douyin_tiktok_download_api:latest
container_name: dtk_worker
restart: always
environment:
TZ: Asia/Shanghai
DTK_SECRET_KEY: "<你的密钥>"
DTK_DATABASE_URL: "postgresql+asyncpg://dtk:dtk123@postgres:5432/dtk"
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_started
command: worker
migrate:
image: evil0ctal/douyin_tiktok_download_api:latest
container_name: dtk_migrate
environment:
DTK_SECRET_KEY: "<你的密钥>"
DTK_DATABASE_URL: "postgresql+asyncpg://dtk:dtk123@postgres:5432/dtk"
depends_on:
postgres:
condition: service_healthy
command: migrate
postgres:
image: timescale/timescaledb:2.17.2-pg16
container_name: dtk_postgres
restart: always
environment:
POSTGRES_USER: dtk
POSTGRES_PASSWORD: dtk123
POSTGRES_DB: dtk
volumes:
- ./pgdata:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U dtk"]
interval: 5s
timeout: 5s
retries: 5
redis:
image: redis:7-alpine
container_name: dtk_redis
restart: always
重要说明:
- 数据库必须用 TimescaleDB 镜像,普通 PostgreSQL 不行(缺少 timescaledb 扩展)
- 必须先跑 migrate 容器执行数据库迁移,再启动 API
- 必须有 worker 容器消费任务队列,否则请求会超时
- 所有环境变量都带
DTK_前缀- 如果 timescaledb 镜像拉取慢,用国内镜像:
docker pull docker.m.daocloud.io/timescale/timescaledb:2.17.2-pg16 docker tag docker.m.daocloud.io/timescale/timescaledb:2.17.2-pg16 timescale/timescaledb:2.17.2-pg16
4.4 启动服务
cd ~/tiktok
docker compose up -d
4.5 查看启动状态
# 查看所有容器
docker ps
# 查看迁移日志
docker logs dtk_migrate
# 查看 API 日志
docker logs -f douyin_tiktok_download_api
看到以下输出说明启动成功:
dtk: starting api on 0.0.0.0:8000
Application startup complete.
Uvicorn running on http://0.0.0.0:8000
同时会输出一个初始化链接:
http://127.0.0.1:8000/setup?token=xxxxx
五、初始化配置
5.1 创建管理员
浏览器打开初始化链接(把端口改成 8080):
http://127.0.0.1:8080/setup?token=<日志中的token>
按向导完成 4 步:
- 创建管理员:输入用户名和密码(密码至少 12 位)
- 配置代理:直接跳过(国内解析抖音不需要代理)
- 铸造首个身份:直接跳过(稍后手动导入 Cookie)
- 冒烟测试:直接跳过
5.2 导入抖音 Cookie
获取 Cookie
- Chrome 浏览器打开
https://www.douyin.com,登录你的抖音账号 - 按
F12打开开发者工具 - 点顶部 Network(网络)标签
- 按
F5刷新页面 - 点击列表中第一个请求
- 右侧找到 Request Headers(请求标头)
- 找到
cookie:那一行,完整复制整行值 - 找到
user-agent:那一行,也复制
导入到 DTK
- 打开
http://127.0.0.1:8080/ - 左侧菜单点「身份池」
- 点「导入 cookie」
- 平台选择
douyin - Cookie 框:粘贴完整的 cookie
- User agent 框:粘贴完整的 user-agent
- 勾选「我已知晓这串 cookie 等价于账号密码」
- 点「保存身份」
注意:Cookie 和 User-Agent 必须来自同一个浏览器会话,否则抖音会触发风控(403 错误)。
六、使用
6.1 Web 控制台
| 页面 | 地址 |
|---|---|
| 控制台首页 | http://127.0.0.1:8080/ |
| 调试台 | 左侧菜单「调试台」 |
| API 文档 | http://127.0.0.1:8080/docs |
6.2 解析视频
- 打开「调试台」
- 在 URL 框粘贴抖音视频链接,如:
https://www.douyin.com/video/7678472806804388202 - 点「发起请求」
- 展开「归一化结果」查看解析数据
6.3 API 调用
curl -X POST http://127.0.0.1:8080/api/v1/parse \
-H "Content-Type: application/json" \
-d '{"url": "https://www.douyin.com/video/7678472806804388202"}'
七、日常运维
7.1 每天开机操作
# 1. 打开 WSL 终端
# 2. 进入项目目录
cd ~/tiktok
# 3. 启动服务(如果 Docker 没自动启动)
docker compose up -d
# 4. 查看 WSL IP(如果 127.0.0.1 访问不了)
ip addr show eth0 | grep 'inet '
# 5. 浏览器访问
# http://127.0.0.1:8080/
7.2 常用命令
| 操作 | 命令 |
|---|---|
| 查看 API 日志 | docker logs -f douyin_tiktok_download_api |
| 查看 Worker 日志 | docker logs -f dtk_worker |
| 重启所有服务 | cd ~/tiktok && docker compose restart |
| 停止所有服务 | cd ~/tiktok && docker compose down |
| 启动所有服务 | cd ~/tiktok && docker compose up -d |
| 查看运行状态 | docker ps |
| 查看 WSL IP | ip addr show eth0 \| grep 'inet ' |
7.3 数据持久化
| 目录 | 内容 |
|---|---|
~/tiktok/pgdata/ |
PostgreSQL 数据库数据 |
~/tiktok/data/ |
应用数据 |
备份:停止服务后备份这两个目录即可。
八、常见问题
Q1: 启动报错 DTK_SECRET_KEY is not set
环境变量没配。检查 docker-compose.yml 中的 DTK_SECRET_KEY,长度至少 32 字符。
Q2: 启动报错 the timescaledb extension is not available
用了普通 PostgreSQL 镜像。必须换成 timescale/timescaledb:2.17.2-pg16。
Q3: 请求超时 / 一直排队
缺少 worker 容器。确保 docker-compose.yml 中有 worker 服务,且 docker compose up -d 后 docker ps 能看到 dtk_worker 在运行。
Q4: 解析返回 403 / UPSTREAM_RISK_CONTROL
抖音风控拦截。解决方法:
- 删除旧身份
- 从浏览器重新获取新鲜的 Cookie(包括
sessionid、ttwid、odin_tt等) - 同时复制 User-Agent 并填写
- 重新导入身份
Q5: WSL2 重启后 127.0.0.1 访问不了
WSL2 的 IP 可能变了。执行 ip addr show eth0 | grep 'inet ' 查看新 IP,用 http://新IP:8080/ 访问。
Q6: Docker Hub 拉取镜像慢
配置国内镜像加速(见 3.2 节)。或手动从 daocloud 拉取后打标签。
Q7: 如何重置管理员密码
目前没有邮件找回密码功能,只能通过 CLI 重置。具体方法参考官方文档。
九、架构说明
┌─────────────┐ ┌─────────────┐
│ 浏览器 │────▶│ API :8080 │
└─────────────┘ └──────┬──────┘
│
┌──────┴──────┐
│ Redis │
│ (任务队列) │
└──────┬──────┘
│
┌──────┴──────┐
│ Worker │
│ (解析任务) │
└──────┬──────┘
│
┌──────┴──────┐
│ PostgreSQL │
│ (TimescaleDB)│
└─────────────┘
- API:接收 HTTP 请求,返回解析结果
- Worker:后台消费解析任务,调用抖音接口
- Redis:任务队列
- PostgreSQL (TimescaleDB):存储配置、身份、请求日志
十、版本信息
- 镜像版本:v5.1.0
- Python:3.12
- 框架:FastAPI + Uvicorn
- 数据库:PostgreSQL 16 + TimescaleDB 2.17.2
- 缓存:Redis 7