MoreRSS

site iconLala | 荒岛修改

一个应用分享、教程类的博客,主要是那些需要自部署的。
请复制 RSS 到你的阅读器,或快速订阅到 :

Inoreader Feedly Follow Feedbin Local Reader

Lala | 荒岛的 RSS 预览

Docker部署PowerDNS Authoritative Server

2026-01-19 17:12:01

我几年前写过一篇部署PowerDNS权威服务器的文章,最近需要搭建一个,然后翻出来看了下发现写的不够完善,而且纯手动部署太麻烦了,遂决定重新记录下使用Docker部署的步骤,另外主要补充一下:主从同步、DNSSEC的配置。

首先还是需要到域名注册商添加胶水记录(Glue Record),我使用的是spaceship,这家的用户面板不叫胶水记录,叫个人名称服务器,说实话有时候挺烦这种自己瞎起名字的行为。。害我在他们的这个面板里面找半天:

由于spaceship的限制,这里至少要添加2条胶水记录,如果你不打算部署2台服务器(主从同步),可以把两条记录的值都指向同一台服务器的IP,之后更改域名的NS服务器为刚设置的“个人名称服务器”:

本文示例:91.99.72.72为主(primary)服务器,49.13.168.202为从(secondary)服务器,在两台服务器内都安装Docker:

apt -y update
apt -y install curl
curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh

在主(primary)服务器创建目录新建compose文件:

mkdir /opt/pdns-mysql && cd /opt/pdns-mysql && nano docker-compose.yml

写入如下内容,需要修改的地方写了注释:

services:
  mariadb:
    image: mariadb:lts
    container_name: pdns-mariadb
    restart: unless-stopped
    networks:
      - pdns
    environment:
      - MARIADB_ROOT_PASSWORD=setyourpdnsmasterdbpassword # 设置数据库ROOT用户的密码
    volumes:
      - ./mariadb-data:/var/lib/mysql:Z
    healthcheck:
      test: ['CMD', 'healthcheck.sh', '--connect', '--innodb_initialized']
      timeout: 10s
      retries: 5

  phpmyadmin:
    image: phpmyadmin
    restart: unless-stopped
    networks:
      - pdns
    ports:
      - 8988:80
    environment:
      - PMA_HOST=mariadb

  pdns-master:
    image: pschiffe/pdns-mysql:latest
    container_name: pdns-master
    hostname: ns1.ohsb.cc # 设置PDNS主服务器的主机名,务必与你的胶水记录保持一致
    restart: unless-stopped
    networks:
      pdns:
        ipv4_address: 172.89.64.74
    depends_on:
      mariadb:
        condition: service_healthy
    environment:
      - PDNS_gmysql_host=mariadb
      - PDNS_gmysql_port=3306
      - PDNS_gmysql_user=root
      - PDNS_gmysql_password=setyourpdnsmasterdbpassword # 设置连接数据库ROOT用户的密码
      - PDNS_gmysql_dbname=powerdns
      - PDNS_gmysql_dnssec=yes
      - PDNS_primary=yes
      - PDNS_api=yes
      - PDNS_api_key=setyourpdnsapikey # 设置PDNS API KEY
      - PDNS_webserver=yes
      - PDNS_webserver_address=0.0.0.0
      - PDNS_webserver_allow_from=0.0.0.0/0,::/0
      - PDNS_webserver_password=setyourwebserverpassword # 设置PDNS WEB密码
      - PDNS_version_string=anonymous
      - PDNS_default_ttl=1500
      - PDNS_allow_axfr_ips=49.13.168.202 # 设置为从服务器的公网IP
      - PDNS_only_notify=49.13.168.202 # 设置为从服务器的公网IP
    ports:
      - '53:53'
      - '53:53/udp'
      - '8081:8081'
    volumes:
      - /etc/localtime:/etc/localtime:ro

  pdns-admin:
    image: pschiffe/pdns-admin
    container_name: pdns-admin
    restart: unless-stopped
    depends_on:
      mariadb:
        condition: service_healthy
    networks:
      - pdns
    ports:
      - '8989:8080'
    environment:
      - PDNS_ADMIN_SQLA_DB_HOST=mariadb
      - PDNS_ADMIN_SQLA_DB_PORT=3306
      - PDNS_ADMIN_SQLA_DB_USER=root
      - PDNS_ADMIN_SQLA_DB_PASSWORD=setyourpdnsmasterdbpassword # 设置连接数据库ROOT用户的密码
      - PDNS_ADMIN_SQLA_DB_NAME=powerdnsadmin
      - PDNS_API_URL="http://pdns-master:8081/"
      - PDNS_API_KEY=setyourpdnsapikey # 设置连接到PDNS Master的API KEY
      - PDNS_VERSION=5.0
    volumes:
      - /etc/localtime:/etc/localtime:ro

networks:
  pdns:
    ipam:
      config:
        - subnet: 172.89.0.0/16
          gateway: 172.89.0.1

在从(secondary)服务器创建目录新建compose文件:

mkdir /opt/pdns-slave && cd /opt/pdns-slave && nano docker-compose.yml

写入如下内容,需要修改的地方写了注释:

services:
  mariadb:
    image: mariadb:lts
    container_name: pdns-mariadb
    restart: unless-stopped
    networks:
      - pdns
    environment:
      - MARIADB_ROOT_PASSWORD=setyourpdnsmasterdbpassword # 设置数据库ROOT用户的密码
    volumes:
      - ./mariadb-data:/var/lib/mysql:Z
    healthcheck:
      test: ['CMD', 'healthcheck.sh', '--connect', '--innodb_initialized']
      timeout: 10s
      retries: 5

  phpmyadmin:
    image: phpmyadmin
    restart: unless-stopped
    networks:
      - pdns
    ports:
      - 8988:80
    environment:
      - PMA_HOST=mariadb

  pdns-slave:
    image: pschiffe/pdns-mysql:latest
    container_name: pdns-slave
    hostname: ns2.ohsb.cc # 设置PDNS从服务器的主机名,务必与你的胶水记录保持一致,从服务器必须设置,否则无法与主服务器同步!
    restart: unless-stopped
    networks:
      pdns:
        ipv4_address: 172.89.64.75
    depends_on:
      mariadb:
        condition: service_healthy
    environment:
      - PDNS_gmysql_host=mariadb
      - PDNS_gmysql_port=3306
      - PDNS_gmysql_user=root
      - PDNS_gmysql_password=setyourpdnsmasterdbpassword # 设置连接数据库ROOT用户的密码
      - PDNS_gmysql_dbname=powerdnsslave
      - PDNS_gmysql_dnssec=yes
      - PDNS_secondary=yes
      - PDNS_autosecondary=yes
      - PDNS_webserver=yes
      - PDNS_webserver_address=0.0.0.0
      - PDNS_webserver_allow_from=0.0.0.0/0,::/0
      - PDNS_webserver_password=setyourwebserverpassword # 设置PDNS WEB密码
      - PDNS_version_string=anonymous
      - PDNS_default_ttl=1500
      - PDNS_disable_axfr=yes
      - PDNS_allow_notify_from=91.99.72.72 # 设置为主服务器的公网IP
      - SUPERMASTER_IPS=91.99.72.72 # 设置为主服务器的公网IP
    ports:
      - '53:53'
      - '53:53/udp'
      - '8081:8081'
    volumes:
      - /etc/localtime:/etc/localtime:ro

networks:
  pdns:
    ipam:
      config:
        - subnet: 172.89.0.0/16
          gateway: 172.89.0.1

配置项太多,这里我也懒得详细说明了,打字太累= =为了方便理解,我没有给敏感内容(域名、服务器IP等信息)脱敏,这套配置是我目前从测试服务器1:1复制下来的。只要你按照注释来配置,肯定能跑起来的,并且功能都是正常的。

启动主、从服务器的所有服务:

docker compose up -d

配置DNSSEC,首先打开PowerDNS-Admin(91.99.72.72:8989)注册一个账号,第一个注册的账号自动成为管理员。

在PowerDNS-Admin添加Zone,Zone Name:你的域名,Zone Type选择:Primary,一定要选择Primary,Primary,Primary!

按如图所示添加2条NS记录以及2条A记录:

启用DNSSEC:

会回显类似如图的信息:

DNSKEY不用管,你可以简单理解为这是公钥。我们需要注意的是DS下面的内容,这实际上代表两条DS记录:

41411 13 2 48e9394892ee2da8...
41411 13 4 9a9382822735e648...

41411是“密钥标签”,13是“算法”,2和4是“摘要类型”,后面一长串是“摘要”。按照这个格式在spaceship内添加两条DS记录:

实际上只添加一条DS记录也是可以的,这个取决于你自己。检查DNSSEC是否生效,可以安装如下软件包:

apt install bind9-dnsutils

测试:

delv ns1.ohsb.cc
delv ns2.ohsb.cc

如果输出的内容有fully validated,则说明DNSSEC工作正常:

检查主从同步是否正常,可以使用compose内部署的phpmyadmin登录到服务器数据库,查看两个数据库内的数据是否一致:

总结下部署过程中遇到的问题。从服务器无法同步,报错:

Unable to find backend willing to host ohsb.cc for potential autoprimary 91.99.72.72. Remote nameservers

这是从服务器的Docker容器没有设置正确的hostname导致的,见此issue

在spaceship设置了DNSSEC的DS记录后,spaceship面板的DNS传播状态异常。这是由于PowerDNS内的NS记录配置错误导致的。我在spaceship配置了两个NS服务器,那么PowerDNS-Admin内也应该有两条NS记录,必须要保持一致。

参考资料:

https://hub.docker.com/r/pschiffe/pdns-mysql
https://github.com/pschiffe/docker-pdns/blob/master/docker-compose-mysql.yml
https://doc.powerdns.com/authoritative/settings.html
https://doc.powerdns.com/authoritative/backends/generic-mysql.html#gmysql-dnssec

自建开源SSO(单点登录)身份验证服务:VoidAuth

2026-01-12 16:49:46

VoidAuth是一款开源的SSO身份验证和用户管理软件,可为您的自托管应用程序保驾护航,并支持诸多实用功能,例如Passkey登录、邀请注册、自助注册、电子邮件支持等等。

VoidAuth特点(摘自项目文档):

🌐 OpenID Connect (OIDC) Provider
🔄 Proxy ForwardAuth
👤 User and Groups Management
📨 User Self-Registration and Invitations
🎨 Customizable (Logo, Title, Theme Color, Email Templates)
🔑 Multi-factor Authentication, Passkeys, and Passkey-Only Accounts
📧 Secure Password Reset with Email Verification
🔒 Encryption-At-Rest with Postgres or SQLite Database

其实类似VoidAuth这样开源并且支持自建的SSO程序有很多,在接触VoidAuth之前,我部署过很多个,这里就不详细说了。我只想简单谈一下个人体验,我用过的这些软件里面或多或少都有这样的问题:安装和配置非常复杂、程序本身设计的过于臃肿,对于个人自托管爱好者而言(个人用户),甚至有很多用不到的功能,而VoidAuth完美的解决了上述问题,它非常轻量且易于使用。

VoidAuth最让我觉得好用的一个功能是ProxyAuth(转发认证),我自建的这些服务里面并不是所有都原生支持OIDC的,对于那些不支持OIDC的应用程序,我现在可以通过ProxyAuth来实现SSO,真正做到了一个账号登录所有服务。

这篇文章记录下VoidAuth安装以及OIDC、ProxyAuth的配置。

安装Docker:

apt -y update
apt -y install curl
curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh

创建目录新建compose文件:

mkdir /opt/voidauth && cd /opt/voidauth && nano docker-compose.yml

写入如下内容:

services:
  voidauth: 
    image: voidauth/voidauth:latest
    restart: unless-stopped
    ports:
      - "127.0.0.1:3001:3001"
    volumes:
      - ./voidauth/config:/app/config
    environment:
      APP_URL: https://voidauth.example.com # 设置你的域名
      APP_PORT: 3001
      STORAGE_KEY: JW8G+gr2sa8vuStV2F/6rR7VeqvarijvogwvE8jIDD0= # 使用openssl rand -base64 32命令生成
      DB_PASSWORD: yourdbpassword # 设置数据库密码
      DB_HOST: voidauth-db
      SIGNUP: false
      SIGNUP_REQUIRES_APPROVAL: true
      ENABLE_DEBUG: false
    depends_on:
      voidauth-db:
        condition: service_healthy

  voidauth-db:
    image: postgres:18
    restart: unless-stopped
    environment:
      POSTGRES_PASSWORD: yourdbpassword # 设置数据库密码
    volumes:
      - db:/var/lib/postgresql/18/docker
    healthcheck:
      test: "pg_isready -U postgres -h localhost"

volumes:
  db:

启动:

docker compose up -d

默认的管理员账号与密码可通过查看容器日志获取:

docker compose logs -f

注:仅容器第一次启动会输出管理员账号与密码,后续不再显示,务必保存好。

配置Ferron反向代理:

nano /etc/ferron.kdl

写入如下内容:

voidauth.example.com {
   header "Access-Control-Allow-Origin" "*"
   proxy "http://127.0.0.1:3001/"
}

重载Ferron:

systemctl reload ferron

现在来配置ProxyAuth,让不支持OIDC的服务接入VoidAuth,实现单点登录。开始前先简单介绍一下这个功能是怎么实现的。

我现在的自托管环境,基本都是用Docker启动的服务,直接暴露服务的地址和端口,例如:127.0.0.1:5030,然后通过主机的Web Server反向代理127.0.0.1:5030,实现域名绑定、SSL证书申请、服务对外的发布(公网访问)。

VoidAuth的ProxyAuth其实就是ForwardAuth(转发认证),这个功能是需要与反向代理配合使用的,也就是说需要Web Server软件支持才行。我们配置Web Server,让服务在公网访问的时候先跳转到VoidAuth进行身份认证,认证完成后再跳转回源服务,这就是大致的流程。

现在主流的NGINX、Caddy、Traefik Web Server都是支持ForwardAuth的,如果您使用的是这类软件,可以参考VoidAuth官方的文档来配置。我目前使用的是Ferron Web Server,官方没有相应的文档,所以这里我只记录与Ferron相关的内容。

编辑Ferron配置文件:

nano /etc/ferron.kdl

加入如下配置,建议直接配置在全局(*):

* {
    trust_x_forwarded_for #true
}

根据Ferron 2.2.1版本的发布记录可以得知,这将让Ferron在默认情况下信任“X-Forwarded-For”标头,且不再覆盖X-Forwarded-Host、X-Forwarded-Proto标头,这个配置非常关键,没有这个配置Ferron将无法与VoidAuth配合使用。

假设我要保护的服务域名是:slskd.example.com,写入如下配置:

slskd.example.com {
   auth_to "https://voidauth.example.com/api/authz/forward-auth"
   auth_to_no_verification #false
   auth_to_copy "Remote-User" "Remote-Email" "Remote-Name" "Remote-Groups"
   proxy "http://127.0.0.1:5030/"
}

重载Ferron使新配置生效:

systemctl reload ferron

在VoidAuth添加需要保护的服务域名:slskd.example.com:

这样就配置好了,是不是特别简单,当用户访问slskd.example.com时,会先跳转到VoidAuth进行身份认证。

现在简单介绍一下OIDC的配置,您在VoidAuth的管理员后台点击OIDC Apps,可以查看对接服务需要用到的各种OIDC Endpoints:

然后您可以在VoidAuth的管理员后台创建一个OIDC App,这里我以Arcane Docker容器管理平台为例:

Arcane配置:

这里需要注意的是适用范围需要加上:groups,管理员声明需要配置为:groups,值配置为:auth_admins。因为我没有在VoidAuth创建新的管理员账号,默认的管理员账号(auth_admin)所属的组就是auth_admins,这样配置就可以让您以管理员的身份通过OIDC登录到Arcane。

最后,也许您可以看看VoidAuth官方的文档,他们提供了众多服务的OIDC接入指南可供参考。

Arcane:高颜值的Docker容器管理平台

2026-01-10 11:12:33

作为一个颜控,不得不说这个Arcane的前端设计的是真好看,尤其是在设置内打开了玻璃特效后,就一个词形容:精美。

其实这个项目刚出来没多久我就部署过,好像当时Gayhub的Star还没过500,确实哈,当时这个项目的完成度很低,而且有很多BUG,前端也没有现在好看。

但是但是但是,自从1.0版本作者把后端用Go重写后,这个项目似乎步入正轨了,我最近又重新部署了一遍,试用了一下,发现这个项目确实比之前强太多了,用在生产环境完全没问题。

当然就目前而言,我个人认为Arcane还是有一些小瑕疵的,比如中文翻译,有些地方翻译的不准确,但这问题不大。目前最让我不爽的是还不支持compose build指令,这意味着只能使用预构建的image,我有点纳闷的是前两天发布的新版本都支持Git Sync了为啥还不支持compose build=-=,但是看这个issue应该是计划上了,如果需要的人多,作者会考虑开发。

安装Docker:

apt -y update
apt -y install curl
curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh

创建目录新建compose文件:

mkdir /opt/arcane && cd /opt/arcane && nano docker-compose.yml

写入如下内容:

services:
  arcane:
    image: ghcr.io/getarcaneapp/arcane:latest
    container_name: arcane
    restart: unless-stopped
    environment:
      - APP_URL=https://arcane.example.com
      - PUID=1000
      - PGID=1000
      - ENCRYPTION_KEY=
      - JWT_SECRET=
    ports:
      - '127.0.0.1:3552:3552'
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - arcane-data:/app/data

volumes:
  arcane-data:

ENCRYPTION_KEY、JWT_SECRET可使用如下命令启动一个临时容器(运行完毕自动删除)生成:

docker run --rm ghcr.io/getarcaneapp/arcane:latest /app/arcane generate secret

启动:

docker compose up -d

配置Ferron反向代理:

nano /etc/ferron.kdl

写入如下内容:

arcane.example.com {
   proxy "http://127.0.0.1:3552/"
}

重载Ferron:

systemctl reload ferron

默认的管理员账号:arcane,密码:arcane-admin

Arcane还支持“远程环境”,也就是说你可以通过Arcane管理多台服务器的Docker,只需要在每台服务器内部署一个arcane-agent即可,具体操作见:

https://getarcane.app/docs/features/environments

如果你觉得让Arcane直接连接到Docker套接字这种部署方法不安全,也可以改为使用套接字代理,详细信息见:

https://getarcane.app/docs/setup/socket-proxy

Rote:一个看起来与众不同的个人笔记库

2026-01-06 06:07:58

Rote并不是传统意义上的笔记软件,与Obsidian、Notion这类软件有本质区别,我个人感觉Rote更像是一个类似Twitter的社交平台,或者微博客、朋友圈之类的。Rote应该更适合记录一些碎碎念,或者简短的内容。

Rote支持自建服务器,且Web UI设计的非常精美,还有iOS客户端可以使用,iOS客户端的UI也好看,说实话第一眼就喜欢上了,当时部署的时候还遇到S3配置的问题请教过作者,作者也很热心的帮忙解决。

这篇文章记录下部署过程,开始前需要准备一个S3服务,不配置S3也能用,但所有需要用到上传文件的功能都将不可用,建议还是配置一下体验完整版。

请注意目前Rote并不完全支持所有S3服务商,使用Rustfs、MinIO等S3实现可能会出现问题。目前只建议使用AWS S3/CF R2/Garage。我这里用的S3实现是Garage,有关Garage的生产环境部署可参考这篇文章

安装Docker:

apt -y update
apt -y install curl
curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh

创建目录新建compose文件:

mkdir /opt/rote && cd /opt/rote && nano docker-compose.yml

写入如下内容:

services:
  rote-backend:
    image: rabithua/rote-backend:latest
    pull_policy: always
    container_name: rote-backend
    environment:
      # 配置数据库连接密码,默认密码:pgpassword
      - POSTGRESQL_URL=postgresql://rote:pgpassword@rote-postgres:5432/rote
    ports:
      - "127.0.0.1:18000:3000"
    depends_on:
      rote-postgres:
        condition: service_healthy
    restart: unless-stopped
    command:
      [
        "sh",
        "-c",
        "sleep 15 && bun run dist/scripts/runMigrations.js && bun run dist/server.js",
      ]

  rote-frontend:
    image: rabithua/rote-frontend:latest
    pull_policy: always
    container_name: rote-frontend
    ports:
      - "127.0.0.1:18001:80"
    depends_on:
      - rote-backend
    environment:
      # 配置后端URL
      - VITE_API_BASE=https://rote-backend.example.com
    restart: unless-stopped

  rote-postgres:
    image: postgres:17
    container_name: rote-postgres
    restart: unless-stopped
    environment:
      POSTGRES_USER: rote
      # 配置数据库连接密码,默认密码:pgpassword
      POSTGRES_PASSWORD: pgpassword
      POSTGRES_DB: rote
    volumes:
      - ./pg_data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U rote -d rote"]
      interval: 5s
      timeout: 3s
      retries: 10
      start_period: 30s

networks:
  default:
    name: rote-network
    driver: bridge

启动Rote:

docker compose up -d

配置Ferron反向代理:

nano /etc/ferron.kdl

写入如下内容:

rote-backend.example.com {
    proxy "http://127.0.0.1:18000/"
}

rote.example.com {
    proxy "http://127.0.0.1:18001/"
}

重载Ferron:

systemctl reload ferron

如果遇到Ferron上传速度慢、上传大文件失败等问题,可参考这篇文章解决。

首次访问Rote需要初始化配置,这里先暂时跳过S3存储配置,因为这个页面不支持配置Garage S3:

初始化完成后,在管理员后台->存储设置,继续配置S3存储:

由于我们用的是Garage S3,这里的区域和URL前缀是必须要填写的。

效果如下,首页:

探索页:

个人主页:

MyTube:您的自托管YouTube,支持MissAV下载

2026-01-05 08:54:39

MyTube是一个支持YouTube、Bilibili、MissAV及yt-dlp站点的自托管视频下载器与播放器。具备频道订阅、自动下载及本地化存储功能。UI 设计精美,支持收藏集分类管理。内置Cloudflare Tunnel支持,无需端口映射即可实现安全远程访问。支持Docker一键部署。

MyTube的功能特点(摘自项目文档)

视频下载:通过简单的 URL 输入下载 YouTube、Bilibili 和 MissAV 视频。
视频上传:直接上传本地视频文件到您的库,并自动生成缩略图。
Bilibili 支持:支持下载单个视频、多 P 视频以及整个合集/系列。
并行下载:支持队列下载,可同时追踪多个下载任务的进度。
批量下载:一次性添加多个视频链接到下载队列。
并发下载限制:设置同时下载的数量限制以管理带宽。
本地库:自动保存视频缩略图和元数据,提供丰富的浏览体验。
视频播放器:自定义播放器,支持播放/暂停、循环、快进/快退、全屏和调光控制。
字幕:自动下载 YouTube / Bilibili 默认语言字幕。
搜索功能:支持在本地库中搜索视频,或在线搜索 YouTube 视频。
收藏夹:创建自定义收藏夹以整理您的视频。
订阅功能:订阅您喜爱的频道,并在新视频发布时自动下载。
登录保护:通过密码登录页面保护您的应用。
国际化:支持多种语言,包括英语、中文、西班牙语、法语、德语、日语、韩语、阿拉伯语、葡萄牙语和俄语。
分页功能:支持分页浏览,高效管理大量视频。
视频评分:使用 5 星评级系统为您的视频评分。
移动端优化:移动端友好的标签菜单和针对小屏幕优化的布局。
临时文件清理:直接从设置中清理临时下载文件以管理存储空间。
视图模式:在主页上切换收藏夹视图和视频视图。
Cookie 管理:支持上传 cookies.txt 以启用年龄限制或会员内容的下载。
yt-dlp 配置: 通过用户界面自定义全局 yt-dlp 参数、网络代理及其他高级设置。
访客模式:启用只读模式,允许查看视频但无法进行修改。非常适合与他人分享您的视频库。
云存储集成:下载后自动将视频和缩略图上传到云存储(OpenList/Alist)。
Cloudflare Tunnel 集成: 内置 Cloudflare Tunnel 支持,无需端口转发即可轻松将本地 MyTube 实例暴露到互联网。

安装Docker:

apt -y update
apt -y install curl
curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh

创建目录新建compose文件:

mkdir /opt/mytube && cd /opt/mytube && nano docker-compose.yml

写入如下内容:

services:
  backend:
    image: franklioxygen/mytube:backend-latest
    container_name: mytube-backend
    pull_policy: always
    restart: unless-stopped
    environment:
      - PORT=5551
      - MAX_FILE_SIZE=5000000000
    volumes:
      - ./uploads:/app/uploads
      - ./data:/app/data
  frontend:
    image: franklioxygen/mytube:frontend-latest
    container_name: mytube-frontend
    pull_policy: always
    restart: unless-stopped
    ports:
      - "5556:5556"
    depends_on:
      - backend
    environment:
      # 在大多数设置中,这些默认值都可以正常工作,不需要修改。
      - VITE_API_URL=/api
      - VITE_BACKEND_URL=

启动:

docker compose up -d

配置Ferron反向代理:

nano /etc/ferron.kdl

写入如下内容:

mytube.example.com {
    proxy "http://127.0.0.1:5556/"
    proxy_request_header_replace "Host" "{header:Host}"
}

管理员的默认密码是123,登录进去后请立即修改密码,并且关闭“允许重置密码”的功能,如果可以建议使用passkey登录:

如果遇到下载的视频分辨率太低,可以在后台自定义修改yt-dlp的配置:

-S res:2160

如果遇到下载速度慢,可以适当增加线程:

-N 15

效果:

Ferron Web Server上传速度慢、上传大文件失败解决办法

2026-01-04 14:02:39

最近在使用Ferron Web Server的时候遇到几个问题,记录下解决办法。

编辑Ferron配置文件:

nano /etc/ferron.kdl

上传速度慢,增加HTTP2窗口大小(单位字节)即可,streams(多路复用)也可以增加,但好像这个streams的配置对上传速度的影响不明显:

h2_initial_window_size 512000000
h2_max_concurrent_streams 256

上传大文件失败,浏览器控制台报错误的HTTP2协议(ERR_HTTP2_PROTOCOL_ERROR),服务器端的Ferron日志内没有有用的信息。

排查了半天发现是Ferron默认的超时时间(单位毫秒)配置太短导致,因为上传速度比较慢,触发了超时,Ferron把连接重置了,解决办法很简单把超时时间改长一点或者关闭:

timeout 21600000 // 6小时
timeout #false // 关闭

上面提到的配置建议直接应用全局:

* {
    h2_initial_window_size 512000000
    h2_max_concurrent_streams 256
    timeout 21600000
    ...
}

重载配置使其生效:

systemctl reload ferron.service

参考Ferron文档:https://ferron.sh/docs/configuration-kdl