Skip to content

Repository files navigation

一个革新性的静态博客系统,由前端展示、内容存储和可选的 CMS 管理端三个仓库组成。

✨ 支持在线发布文章 · 可视化配置管理 · 无需本地开发环境

Ryuchan Logo

license   release

🖥️ Demo


🏗️ 系统架构

RyuChan 从 v3.1.0 起拆分为两个核心仓库,可选 CMS 管理端:

仓库 职责 技术栈 地址
RyuChan(前端仓) Astro 模板、组件、样式、构建配置 Astro 5.x + Tailwind CSS + React 19 当前仓库
RyuChan-Content(内容仓) 文章、站点配置、友链、项目、图片等所有内容 Markdown / YAML kobaridev/RyuChan-Content
RyuChan-CMS(管理端·可选) Web 可视化内容管理后台 React 19 + Vite + Tailwind CSS kobaridev/RyuChan-CMS
┌───────────────────────────┐
│  RyuChan-Content(内容仓) │   ┌───────────────────────┐
│  文章/配置/图片/友链等     │   │  RyuChan-CMS(可选)   │
└─────────────┬─────────────┘   │  React/Vite 管理端     │
              │ prebuild clone  │  /blog / /config 等    │
              ▼                 └───────────┬───────────┘
┌───────────────────────┐                   │ trigger-deploy
│      RyuChan          │                   ▼
│  (Astro 前端展示)      │──────────────►  ┌──────────────────┐
│  /blog / /about 等    │   构建同步      │  Cloudflare Pages│
└───────────────────────┘                 │   部署上线         │
                                          └──────────────────┘

为什么拆分?

  • 写文章和改代码互不干扰,内容仓可单独设为私有
  • 内容仓提交历史干净,前端部署与内容发布解耦
  • 可选使用 RyuChan-CMS 进行可视化内容管理,不依赖亦可正常编辑

✨ 核心亮点

🚀 在线编辑体验

RyuChan 内置了在线编辑能力,无需本地开发环境即可直接管理博客内容:

  • 📝 在线发布/编辑文章 — 在浏览器中编写、预览、发布文章,支持 Markdown 编辑、图片上传、实时预览
  • ⚙️ 可视化配置管理/config 页面管理网站标题、主题、Banner、社交链接等,无需手动编辑 YAML
  • 🔐 GitHub App 认证 — 基于 GitHub App 的安全认证,所有变更直接提交到内容仓,保持版本控制
  • 📦 多模块编辑 — 友链、导航、相册、音乐等均可在线管理

关于页编辑/about-edit 提供代码级编辑入口(直接编辑 Astro 模板),功能尚在完善中。如需更完善的可视化编辑体验,可配合使用 RyuChan-CMS(见下文)。

preview preview

🎨 优雅的前端展示

  • ✅ 白天 / 黑夜模式切换
  • ✅ 极速访问速度与优秀 SEO(SSG 静态生成)
  • ✅ 视图过渡动画(ClientRouter)
  • ✅ 文章全文搜索(Pagefind)
  • ✅ 移动端优先的响应式设计
  • ✅ 高度可配置的 Banner(随机图、打字机效果)
  • ✅ 使用 Tailwind CSS + daisyUI 构建
  • ✅ RSS 订阅支持
  • ✅ 追番管理(TMDB API + Bilibili 同步)
  • ✅ 网站导航(分类资源导航,支持搜索筛选)
  • ✅ 音乐播放(Meting API,支持网易云/QQ音乐等平台歌单)
  • ✅ 相册与照片墙(瀑布流 + Fancybox 灯箱)

⬇️ 快速开始

前置要求

  • pnpm 包管理器
  • Git
  • GitHub App(用于在线编辑功能)

1. 克隆前端仓库

git clone https://github.com/kobaridev/RyuChan.git
cd RyuChan
pnpm i

2. 配置内容仓库

前端仓需要关联内容仓才能获取文章和配置。有两种方式:

方式一:本地开发(推荐)

将内容仓克隆到同级目录,前端仓会自动检测:

# 在 RyuChan 的上级目录执行
git clone https://github.com/kobaridev/RyuChan-Content.git ryuchan-content

或通过环境变量指定路径:

# 在 RyuChan 根目录创建 .env
CONTENT_REPO=/path/to/ryuchan-content

方式二:CI / 自动化构建

在环境变量中配置内容仓凭据:

CONTENT_REPO_OWNER=kobaridev
CONTENT_REPO_NAME=RyuChan-Content
CONTENT_REPO_BRANCH=main
CONTENT_TOKEN=ghp_xxxxxxxxxxxx    # 内容仓为私有时需要

3. 运行

pnpm run dev

📦 内容仓库结构(RyuChan-Content)

内容仓的所有文件均通过 prebuild 脚本同步到前端仓对应位置。

ryuchan-content/
├── src/content/
│   ├── site/config.yaml                   # 站点通用配置:标题/描述/主题/favicon/banner
│   ├── user/config.yaml                   # 用户信息:头像/描述/社交链接/收款码
│   ├── footer/config.yaml                 # 页脚:社交链接与备案信息
│   ├── blog/
│   │   ├── config.yaml                    # 博客模块标题/副标题 + 每页文章条数
│   │   └── src/                           # 文章(.md / .mdx),一条记录一篇文章
│   ├── about/
│   │   ├── config.yaml                    # 关于页标题/副标题
│   │   └── src/index.md                   # 关于页正文
│   ├── friends/
│   │   ├── config.yaml                    # 友链页配置
│   │   └── list/                          # 一条友链一个文件(01.yaml, 02.yaml ...)
│   ├── project/
│   │   ├── config.yaml                    # 项目页配置
│   │   └── src/                           # 一个项目一个文件(01.yaml, 02.yaml ...)
│   ├── album/
│   │   ├── config.yaml                    # 相册页配置
│   │   └── categories/                    # 一个相册一个文件(一组照片)
│   ├── navigation/
│   │   ├── config.yaml                    # 导航页配置
│   │   └── categories/                    # 一个分组一个文件(01.yaml, 02.yaml ...)
│   ├── music/
│   │   ├── config.yaml                    # 音乐页配置 + Meting API 基址
│   │   ├── list/                          # 一个播放列表一个文件
│   │   └── custom/                        # 自定义歌单完整数据
│   ├── anime/
│   │   ├── config.yaml                    # 追番页配置 + 数据源列表
│   │   └── provider/                      # bilibili.yaml / tmdb.yaml
│   ├── comments/
│   │   ├── config.yaml                    # 评论开关与选用 provider
│   │   └── provider/                      # giscus.yaml / twikoo.yaml / waline.yaml
│   └── analysis/
│       ├── config.yaml                    # 统计脚本开关
│       └── provider/                      # umami / claity 统计脚本
├── assets/
│   ├── media/                             # 文章配图,构建时映射到 public/image/
│   └── brand/                             # 站点级图片,构建时展开到 public/ 根
│       ├── favicon.ico / logo.png / profile.png / home.webp
│       └── qrcode/
│           ├── Alipay.jpg
│           └── WeChat.jpg
└── ryucms.schema.json                     # RyuChan-CMS 管理端的 collection 定义

内容 → 前端映射关系

prebuild 脚本将内容仓文件同步到前端仓对应位置:

内容仓 前端仓
src/content/blog/src/ src/content/blog/
src/content/friends/list/*.yaml 合成 → src/data/friends.yaml
src/content/project/src/*.yaml 合成 → src/data/projects.yaml
src/content/navigation/categories/*.yaml 合成 → src/data/navigation.yaml
src/content/album/categories/*.yaml 合成 → src/data/albums.json
src/content/site/config.yaml config.site.*(除 pages/menu 外)
src/content/user/config.yaml config.user.*
src/content/blog/config.yaml config.site.pages.home.* + config.site.blog
src/content/music/list/*.yaml 合成 → ryuchan.config.yaml(playlists 配置)
src/content/music/custom/*.yaml fetch-music-duration.mjs 注入 music.json
src/content/footer/config.yaml 注入前端页脚
src/content/comments/provider/*.yaml Astro 构建时读取
src/content/anime/provider/*.yaml Astro 构建时读取
src/content/analysis/provider/*.html 注入 <head>
assets/media/ public/image/
assets/brand/ public/ 根(展开,含 qrcode)

⚠️ assets/brand 展开public/ 根目录,/logo.png/profile.png/favicon.ico 等绝对路径引用保持不变。


🔧 可选:CMS 管理端(RyuChan-CMS)

RyuChan-CMS 是独立的内容管理后台,可选使用。对于希望完全脱离代码进行内容管理的项目,可作为替代或补充方案。

功能模块

路由 功能
/dashboard 管理面板概览
/blog 文章列表与管理
/blog/new 新建文章
/blog/:slug/edit 编辑已有文章
/config/site 站点全局配置
/config/module-titles 各模块标题设置
/config/:module 模块级配置(comments、anime、music 等)
/navigation 导航管理
/album 相册管理
/friends 友链管理
/projects 项目管理
/music 音乐歌单管理
/about 关于页可视化编辑

技术栈

  • React 19 + Vite 8
  • Tailwind CSS + daisyUI
  • CodeMirror 6(Markdown 编辑器)
  • GitHub App OAuth 登录

CMS 通过 GitHub App OAuth 直接读写 RyuChan-Content 内容仓,不依赖前端仓库运行。 不部署 CMS 完全不影响 RyuChan 博客的正常使用——内置的 /write/config 页面提供基础的在线编辑能力。


🔐 环境变量

前端仓(RyuChan)

参考 .env.example,各变量说明如下:

变量 用途 必填场景
PUBLIC_GITHUB_OWNER GitHub 用户名/组织(内容仓 owner) 本地开发、在线编辑
PUBLIC_GITHUB_REPO 内容仓仓库名 本地开发、在线编辑
PUBLIC_GITHUB_BRANCH 内容仓分支 本地开发、在线编辑
PUBLIC_GITHUB_APP_ID GitHub App ID 本地开发、在线编辑
PUBLIC_GITHUB_ENCRYPT_KEY 用于 AES-256 加密 PEM 私钥的密钥 本地开发、在线编辑(可选)
PUBLIC_FRONTEND_REPO 前端仓仓库名(仅 about-edit 等写入前端仓的功能需要) 仅约用 about-edit
CONTENT_REPO_OWNER 内容仓所属用户/组织 所有构建环境
CONTENT_REPO_NAME 内容仓仓库名 所有构建环境
CONTENT_REPO_BRANCH 内容仓分支 所有构建环境
CONTENT_TOKEN Personal Access Token(repo scope) 内容仓为私有时
CONTENT_REPO 本地内容仓路径(设置后跳过 clone,性能更快) 本地开发(可选)

本地开发(.env 文件)

# 内容仓 GitHub 配置(在线编辑写入目标)
PUBLIC_GITHUB_OWNER=kobaridev
PUBLIC_GITHUB_REPO=RyuChan-Content
PUBLIC_GITHUB_BRANCH=main
PUBLIC_GITHUB_APP_ID=           # 你的 GitHub App ID
PUBLIC_GITHUB_ENCRYPT_KEY=      # 你的 AES-256 加密密钥(可选)

# 前端仓名称(仅 about-edit 需要,默认 RyuChan)
# PUBLIC_FRONTEND_REPO=RyuChan

# 内容仓(推荐:克隆到同级目录自动检测)
# git clone https://github.com/kobaridev/RyuChan-Content.git ../ryuchan-content

# 或手动指定路径
# CONTENT_REPO=/absolute/path/to/ryuchan-content

# CI 构建用(本地可省略)
CONTENT_REPO_OWNER=kobaridev
CONTENT_REPO_NAME=RyuChan-Content
CONTENT_REPO_BRANCH=main
# CONTENT_TOKEN=ghp_xxxxxxxxxxxx  # 内容仓为私有时需要

GitHub Actions Secrets(前端仓)

Secret deploy-pages deploy-vercel deploy-worker
CONTENT_TOKEN 私有仓时需要 私有仓时需要 私有仓时需要
CLOUDFLARE_API_TOKEN
CLOUDFLARE_ACCOUNT_ID
VERCEL_TOKEN
VERCEL_ORG_ID
VERCEL_PROJECT_ID

配置地址:https://github.com/<owner>/RyuChan/settings/secrets/actions


内容仓(RyuChan-Content)

内容仓本身不需要环境变量,但需要配置 Actions Secrets 以触发前端部署:

Secret 说明
FRONTEND_REPO_OWNER 前端仓所属用户/组织
FRONTEND_REPO_NAME 前端仓仓库名
FRONTEND_BRANCH 触发部署的目标分支
DISPATCH_TOKEN 具有 repo scope 的 Personal Access Token

配置地址:https://github.com/<owner>/RyuChan-Content/settings/secrets/actions


CMS 管理端(RyuChan-CMS,可选)

参考 .env.example

变量 用途 必填场景
VITE_GITHUB_CLIENT_ID GitHub OAuth App Client ID 所有环境
VITE_OAUTH_PROXY_URL OAuth 代理地址 所有环境

本地开发:VITE_OAUTH_PROXY_URL=http://localhost:8787 生产部署:VITE_OAUTH_PROXY_URL=https://auth.131714.xyz

还需通过 Cloudflare Worker Secrets 配置(通过 npx wrangler secret put):

  • GITHUB_CLIENT_ID — GitHub OAuth Client ID
  • GITHUB_CLIENT_SECRET — GitHub OAuth Client Secret(私密,不能放 .env
  • REDIRECT_URI — OAuth 回调地址(必须与 GitHub OAuth App 设置的回调地址一致)
  • CMS_ORIGIN — CMS 前端部署地址,如 https://cms-xxx.vercel.app

详细 OAuth 代理配置见 RyuChan-CMS


📝 配置详解(site/config.yaml)

RyuChan 的所有网站配置由内容仓的 src/content/site/config.yaml 驱动,以下是完整字段说明:

site 配置

site:
  tab: RyuChan                      # 浏览器标签页标题
  title: RyuChan                    # 站点主标题
  title_type: text                  # 导航栏标题展示方式:text(文字)或 image(图片)
  title_image: /logo.png            # title_type 为 image 时使用的图片
  description: 站点描述文字           # SEO meta description
  language: zh                      # 语言代码(zh / en)
  favicon: /favicon.ico             # 站点图标
  theme:
    light: garden                   # 浅色主题(daisyUI 主题名)
    dark: dracula                   # 深色主题(daisyUI 主题名)
    code: snazzy-light              # 代码高亮主题
  date_format: ddd MMM DD YYYY      # 日期显示格式
  banner:
    enableRandom: true              # 是否启用随机 Banner 图
    randomUrl: https://t.alcy.cc/ycy # 随机图 API 地址
    randomCount: 5                  # 每次随机获取图片数量
    height: 70vh                    # Banner 区域高度
    images:                         # 固定图片列表(enableRandom 为 false 时使用)
      - https://example.com/bg1.jpg
  menu:                             # 顶部导航菜单
    - id: write
      text: 写作
      href: /write
      svg: material-symbols:edit-square-outline-rounded
      target: _self

user 配置

user:
  name: 作者名
  description: 个人简介
  site: https://example.com       # 个人主页
  avatar: /profile.png            # 头像(位于 assets/brand/)
  qr_wechat: /WeChat.jpg          # 微信收款码
  qr_alipay: /Alipay.jpg          # 支付宝收款码
  sidebar:
    social:                       # 侧边栏社交图标(Iconify 图标名)
      - href: https://github.com/user
        ariaLabel: Github
        svg: ri:github-line
  footer:
    social:                       # 页脚社交图标
      - href: https://twitter.com/user
        ariaLabel: Twitter
        svg: ri:twitter-line

其他模块配置

# blog/config.yaml
title: 博客标题
subtitle: 博客副标题
pageSize: 8                       # 每页文章条数
typewriterTexts:                  # 首页打字机效果文本
  - Hello World
  - 欢迎来到我的博客

# comments/config.yaml
enable: true
provider: twikoo                  # twikoo / waline / giscus

# comments/provider/twikoo.yaml
envId: xxx

# comments/provider/waline.yaml
serverURL: https://waline.example.com
lang: zh

# comments/provider/giscus.yaml
repo: owner/repo
repoId: xxx
category: Announcements
categoryId: xxx

# anime/config.yaml
title: 追番
provider:
  - bilibili
  - tmdb
subtitle: 记录和分享我喜欢的动漫

# anime/provider/bilibili.yaml
uid: 12345678

# anime/provider/tmdb.yaml
apiKey: xxx
listId: 12345

# music/config.yaml
title: Music
api: https://meting.mikus.ink/api # Meting API 基址
subtitle: 沉浸式享受音乐时光

# analysis/config.yaml
enable: true
provider:
  - umami-head                    # 或 claity

# analysis/provider/umami-head.yaml
baseUrl: https://umami.example.com
shareId: xxx
websiteId: xxx
timezone: Asia/Shanghai

📝 文章写作约定

文章 frontmatter 必填 titledescriptionpubDate,可选 updatedimagebadgedraftcategoriestags

名称 含义 是否必要 说明
title 文章标题 同时用作 URL slug
description 文章简介 显示在文章列表卡片
pubDate 发布日期 ISO 格式推荐:2026-08-16T00:00,兼容历史格式如 Jul 01 2024
updated 更新日期 同 pubDate 格式
image 文章封面 图片路径写 /image/xxx.webp(位于 assets/media/
categories 文章分类 字符串数组,如 ["技术", "生活"]
tags 文章标签 字符串数组,如 ["Astro", "博客"]
badge 文章徽标 设为 Pin 可置顶文章
draft 草稿状态 设为 true 则不在列表展示

配图引用:图片文件放在 assets/media/,frontmatter 和正文中统一写 /image/xxx。例如文件 assets/media/image1.webp,写 image: /image/image1.webp

MDX 文章:扩展名为 .mdx 的文章可使用 src/components/mdx/ 下的自定义组件,如 <Diff l="/image/l.webp" r="/image/r.webp" />


🌐 页面功能

追番页面

  • 集成 TMDB API 获取动漫元数据
  • 支持 Bilibili 追番列表同步
  • 实时搜索和筛选,按类型、评分排序

导航页面

  • 分类资源导航,支持搜索和筛选
  • 响应式卡片布局

相册页面

  • 瀑布流照片展示,支持多种比例(1x1 / 4x3 / 4x5 / 9x16)
  • Fancybox 灯箱浏览

音乐页面

  • 基于 Meting API 的多平台音乐播放
  • 支持网易云、QQ音乐等平台歌单
  • 自定义播放列表(provider: custom

静态页面

  • About — 个人简介、技术栈展示
  • Friends — 友链展示和站点展示
  • Projects — 个人项目展示

🛠️ 部署流程

最低配置(仅搭建博客)

仅需部署前端仓,无需 CMS:

1. 克隆内容仓到任意位置(或公开仓库)
2. 克隆前端仓,克隆内容仓到同级目录
3. 配置 GitHub Actions Secrets(CLOUDFLARE_*、CONTENT_TOKEN 如有)
4. push 代码触发 deploy-pages workflow
5. 内容更新时,push 内容仓自动触发 trigger-deploy → 前端 redeploy

完整配置(含可选 CMS)

1. 前端仓(RyuChan)→ Cloudflare Pages / Vercel / Workers
   - Secrets: CONTENT_TOKEN(私有仓)、CLOUDFLARE_API_TOKEN、CLOUDFLARE_ACCOUNT_ID
   - 或 VERCEL_TOKEN、VERCEL_ORG_ID、VERCEL_PROJECT_ID

2. 内容仓(RyuChan-Content)→ GitHub 公共/私有仓库
   - Secrets: FRONTEND_REPO_OWNER、FRONTEND_REPO_NAME、FRONTEND_BRANCH、DISPATCH_TOKEN
   - push 触发 trigger-deploy.yml → repository_dispatch → 前端 redeploy

3. CMS 管理端(RyuChan-CMS)→ 任意静态托管(Vercel / Cloudflare Pages 等)
   - Env: VITE_GITHUB_CLIENT_ID、VITE_OAUTH_PROXY_URL
   - OAuth 代理 Cloudflare Worker Secrets:
     GITHUB_CLIENT_ID、GITHUB_CLIENT_SECRET、REDIRECT_URI、CMS_ORIGIN

部署流程一图概览

本地开发:
  RyuChan-Content(本地 clone)
       ↓ prebuild 脚本同步
  RyuChan(pnpm dev)→ 浏览器访问

线上部署(无 CMS):
  push 内容仓  →  trigger-deploy  →  repository_dispatch  →  前端仓库 build + deploy
  push 前端仓  →  deploy-pages workflow  →  Cloudflare Pages

线上部署(含 CMS):
  push 内容仓  →  trigger-deploy  →  前端 redeploy
  CMS 部署(Vercel 等)→ GitHub OAuth → 直接读写内容仓

🛠️ 常用命令

pnpm dev                  # 启动开发服务器
pnpm build                # 完整构建(prebuild → astro build → pagefind 索引)
pnpm run search:index     # 生成/更新全文搜索索引
pnpm run preview          # 本地预览构建产物
pnpm run check            # Astro 类型检查
pnpm run deploy           # 构建并部署到 Cloudflare Pages
pnpm run prefetch:music   # 预取音乐时长数据
pnpm run search:clean     # 清理搜索索引

🙏 致谢

本项目基于以下优秀的开源项目:

  • Frosti — 项目核心基础,由 EveSunMaple 开发
  • Yukina — 部分设计巧思来自 WhitePaper233
  • Mizuki — 部分功能实现借鉴了 matsuzaka-yuki
  • 2025-blog-public — 在线编辑文章和配置站点的灵感来源,由 yysuni 开发
  • RyuChan-CMS — 可选的可视化 CMS 管理端,由同一作者开发,见 kobaridev/RyuChan-CMS

感谢所有开源社区的贡献者们!


📝 许可证

本项目采用 MIT 许可证

🤝 贡献

欢迎提交 Issue 和 Pull Request!

About

✨A static blog template built with Astro.

Resources

Stars

146 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages