Files
user 1a4d750a4e feat: 增加开发/生产启动脚本,默认内网监听,并修复账号根 PROPFIND 404
默认监听改为 0.0.0.0:18900,内网设备可直接访问;sso 模式仍要求绑回环。
启动日志不再把 0.0.0.0 写成 http://0.0.0.0。

新增 start-dev.sh 与 start-prod.sh(后台 nohup,不占用终端),公共逻辑在
start-lib.sh。开发脚本可按源码指纹决定是否编译;生产脚本在普通启动和
注册 systemd 时同样比对二进制,不一致则 make build。无完整源码时只用现有
二进制。指纹与 pid/日志写入 .run/(已 gitignore)。

生产脚本交互菜单支持后台启动、注册/取消系统服务与开机自启。占用端口时:
本仓库开发或脚本实例先停再接管默认 18900;其它进程才改用相邻端口。临时
换端口不写回下次默认地址。启动信息为每个内网地址同时打印管理页和文件页。

WebDAV 账号根无尾斜杠(如 /ccswitch)会按 /ccswitch/ 处理,避免客户端
PROPFIND 得到 404。补充对应测试。README 同步启动、部署与 systemd 说明。
2026-10-03 11:39:14 +08:00

69 lines
1.8 KiB
Go

// Command davbox 启动一个按账号隔离的 WebDAV 服务,并内置 admin / client 页面。
package main
import (
"flag"
"log"
"net/http"
"os"
"time"
"github.com/YLing2024/davbox/internal/account"
"github.com/YLing2024/davbox/internal/auth"
"github.com/YLing2024/davbox/internal/server"
)
func main() {
addr := flag.String("addr", "0.0.0.0:18900", "监听地址")
dataDir := flag.String("data", "./data", "数据目录")
flag.Parse()
authMode, err := auth.ParseMode(os.Getenv("AUTH_MODE"))
if err != nil {
log.Fatalf("%v", err)
}
if err := os.MkdirAll(*dataDir, 0o755); err != nil {
log.Fatalf("创建数据目录失败: %v", err)
}
store, err := account.Open(*dataDir)
if err != nil {
log.Fatalf("加载账号失败: %v", err)
}
secret, err := auth.LoadOrCreateSecret(*dataDir)
if err != nil {
log.Fatalf("加载会话密钥失败: %v", err)
}
// builtin 模式加载(必要时生成)自带管理员口令;sso 模式不碰自带账号体系。
var adminHash []byte
if authMode.IsSSO() {
log.Printf("管理端认证: SSO(信任 %s,请确保仅在网关后暴露)", auth.HeaderAuthUser)
} else {
adminHash, err = auth.LoadOrCreateAdmin(*dataDir)
if err != nil {
log.Fatalf("加载管理员口令失败: %v", err)
}
}
srv := server.New(server.Config{
DataDir: *dataDir,
Store: store,
AdminHash: adminHash,
Signer: auth.NewSigner(secret),
AuthMode: authMode,
})
httpServer := &http.Server{
Addr: *addr,
Handler: srv.Handler(),
ReadHeaderTimeout: 15 * time.Second,
}
log.Printf("davbox 已启动,监听 %s,数据目录 %s", *addr, *dataDir)
if err := httpServer.ListenAndServe(); err != nil && err != http.ErrServerClosed {
log.Fatalf("服务退出: %v", err)
}
}