yanchang
yanchang
发布于 2026-02-07 / 36 阅读
0
0

青龙面板部署实录(谨慎部署注意安全)

碎碎念

青龙面板(Qinglong Panel)是管理定时任务的神器,不仅能自动跑各种签到脚本(京东、B站、阿里云盘等),还能做数据监控。最近正好腾出手来,决定在我的 Linux 服务器上部署一套,顺便把消息推送配置好,实现“躺平式”自动化管理。

本以为只是个简单的 Docker 部署,没想到在配置 QQ 邮箱通知 时,结结实实地踩了两个坑。特此记录.

1. 什么是青龙面板?

简单来说,青龙面板就是一个支持 Python、JavaScript、Shell 等多语言的分布式定时任务管理平台

它的核心功能就是“自动化”。对于我们普通用户,它最大的用处包括:

  • 自动签到薅羊毛:JD 农场、淘宝淘金币、饿了么吃货豆等。

  • 自动维护:云盘自动签到扩容、B 站自动刷经验升级。

  • 信息聚合:监控商品价格、股市波动或天气变化,并推送到手机。

2. 部署过程

第一步:部署非常简单,Docker Compose (推荐,方便管理)

  1. 创建目录

    mkdir -p /opt/qinglong
    cd /opt/qinglong
    
  2. 创建 docker-compose.yml 文件

    nano docker-compose.yml
    
  3. 填入以下内容

    version: '3'
    services:
      qinglong:
        image: whyour/qinglong:latest
        container_name: qinglong
        restart: unless-stopped
        tty: true
        ports:
          - 5700:5700
        volumes:
          - ./data:/ql/data
    
  4. 启动

    docker compose up 

第二步:配置 Systemd 服务文件

我们创建一个服务文件,告诉系统:“开机时帮我运行 docker compose up,关机时运行 docker compose down”。

  1. 创建文件

    Bash

    sudo nano /etc/systemd/system/qinglong.service
    
  2. 写入以下内容(假设你的 docker-compose.yml 在 /opt/qinglong/ 目录下,如果不是请修改路径)

    Ini, TOML

    [Unit]
    Description=Qinglong Panel (Docker Compose)
    # 等 Docker 服务启动后再启动这个
    Requires=docker.service
    After=docker.service
    
    [Service]
    Type=oneshot
    RemainAfterExit=yes
    
    # 指向你的工作目录
    WorkingDirectory=/opt/qinglong
    
    # 启动命令:自动拉取最新镜像并后台启动
    ExecStart=/usr/bin/docker compose up -d
    
    # 停止命令:优雅停止容器
    ExecStop=/usr/bin/docker compose down
    
    # 发生错误不自动重启(避免网络问题导致无限重启死循环),由 Docker 自身接管
    # 只要容器里写了 restart: unless-stopped,Docker 会自己负责维稳
    
    [Install]
    WantedBy=multi-user.target
    
  3. 保存退出Ctrl+O -> Enter -> Ctrl+X


第三步:启动并设置开机自启

Bash

# 1. 重载系统服务
sudo systemctl daemon-reload

# 2. 设置开机自启
sudo systemctl enable qinglong

# 3. 立即启动服务 (这一步会开始拉取镜像,可能需要一点时间)
sudo systemctl start qinglong

# 4. 查看状态
sudo systemctl status qinglong

第四步:nginx实现https访问

最后一步,为了能用我的域名优雅地访问,我在 Nginx 里加了一段反代配置,通过 HTTPS 访问,安全性拉满。

sudo vim /etc/nginx/sites-available/qinglong.conf

内容为

server {
    listen 5701 ssl;
    server_name www.yanchang.cc;

    ssl_certificate     /etc/nginx/ssl/www.yanchang.pem;
    ssl_certificate_key /etc/nginx/ssl/www.yanchang.key;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    ssl_buffer_size 4k;
    # 设置为 0 表示“不限制大小”,或者设置为具体数值如 10240m (10GB)
    client_max_body_size 0;
    location / {
        proxy_pass http://127.0.0.1:5700;   # 青龙服务的端口
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        # 关键配置:避免大文件/预览被掐掉
        proxy_buffering off;
        proxy_request_buffering off;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        # 大文件超时设置
        proxy_connect_timeout 300;
        proxy_send_timeout 300;
        proxy_read_timeout 300;
        send_timeout 300;
    }
}

启用配置

sudo ln -s /etc/nginx/sites-available/qinglong.conf /etc/nginx/sites-enabled/
sudo nginx -t   # 检查配置有没有写错
sudo systemctl reload nginx

放行端口


sudo ufw allow 5701

3.踩坑实录:

坑一:docker网络问题

yanchang@yanchang-Home-Server:/opt/qinglong$ docker compose up -d
WARN[0001] /opt/qinglong/docker-compose.yml: the attribute `version` is obsolete, it will be ignored, please remove it to avoid potential confusion 
[+] Running 1/1
 ✘ qinglong Error Get "https://registry-1.docker.io/v2/": proxyconnect tcp: dial tcp ...                 1.5s 
Error response from daemon: Get "https://registry-1.docker.io/v2/": proxyconnect tcp: dial tcp 127.0.0.1:7890: connect: connection refused

或者说

yanchang@yanchang-Home-Server:/opt/qinglong$ docker compose up -d
WARN[0000] /opt/qinglong/docker-compose.yml: the attribute `version` is obsolete, it will be ignored, please remove it to avoid potential confusion 
[+] Running 1/1
 ✘ qinglong Error Get "https://registry-1.docker.io/v2/": net/http: request canceled ...                15.6s 
Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)

解决方案

情况一:你其实没有在服务器上开代理(最常见)

如果你这台服务器上并没有运行 Clash/v2ray 等工具,或者你不想让 Docker 走代理,你需要把这个过期的代理配置删掉

  1. 找到代理配置文件 Docker 的代理配置通常藏在 Systemd 的文件夹里。运行这行命令找出来:

    grep -r "7890" /etc/systemd/system/
    

    通常会显示在 /etc/systemd/system/docker.service.d/http-proxy.conf 或类似的文件里。

  2. 删除它 假设找到的是上面那个路径(如果不是,请替换为你搜到的路径):

    sudo rm -rf /etc/systemd/system/docker.service.d/http-proxy.conf
    # 或者直接把整个文件夹删了(如果里面没别的配置)
    sudo rm -rf /etc/systemd/system/docker.service.d/
    
  3. 重启 Docker 这一步必须做,否则配置不生效。

    sudo systemctl daemon-reload
    sudo systemctl restart docker
    
  4. 再次尝试部署

    docker compose up -d
    

情况二:你在国内,直连拉不动,必须配镜像源

删了代理后,因为众所周知的网络原因,你可能会遇到“拉取超时” (image pull backofftimeout)。这时候你需要配置国内镜像源

  1. 编辑 Docker 配置文件

    sudo nano /etc/docker/daemon.json

    (如果文件不存在,nano 会自动创建一个空的)

  2. 写入可用的镜像源 目前很多国内源都挂了,推荐使用这就几个目前还坚挺的(或者你有阿里云加速器更好):

    {
      "registry-mirrors": [
        "https://docker.m.daocloud.io",
        "https://huecker.io",
        "https://dockerhub.timeweb.cloud",
        "https://noohub.ru"
      ],
      "dns": ["223.5.5.5", "119.29.29.29", "1.1.1.1", "8.8.8.8"]
    }
  3. 保存并重启

    • Ctrl+O 保存 -> Enter -> Ctrl+X 退出。

    • 重启 Docker:

      Bash

      sudo systemctl daemon-reload
      sudo systemctl restart docker
      
  4. 再试一次

    Bash

    docker compose up -d
    

QQ 邮箱通知配置面板跑起来了,下一步就是配置 消息推送(Notification)。我选择了最通用的 Email 方式,想通过 QQ 邮箱把任务日志发给我自己。

坑二:Invalid login: 535 Login fail

一开始我直接填入了我的 QQ 号和QQ 登录密码,结果直接报错:

Invalid login: 535 Login fail. Account is abnormal, service is not open...

原因分析: 人间应该是邮件服务商应该是smtp.qq.com 或者类似的服务地址

解决方案:输入类似于下面的smtp.qq.com (错的)

坑三:connect ECONNREFUSED 127.0.0.1:587

解决了密码问题,我满怀信心地再次测试,结果终端爆出了更离谱的错误:

connect ECONNREFUSED 127.0.0.1:587

排查过程: 我很纳闷,明明我是要连 smtp.qq.com,为什么报错提示说我连的是 127.0.0.1(本地回环地址)?这意味着程序根本没去连腾讯的服务器,而是自己在连自己。

我检查了配置文件(或 Nodemailer 配置项):

  • User: xxxx@qq.com

  • Pass: (授权码)

  • Service: smtp.qq.com (我当时手动填了这个)

原因分析: 经过查阅 Nodemailer 的文档(青龙面板底层发邮件用的库),发现了一个配置逻辑陷阱:

  • 如果配置项叫 service(服务名),它期望的是一个预设的关键词(比如 QQ, Gmail, 163)。

  • 一旦你填了 QQ,它会自动帮你把 Host 设为 smtp.qq.com,端口设为 465

  • 但是,我在 service 这一栏填了 smtp.qq.com。程序无法识别这个“服务名”,于是它回退到了默认配置,即尝试连接 localhost

解决方案: 将配置项修改如下:

  • emailService (服务名): 修改为 QQ (或者 qq),不要smtp.qq.com

  • emailUser: xxxx@qq.com

  • emailPass: (你的授权码)

或者,如果支持自定义 Host,应该清空 Service 字段,显式指定 Host 为 smtp.qq.com 且 Port 为 465 (Secure: true)。但直接用 Service 别名是最稳的。

4. 总结

修改配置后,点击测试,邮件秒收!

这次折腾让我再次意识到:

  1. RTFM (Read The Manual):看清楚配置项是要求填“服务名(Service)”还是“主机名(Host)”,这两者在底层实现上完全不同。

  2. 安全意识:任何涉及第三方登录的地方,现在基本都需要 App Password 或授权码,直接用密码硬怼的时代已经过去了。

现在,我的青龙面板已经开始稳定运行,接下来准备去 GitHub 上找一些有趣的脚本(比如自动签到、博客数据库备份等)挂上去,让服务器真正为我“打工”。


评论