从b站自动录播到部署nextcloud与优化

最后更新于 2025-07-26 31 次阅读


AI 摘要

本文记录了如何在服务器上部署B站录播系统bililivego和Nextcloud,以及进行相关的优化配置。首先,安装bililivego用于录制B站和虎牙的直播视频,便于后续管理。接下来,介绍了使用1panel和Nginx进行Docker应用的安装流程,包括域名注册、反向代理配置及SSL证书申请。 在部署Nextcloud时,做了针对上传限制和超时时间的配置,并加强了安全性。文中提到通过挂载bililivego录播文件夹到Nextcloud,从而实现便捷的文件管理。此外,还讨论了在Nextcloud中安装Talk和Office应用,配置高性能后端服务以优化多人视频通话功能,以及在线文档处理。 在遇到Challenges时,例如Let’s Encrypt证书申请失败,通过反复排查最终解决了问题。整篇文章不仅详细记录了操作步骤,还反映出在部署过程中所积累的经验和对于问题的思考。

服务器闲着也是闲着,不如多部署点服务榨干空余的内存

bililivego

首先是安装了一个1panel软件商店看到的bilibilli录播系统 bililivego ,可以录制很多国内平台,目前使用了虎牙和B站,还是很稳定的,还可以自动在录制结束后把flv格式转换成mp4

顺便记录一下用1panel+nginx快速安装一个docker应用的流程吧,现在已经非常熟练了。

域名注册

首先要注册域名,A记录指向IP地址

docker部署应用或者1panel商店点击安装后,不需要向外网暴露接口,我们直接用nginx把域名的访问反向代理到内网的127.0.0.1:xxxxx接口

编写nginx配置之前,先关闭nginx关掉它对80和443接口的监听,我们先用certbot把ssl证书申请下来,当然有不关闭nginx的优雅一点的方法,比如用docker什么的,但我这个方法我实在太熟练了不想学了

nginx -t # check configuration syntax
systemctl stop nginx # stop nginx

sudo certbot certonly --standalone -v -d your.domain.name.com
# certificates will be saved to /etc/letsencrypt/live/

systemctl start nginx

然后opt/nginx/sites-available 里面创建一个域名.conf文件配置反向代理,一个最基础的架构:

# HTTP → HTTPS 重定向
server {
    listen 80;
    server_name blog.domain.com;
    return 301 https://hostrequest_uri;
}

# HTTPS 主配置(先不用 ssl_certificate,交给 Certbot 临时写入)
server {
    listen 443 ssl http2;
    server_name blog.domain.com;

    ssl_certificate     /etc/letsencrypt/live/domain/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/domain/privkey.pem;

    location / {
        proxy_pass       http://127.0.0.1:12345;
        proxy_set_header Host            host;
        proxy_set_header X-Real-IPremote_addr;
        proxy_set_header X-Forwarded-For proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Protoscheme;
    }
}

然后把文件软连接到enable文件夹,检查语法,重启nginx

sudo ln -s /etc/nginx/sites-available/your.domain.com.conf /etc/nginx/sites-enabled/

nginx -t
systemctl restart nginx

基本流程就是这样,这几天用的太多了,不过一些应用还是要适当的根据需要调整nginx配置,增加一些规则,比如下面的nextcloud


然后我就想了想,我不能每次看录播都进1panel后台里点出来看啊, 有点不优雅了,一开始想的是作为一个本地网盘挂载到Alist上, 但是效果不好, Alist也不是干这个用的而且这个时候已经暴雷了, 我实际上也用不到很多功能, 遂删掉了整个docker, 留下网盘的二级域名重新想起了之前部署过的nextcloud

Nextcloud

基本部署没有区别, 安装后发现相比几年前更新的挺多的, 多了很多功能, 有各种app说不定可以用一下

有几点需要注意,首先就是nginx经典问题默认限制上传大小和超时时间,然后加一个HSTS头提升安全性,让nextcloud少一个安全警告

    client_max_body_size 10G;
    client_body_timeout 600s;

    # HSTS
    add_header Strict-Transport-Security "max-age=15552000; includeSubDomains" always;

还有其他性能优化的操作,如果过一段时间我有小文件同步需求/大量文件操作了, 我就把默认的sqlite换了, 系统也是推荐更换成性能更好的数据库的

好,继续主线任务,为了能安心观看管人录播

一开始是想写个脚本, 自动从文件夹中上传到nextcloud的webdev中, 但是感觉明明很简单的逻辑, 越写越复杂, 改了好几版跑通了发现同步消耗的流量太大了, 而且流量完全是左手倒右手多少有点不环保了, 于是暂停了脚本的定时运行, 本着第一性原理的思路我突然意识到我就是个傻逼, 为啥不继续直接挂载本地的外部存储上去呢

于是把bililivego录播文件夹挂载到nextcloud的容器中, 挂载体验很好, 文件打开都很顺利搞定了之后就可以移动设备下载nextcloud应用管理文件,然后用比如MX player播放里面的视频,支持更多锁屏后台播放之类的功能

比较折腾时间的是搞talk和office两个应用, 虽然说不算难, 但是也是我第一次接触这种本机应用借用一个其他域名下的后端服务的架构,对着ChatGPT和文档学习nginx各种新规则

Talk App

第一眼看到,感觉实现度还挺高的, 可以实现实时聊天群组和视频通话, 借助自己配置的高性能后端(HPB)服务, 一个完全部署在个人服务器上的功能齐全美观聊天系统还是很吸引我的

但是官方推荐自己部署一个开源的HPB(high performance backend)服务,能在多人视频通话的时候显著降低性能消耗,安装流程如下,参考Quick install - Nextcloud Talk API documentation

1. 生成三条密钥

随便找一台机器,生成三条密钥

TURN_SECRET=(openssl rand -hex 32)
SIGNALING_SECRET=(openssl rand -hex 32)
INTERNAL_SECRET=(openssl rand -hex 32)
echo "INTERNAL_SECRET:INTERNAL_SECRET" 
echo "SIGNALING_SECRET: SIGNALING_SECRET" 
echo "TURN_SECRET:TURN_SECRET" 

然后把输出的三串长十六进制字符串记下来,等下要填到 Docker 容器和 Nextcloud 设置里。

  • TURN_SECRET 用于 TURN 中继服务器的鉴权
  • SIGNALING_SECRET 用于信令服务器和 Nextcloud 之间的认证
  • INTERNAL_SECRET 用于容器内部组件的安全通信

2. 启动HPB容器

ssh登录服务器

docker run --name nextcloud-talk-hpb \
  --restart=always -d \
  -e NC_DOMAIN=nextcloud.domain.com \
  -e TALK_PORT=3478 \
  -e TURN_SECRET=<TURN_SECRET> \
  -e SIGNALING_SECRET=<SIGNALING_SECRET> \
  -e INTERNAL_SECRET=<INTERNAL_SECRET> \
  -p 127.0.0.1:8081:8081 \          # 信令服务器对外只在本机可访问
  -p 0.0.0.0:3478:3478/udp \        # TURN UDP 
  -p 0.0.0.0:3478:3478/tcp \        # TURN TCP 
  ghcr.io/nextcloud-releases/aio-talk:latest

3. 为信令服务器设置域名 & Nginx 反代

a) 准备一个新的域名或子域名指向服务器
  • 可以使用signaling.原域名,并在 DNS 管理后台添加一条 A 记录,指向你的服务器 IP。
  • 等 DNS 生效(几分钟到半小时)。
b) 在 Nginx 下添加反代配置

编辑新的域名的反代配置

server {
    listen 443 ssl http2;
    server_name doamin.doamin.doamin.com;

    # 证书
    ssl_certificate     /etc/letsencrypt/live/doamine/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/doamin/privkey.pem;

    # 代理到本地 8081(信令)
    location / {
        proxy_pass       http://127.0.0.1:8081;
        proxy_http_version 1.1;
        proxy_set_header Host            host;
        proxy_set_header X-Real-IPremote_addr;
        proxy_set_header X-Forwarded-For proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Protoscheme;
        # WebSocket 需要以下两行
        proxy_set_header Upgrade         $http_upgrade;
        proxy_set_header Connection      "upgrade";
    }
}

然后启用并重载 Nginx:

ln -s /etc/nginx/sites-available/domain.conf /etc/nginx/sites-enabled/
nginx -t && systemctl reload nginx

4. 在 Nextcloud 后台填写 HPB & TURN 配置

没问题的话配置服务器信息就好了

  1. 以管理员身份,进入 “设置” →“管理” →“Talk”
  2. 找到 “高性能后端” 部分,填写signaling secret

  3. 找到 “TURN 服务器” 配置,点击 添加,按下面填:

    • 服务器:域名:3478
    • 密码/Secret:你生成的
    • 协议:同时选 UDP 和 TCP
    • 类型:turn

  • Nextcloud Core 会把自己的 P2P 流量发给信令服务,信令再协调点对点或转给 TURN
  • TURN 中继用于在防火墙/NAT 环境下保持媒体流

对了,记得开放防火墙3478端口的UDP/TCP,我刚刚才发现自己没开放,这不影响核心功能的运行。“是的,TURN 服务器的 3478 端口(默认)在生产环境下通常需要开放,尤其当用户端 在 NAT、防火墙之后,你希望 提高连接成功率(特别是 WebRTC 相关服务,如 HPB、Talk、Jitsi)。”

ChatGPT如是说。

Nextcloud Office App

这是一个类似HPB的架构,用来辅助app进行文档处理和编辑,安装参考官方文档Collabora 在线 SDK 文档 - 欢迎 --- Collabora Online SDK Documentation - Welcome
尤其参考:代理设置 — SDK https://sdk.collaboraonline.com/ 文档 --- Proxy settings — SDK https://sdk.collaboraonline.com/ documentation

基本还是按照刚才的流程来,先注册一个子域名,然后docker安装后端,nginx代理过来,域名填写进app管理界面就好了

测试的时候,域名填写测试为绿色对勾,然后文件界面可以正常打开文档两项都满足就基本OK了

我安装的时候遇到了大问题,我真没想到letsencrypt的服务器出问题了,导致域名不能注册,我反复开关nginx,问gpt分析log才意识到这个问题,第二天状态恢复就没问题了,然后nginx多参考官方文档,规则多一些

我贴出我的docker启动参数

# 先删掉旧容器,我之前装了好几次所以删掉
docker rm -f collabora

docker run -d \
  --name collabora \
  --restart always \
  -e domain=domain\\.domain\\.com\|domain2\\.domain\\.domain\\.com \
  -e username=admin \
  -e password=yourpassword \
  -e extra_params="--o:ssl.enable=false \
                   --o:ssl.termination=true \
                   --o:server_name=domain.domain.domain.com" \
  -p 127.0.0.1:9980:9980 \
  collabora/code

和nginx配置文件

# 80 → 443 重定向(把 http 改成 https)
server {
    listen 80;
    server_name domain.domain.domain.com;
    return 301 https://hostrequest_uri;
}

server {
    listen 443 ssl http2;
    server_name domain.domain.domain.com;

    ssl_certificate     /etc/letsencrypt/live/domain.domain.domain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/domain.domain.domain.com/privkey.pem;

    # HSTS
    add_header Strict-Transport-Security "max-age=15552000; includeSubDomains" always;

    client_max_body_size 10G;
    client_body_timeout 600s;

    # 共用的一行:保持协议给后端
    proxy_set_header X-Forwarded-Proto scheme;

    # 主 WebSocket(实时协作)
    location ~ ^/cool/(.*)/ws {
        proxy_pass http://127.0.0.1:9980;
        proxy_http_version 1.1;
        proxy_set_header Upgrade http_upgrade;
        proxy_set_header Connection "Upgrade";
        proxy_set_header Hosthost;
        proxy_read_timeout 36000s;
    }

    # WOPI 发现接口
    location ^~ /hosting/(discovery|capabilities) {
        proxy_pass http://127.0.0.1:9980;
        proxy_set_header Host host;
    }

    # 其它静态/下载/管理接口
    location ^~ /loleaflet { proxy_pass http://127.0.0.1:9980; proxy_set_header Hosthost; }
    location ~ ^/(c|l)ool { proxy_pass http://127.0.0.1:9980; proxy_set_header Host host; }
    location ^~ /cool/adminws {
        proxy_pass http://127.0.0.1:9980;
        proxy_http_version 1.1;
        proxy_set_header Upgradehttp_upgrade;
        proxy_set_header Connection "Upgrade";
        proxy_set_header Host host;
        proxy_read_timeout 36000s;
    }

    # 兜底
    location / {
        proxy_pass http://127.0.0.1:9980;
        proxy_set_header Hosthost;
    }
}

没啥了,nextcloud系统里还有一些安全警告,等我解决解决再编辑文章