默认监听改为 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 说明。
69 lines
1.8 KiB
Go
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)
|
|
}
|
|
}
|