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 步:

  1. 创建管理员:输入用户名和密码(密码至少 12 位)
  2. 配置代理:直接跳过(国内解析抖音不需要代理)
  3. 铸造首个身份:直接跳过(稍后手动导入 Cookie)
  4. 冒烟测试:直接跳过

5.2 导入抖音 Cookie

获取 Cookie

  1. Chrome 浏览器打开 https://www.douyin.com登录你的抖音账号
  2. F12 打开开发者工具
  3. 点顶部 Network(网络)标签
  4. F5 刷新页面
  5. 点击列表中第一个请求
  6. 右侧找到 Request Headers(请求标头)
  7. 找到 cookie: 那一行,完整复制整行值
  8. 找到 user-agent: 那一行,也复制

导入到 DTK

  1. 打开 http://127.0.0.1:8080/
  2. 左侧菜单点「身份池
  3. 点「导入 cookie
  4. 平台选择 douyin
  5. Cookie 框:粘贴完整的 cookie
  6. User agent 框:粘贴完整的 user-agent
  7. 勾选「我已知晓这串 cookie 等价于账号密码」
  8. 点「保存身份」

注意:Cookie 和 User-Agent 必须来自同一个浏览器会话,否则抖音会触发风控(403 错误)。


六、使用

6.1 Web 控制台

页面 地址
控制台首页 http://127.0.0.1:8080/
调试台 左侧菜单「调试台」
API 文档 http://127.0.0.1:8080/docs

6.2 解析视频

  1. 打开「调试台」
  2. 在 URL 框粘贴抖音视频链接,如:
    https://www.douyin.com/video/7678472806804388202
  3. 点「发起请求」
  4. 展开「归一化结果」查看解析数据

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 -ddocker ps 能看到 dtk_worker 在运行。

Q4: 解析返回 403 / UPSTREAM_RISK_CONTROL

抖音风控拦截。解决方法:

  1. 删除旧身份
  2. 从浏览器重新获取新鲜的 Cookie(包括 sessionidttwidodin_tt 等)
  3. 同时复制 User-Agent 并填写
  4. 重新导入身份

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