cdrop — 跨 OS 剪贴板与文件传输服务

Commilitia Drop:自托管的跨设备剪贴板同步与点对点文件传输。

- 后端 Go(chi / SQLite WAL / SSE Hub / WebRTC signaling + 状态机 / Relay ring buffer),编译进单个 distroless 镜像(前端 go:embed)。
- 前端 React + TanStack Router + Zustand,自实现 SSE + WebRTC P2P,NAT 受阻时回退服务端中继;聚珍(Juzhen)CJK 综合排版。
- 桌面端 Wails v2(macOS / Windows),瘦客户端复用 web。
- 鉴权 OIDC PKCE(自建 Casdoor 等),refresh_token 信封加密存系统密钥库;iOS Shortcut 用 HS256 scoped token。

架构文档与变更记录见 docs 分支(PROJECT_BRIEF / FRONTEND_DESIGN / CHANGELOG)。

本次为公开发布初始提交:完整开发历史(含部署细节)留存于私有归档,公开仓库自此干净起步。
This commit is contained in:
2026-06-15 21:38:28 +08:00
commit f21fa5b5e8
239 changed files with 29010 additions and 0 deletions
+43
View File
@@ -0,0 +1,43 @@
# syntax=docker/dockerfile:1.7
#
# cdrop:latest —— 应用镜像。基础环境(Go 工具链 + node_modules + go modules
# 已被 cdrop-base:latest 预热(见 docker/Dockerfile.base),这里只做源码层与
# 跨编译。
#
# 构建(部署平台为 linux/amd64):
# docker buildx build --platform linux/amd64 \
# -f docker/Dockerfile -t cdrop:latest --load .
#
# BUILDPLATFORM 让 build 阶段跑在宿主原生 archmacOS arm64),跨编译产出
# linux/amd64 的 Go 二进制;最终 runtime FROM distroless 是 linux/amd64
# 但只有 COPY 一层,不经过 qemu 执行任何 amd64 程序。
# ---- build (uses cached base) ----
FROM --platform=$BUILDPLATFORM cdrop-base:latest AS build
ARG TARGETOS=linux TARGETARCH=amd64
# Vite 编译期 envdev 模式 token 必须随 image 烤进 bundleprod 部署留空即可
ARG VITE_CDROP_DEV_TOKEN=""
ARG VITE_CDROP_STUN_URLS=""
ENV VITE_CDROP_DEV_TOKEN=$VITE_CDROP_DEV_TOKEN \
VITE_CDROP_STUN_URLS=$VITE_CDROP_STUN_URLS
WORKDIR /src
# 复制源码(依赖在 base 中已就位)
COPY . .
# 前端构建(VITE_* 环境变量已 export
RUN cd web && npm run build
# 嵌入到 internal/webui/dist 让 //go:embed 拿到
RUN rm -rf ./internal/webui/dist && cp -a web/dist ./internal/webui/dist
# 跨编译 Go 到目标平台
RUN GOOS=$TARGETOS GOARCH=$TARGETARCH CGO_ENABLED=0 \
go build -trimpath -ldflags="-s -w" -o /out/cdropd ./cmd/cdropd
# ---- runtime (linux/amd64 distroless) ----
FROM gcr.io/distroless/static-debian12:nonroot
COPY --from=build /out/cdropd /cdropd
USER nonroot:nonroot
EXPOSE 8080
ENTRYPOINT ["/cdropd"]