92a03aeafd
页面 / PWA 关闭、或桌面窗口非前台时,收到文件、消息、传输完成 / 失败以系统通知提醒。
判定统一为「页面打开走应用内提示,否则系统通知」,三端各自落地;网页端的判定直接复用
Hub.SendTo 的投递结果,零额外状态。
- Web Push(VAPID,账号无关):服务端 internal/push.Sender 在事件未经 SSE 投递到目标
设备时(即该设备页面已关)发推送,文案按订阅 locale 在服务端渲染(中简 / 中繁 / 英)、
404 / 410 自动清理死订阅;新增 push_subscriptions 表(含 locale,主键为 endpoint 的
SHA-256 以幂等 upsert)+ /api/push/{vapid-key, subscribe POST/DELETE} 端点
- 事件挂接:transfer:incoming / message(离线返 202,文本随推送送达)/ transfer:state
DONE|FAILED,均未投递才推
- 配置 CDROP_VAPID_PUBLIC_KEY / CDROP_VAPID_PRIVATE_KEY(半对即拒启动,都空则推送惰性
关闭)+ just vapid-keygen 生成工具(cmd/vapidgen)
- 前端:service worker 加 push / notificationclick(仍不拦截 /api 与导航);net/push.ts
订阅管理 + push store slice + 设置页「推送通知」面板(仅浏览器 / PWA);登录后 resyncPush
把既有订阅重新登记到当前用户,换用户 / endpoint 轮换 / 切换语言皆自愈
- 桌面原生通知:platform/notify_{darwin,windows,other}.go + notify_darwin.m,仅窗口非
前台时弹原生通知(macOS UNUserNotificationCenter,未签名时安全空操作、待签名后显示;
Windows go-toast 即用);app.go ShowNotification 绑定,前端 notifyNativeIfBackground
复用 hub 事件分发 + 客户端本地化
- 文档:README / .env.example / compose 模板补 CDROP_VAPID_* 配置
注:sqlc v1.31.1 对 query 文件里的多字节字符会错位偏移、生成损坏 SQL,故 query 注释保持纯
ASCII(文件内留有警示)。
46 lines
2.4 KiB
YAML
46 lines
2.4 KiB
YAML
# cdrop 在你的 docker-compose.yaml 中的服务条目片段。
|
||
# NN 由你决定(与既有服务区分的编号 / 名称);your-proxy-network 换成你的反代所在网络。
|
||
#
|
||
# 不显式 ports —— 走内部网络,反代(如 Caddy)通过 NN-cdrop:8080 访问。
|
||
# 持久化挂一个目录到 /data,里面只有 cdrop.db(SQLite WAL)。
|
||
|
||
NN-cdrop:
|
||
image: cdrop:latest
|
||
container_name: NN-cdrop
|
||
restart: unless-stopped
|
||
networks: [your-proxy-network]
|
||
ports: []
|
||
volumes:
|
||
- ./NN-cdrop/data:/data
|
||
environment:
|
||
# M13 首轮 dev 模式(验证 Caddy / H3 管道),稳定后切 prod 见下方注释
|
||
CDROP_AUTH_MODE: dev
|
||
CDROP_DEV_TOKEN: REPLACE_WITH_RANDOM_HEX64
|
||
CDROP_DB_PATH: /data/cdrop.db
|
||
CDROP_LISTEN: ":8080"
|
||
CDROP_DEVICE_TTL_HOURS: "196"
|
||
|
||
# ---- prod 切换时启用以下,并把 CDROP_AUTH_MODE 改成 prod、删掉 DEV_TOKEN ----
|
||
# CDROP_OIDC_AUTHORIZE_URL: https://your-idp.example/login/oauth/authorize
|
||
# CDROP_OIDC_TOKEN_URL: https://your-idp.example/api/login/oauth/access_token
|
||
# JWKS 可走 IdP 内网地址省一跳;也可用公网 https。
|
||
# CDROP_OIDC_JWKS_URL: https://your-idp.example/.well-known/jwks
|
||
# CDROP_OIDC_ISSUER: https://your-idp.example/
|
||
# prod 强制非空(空则跳过 audience 校验 = 同 JWKS 其他应用可冒充)
|
||
# CDROP_OIDC_AUDIENCE: <你的 OAuth client_id>
|
||
# CDROP_OIDC_CLIENT_ID: <你的 OAuth client_id>
|
||
# CDROP_OIDC_REDIRECT_URI: https://your-domain.example/oauth/callback
|
||
# CDROP_OIDC_SCOPES: "openid profile email"
|
||
# prod 强制非空:浏览器免重登会话 refresh_token 落盘加密密钥(SHA-256 派生 AES-256)
|
||
# CDROP_SESSION_SECRET: REPLACE_WITH_RANDOM_HEX64
|
||
# CDROP_HS256_SECRET: REPLACE_WITH_RANDOM_HEX64
|
||
|
||
# ---- 可选:Web Push(VAPID)推送通知(不配则推送惰性关闭)----
|
||
# 用 `just vapid-keygen` 生成一对,二者须同时设置(半对即拒启动)
|
||
# CDROP_VAPID_PUBLIC_KEY: <just vapid-keygen 输出>
|
||
# CDROP_VAPID_PRIVATE_KEY: <just vapid-keygen 输出>
|
||
|
||
# ---- 可选:Cloudflare Realtime TURN over TLS(不配则前端 STUN-only 兜底)----
|
||
# CDROP_CF_TURN_KEY_ID: <dash.cloudflare.com → Realtime → TURN App>
|
||
# CDROP_CF_TURN_API_TOKEN: <同 App 派发的 API Token>
|