Stationary 是一款专为创意工作者与内容管理者打造的高性能自建媒体资产管理系统。集内容聚合、元数据同步、交互播放、本地归档与 AI 混合检索于一体,无缝对接各类外部同步 Agent 与平台集成端。
核心特性 • 用户界面 • 工作空间 • 快速上手 • 系统文档
- 🎨 Card-on-Canvas 美学设计:融合 Apple 风格的空间卡片画布层级与 Linear 级别的桌面精细度,采用 HSL 色调与高密度布局。
- 📸 Live Photo 与原生多媒体支持:原生支持 Live Photo 交互播放与浏览器端 HEIC/HEIF 图像解码。
- 🎬 统一 DASH 分片流播:针对音视频分离的多轨媒体源,在后台解析
sidx索引块范围并生成 SegmentBase 元数据,通过dash.js实现免转码、低延迟流播。 - 🏷️ 多租户媒体库与标签管理:基于 Library 的物理隔离,支持 RBAC 细粒度授权(
VIEWER/EDITOR/ADMIN),提供标签别名映射与规范化审核流。 - 🔍 AI 混合检索与富化:结合 SQL Trigram 模糊匹配、Gemini 文本向量 (
text-embedding-004) 与视觉向量 (multimodal-embedding-004),使用倒数排序融合 (RRF) 算法实现精准检索与 AI 标注。 - ⚡ 自研持久化任务引擎:基于 PostgreSQL 的任务队列引擎,利用
SKIP LOCKED原子租约锁、指数退避重试与JobSweeper清扫机制,零依赖高可靠运行。
以 Posts 为基本单元陈列。每张卡片展示作者信息、发布时间、标签以及首张 Media 的缩略图封面。
点击 Post 卡片后从右侧滑出。内置 Swiper 驱动的高清媒体轮播图与完整的 Post 元数据审查面板。
越过 Post 容器,直接陈列所有 Media 资源(图片/视频),支持两种布局模式:
- Flat 模式 (平铺):所有 Media 独立渲染为卡片,适合精细化物色与搜索特定资产。
- Stacked 模式 (堆叠):将同一 Post 下的多张 Media 折叠展示,仅显示首图及数量角标 (
+N)。
Stationary 采用 Bun Workspace Monorepo 架构:
stationary/
├── apps/
│ ├── server/ # Bun + Hono 后端 API 服务,Drizzle ORM,自研 DB 任务队列引擎
│ ├── web/ # Nuxt 4 + Vue 3 桌面端 Web 应用,Tailwind CSS v4,Swiper,Plyr
│ └── flutter/ # Flutter 多端跨平台客户端应用
└── docs/ # 系统设计规范与架构流转文档
| 应用/组件 | 技术栈 | 职责与功能 |
|---|---|---|
apps/server |
Bun, Hono, Drizzle ORM, PostgreSQL, Redis, @ai-sdk/google |
RESTful API、Better Auth 鉴权、异步任务引擎、S3 资产管理 |
apps/web |
Nuxt 4, Vue 3, Pinia, Vue Query, Tailwind CSS v4, dash.js | Web 客户端、Card-on-Canvas 布局系统、DASH 播放器、HEIC 渲染 |
apps/flutter |
Flutter, Dart, Chewie, PhotoView | 移动端与桌面端跨平台客户端 |
- Bun:
v1.3.0或更高版本 - PostgreSQL:
v15或更高版本(需开启pgvector与pg_trgm扩展) - Redis:用于 KV 缓存与接口限流
bun install在对应目录下分别创建 .env 文件:
- 后端 (Server):复制
apps/server/.env.example为apps/server/.env,填写 PostgreSQL、Redis 和 S3 凭证。 - 前端 (Web):复制
apps/web/.env.example为apps/web/.env,设置NUXT_PUBLIC_API_BASE_URL(默认http://localhost:9400)。
cd apps/server
bun run db:migrate在根目录下并行启动所有服务:
bun run dev前端与后端已合并打包为单一高性能 Docker 镜像(根目录 Dockerfile)。容器内置轻量级 Caddy 网关,统一对外暴露单一端口(4000),透明将 /api/* 路由至后端 Hono,其余请求路由至 Nuxt 前端,彻底杜绝跨域与双端口困扰:
# 1. 准备环境变量文件
cp .env.example .env
# 编辑 .env 配置外部 DB_URL、REDIS_URL、S3 等参数
# 2. 构建并在后台启动统一容器服务
bun run docker:up # 或: docker compose up -d
# 3. 查看实时日志
bun run docker:logs # 或: docker compose logs -f访问入口:
- Stationary 统一入口 (Web & API):
http://localhost:4000
Stationary 提供基于 k3s 与 ArgoCD 的现代化 GitOps 持续交付配置:
- CI/CD:GitHub Actions (
.github/workflows/deploy.yaml) 负责自动构建单一整合镜像并推送至 GHCR (ghcr.io/stariverr/stationary),自动更新 Kustomize 镜像版本。 - GitOps:ArgoCD 监听
deploy/k8s/overlays/production目录,自动化同步状态至 k3s 集群并保障状态自愈。 - 网关路由:适配 k3s 内置 Traefik Ingress Controller,将外部流量直通
stationary:4000服务。
在 k3s 集群中注册并启用 ArgoCD Application:
# 1. 在 stationary 命名空间下创建 Secret(连接外部数据库/Redis及各项密钥)
kubectl create namespace stationary
kubectl create secret generic stationary-secrets -n stationary \
--from-literal=DB_URL="postgresql://..." \
--from-literal=REDIS_URL="redis://..." \
--from-literal=AUTH_SECRET="..." \
--from-literal=RESEND_API_KEY="..." \
--from-literal=RESEND_EMAIL_SENDER="..." \
--from-literal=S3_ENDPOINT="..." \
--from-literal=S3_ACCESS_KEY_ID="..." \
--from-literal=S3_SECRET_ACCESS_KEY="..." \
--from-literal=S3_BUCKET="..." \
--from-literal=CDN_BASE_URL="..."
# 2. 应用 ArgoCD Application
kubectl apply -f deploy/argocd/application.yamldocs/ 目录下包含完整的系统架构与技术设计文档:
- 📐 系统设计与数据库规范说明 - 数据模型、软删除与生命周期、JobRunner 任务引擎规范。
- 🧭 Media / Track 数据架构改进任务书 - Media、Track、File 身份、生命周期、应用层一致性与迁移任务。
- 🔌 媒体元数据同步工作流 & API 契约 - 客户端对接规范、
external_id生成逻辑与 API 结构。 - 🔄 Metadata 物理保存与清理流程详细说明 -
saveMetadata执行流程、差异检测与 S3 软删除清扫。 - 🔍 多空间 AI 混合检索架构规范 - 向量空间隔离、pgvector HNSW 索引与 RRF 排序融合。
- ⚖️ 系统架构设计取舍与 Trade-offs - Multi-Track 设计与 DASH 分片解析的取舍考量。
- 🛠️ 任务执行引擎接入指南:新增任务类型 - 基于策略模式扩展后台异步任务处理器的指南。
- 📜 TypeScript 编写规范与避坑指南 - Temporal API、Web API Streams 和
bun:File强制编码规范。
私有项目,保留所有权利。

