alist/luci-app-alist: add full configuration settings

Signed-off-by: sbwml <admin@cooluc.com>
This commit is contained in:
sbwml 2024-09-06 14:54:06 +08:00
parent c7a2dbac10
commit b8b5ba4367
5 changed files with 439 additions and 147 deletions

View File

@ -1,9 +1,32 @@
config alist config alist
option 'enabled' '0' option enabled '0'
option 'port' '5244' option port '5244'
option 'temp_dir' '/tmp/alist' option delayed_start '0'
option 'ssl' '0' option allow_wan '0'
option 'token_expires_in' '48' option force '1'
option 'max_connections' '0' option token_expires_in '48'
option 'site_url' '' option max_connections '0'
option 'delayed_start' '0' option tls_insecure_skip_verify '1'
option data_dir '/etc/alist'
option temp_dir '/tmp/alist'
option log '1'
option log_max_size '10'
option log_max_backups '5'
option log_max_age '28'
option log_compress '0'
option database_type 'sqlite3'
option ssl '0'
option download_workers '5'
option download_max_retry '1'
option transfer_workers '5'
option transfer_max_retry '2'
option upload_workers '5'
option upload_max_retry '0'
option copy_workers '5'
option copy_max_retry '2'
option cors_allow_origins '*'
option cors_allow_methods '*'
option cors_allow_headers '*'
option s3 '0'

View File

@ -10,21 +10,34 @@ LOG_FILE=/var/log/alist.log
get_config() { get_config() {
config_get_bool enabled $1 enabled 1 config_get_bool enabled $1 enabled 1
config_get port $1 port 5244 config_get port $1 port 5244
config_get log $1 log 1
config_get site_url $1 site_url ""
config_get data_dir $1 data_dir "/etc/alist"
config_get temp_dir $1 temp_dir "/tmp/alist"
config_get ssl $1 ssl 0
config_get ssl_cert $1 ssl_cert ""
config_get ssl_key $1 ssl_key ""
config_get token_expires_in $1 token_expires_in 48
config_get allow_wan $1 allow_wan 0 config_get allow_wan $1 allow_wan 0
config_get max_connections $1 max_connections 0
config_get delayed_start $1 delayed_start 0 config_get delayed_start $1 delayed_start 0
# mysql config_get force $1 force 1
config_get mysql $1 mysql 0 config_get site_url $1 site_url ""
config_get mysql_type $1 mysql_type "mysql" config_get cdn $1 cdn ""
config_get jwt_secret $1 jwt_secret ""
config_get data_dir $1 data_dir "/etc/alist"
config_get temp_dir $1 temp_dir "/tmp/alist"
config_get token_expires_in $1 token_expires_in 48
config_get max_connections $1 max_connections 0
config_get tls_insecure_skip_verify $1 tls_insecure_skip_verify 1
# log
config_get log $1 log 1
config_get log_max_size $1 log_max_size 10
config_get log_max_backups $1 log_max_backups 5
config_get log_max_age $1 log_max_age 28
config_get log_compress $1 log_compress 0
# scheme
config_get ssl $1 ssl 0
config_get force_https $1 force_https 0
config_get ssl_cert $1 ssl_cert ""
config_get ssl_key $1 ssl_key ""
# database
config_get database_type $1 database_type "sqlite3"
config_get mysql_host $1 mysql_host "" config_get mysql_host $1 mysql_host ""
config_get mysql_port $1 mysql_port "3306" config_get mysql_port $1 mysql_port "3306"
config_get mysql_username $1 mysql_username "" config_get mysql_username $1 mysql_username ""
@ -34,6 +47,26 @@ get_config() {
config_get mysql_ssl_mode $1 mysql_ssl_mode "" config_get mysql_ssl_mode $1 mysql_ssl_mode ""
config_get mysql_dsn $1 mysql_dsn "" config_get mysql_dsn $1 mysql_dsn ""
# tasks
config_get download_workers $1 download_workers 5
config_get download_max_retry $1 download_max_retry 1
config_get transfer_workers $1 transfer_workers 5
config_get transfer_max_retry $1 transfer_max_retry 2
config_get upload_workers $1 upload_workers 5
config_get upload_max_retry $1 upload_max_retry 0
config_get copy_workers $1 copy_workers 5
config_get copy_max_retry $1 copy_max_retry 2
# cors
config_get cors_allow_origins $1 cors_allow_origins '*'
config_get cors_allow_methods $1 cors_allow_methods '*'
config_get cors_allow_headers $1 cors_allow_headers '*'
# s3
config_get s3 $1 s3 0
config_get s3_port $1 s3_port 5246
config_get s3_ssl $1 s3_ssl 0
config_load network config_load network
config_get lan_addr lan ipaddr "0.0.0.0" config_get lan_addr lan ipaddr "0.0.0.0"
if echo "${lan_addr}" | grep -Fq ' '; then if echo "${lan_addr}" | grep -Fq ' '; then
@ -41,6 +74,11 @@ get_config() {
else else
lan_addr=${lan_addr%%/*} lan_addr=${lan_addr%%/*}
fi fi
# init jwt_secret
[ -z "$jwt_secret" ] && jwt_secret=$(tr -cd "a-zA-Z0-9" < "/dev/urandom" | head -c16)
uci -q set alist.@alist[0].jwt_secret="$jwt_secret"
uci commit alist
} }
set_firewall() { set_firewall() {
@ -81,23 +119,20 @@ start_service() {
external_access="deny" external_access="deny"
fi fi
# mysql
[ "$mysql" -eq 1 ] && database=$mysql_type || database=sqlite3
set_firewall set_firewall
true > $LOG_FILE true > $LOG_FILE
# init config # init config
json_init json_init
json_add_boolean "force" "1" json_add_boolean "force" "$force"
json_add_string "site_url" "$site_url" json_add_string "site_url" "$site_url"
json_add_string "cdn" "" json_add_string "cdn" "$cdn"
json_add_string "jwt_secret" "" json_add_string "jwt_secret" "$jwt_secret"
json_add_int "token_expires_in" "$token_expires_in" json_add_int "token_expires_in" "$token_expires_in"
# database # database
json_add_object 'database' json_add_object 'database'
json_add_string "type" "$database" json_add_string "type" "$database_type"
json_add_string "host" "$mysql_host" json_add_string "host" "$mysql_host"
json_add_int "port" "$mysql_port" json_add_int "port" "$mysql_port"
json_add_string "user" "$mysql_username" json_add_string "user" "$mysql_username"
@ -121,7 +156,7 @@ start_service() {
json_add_string "address" "$listen_addr" json_add_string "address" "$listen_addr"
json_add_int "http_port" "$http_port" json_add_int "http_port" "$http_port"
json_add_int "https_port" "$https_port" json_add_int "https_port" "$https_port"
json_add_boolean "force_https" "0" json_add_boolean "force_https" "$force_https"
json_add_string "cert_file" "$ssl_cert" json_add_string "cert_file" "$ssl_cert"
json_add_string "key_file" "$ssl_key" json_add_string "key_file" "$ssl_key"
json_add_string "unix_file" "" json_add_string "unix_file" ""
@ -136,61 +171,62 @@ start_service() {
json_add_object "log" json_add_object "log"
json_add_boolean "enable" "$log" json_add_boolean "enable" "$log"
json_add_string "name" "$LOG_FILE" json_add_string "name" "$LOG_FILE"
json_add_int "max_size" "10" json_add_int "max_size" "$log_max_size"
json_add_int "max_backups" "5" json_add_int "max_backups" "$log_max_backups"
json_add_int "max_age" "28" json_add_int "max_age" "$log_max_age"
json_add_boolean "compress" "0" json_add_boolean "compress" "$log_compress"
json_close_object json_close_object
json_add_int "delayed_start" "$delayed_start" json_add_int "delayed_start" "$delayed_start"
json_add_int "max_connections" "$max_connections" json_add_int "max_connections" "$max_connections"
json_add_boolean "tls_insecure_skip_verify" "1" json_add_boolean "tls_insecure_skip_verify" "$tls_insecure_skip_verify"
# tasks # tasks
json_add_object "tasks" json_add_object "tasks"
json_add_object "download" json_add_object "download"
json_add_int "workers" "5" json_add_int "workers" "$download_workers"
json_add_int "max_retry" "1" json_add_int "max_retry" "$download_max_retry"
json_close_object json_close_object
json_add_object "transfer" json_add_object "transfer"
json_add_int "workers" "5" json_add_int "workers" "$transfer_workers"
json_add_int "max_retry" "2" json_add_int "max_retry" "$transfer_max_retry"
json_close_object json_close_object
json_add_object "upload" json_add_object "upload"
json_add_int "workers" "5" json_add_int "workers" "$upload_workers"
json_add_int "max_retry" "0" json_add_int "max_retry" "$upload_max_retry"
json_close_object json_close_object
json_add_object "copy" json_add_object "copy"
json_add_int "workers" "5" json_add_int "workers" "$copy_workers"
json_add_int "max_retry" "2" json_add_int "max_retry" "$copy_max_retry"
json_close_object json_close_object
json_close_object json_close_object
# cors # cors
json_add_object "cors" json_add_object "cors"
json_add_array "allow_origins" json_add_array "allow_origins"
json_add_string "" "*" json_add_string "" "$cors_allow_origins"
json_close_array json_close_array
json_add_array "allow_methods" json_add_array "allow_methods"
json_add_string "" "*" json_add_string "" "$cors_allow_methods"
json_close_array json_close_array
json_add_array "allow_headers" json_add_array "allow_headers"
json_add_string "" "*" json_add_string "" "$cors_allow_headers"
json_close_array json_close_array
json_close_object json_close_object
# s3 # s3
json_add_object "s3" json_add_object "s3"
json_add_boolean "enable" "0" json_add_boolean "enable" "$s3"
json_add_int "port" "5246" json_add_int "port" "$s3_port"
json_add_boolean "ssl" "0" json_add_boolean "ssl" "$s3_ssl"
json_close_object json_close_object
json_dump > $data_dir/config.json json_dump > $data_dir/config.json
procd_open_instance alist procd_open_instance alist
procd_set_param command $PROG procd_set_param command $PROG
procd_append_param command server --data $data_dir procd_append_param command server
procd_append_param command --data $data_dir
procd_set_param stdout 0 procd_set_param stdout 0
procd_set_param stderr 0 procd_set_param stderr 0
procd_set_param respawn procd_set_param respawn
@ -201,7 +237,7 @@ start_service() {
reload_service() { reload_service() {
stop stop
sleep 3 sleep 2
start start
} }

View File

@ -95,7 +95,9 @@ return view.extend({
]); ]);
} }
s = m.section(form.NamedSection, '@alist[0]', 'alist'); // init
s = m.section(form.TypedSection, 'alist', _('Basic Settings'));
s.anonymous = true;
o = s.option(form.Flag, 'enabled', _('Enabled')); o = s.option(form.Flag, 'enabled', _('Enabled'));
o.default = o.disabled; o.default = o.disabled;
@ -106,13 +108,147 @@ return view.extend({
o.default = '5244'; o.default = '5244';
o.rmempty = false; o.rmempty = false;
o = s.option(form.Value, 'delayed_start', _('Delayed Start (seconds)'));
o.datatype = 'uinteger';
o.default = '0';
o.rmempty = false;
o = s.option(form.Flag, 'allow_wan', _('Allow Access From Internet'));
o.rmempty = false;
o = s.option(form.Button, '_newpassword', _('Reset Password'),
_('Generate a new random password.'));
o.inputtitle = _('Reset Password');
o.inputstyle = 'apply';
o.onclick = L.bind(this.handleResetPassword, this, data);
// global
s = m.section(form.TypedSection, 'alist', _('Global Settings'));
s.anonymous = true;
o = s.option(form.Flag, 'force', _('Force read config'),
_('By default AList reads the configuration from environment variables, set this field to true to force AList to read config from the configuration file.'));
o.default = true;
o.rmempty = false;
o = s.option(form.Value, 'site_url', _('Site URL'),
_('When the web is reverse proxied to a subdirectory, this option must be filled out to ensure proper functioning of the web. Do not include \'/\' at the end of the URL'));
o = s.option(form.Value, 'cdn', _('CDN URL'));
o.default = '';
o = s.option(form.Value, 'jwt_secret', _('JWT Key'));
o.default = '';
o = s.option(form.Value, 'token_expires_in', _('Login Validity Period (hours)'));
o.datatype = 'uinteger';
o.default = '48';
o.rmempty = false;
o = s.option(form.Value, 'max_connections', _('Max Connections'),
_('0 is unlimited, It is recommend to set a low number of concurrency (10-20) for poor performance device'));
o.default = '0';
o.datatype = 'uinteger';
o.rmempty = false;
o = s.option(form.Flag, 'tls_insecure_skip_verify', _('Disable TLS Verify'));
o.default = true;
o.rmempty = false;
o = s.option(form.Value, 'data_dir', _('Data directory'));
o.default = '/etc/alist';
o = s.option(form.Value, 'temp_dir', _('Cache directory'));
o.default = '/tmp/alist';
o.rmempty = false;
// Logs
s = m.section(form.TypedSection, 'alist', _('Logs'));
s.anonymous = true;
o = s.option(form.Flag, 'log', _('Enable Logs')); o = s.option(form.Flag, 'log', _('Enable Logs'));
o.default = 1; o.default = 1;
o.rmempty = false; o.rmempty = false;
o = s.option(form.Value, 'log_max_size', _('Max Size'));
o.datatype = 'uinteger';
o.default = '10';
o.rmempty = false;
o.depends('log', '1');
o = s.option(form.Value, 'log_max_backups', _('Max backups'));
o.datatype = 'uinteger';
o.default = '5';
o.rmempty = false;
o.depends('log', '1');
o = s.option(form.Value, 'log_max_age', _('Max age'));
o.datatype = 'uinteger';
o.default = '28';
o.rmempty = false;
o.depends('log', '1');
o = s.option(form.Flag, 'log_compress', _('Log Compress'));
o.default = 'false';
o.rmempty = false;
o.depends('log', '1');
// database
s = m.section(form.TypedSection, 'alist', _('Database'));
s.anonymous = true;
o = s.option(form.ListValue, 'database_type', _('Database Type'));
o.default = 'sqlite3';
o.value('sqlite3', _('SQLite'));
o.value('mysql', _('MySQL'));
o.value('postgres', _('PostgreSQL'));
o = s.option(form.Value, 'mysql_host', _('Database Host'));
o.depends('database_type','mysql');
o.depends('database_type','postgres');
o = s.option(form.Value, 'mysql_port', _('Database Port'));
o.datatype = 'port';
o.default = '3306';
o.depends('database_type','mysql');
o.depends('database_type','postgres');
o = s.option(form.Value, 'mysql_username', _('Database Username'));
o.depends('database_type','mysql');
o.depends('database_type','postgres');
o = s.option(form.Value, 'mysql_password', _('Database Password'));
o.depends('database_type','mysql');
o.depends('database_type','postgres');
o = s.option(form.Value, 'mysql_database', _('Database Name'));
o.depends('database_type','mysql');
o.depends('database_type','postgres');
o = s.option(form.Value, 'mysql_table_prefix', _('Database Table Prefix'));
o.default = 'x_';
o.depends('database_type','mysql');
o.depends('database_type','postgres');
o = s.option(form.Value, 'mysql_ssl_mode', _('Database SSL Mode'));
o.depends('database_type','mysql');
o.depends('database_type','postgres');
o = s.option(form.Value, 'mysql_dsn', _('Database DSN'));
o.depends('database_type','mysql');
o.depends('database_type','postgres');
// scheme
s = m.section(form.TypedSection, 'alist', _('Web Protocol'));
s.anonymous = true;
o = s.option(form.Flag, 'ssl', _('Enable SSL')); o = s.option(form.Flag, 'ssl', _('Enable SSL'));
o.rmempty = false; o.rmempty = false;
o = s.option(form.Flag, 'force_https', _('Force HTTPS'));
o.rmempty = false;
o.depends('ssl', '1');
o = s.option(form.Value, 'ssl_cert', _('SSL cert'), o = s.option(form.Value, 'ssl_cert', _('SSL cert'),
_('SSL certificate file path')); _('SSL certificate file path'));
o.rmempty = false; o.rmempty = false;
@ -123,76 +259,82 @@ return view.extend({
o.rmempty = false; o.rmempty = false;
o.depends('ssl', '1'); o.depends('ssl', '1');
o = s.option(form.Flag, 'mysql', _('Enable Database')); // tasks
o.rmempty = false; s = m.section(form.TypedSection, 'alist', _('Task threads'));
s.anonymous = true;
o = s.option(form.ListValue, 'mysql_type', _('Database Type')); o = s.option(form.Value, 'download_workers', _('Download Workers'));
o.default = 'mysql';
o.depends('mysql', '1');
o.value('mysql', _('MySQL'));
o.value('postgres', _('PostgreSQL'));
o = s.option(form.Value, 'mysql_host', _('Database Host'));
o.depends('mysql', '1');
o = s.option(form.Value, 'mysql_port', _('Database Port'));
o.datatype = 'port';
o.default = '3306';
o.depends('mysql', '1');
o = s.option(form.Value, 'mysql_username', _('Database Username'));
o.depends('mysql', '1');
o = s.option(form.Value, 'mysql_password', _('Database Password'));
o.depends('mysql', '1');
o = s.option(form.Value, 'mysql_database', _('Database Name'));
o.depends('mysql', '1');
o = s.option(form.Value, 'mysql_table_prefix', _('Database Table Prefix'));
o.default = 'x_';
o.depends('mysql', '1');
o = s.option(form.Value, 'mysql_ssl_mode', _('Database SSL Mode'));
o.depends('mysql', '1');
o = s.option(form.Value, 'mysql_dsn', _('Database DSN'));
o.depends('mysql', '1');
o = s.option(form.Flag, 'allow_wan', _('Allow Access From Internet'));
o.rmempty = false;
o = s.option(form.Value, 'site_url', _('Site URL'),
_('When the web is reverse proxied to a subdirectory, this option must be filled out to ensure proper functioning of the web. Do not include \'/\' at the end of the URL'));
o = s.option(form.Value, 'max_connections', _('Max Connections'),
_('0 is unlimited, It is recommend to set a low number of concurrency (10-20) for poor performance device'));
o.default = '0';
o.datatype = 'uinteger'; o.datatype = 'uinteger';
o.default = '5';
o.rmempty = false; o.rmempty = false;
o = s.option(form.Value, 'token_expires_in', _('Login Validity Period (hours)')); o = s.option(form.Value, 'download_max_retry', _('Download Max Retry'));
o.datatype = 'uinteger'; o.datatype = 'uinteger';
o.default = '48'; o.default = '1';
o.rmempty = false; o.rmempty = false;
o = s.option(form.Value, 'delayed_start', _('Delayed Start (seconds)')); o = s.option(form.Value, 'transfer_workers', _('Transfer Workers'));
o.datatype = 'uinteger';
o.default = '5';
o.rmempty = false;
o = s.option(form.Value, 'transfer_max_retry', _('Transfer Max Retry'));
o.datatype = 'uinteger';
o.default = '2';
o.rmempty = false;
o = s.option(form.Value, 'upload_workers', _('Upload Workers'));
o.datatype = 'uinteger';
o.default = '5';
o.rmempty = false;
o = s.option(form.Value, 'upload_max_retry', _('Upload Max Retry'));
o.datatype = 'uinteger'; o.datatype = 'uinteger';
o.default = '0'; o.default = '0';
o.rmempty = false; o.rmempty = false;
o = s.option(form.Value, 'data_dir', _('Data directory')); o = s.option(form.Value, 'copy_workers', _('Copy Workers'));
o.default = '/etc/alist'; o.datatype = 'uinteger';
o.default = '5';
o = s.option(form.Value, 'temp_dir', _('Cache directory'));
o.default = '/tmp/alist';
o.rmempty = false; o.rmempty = false;
o = s.option(form.Button, '_newpassword', _('Reset Password'), o = s.option(form.Value, 'copy_max_retry', _('Copy Max Retry'));
_('Generate a new random password.')); o.datatype = 'uinteger';
o.inputtitle = _('Reset Password'); o.default = '2';
o.inputstyle = 'apply'; o.rmempty = false;
o.onclick = L.bind(this.handleResetPassword, this, data);
// cors
s = m.section(form.TypedSection, 'alist', _('CORS Settings'));
s.anonymous = true;
o = s.option(form.Value, 'cors_allow_origins', _('Allow Origins'));
o.default = '*';
o.rmempty = false;
o = s.option(form.Value, 'cors_allow_methods', _('Allow Methods'));
o.default = '*';
o.rmempty = false;
o = s.option(form.Value, 'cors_allow_headers', _('Allow Headers'));
o.default = '*';
o.rmempty = false;
// s3
s = m.section(form.TypedSection, 'alist', _('Object Storage'));
s.anonymous = true;
o = s.option(form.Flag, 's3', _('Enabled S3'));
o.rmempty = false;
o = s.option(form.Value, 's3_port', _('Port'));
o.datatype = 'and(port,min(1))';
o.default = 5246;
o.rmempty = false;
o.depends('s3', '1');
o = s.option(form.Flag, 's3_ssl', _('Enable SSL'));
o.rmempty = false;
o.depends('s3', '1');
return m.render(); return m.render();
} }

View File

@ -1,3 +1,13 @@
msgid ""
msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Project-Id-Version: PACKAGE VERSION\n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
"Language: zh_Hans\n"
"MIME-Version: 1.0\n"
"Content-Transfer-Encoding: 8bit\n"
msgid "Alist" msgid "Alist"
msgstr "Alist 文件列表" msgstr "Alist 文件列表"
@ -7,6 +17,9 @@ msgstr "打开 Web 界面"
msgid "A file list program that supports multiple storage." msgid "A file list program that supports multiple storage."
msgstr "一款支持多种存储的目录文件列表程序。" msgstr "一款支持多种存储的目录文件列表程序。"
msgid "Setting"
msgstr "设置"
msgid "Basic Setting" msgid "Basic Setting"
msgstr "基本设置" msgstr "基本设置"
@ -19,9 +32,15 @@ msgstr "启用"
msgid "Port" msgid "Port"
msgstr "端口" msgstr "端口"
msgid "Web Protocol"
msgstr "Web 协议"
msgid "Enable SSL" msgid "Enable SSL"
msgstr "启用 SSL" msgstr "启用 SSL"
msgid "Force HTTPS"
msgstr "强制 HTTPS"
msgid "SSL cert" msgid "SSL cert"
msgstr "SSL 证书" msgstr "SSL 证书"
@ -61,6 +80,18 @@ msgstr "允许从外网访问"
msgid "Enable Logs" msgid "Enable Logs"
msgstr "启用日志" msgstr "启用日志"
msgid "Max Size"
msgstr "日志文大小"
msgid "Max backups"
msgstr "日志备份数量"
msgid "Max age"
msgstr "日志保存天数"
msgid "Log Compress"
msgstr "日志压缩"
msgid "Clear logs" msgid "Clear logs"
msgstr "清空日志" msgstr "清空日志"
@ -79,6 +110,12 @@ msgstr "新密码:"
msgid "New password has been copied to clipboard." msgid "New password has been copied to clipboard."
msgstr "新密码已复制到剪贴板。" msgstr "新密码已复制到剪贴板。"
msgid "Force read config"
msgstr "强制读取配置"
msgid "Setting this to true will force the program to read the configuration file, ignoring environment variables."
msgstr "将此设置为 true 可以强制程序读取配置文件,而忽略环境变量"
msgid "Login Validity Period (hours)" msgid "Login Validity Period (hours)"
msgstr "登录有效期(小时)" msgstr "登录有效期(小时)"
@ -89,7 +126,16 @@ msgid "0 is unlimited, It is recommend to set a low number of concurrency (10-20
msgstr "默认0不限制低性能设备建议设置较低的并发数10-20" msgstr "默认0不限制低性能设备建议设置较低的并发数10-20"
msgid "Site URL" msgid "Site URL"
msgstr "站点 URL" msgstr "站点地址"
msgid "CDN URL"
msgstr "CDN 地址"
msgid "JWT Key"
msgstr "JWT 密钥"
msgid "Disable TLS Verify"
msgstr "禁用 TLS 验证"
msgid "When the web is reverse proxied to a subdirectory, this option must be filled out to ensure proper functioning of the web. Do not include '/' at the end of the URL" msgid "When the web is reverse proxied to a subdirectory, this option must be filled out to ensure proper functioning of the web. Do not include '/' at the end of the URL"
msgstr "Web 被反向代理到二级目录时,必须填写该选项以确保 Web 正常工作。URL 结尾请勿携带 '/'" msgstr "Web 被反向代理到二级目录时,必须填写该选项以确保 Web 正常工作。URL 结尾请勿携带 '/'"
@ -97,11 +143,11 @@ msgstr "Web 被反向代理到二级目录时,必须填写该选项以确保 W
msgid "Delayed Start (seconds)" msgid "Delayed Start (seconds)"
msgstr "开机延时启动(秒)" msgstr "开机延时启动(秒)"
msgid "Enable Database" msgid "Database"
msgstr "启用远程数据库" msgstr "数据库"
msgid "Database Type" msgid "Database Type"
msgstr "类型" msgstr "数据库类型"
msgid "Database Host" msgid "Database Host"
msgstr "主机" msgstr "主机"
@ -127,3 +173,48 @@ msgstr "SSL模式"
msgid "Database DSN" msgid "Database DSN"
msgstr "DSN" msgstr "DSN"
msgid "Task threads"
msgstr "任务线程"
msgid "Download Workers"
msgstr "下载任务线程数"
msgid "Download Max Retry"
msgstr "下载任务重试次数"
msgid "Transfer Workers"
msgstr "中转任务线程数"
msgid "Transfer Max Retry"
msgstr "中转任务下载重试次数"
msgid "Upload Workers"
msgstr "上传任务线程数"
msgid "Upload Max Retry"
msgstr "上传任务重试次数"
msgid "Copy Workers"
msgstr "复制任务线程数"
msgid "Copy Max Retry"
msgstr "复制任务重试次数"
msgid "CORS Settings"
msgstr "跨域设置"
msgid "Allow Origins"
msgstr "允许来源Origins"
msgid "Allow Methods"
msgstr "允许方法Methods"
msgid "Allow Headers"
msgstr "允许标头Headers"
msgid "Object Storage"
msgstr "对象存储"
msgid "Enabled S3"
msgstr "启用 S3"

View File

@ -18,7 +18,7 @@
} }
}, },
"admin/nas/alist/basic": { "admin/nas/alist/basic": {
"title": "Basic Setting", "title": "Setting",
"order": 30, "order": 30,
"action": { "action": {
"type": "view", "type": "view",