# 帆幕 — 私有影音库 · 弹幕观影 · 网盘挂载 **帆幕(Fanmu)** 是自建私有影音库:WebDAV/OpenList 挂载片源、媒体库扫描与 Bangumi 刮削、ArtPlayer 播放与弹幕(开放网络 + 本地 XML),多用户进度与权限。 基于 monorepo 分层(types → models → db → dao → trpc → web),本仓库按**产品仓**维护。 ``` . ├── app/ │ └── web/ @app/web — Astro SSR + React islands + i18n 路由 ├── packages/ │ ├── types/ @app/types — Zod 入参 schema + 共享 DTO │ ├── models/ @app/models — Drizzle 表定义(唯一 schema 源) │ ├── db/ @app/db — libSQL/Turso 连接单例 + drizzle-kit │ ├── dao/ @app/dao — 数据访问层 │ ├── trpc/ @app/trpc — tRPC 路由 + service │ ├── ui/ @app/ui — shadcn 风格基础组件 + Storybook │ ├── design-tokens/ @app/design-tokens │ ├── seo-geo/ @app/seo-geo — SEO/GEO 纯函数 │ ├── i18n/ @app/i18n — zh-CN / en 文案与 locale 工具 │ └── adsense/ @app/adsense — AdSense 加载(可选) └── docs/ ``` ## 快速开始 ```bash yarn install cp .env.example .env # 填入 TURSO_DATABASE_URL / TURSO_AUTH_TOKEN / PUBLIC_SITE_URL yarn db:push # 推 schema yarn dev:web # Astro :4321 ``` ## 技术栈 | 层 | 技术 | |------|------| | 前端 | Astro 7 + React 19 islands | | API | tRPC v11 | | ORM | Drizzle + @libsql/client(Turso) | | 样式 | Tailwind CSS 4 + design-tokens | | 校验 | Zod 4 | | 工程 | TypeScript 7 · Biome · Yarn 4 · Turbo | ## 分层(必须遵守) `web → trpc → dao → db → models`,横切 `types`。禁止循环依赖;跨包只走 `package.json` 的 `exports`。 新增业务实体请按既有分层接线:`types` schema → `models` 表 → `dao` 查询 → `trpc` service/router → `web` 页面。细节见根目录 `AGENTS.md`。 ## 首次运行配置(产品闭环) 1. 注册第一个账号(自动成为**管理员**) 2. **设置 → 开放弹幕网络**:填写弹弹play DevCenter 申请的 `AppId` / `AppSecret`([dev.dandanplay.com](https://dev.dandanplay.com)) 3. **设置 → 弹弹play 账号**:登录弹弹play 账号(站点共用会话,用于拉在线弹幕) 4. 挂载 WebDAV → 扫描/入库 → 播放页自动匹配或手选作品/集数 未完成 2/3 时播放页会提示「去设置」;本地 XML 导入不受影响。 ### Docker ```bash docker build -t fanmu:local . docker run -d -p 4330:4321 \ -e MEDIA_SECRET_KEY=<64-hex> \ -v $PWD/packages/db/local.db:/app/data/local.db \ fanmu:local # 然后走上面「首次运行配置」 ```