最后还是放弃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