最后还是放弃luci,源里的luci app版本可能过老,需要自己找别的安装,但在github上未必能找到符合你需求的luci app,或者来源不清晰。

还是luci简单一点,只建议部分文件单独脚本化运行,有些环境复杂的调试起来有些麻烦,特别是alist新加的transmission。
实际上部分问题主要是文件夹权限的问题,alist luci如果没有缓存目录设置功能,还是更建议脚本化运行。

luci本质上其实就是配置文件的图形化设置,使用luci设置并不一定方便。因为可能缺乏部分选项,或者配置文件格式更新了,会导致你使用中有一些奇奇怪怪的bug,比如之前用luci设置alist,导致文件夹权限问题,离线下载用不了。结果在init文件里,配置文件里看到了好几处设置临时目录的命令。每次新建临时文件夹,但是aria2没有访问权限。

其实大部分APP的配置并不麻烦,自己设置就可以满足大部分需求。

我这里还是求助GPT写了大量的配置文件,然后还是和写服务器配置文件一样被坑了,知识版本过老,乱写。但确实简单,如果自己有鉴别和改写能力,通过GPT写出初版配置文件,然后自己根据需求改写成配置文件,再利用GPT统一所有文件的书写以及命名格式,会节省大量重复修改的时间,也少出错。但是你要自己读几遍,理解并debug的。
先不详细说明每个配置的内容,暂时不好贴出来,说明思路。

首先通过opkg安装,对应程序的二进制文件,比如alist,aria2等等,主要是为了满足依赖,同时你也可以看下版本,如果版本号和最新版一样,或者差不多,可以先找到二进制文件和配置文件备用,方便你后期改写。而且通用的二进制文件往往过大,opkg安装的专版会小很多。

主要有两类文件。
一类是/etc/init.d/里的init文件,用于控制你的程序,启动关闭自启等等,不用写过于麻烦,因为openwrt并不支持很多指令,比如我写了单独的log,但是/etc/init.d/alist log直接提示不支持的命令。建议这里init文件里不要出现除本机磁盘以外的挂载目录。方便通用,也不容易出错。这是我个人规范。
第二类是程序和配置文件,建议单独目录比如我用的就是/services/alist这种,目录下面可以根据app本身的配置规则设置。所有对外置目录的需求,都可以写在对应的配置文件中。这是我个人规范。

运行简单 /etc/init.d/alist start就可以 enable可以设置自启动 但是我restart好像出问题了,命令行可以,但是luci界面的管理,直接关掉了没有启动。
下面是代码示例

alist init.d

#!/bin/sh /etc/rc.common

START=95
STOP=5

SERVICE_NAME="alist"
EXEC="/client/alist/alist"
CONFIG="/client/alist/data/config.json"
CONFIG_DATA="/client/alist/data"
LOG_FILE="/client/alist/alist.log"
PID_FILE="/client/alist.pid"

start() {
    # 检查是否已经在运行
    if [ -f "$PID_FILE" ] && kill -0 $(cat "$PID_FILE") 2>/dev/null; then
        echo "$SERVICE_NAME is already running."
        return 0
    fi

    # 检查配置文件是否存在
    if [ ! -f "$CONFIG" ]; then
        echo "Configuration file not found at $CONFIG. Please initialize Alist first."
        return 1
    fi

    echo "Starting $SERVICE_NAME..."
    # 启动进程并保存PID
    $EXEC --data "$CONFIG_DATA" server >> "$LOG_FILE" 2>&1 &
    echo $! > "$PID_FILE" # 保存PID
    echo "$SERVICE_NAME started with PID $(cat $PID_FILE)."
}

stop() {
    # 检查进程是否在运行
    if [ ! -f "$PID_FILE" ] || ! kill -0 $(cat "$PID_FILE") 2>/dev/null; then
        echo "$SERVICE_NAME is not running."
        return 0
    fi

    echo "Stopping $SERVICE_NAME..."
    kill -15 $(cat "$PID_FILE") && rm -f "$PID_FILE" # 发送停止信号并删除PID文件
    echo "$SERVICE_NAME stopped."
}

restart() {
    echo "Restarting $SERVICE_NAME..."
    stop
    start
}

status() {
    if [ -f "$PID_FILE" ] && kill -0 $(cat "$PID_FILE") 2>/dev/null; then
        echo "$SERVICE_NAME is running with PID $(cat $PID_FILE)."
    else
        echo "$SERVICE_NAME is not running."
    fi
}

boot() {
    start
}

stop_boot() {
    stop
}

alist config 拷贝自动生成/etc/alist里的配置文件根据需求改,/mnt/msd/alist/是我的优盘中的alist目录。我端口改成5255了。还有一问题,低端口对应服务器的高端口,会出问题。我原来设置服务器端的端口是35244,不行,后来改回低端口就好了,暂时没研究为什么。

{
"force": true,
"site_url": "",
"cdn": "",
"jwt_secret": "自动生成的不要改也不要用这段中文",
"token_expires_in": 48,
"database": {
"type": "sqlite3",
"host": "",
"port": 0,
"user": "",
"password": "",
"name": "",
"db_file": "/mnt/msd/alist/data.db",
"table_prefix": "x_",
"ssl_mode": "",
"dsn": ""
},
"meilisearch": {
"host": "http://localhost:7700",
"api_key": "",
"index_prefix": ""
},
"scheme": {
"address": "0.0.0.0",
"http_port": 5255,
"https_port": -1,
"force_https": false,
"cert_file": "",
"key_file": "",
"unix_file": "",
"unix_file_perm": ""
},
"temp_dir": "/mnt/msd/alist/temp",
"bleve_dir": "/mnt/msd/alist/bleve",
"dist_dir": "",
"log": {
"enable": true,
"name": "/mnt/msd/alist/alist.log",
"max_size": 5,
"max_backups": 1,
"max_age": 15,
"compress": false
},
"delayed_start": 0,
"max_connections": 0,
"tls_insecure_skip_verify": false,
"tasks": {
"download": {
"workers": 5,
"max_retry": 1
},
"transfer": {
"workers": 5,
"max_retry": 2
},
"upload": {
"workers": 5,
"max_retry": 0
},
"copy": {
"workers": 5,
"max_retry": 2
}
},
"cors": {
"allow_origins": [
"*"
],
"allow_methods": [
"*"
],
"allow_headers": [
"*"
]
},
"s3": {
"enable": false,
"port": 5246,
"ssl": false
}
}

frpc init

#!/bin/sh /etc/rc.common

START=99
STOP=15

SERVICE_NAME="frpc"
EXEC="/client/frpc/frpc"  # frpc 可执行文件路径
CONFIG="/client/frpc/frpc.toml"  # frpc 配置文件路径
PID_FILE="/client/frpc.pid"  # frpc 进程 PID 文件
LOG_FILE="/client/frpc/frpc.log"  # frpc 日志文件

start() {
    echo "Starting $SERVICE_NAME..."

    # 检查进程是否已在运行
    if [ -f "$PID_FILE" ] && kill -0 $(cat "$PID_FILE") 2>/dev/null; then
        echo "$SERVICE_NAME is already running."
        return 0
    fi

    # 启动 frpc
    $EXEC -c "$CONFIG" >> "$LOG_FILE" 2>&1 &
    echo $! > "$PID_FILE"  # 保存进程的 PID

    echo "$SERVICE_NAME started with PID $(cat $PID_FILE)."
}

stop() {
    echo "Stopping $SERVICE_NAME..."

    # 检查进程是否存在
    if [ -f "$PID_FILE" ]; then
        kill -15 $(cat "$PID_FILE")  # 发送停止信号
        rm -f "$PID_FILE"  # 删除 PID 文件
        echo "$SERVICE_NAME stopped."
    else
        echo "$SERVICE_NAME is not running."
    fi
}

restart() {
    stop
    start
}

status() {
    if [ -f "$PID_FILE" ] && kill -0 $(cat "$PID_FILE") 2>/dev/null; then
        echo "$SERVICE_NAME is running with PID $(cat $PID_FILE)."
    else
        echo "$SERVICE_NAME is not running."
    fi
}

boot() {
    start
}

stop_boot() {
    stop
}

ftpc.toml 示例 新版toml写法与老的兼容 根据需求 看官网文档修改,serverAddr这个域名,GPT建议我不要反代,我看到网上有些人也不管这个,但是子域名这种东西要多少有多少的,不反代也没啥问题,所以我这里是单独的域名,指向服务器IP。192.168.2.1是我本地ip地址,127.0.0.1应该也可以。

serverAddr = "可以是域名,也可以是IP"
serverPort = 7000
auth.method = "token"
auth.token = "建议生成一段随机密码"

[[proxies]]
name = "alisto"
type = "tcp"
localIP = "192.168.2.1"
localPort = 5255
remotePort = 5255

frps.toml 示例 新版toml写法与老的兼容 根据需求 看官网文档修改

bindAddr= 0.0.0.0
bindPort = 7000
kcpBindPort = 7001
quicBindPort = 7002

vhostHTTPPort = 80
vhostHTTPSPort = 443

transport.maxPoolCount = 2000
transport.tcpMux = true
transport.tcpMuxKeepaliveInterval = 60
transport.tcpKeepalive = 7200
transport.tls.force = false

webServer.addr = "0.0.0.0"
webServer.port = 7500
webServer.user = "云端dashboards用户名"
webServer.password = "云端dashboards密码"
webServer.pprofEnable = false

log.to = "/frps/logs/frps.log"
log.level = "info"
log.maxDays = 3
log.disablePrintColor = false

auth.method = "token"
auth.token = "与客户端相同的密码"

maxPortsPerClient = 8
udpPacketSize = 1500
natholeAnalysisDataReserveHours = 168
最后修改:2024 年 12 月 16 日
看表情包吧!