MoreRSS

site iconLala | 荒岛修改

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

Inoreader Feedly Follow Feedbin Local Reader

Lala | 荒岛的 RSS 预览

AIChat:您的赛博AI命令行工具

2025-12-17 11:00:46

AIChat是一款多合一的LLM CLI工具,具有Shell助手、CMD和REPL模式、RAG、AI工具和代理等功能。

Linux安装:

wget https://github.com/sigoden/aichat/releases/download/v0.30.0/aichat-v0.30.0-x86_64-unknown-linux-musl.tar.gz
tar -xzvf aichat-v0.30.0-x86_64-unknown-linux-musl.tar.gz
mv aichat /usr/local/bin

初次运行:

aichat

按照提示配置AI厂商和KEY:

> No config file, create a new one? Yes
> Platform: openai
> API Key: ***
✨ Saved config file to '/home/imlala/.config/aichat/aichat.yaml'

查看配置文件和其他信息:

aichat --info

aichat的-e模式,效果:

更多玩法见:https://github.com/sigoden/aichat/wiki

DMMTV解锁问题排查

2025-12-16 19:04:54

记录下排查与解决过程。起因:一台日本VPS(Debian12)用脚本测试能解锁DMMTV,但是搭建了代理用浏览器访问却解不了。。

一开始走弯路了,有点怀疑是解锁脚本测试的不准确,但是我还是更愿意相信是自己环境的问题,毕竟解锁脚本经过多人使用出错的概览不大,然后又以为是DMM用了WebRTC,给浏览器装了个关闭WebRTC的扩展还是不行。。

后来我发现这个VPS是双栈网络,有IPv6地址,然后又跑了一遍解锁脚本测试发现IPv6是不能解锁的,我就猜测是不是访问DMMTV的时候流量走了IPv6?我试着把IPv6关闭后,确实就能解锁了,到这里就能够确定是IPv6的问题了,但是我还是想保留IPv6,平时还是会用到IPv6的,直接关掉有点太鲁莽了。

我知道Linux系统中有一个gai.conf的配置文件,它可以控制系统如何选择地址,尤其是当系统同时支持IPv4和IPv6时,它决定了应用优先使用IPv4还是IPv6,我试着编辑gai.conf:

nano /etc/gai.conf

取消如下内容的注释,以启用IPv4优先:

precedence ::ffff:0:0/96  100

但是这并不能解决我的问题,虽然在VPS内curl还有ping等工具确实优先使用IPv4了,但作为代理服务器,我用浏览器访问DMMTV还是不能解锁。。。百思不得其解,突然想到会不会是代理节点的问题?我使用的是Remnawave面板,这台VPS安装的是Docker运行的Remnanode,使用的网络模式是host:

services:
    remnanode:
        container_name: remnanode
        hostname: remnanode
        image: remnawave/node:latest
        restart: always
        network_mode: host
        env_file:
            - .env

host网络默认应该也是没有启用IPv6支持的,但我记不太清楚,所以特地验证了一下,确实是没有启用IPv6:

docker network inspect host

我不知道这里的IPv6启用与否是否真的会影响到容器内的程序,所以我想看看容器的日志,我先用这个命令查看:

docker compose logs -f

发现看不到真正有用的日志,因为Remnanode实际上是用的Xray-core内核,它这个容器相当于是套了一层supervisor,最外层看不到Xray-core内核的日志,所以通过下面的命令我终于看到Xray-core内核的日志了:

docker exec -it remnanode tail -n +1 -f /var/log/supervisor/xray.out.log

按道理来说应该挂载一个volume,把这个log保存到宿主机的,当时配置的时候疏忽了,这日志一看就知道问题所在了,Xray-core一直在用IPv6去连接DMMTV。。。接着去搜Xray-core的文档,发现这段话:

可以通过修改 “domainStrategy”: “UseIPv6″来控制对应用户的访问方式 实测优先级要高于系统本身的 gai.config

难怪我之前配置gai.conf不起作用,现在就明朗了= =在Remnawave面板,修改配置文件,在出站配置domainStrategy:

"settings": {
  "domainStrategy": "UseIPv4"
}

如图所示:

再次测试,DMMTV就能够正常解锁了= =

部署MoonTVPlus二开增强版+LogVar弹幕API

2025-12-09 06:10:37

MoonTVPlus是基于MoonTV v100二次开发的增强版影视聚合播放器。它在原版基础上新增了外部播放器支持、视频超分、弹幕系统、评论抓取等实用功能,提供更强大的观影体验。

相对原版新增内容:

🎮 外部播放器跳转:支持 PotPlayer、VLC、MPV、MX Player、nPlayer、IINA 等多种外部播放器
✨ 视频超分 (Anime4K):使用 WebGPU 技术实现实时视频画质增强(支持 1.5x/2x/3x/4x 超分)
💬 弹幕系统:完整的弹幕搜索、匹配、加载功能,支持弹幕设置持久化、弹幕屏蔽
📝 豆瓣评论抓取:自动抓取并展示豆瓣电影短评,支持分页加载
🪒自定义去广告:你可以自定义你的去广告代码,实现更强力的去广告功能

安装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/moontvplus && cd /opt/moontvplus && nano docker-compose.yml

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

services:
  moontv-core:
    image: ghcr.io/mtvpls/moontvplus:latest
    container_name: moontv-core
    restart: on-failure
    ports:
      - '10300:3000'
    environment:
      - USERNAME=admin
      - PASSWORD=yourpasswd # 设置moontvplus管理员密码
      - NEXT_PUBLIC_STORAGE_TYPE=kvrocks
      - KVROCKS_URL=redis://moontv-kvrocks:6666
    depends_on:
      - moontv-kvrocks

  moontv-kvrocks:
    image: apache/kvrocks
    container_name: moontv-kvrocks
    restart: unless-stopped
    volumes:
      - kvrocks-data:/var/lib/kvrocks

  danmu-api:
    image: logvar/danmu-api:latest
    container_name: danmu-api
    restart: unless-stopped
    ports:
      - "9321:9321"
    environment:
      - TOKEN=89641937 # 设置访问token
      - ADMIN_TOKEN=19378964 # 设置管理员访问token
    volumes:
      - ./.chche:/app/.cache

volumes:
  kvrocks-data:

启动:

docker compose up -d

配置Ferron反向代理:

nano /etc/ferron.kdl

写入如下内容:

moontvplus.example.com {
    proxy "http://127.0.0.1:10300/"
}

重载Ferron:

systemctl reload ferron

弹幕配置,弹幕API地址填写:http://danmu-api:9321,弹幕APIToken填写你设置的TOKEN=值(默认89641937)

配置订阅(视频源),这里推荐这个项目LunaTV-config。将这个URL填写上去保存即可。

效果:

如果你不想公开danmu-api服务器,可以删掉端口映射的配置,改为如下内容:

...
  danmu-api:
    image: logvar/danmu-api:latest
    container_name: danmu-api
    restart: unless-stopped
    ports:
      - "9321:9321"
    expose:
      - "9321"
    environment:
      - TOKEN=89641937 # 设置访问token
      - ADMIN_TOKEN=19378964 # 设置管理员访问token
    volumes:
      - ./.chche:/app/.cache
...

Ferron:一个用Rust编写的快速、内存安全的Web服务器

2025-12-08 13:18:44

Ferron是一个用Rust编写的高性能Web服务器。Ferron特点(摘自项目页面):

High performance – built with Rust’s async capabilities for optimal speed.
Memory-safe – built with Rust, which is a programming language offering memory safety.
Extensibility – modular architecture for easy customization.
Secure – focus on robust security practices and safe concurrency.

我安装用了一段时间,觉得各方面非常不错,所以特地写篇入门的文章,顺便也算是推荐一下吧。目前我已经把多台服务器的NGINX换成这个了。初次用Ferron给人最大的感觉就是配置起来特别简单,有点Caddy那味,甚至比Caddy还简单。

除了配置简单以外,很多特性或者说功能都是开箱即用的,比如HTTP3、PROXY Protocol、WebSocket、GRPC反代、FastCGI、自动申请TLS证书等等。废话就不多说了,下面一起来体验一下。

安装Ferron,这里我的系统是Debian 13,使用官方的存储库来安装:

apt update
apt install curl gnupg2 ca-certificates lsb-release debian-archive-keyring
curl https://deb.ferron.sh/signing.pgp | gpg --dearmor | tee /usr/share/keyrings/ferron-keyring.gpg >/dev/null
echo "deb [signed-by=/usr/share/keyrings/ferron-keyring.gpg] https://deb.ferron.sh $(lsb_release -cs) main" | tee /etc/apt/sources.list.d/ferron.list
apt update
apt install ferron

管理Ferron服务:

systemctl stop ferron
systemctl restart ferron
systemctl reload ferron

重要的目录和文件:

/var/log/ferron/access.log # 访问日志
/var/log/ferron/error.log # 错误日志
/var/www/ferron # Ferron的网站根目录
/etc/ferron.kdl # Ferron的主配置文件

默认使用的用户和主目录:

ferron:x:1000:1000::/var/lib/ferron:/usr/sbin/nologin

编辑主配置文件:

nano /etc/ferron.kdl

在主配置文件添加如下内容可以包含(include)其他配置文件:

include "/var/lib/ferron/*.kdl"

在主配置文件添加如下内容以支持HTTP3、PROXY Protocol(默认未启用)、自动申请TLS证书功能:

* {
    protocols "h1" "h2" "h3"
    protocol_proxy #false
    auto_tls
    auto_tls_contact "[email protected]"
    auto_tls_cache "/var/lib/ferron/letsencrypt-cache"
    auto_tls_letsencrypt_production
    auto_tls_challenge "http-01"
}

现在简单说一下最常见的用例:反向代理。在主配置文件或者包含(include)一个新的配置文件写入如下内容:

example.com {
    proxy "http://127.0.0.1:3000/"
}

这就完成了一个反向代理的配置,并且Ferron直接就支持WebSocket,不需要额外的配置。我们需要注意的是Ferron默认会将请求发送到后端服务器之前重写“Host”标头,并在“X-Forwarded-Host”标头中保留原始的“Host”标头值。然而,有些Web应用程序可能无法在这种配置下正常工作,这可能会导致主机头不匹配以及其他问题。在这种情况下,你可以将“Host”标头设置为原始值(保留完整的“Host”标头):

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

Ferron还支持多域名(virtual host)、IP(virtual host):

example.com,www.example.com {
    ...
}

"192.168.1.1" {
    ...
}

自动重定向,将不带“www”的URL重定向到带“www”的URL:

example.com {
    wwwredirect #true
}

每当配置文件发生更改,只需要Reload即可使Ferron使用新的配置:

systemctl reload ferron

除了反代,Ferron还支持通过FastCGI运行PHP程序,例如这里我要配置一个Laravel:

example.com {
    root "/var/www/laravel/public"
    rewrite "^/(.*)" "/index.php/$1" file=#false directory=#false last=#true
    fcgi_php "unix:///run/php/php8.4-fpm.sock"
}

这里要特别注意,Debian系统默认的Unix套接字(php8.4-fpm.sock)所有者和组是www-data,我们需要将其修改为ferron,编辑如下配置文件:

nano /etc/php/8.4/fpm/pool.d/www.conf

找到如下内容将其修改为ferron:

listen.owner = ferron
listen.group = ferron

重启PHP-FPM:

systemctl restart php8.4-fpm.service

重载Ferron:

systemctl reload ferron

完整的配置和文档请参考官方网站:https://ferron.sh/docs

PigeonPod:随时随地收听YouTube

2025-12-03 06:33:05

PigeonPod是一款可以将YouTube的任意频道、播放列表转换成播客的程序,支持自托管。开始部署前,你需要创建一个YouTube Data API v3的API key创建步骤可参考这里

安装Docker和NGINX:

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

创建目录新建compose文件:

mkdir /opt/pigeon-pod && cd /opt/pigeon-pod && nano docker-compose.yml

写入如下内容(将pigeonpod.example.com替换成你的域名):

services:
  pigeon-pod:
    image: ghcr.io/aizhimou/pigeon-pod:latest
    restart: unless-stopped
    container_name: pigeon-pod
    ports:
      - '127.0.0.1:8834:8080'
    environment:
      - 'PIGEON_BASE_URL=https://pigeonpod.example.com'
      - 'PIGEON_AUDIO_FILE_PATH=/data/audio/'
      - 'PIGEON_COVER_FILE_PATH=/data/cover/'
      - 'SPRING_DATASOURCE_URL=jdbc:sqlite:/data/pigeon-pod.db' # set to your database path
    volumes:
      - data:/data
volumes:
  data:

启动:

docker compose up -d

配置NGINX反向代理:

nano /etc/nginx/sites-available/pigeonpod

写入如下内容(将pigeonpod.example.com替换成你的域名):

server {
    listen 80;
    server_name pigeonpod.example.com;
    client_max_body_size 0;

    location / {
        proxy_pass http://127.0.0.1:8834;
        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;
    }
}

启用站点:

ln -s /etc/nginx/sites-available/pigeonpod /etc/nginx/sites-enabled/pigeonpod

签发SSL证书:

certbot --nginx --email [email protected] --agree-tos --no-eff-email

访问pigeonpod.example.com,默认的管理员账号:root,密码:Root@123

登录进去,添加你刚创建的YouTube Data API Key:

效果:

VPS配置LotSpeed单边加速

2025-12-02 10:29:06

我第一眼看到这个名字还以为是锐速,卧槽文艺复兴了??说起来还挺怀念那段时间的,那段时间是折腾小鸡最快乐的时候,现在已经电子阳痿了。。完全提不起兴趣,今年黑5,总共消费0元= =

找了台灵车落地鸡试了一下,没想到药效出乎意料的好,本来晚高峰只能跑0.几MBps的鸡,吃上这个后能跑150MBps了,白天能跑150MBps的,现在能跑650MBps了。。

LotSpeed作者一共提供了3个版本,我全部都试了一遍,发现zeta-tcp版本的效果最好,所以这里我就只记录下zeta-tcp版本的配置步骤。

系统我使用的是Debian13,先更新系统、重启,确保系统当前运行的内核是最新版:

apt update
apt full-upgrade

安装需要用到的软件包:

apt install build-essential git
apt install linux-headers-$(uname -r)

克隆项目存储库、编译lotspeed内核模块:

git clone -b zeta-tcp https://github.com/uk0/lotspeed.git
cd lotspeed
make

安装lotspeed内核模块:

cp lotspeed.ko /lib/modules/$(uname -r)/kernel/net/ipv4/
depmod -a

加载lotspeed内核模块:

modprobe lotspeed

确保加载成功:

lsmod | grep lotspeed

[可选]配置开机自动加载lotspeed内核模块:

echo "lotspeed" >> /etc/modules-load.d/lotspeed.conf

这个开机自动加载配不配其实不重要,因为只要你后续把拥塞控制算法设置成lotspeed,系统就会自动加载lotspeed内核模块。配置这个的效果就是即便你的系统拥塞控制算法不是lotspeed,系统也自动加载lotspeed内核模块。换句话说就是无论你用不用这个模块,系统都先给你加载起来。

设置拥塞控制算法为lotspeed:

nano /etc/sysctl.d/10-lotspeed.conf

写入如下内容:

net.ipv4.tcp_congestion_control = lotspeed
net.ipv4.tcp_no_metrics_save = 1

使其生效:

sysctl --system

查看拥塞控制算法是否生效:

sysctl net.ipv4.tcp_congestion_control

这样就配置好了,注意不要随意更新系统内核,如果内核更新了,你就需要重新编译一遍,作者要是能搞个dkms出来就好了。