QD 是 一个 基于 HAR 编辑器和 Tornado 服务端的 HTTP 定时任务自动执行 Web 框架。

官网:https://qd-today.github.io/qd/zh_CN/
Github:https://github.com/qd-today/qd

主要特性

  • 基于Har: 仅需上传通过抓包得到的 Har, 即可制作框架所需的 HTTP 任务模板。
  • Tornado 服务端: 使用 Tornado 作为服务端, 以实现异步响应前端和发起 HTTP 请求。
  • API & 插件支持: 内置多种 API 和过滤器用于模板制作, 后续将提供自定义插件支持。
  • 开源: QD 是一个基于 MIT 许可证的开源项目。

部署环境

  • 系统:Debian
  • 域名一个,并解析到服务器
  • 安装好 Docker、Docker-compose,见VPS部署
  • 安装好 Caddy,反向代理

部署

升级 packages,

apt update -y

安装常用的软件,

apt install wget curl sudo vim git

QD

创建安装目录,

mkdir -p /root/data/docker/qd
mkdir -p /root/data/docker/redis
cd /root/data/docker/qd

下载 docker-compose.yml ,

wget https://fastly.jsdelivr.net/gh/qd-today/qd@master/docker-compose.yml

根据需求和配置说明修改配置环境变量,

version: "3"

services:
  qd:
    image: qdtoday/qd:latest
    # image: qdtoday/qd:lite-latest # 精简版
    # image: qdtoday/qd:dev # 开发版
    container_name: qd
    depends_on:
      - redis
    ports:
      - "8000:80"
    volumes:
      - "/root/data/docker/qd/:/usr/src/app/config"
    environment:
      # - QD_DEBUG=False
      # - BIND=0.0.0.0
      # - PORT=80
      # - MULTI_PROCESS=False
      # - AUTO_RELOAD=False
      # - GZIP=True
      # - ACCESS_LOG=True
      # - DISPLAY_IMPORT_WARNING=True
      # - USER0ISADMIN=True
      # - STATIC_URL_PREFIX=/static/
      - DOMAIN=
      # - COOKIE_DAY=5
      # - COOKIE_SECURE_MODE=False
      - COOKIE_SECRET=binux
      - PBKDF2_ITERATIONS=400
      - AES_KEY=binux
      # - DB_TYPE=sqlite3
      # - JAWSDB_MARIA_URL=mysql://user:pass@localhost:3306/dbname?auth_plugin=
      # - QD_SQL_LOGGING_NAME=QD.sql
      # - QD_SQL_LOGGING_LEVEL=WARNING
      # - QD_SQL_POOL_LOGGING_NAME=QD.sql.pool
      # - QD_SQL_POOL_LOGGING_LEVEL=WARNING
      # - QD_SQL_POOL_SIZE=5
      # - QD_SQL_MAX_OVERFLOW=10
      # - QD_SQL_POOL_PRE_PING=True
      # - QD_SQL_POOL_RECYCLE=3600
      # - QD_SQL_POOL_TIMEOUT=30
      # - QD_SQL_POOL_USE_LIFO=True
      - REDISCLOUD_URL=redis://redis:6379
      # - REDIS_DB_INDEX=1
      # - QD_EVIL=1000
      # - EVIL_PASS_LAN_IP=True
      # - WORKER_METHOD=Queue
      # - QUEUE_NUM=50
      # - CHECK_TASK_LOOP=500
      # - TASK_MAX_RETRY_COUNT=8
      # - NEW_TASK_DELAY=1
      # - TASK_WHILE_LOOP_TIMEOUT=900
      # - TASK_REQUEST_LIMIT=1500
      # - DOWNLOAD_SIZE_LIMIT=5242880
      # - REQUEST_TIMEOUT=30.0
      # - CONNECT_TIMEOUT=30.0
      # - DELAY_MAX_TIMEOUT=29.9
      # - UNSAFE_EVAL_TIMEOUT=3.0
      # - USE_PYCURL=True
      # - ALLOW_RETRY=True
      # - DNS_SERVER=
      # - CURL_ENCODING=True
      # - CURL_CONTENT_LENGTH=True
      # - NOT_RETRY_CODE=301|302|303|304|305|307|400|401|403|404|405|407|408|409|410|412|415|413|414|500|501|502|503|504|599
      # - EMPTY_RETRY=True
      # - TRACEBACK_PRINT=False
      # - PUSH_PIC_URL=https://gitee.com/qd-today/qd/raw/master/web/static/img/push_pic.png
      # - PUSH_BATCH_SW=True
      # - PUSH_BATCH_DELTA=60
      # - WS_PING_INTERVAL=5
      # - WS_PING_TIMEOUT=30
      # - WS_MAX_MESSAGE_SIZE=10485760
      # - WS_MAX_QUEUE_SIZE=100
      # - WS_MAX_CONNECTIONS_SUBSCRIBE=30
      # - SUBSCRIBE_ACCELERATE_URL=jsdelivr_cdn
      # - PROXIES=
      # - PROXY_DIRECT_MODE=regexp
      # - PROXY_DIRECT=(?xi)\A([a-z][a-z0-9+\-.]*://)?(0(.0){3}|127(.0){2}.1|localhost|\[::([\d]+)?\])(:[0-9]+)?
      # - EXTRA_ONNX_NAME=
      # - EXTRA_CHARSETS_NAME=
      # - MAIL_SMTP=
      # - MAIL_PORT=465
      # - MAIL_SSL=True
      # - MAIL_USER=
      # - MAIL_PASSWORD=
      # - MAIL_FROM=${MAIL_USER}
      # - MAIL_DOMAIN_HTTPS=False
      # - MAILGUN_KEY=
      # - MAILGUN_DOMAIN=${DOMAIN}
      # - GA_KEY=

  redis:
    image: redis:alpine
    container_name: redis
    command: ["--loglevel warning"]
    # command: redis-server /usr/local/etc/redis/redis.conf
    volumes:
      # - ./redis/redis.conf:/usr/local/etc/redis/redis.conf:rw
      - /root/data/docker/redis/:/data:rw

启动,

docker-compose up -d 

首位注册用户默认为管理员, 需要先登出再登陆后才能获得完整管理员权限。

更新

进入 docker-compose.yml 所在的文件夹,

cd /root/data/docker/qd

拉取最新的镜像,

docker-compose pull

重新更新当前镜像,

docker-compose up -d

卸载

进入 docker-compose 所在的文件夹,

cd /root/data/docker/qd

停止容器,此时不会删除映射到本地的数据,

docker-compose down

完全删除映射到本地的数据,

cd
rm -rf /root/data/docker/qd
rm -rf /root/data/docker/redis

反向代理

进入目录 /etc/caddy/sites ,创建并编辑 qd.amaranthinking.eu.org.conf

# Uncomment this in addition with the import admin_redir statement allow access to the admin interface only from local networks
# (admin_redir) {
#        @admin {
#                path /admin*
#                not remote_ip private_ranges
#        }
#        redir @admin /
# }

qd.amaranthinking.eu.org {
  log {
    level INFO
    output file /root/data/docker/qd/qd.log {
      roll_size 10MB
      roll_keep 10
    }
  }

  # Uncomment this if you want to get a cert via ACME (Let's Encrypt or ZeroSSL).
  # tls {$EMAIL}

  # Or uncomment this if you're providing your own cert. You would also use this option
  # if you're running behind Cloudflare.
  # tls {$SSL_CERT_PATH} {$SSL_KEY_PATH}

  # This setting may have compatibility issues with some browsers
  # (e.g., attachment downloading on Firefox). Try disabling this
  # if you encounter issues.
  encode gzip

  # Uncomment to improve security (WARNING: only use if you understand the implications!)
  # If you want to use FIDO2 WebAuthn, set X-Frame-Options to "SAMEORIGIN" or the Browser will block those requests
  header {
       # Enable HTTP Strict Transport Security (HSTS)
       Strict-Transport-Security "max-age=31536000;"
       # Enable cross-site filter (XSS) and tell browser to block detected attacks
       X-XSS-Protection "1; mode=block"
       # Disallow the site to be rendered within a frame (clickjacking protection)
       X-Frame-Options "SAMEORIGIN"
       # Prevent search engines from indexing (optional)
       X-Robots-Tag "none"
       # Server name removing
       -Server
  }

  # Uncomment to allow access to the admin interface only from local networks
# import admin_redir

  # Proxy everything to Rocket
  reverse_proxy 127.0.0.1:8000 {
       # Send the true remote IP to Rocket, so that it can put this in the
       # log, so that fail2ban can ban the correct IP.
       header_up X-Real-IP {remote_host}
  }
}

文章目录