Skip to content

Commit e79377b

Browse files
committed
fix(rclone): 前台 WebUI 直接输出日志
前台运行的目的就是让操作者看到 rclone 的启动和错误输出。默认前台模式不再传 --log-file,让 rclone stdout/stderr 直接留在当前终端;后台模式仍写入 .runtime/logs/webui.log。 Constraint: 保持后台日志文件行为 Rejected: 前台继续只提示 tail 日志 | 仍需要用户额外操作才能判断启动失败原因 Confidence: high Scope-risk: narrow Tested: Pester RcloneOps.Tests.ps1 Tested: node --test config/service/oss/rclone/rclone-ops.test.mjs Tested: pnpm qa Not-tested: 真实 rclone WebUI 交互登录
1 parent 0049961 commit e79377b

3 files changed

Lines changed: 23 additions & 16 deletions

File tree

config/service/oss/rclone/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ pwsh ./rclone-ops.ps1 doctor
102102

103103
## 启动 WebUI / RC
104104

105-
默认监听 `127.0.0.1:5572`。不带 `--background` 时是前台运行模式,命令会持续占用当前终端;如果没有持续输出,通常表示 `rclone rcd` 仍在运行,可打开 `http://127.0.0.1:5572` 或查看 `.runtime/logs/webui.log` 确认状态,按 `Ctrl+C` 停止。
105+
默认监听 `127.0.0.1:5572`。不带 `--background` 时是前台运行模式,命令会持续占用当前终端,并把 rclone 日志直接显示在当前终端;可打开 `http://127.0.0.1:5572` 确认状态,按 `Ctrl+C` 停止。后台模式才会把日志写入 `.runtime/logs/webui.log`
106106

107107
如果未设置 `RCLONE_RC_PASS`,rclone WebUI 会自动生成临时认证信息;建议日常运维显式设置强密码:
108108

config/service/oss/rclone/rclone-ops.mjs

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -369,13 +369,16 @@ function commandWebui(flags, passthrough) {
369369
'RCLONE_RC_PASS',
370370
process.env.RCLONE_RC_PASS ?? '',
371371
)
372+
const isBackground = flags.has('background')
372373
const logFile = resolveOption(
373374
flags,
374375
'log-file',
375376
'RCLONE_LOG_FILE',
376377
join(DEFAULT_LOG_DIR, 'webui.log'),
377378
)
378-
ensureDir(dirname(logFile))
379+
if (isBackground) {
380+
ensureDir(dirname(logFile))
381+
}
379382
const rcloneCheck = checkRclone(binary)
380383
if (!rcloneCheck.ok) {
381384
throw new Error(
@@ -389,9 +392,11 @@ function commandWebui(flags, passthrough) {
389392
'--rc-web-gui',
390393
`--rc-addr=${rcAddr}`,
391394
`--config=${configPath}`,
392-
`--log-file=${logFile}`,
393395
...passthrough,
394396
]
397+
if (isBackground) {
398+
args.push(`--log-file=${logFile}`)
399+
}
395400
if (rcPass) {
396401
args.push(`--rc-user=${rcUser}`, `--rc-pass=${rcPass}`)
397402
}
@@ -402,23 +407,21 @@ function commandWebui(flags, passthrough) {
402407
console.log('准备启动 rclone WebUI/RC:')
403408
console.log(` 地址: http://${rcAddr}`)
404409
console.log(` 配置: ${configPath}`)
405-
console.log(` 日志: ${logFile}`)
410+
console.log(` 日志: ${isBackground ? logFile : '当前终端(rclone stdout/stderr)'}`)
406411
if (!rcPass) {
407412
console.log(
408413
' 认证: 未设置 RCLONE_RC_PASS,rclone 会生成临时认证信息;建议日常运维显式设置强密码。',
409414
)
410415
}
411-
if (flags.has('background')) {
416+
if (isBackground) {
412417
console.log(' 模式: 后台启动,可用 stop-webui 停止。')
413418
} else {
414-
console.log(
415-
' 模式: 前台运行,会持续占用当前终端;无持续输出通常表示服务仍在运行,按 Ctrl+C 停止。',
416-
)
419+
console.log(' 模式: 前台运行,rclone 日志会直接显示在当前终端,按 Ctrl+C 停止。')
417420
console.log(' 提示: 如需命令立即返回,请使用 --background --no-open-browser。')
418421
}
419422

420423
return runRclone(binary, args, {
421-
background: flags.has('background'),
424+
background: isBackground,
422425
pidFile: join(DEFAULT_RUNTIME_DIR, 'webui.pid'),
423426
})
424427
}

config/service/oss/rclone/rclone-ops.ps1

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -624,35 +624,39 @@ function Start-RcloneOpsWebUi {
624624
$rcAddr = Get-RcloneOpsOption -Flags $Flags -Name 'addr' -EnvName 'RCLONE_RC_ADDR' -DefaultValue $script:DefaultRcAddr
625625
$rcPass = Get-RcloneOpsOption -Flags $Flags -Name 'pass' -EnvName 'RCLONE_RC_PASS' -DefaultValue ''
626626
$rcUser = if ($rcPass) { Get-RcloneOpsOption -Flags $Flags -Name 'user' -EnvName 'RCLONE_RC_USER' -DefaultValue $script:DefaultRcUser } else { '' }
627+
$isBackground = $Flags.ContainsKey('background')
627628
$logFile = Get-RcloneOpsOption -Flags $Flags -Name 'log-file' -EnvName 'RCLONE_LOG_FILE' -DefaultValue (Join-Path $script:DefaultLogDir 'webui.log')
628-
New-Item -ItemType Directory -Path (Split-Path -Parent $logFile) -Force | Out-Null
629+
if ($isBackground) {
630+
New-Item -ItemType Directory -Path (Split-Path -Parent $logFile) -Force | Out-Null
631+
}
629632

630633
if (-not (Get-Command $rclone -ErrorAction SilentlyContinue)) {
631634
throw "未找到 rclone 命令:$rclone。请先安装 rclone,或通过 --rclone / RCLONE_BIN 指定路径。"
632635
}
633636

634-
# WebUI 会暴露 RC API;默认只监听 localhost,避免无意暴露到公网。
635-
$rcloneArgs = @('rcd', '--rc-web-gui', "--rc-addr=$rcAddr", "--config=$configPath", "--log-file=$logFile")
637+
# 前台模式保留 rclone 的 stderr/stdout,后台模式才写日志文件,避免用户误判“没反应”。
638+
$rcloneArgs = @('rcd', '--rc-web-gui', "--rc-addr=$rcAddr", "--config=$configPath")
639+
if ($isBackground) { $rcloneArgs += "--log-file=$logFile" }
636640
if ($rcPass) { $rcloneArgs += @("--rc-user=$rcUser", "--rc-pass=$rcPass") }
637641
if ($Flags.ContainsKey('no-open-browser')) { $rcloneArgs += '--rc-web-gui-no-open-browser' }
638642
$rcloneArgs += $Passthrough
639643

640644
Write-Host '准备启动 rclone WebUI/RC:'
641645
Write-Host " 地址: http://$rcAddr"
642646
Write-Host " 配置: $configPath"
643-
Write-Host " 日志: $logFile"
647+
Write-Host (" 日志: {0}" -f ($(if ($isBackground) { $logFile } else { '当前终端(rclone stdout/stderr)' })))
644648
if (-not $rcPass) {
645649
Write-Host ' 认证: 未设置 RCLONE_RC_PASS,rclone 会生成临时认证信息;建议日常运维显式设置强密码。'
646650
}
647-
if ($Flags.ContainsKey('background')) {
651+
if ($isBackground) {
648652
Write-Host ' 模式: 后台启动,可用 stop-webui 停止。'
649653
}
650654
else {
651-
Write-Host ' 模式: 前台运行,会持续占用当前终端;无持续输出通常表示服务仍在运行,按 Ctrl+C 停止。'
655+
Write-Host ' 模式: 前台运行,rclone 日志会直接显示在当前终端,按 Ctrl+C 停止。'
652656
Write-Host ' 提示: 如需命令立即返回,请使用 --background --no-open-browser。'
653657
}
654658

655-
Invoke-RcloneOpsProcess -FilePath $rclone -Arguments $rcloneArgs -Background:($Flags.ContainsKey('background')) -PidFile (Join-Path $script:DefaultRuntimeDir 'webui.pid')
659+
Invoke-RcloneOpsProcess -FilePath $rclone -Arguments $rcloneArgs -Background:$isBackground -PidFile (Join-Path $script:DefaultRuntimeDir 'webui.pid')
656660
}
657661

658662
function Stop-RcloneOpsWebUi {

0 commit comments

Comments
 (0)