Skip to content

Latest commit

 

History

History
186 lines (138 loc) · 8.78 KB

File metadata and controls

186 lines (138 loc) · 8.78 KB

Stationary (简体中文)

Stationary Logo

多平台媒体资产管理与集成平台 (MAM)

Stationary 是一款专为创意工作者与内容管理者打造的高性能自建媒体资产管理系统。集内容聚合、元数据同步、交互播放、本地归档与 AI 混合检索于一体,无缝对接各类外部同步 Agent 与平台集成端。

Bun Nuxt 4 Hono Flutter Drizzle ORM PostgreSQL

核心特性 • 用户界面 • 工作空间 • 快速上手 • 系统文档

English Documentation


✨ 核心特性

  • 🎨 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 清扫机制,零依赖高可靠运行。

🎨 用户界面与视图

1. Board 视图 (Posts)

以 Posts 为基本单元陈列。每张卡片展示作者信息、发布时间、标签以及首张 Media 的缩略图封面。

Board 视图 (Posts)

2. 详情抽屉 (Post Inspector)

点击 Post 卡片后从右侧滑出。内置 Swiper 驱动的高清媒体轮播图与完整的 Post 元数据审查面板。

详情抽屉 (Post Inspector)

3. Media 视图 (All Pins Grid)

越过 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 缓存与接口限流

1. 安装依赖

bun install

2. 配置环境变量

在对应目录下分别创建 .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)。

3. 初始化数据库迁移

cd apps/server
bun run db:migrate

4. 启动开发服务器

在根目录下并行启动所有服务:

bun run dev

🐳 Docker Compose 联合部署 (单机 / 私有化部署)

前端与后端已合并打包为单一高性能 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

☸️ Kubernetes & GitOps 编排 (k3s + ArgoCD + GitHub Actions)

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.yaml

📚 系统文档

docs/ 目录下包含完整的系统架构与技术设计文档:


📄 许可证

私有项目,保留所有权利。