Skip to content

Latest commit

 

History

963 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

月读空间 · Tsukuyomi Space

简体中文 | English

给日常留一点月光。与八千代聊天,读故事、看创作,遇见同频的人。

围绕《超时空辉夜姬!》世界观构建的非盈利同人社区,以 Vue 3 + Express 连接 Live2D AI 陪伴、内容创作、社区互动与作品百科。

国内站 · 中文 / 日语 · 海外站 · English · 部署指南 · 问题反馈

项目预览 · 核心体验 · 快速开始 · 部署与配置 · 开发文档 · 支持项目

月读空间新版首页:月白樱粉主题、私人居所入口与月下新鲜事

项目预览

以下截图采集于 2026-10-05,来自国内站公开页面,使用 1280 × 720 桌面视口、浅色主题、未登录状态。主舞台展示精选视图,像素工坊展示内置的月光小屋示例;社区内容与时间、天气场景会持续变化。

Live2D AI 私人居所 主舞台 · 文章与创作
Live2D AI 私人居所 主舞台精选文章
192 × 108 像素工坊 超时空辉夜姬 Wiki
像素工坊画布与绘画工具 超时空辉夜姬百科首页

核心体验

  • 与八千代相伴:Live2D 角色、聊天、表情、TTS、音乐和天气场景组合成私人居所;可连接云端 LLM 或本机 Ollama,并通过 MCP 扩展工具。
  • 让对话延续:登录后的会话与长期记忆按账号隔离、跨设备同步;支持记忆管理、角色知识库,以及角色日记和人设备份导入。
  • 创作与交流:在主舞台阅读文章,在月读广场留言,在图库分享作品,或用固定 192 × 108 画布绘制、发布和导出像素画。
  • 探索作品世界:公开 Wiki 汇集角色、世界观、音乐与制作资料;节奏跑酷游戏提供键盘、触控和全屏游玩。
  • 记录每天的相遇:月契成长中心包含签到、每日任务、连续奖励与邀请成长;站内通知帮助追踪互动。
  • 统一的月光界面:深色 / 浅色主题、响应式导航与共享设计变量贯穿主要页面,国内站支持中文 / 日语,海外站提供英文入口。

快速开始

使用 Node.js 22.12+;当前 Vite 也支持 Node.js 20.19+。在仓库根目录安装依赖即可,无需在 backend/ 重复安装。

git clone https://github.com/redchenk/tsukuyomi-space.git
cd tsukuyomi-space
npm ci
npm run dev

开发命令会同时启动前端与 API:

服务 地址
Vite 前端 http://localhost:5173/
API 健康检查 http://localhost:3000/api/health

开发环境默认使用本地 SQLite,数据库迁移会在 API 启动时自动执行。Redis、Milvus、SMTP 和第三方 AI 服务按需配置;聊天与语音能力需要在房间设置中配置相应服务。额外音乐、视频背景等大资源需单独准备,详见部署指南。

常用命令

命令 用途
npm run dev 同时启动 API 与前端
npm run dev:api / npm run dev:web 单独启动 API / 前端
npm run build:web 构建前端到 dist/frontend/
npm run build:web:overseas 使用海外环境配置构建英文站
npm run build:live2d 重新构建 Live2D 房间运行时
npm run dev:live2d-studio 启动 Live2D Studio 开发服务
npm test 运行语法检查、API 与前端回归测试
npm run test:api / npm run test:frontend 单独运行 API / 前端回归测试
npm run test:e2e 运行 Playwright 端到端测试

运行端到端测试前,先执行 npm run build:web,并通过 npx playwright install chromium 安装浏览器;也可用 E2E_BASE_URL 指向已有测试服务。

部署与配置

新环境可使用 Docker Compose:

cp .env.docker.example .env.docker
# 编辑 .env.docker,替换密钥、管理员密码与站点域名
docker compose up -d --build
curl http://127.0.0.1:3280/api/health

默认端口绑定到服务器回环地址 127.0.0.1:3280,对外访问需配置反向代理与 HTTPS。SQLite 与上传文件分别持久化到 tsukuyomi-data 和 tsukuyomi-uploads 命名卷。

配置 说明
JWT_SECRET 生产必填,至少 32 字符;可用 openssl rand -base64 48 生成
ADMIN_PASSWORD 首次创建生产管理员时必填,请替换示例密码
CORS_ORIGINS 允许访问 API 的线上域名
MAIL_CREDENTIAL_KEY 聚合邮箱凭据加密密钥,建议独立生成并保持稳定
DATA_DIR / DB_PATH SQLite 持久化路径;Docker 默认使用 /data
REDIS_URL 可选,用于验证码、限流、天气缓存及 token 黑名单
ROOM_MEMORY_BACKEND 默认 mem0,项目内嵌 Mem0 开源 SDK;未启用本地语义服务时使用旧 SQLite 检索
ROOM_LOCAL_INTELLIGENCE true 启用项目内置 BGE 中文语义向量、SQLite 向量库、证据评分与好感度;先安装受内存限制的本地运行时,详见 部署说明
ROOM_MEM0_DB_PATH Mem0 索引文件,默认与主数据库同目录的 room-mem0.db

完整配置见 .env.example 与 .env.docker.example。真实环境文件、密码和 API Key 不应提交到仓库。

  • Docker 更新:bash deploy/docker-deploy.sh。
  • PM2 + Nginx / OpenResty:支持现有服务器部署,步骤见部署指南。
  • 可选服务与大资源:Redis / Milvus profile、模型、音乐与视频的只读挂载均见部署指南。
  • 数据库迁移:启动时自动执行 backend/db/migrations/;生产更新前先备份。部署备份与数据库备份默认各保留最近 10 份,可通过 BACKUP_RETENTION 调整。
  • 昵称与账号:迁移 039_add_user_nickname 为 users 添加独立的 nickname 列,并将老用户的用户名补为初始昵称。用户可在个人中心修改昵称(1–32 个字符,允许重名),管理员在 Terminal 编辑同一字段。用户 ID、登录用户名、主页链接与 @用户名 提及保持不变;文章、留言和其他公开作者信息显示当前昵称。QQ 授权的新账号以 QQ 昵称初始化,后续授权不会覆盖用户自行设置的昵称。

开发文档

Fushi 社区助手的 MCP 2.0 工具与审核后 webhook 事件接口沿用现有留言/文章评论系统,代码默认关闭,生产已按站长批准启用。受限 OAuth 支持自动刷新轮换,持续使用无需定期手动更新鉴权;首次平台连接及真实 dot 验收见 接口、授权、插件连接与回滚说明。

文档 内容
部署与运维 Docker、PM2、反向代理、资源挂载、备份与恢复
权限模型 用户、管理员与超级管理员的权限边界
Room 长期记忆 记忆存储、检索与用户隔离
Room 渲染性能 Live2D 渲染与性能策略
Wiki 维护 百科内容与页面维护
文章排序 文章排序与读者互动指标
文章封面 封面图片功能说明

技术栈

  • 前端:Vue 3、Vite、CSS3、原生 JavaScript、Live2D Cubism、Anime.js、Lucide 图标
  • 后端:Node.js、Express、better-sqlite3
  • 数据与缓存:SQLite、可选 Redis、可选 Milvus 向量库
  • 认证:JWT、Cookie、bcryptjs、QQ OAuth、邮箱验证码
  • 存储:本地受控上传、S3 兼容对象存储 / 阿里云 OSS
  • 附件库和文章编辑器附件上传:单文件最大 100 MB(100 MiB),使用 4 MiB 二进制分块、SHA-256 校验和失败自动重试。中断后 24 小时内重新选择同一文件可续传,附件库可查看或取消未完成上传;图片保留原文件。支持 JPG、PNG、GIF、WebP、MP4、WebM、MOV、MP3、FLAC、WAV、OGG、M4A、PDF、TXT 和 Markdown。
  • 大附件使用 /api/assets/uploads 接口,原 Base64 接口保留 20 MiB 上限兼容图库等入口;代理只需容纳 4 MiB 分块,无需放大普通 JSON 请求限制。OSS 保存异步执行,客户端轮询结果,上传和下载均采用流式传输。
  • 上传暂存位于 DATA_DIR/asset-upload-sessions 私有目录。单实例最多 2 个并行写入或保存任务、每账号 2 个未完成上传、全站最多 8 个,暂存预约上限 800 MiB。超时自动清理,完成后立即删除暂存文件;配置 OSS 后失败会保留分块供重试,不会自动改用本地永久存储。部署继续保持单个 API 进程,多实例需增加共享协调和暂存实现。
  • 集成:Agent OS、MCP、RSS / JSON Feed、多邮箱聚合 API
  • 测试:node:test、Playwright
  • 部署:Docker Compose、PM2、Nginx / OpenResty、GitHub Actions、SSH、国内 / 海外双站

项目结构

tsukuyomi-space/
├── assets/          # 图片、README 示例图、图标、音频和样式等静态资源
├── backend/         # Express API、SQLite 初始化、路由和中间件
├── deploy/          # PM2、Nginx、部署脚本样例
├── docs/            # 部署和维护文档
├── docker-compose.yml # Docker Compose 生产部署入口
├── dist/frontend/   # npm run build:web 生成的 Vue 前端产物
├── live2d-studio/   # Live2D Studio 独立前端
├── lib/             # Live2D / 前端运行库
├── models/          # Live2D 模型资源
├── src/frontend/    # Vue 3 + Vite 主线前端源码
│   └── styles/      # 设计系统 token、主题、组件、动画和响应式规则
├── tests/           # API 与 Playwright 端到端测试
├── .env.example     # 生产环境变量模板
└── package.json     # 项目脚本与依赖

设计系统

前端设计系统位于 src/frontend/styles/,用于稳定“简约清爽 + 现代感 + 二次元动漫风格”的整体视觉:

  • tokens.css:色彩、字体、间距、圆角、阴影、动效时长等基础 token
  • themes.css:深色 / 浅色主题变量,以及旧变量名兼容映射
  • components.css:按钮、卡片、面板、导航、输入框等通用组件样式
  • animations.css:全局背景动效、页面入场和动效节奏
  • responsive.css:全局移动端断点和导航响应式规则

新增页面优先使用 --ts-* 变量;旧的 --moon-*、--panel、--radius 等变量会继续映射到设计系统,便于逐步迁移。

查看完整模块与 Room / Agent 使用说明

完整模块列表

模块 说明
Hub 站点中枢大厅,聚合主要入口、广场动态、文章预览和访问统计
Room Live2D AI 私人房间,包含聊天、长期记忆、资料、便签、天气、音乐、TTS 和独立设置页
Growth 月契成长中心,提供每日任务、连续签到、等级、邀请关系和与八千代联动的成长反馈
Stage / Article 文章列表、详情阅读、编辑器和管理端内容发布流程
Plaza 留言广场,支持留言、回复、点赞和管理员审核
Gallery / Attachments 图库与附件库,支持上传者展示、个人管理、审核和对象存储
Pixel /pixel 固定 192×108 画布的像素工坊,支持触控笔、发布、点赞、分享和 PNG 导出
Game /game 辉夜姬主题节奏跑酷游戏,支持桌面键盘、移动端触控与全屏游玩
Wiki 角色、世界观、音乐、发行与衍生资料总览,以及独立角色和术语词条
Friend Links 公开友链目录与独立申请、审核流程
Agent OS /agent-os 独立应用入口,运行时请求复用站内登录校验
Notifications 分页站内信、已读状态、未读角标与内容跳转
User Center 用户资料、文章、留言、收藏、作品和账号安全管理
Admin 面向 admin / super_admin 的文章、留言、图库和附件审核工作台
Terminal 管理用户权限、友链、访问统计、对象存储和系统配置
Reality 联系方式、隐私说明、责任边界和第三方技术 / 素材来源

Room / Agent 能力

Room 页面正在向个人 Agent 方向演进,当前能力包括:

  • LLM 与 TTS 请求默认从用户浏览器侧发出,减少用户对话和 API Key 经由站点后端转发。
  • GPT-SoVITS 的 localhost / 127.0.0.1 端点保持本机直连;公网 HTTP(S) /tts 端点自动经过站内代理,需登录账号,兼容 HTTPS 网页的混合内容限制。朗读文本和参考路径会发送至所填端点,音频只在内存中转发,不写入服务器磁盘;代理限制队列、超时、音频体积,并禁止内网地址、DNS 重绑定和重定向。
  • 登录用户的会话与长期记忆保存在服务端并按账号隔离,通过账号会话和实时事件跨设备同步;未登录访客退回浏览器本地存储。
  • 聊天支持流式显示、停止、失败后重试,以及编辑或重新生成最新一轮。未完成的回复不会写入历史;刷新页面后可恢复未完成的用户消息。
  • 完成的对话与长期记忆在同一事务中保存,短消息和完整内容也会保留。内嵌 Mem0 开源 SDK 持久化检索索引,检索全部历史记忆;相关原文按预算注入模型,并显示实际参考条数。无需另搭 Mem0 服务或配置云端密钥。
  • 房间设置页提供“记忆管理”,默认折叠,展开后可搜索、查看、编辑、删除当前用户的记忆。
  • 角色知识库保存在浏览器 localStorage,默认内置八千代身份、人设、说话风格、关系和限制条目,用户可自行新增、编辑、停用或恢复默认。
  • 聊天时会按来源和长度预算组织相关长期记忆、角色知识、真实天气、最新站点动态及可用 MCP 工具结果;日记人设与日记正文不会作为聊天身份注入。
  • 八千代能够读取用户当前等级、签到与任务状态;每天第一次对话前会显示一次“今日约定”成长入口。
  • 登录用户可以选择一轮问答生成公开对话卡,分享链接会还原对应场景,并提供独立标题、描述和 OG 图片。
  • 参考 AstrBot 的 Provider / Agent 分层,统一 OpenAI 兼容、Responses、Anthropic 和 Ollama 的流式解析及原生工具接续。工具有参数、轮数、超时和去重限制;推理字段与工具中间消息不会进入聊天历史。
  • MCP 支持原有 REST 桥接和带初始化、会话、JSON / SSE 响应的 Streamable HTTP,以及 MiniMax Token Plan 的站内受限桥接。自动循环仅使用已授权搜索和本轮图片理解;详见 LLM / Agent 协议、配置与验证。
  • LLM 支持受控的云服务直连,也支持浏览器直连用户本机 http://localhost:11434 的 Ollama;本机模式不会把对话转发到本站服务器。
  • Room 音乐播放卡片读取服务器静态目录 /assets/music/ 下的歌曲文件;音乐资源体积较大,不提交到 Git,部署时单独上传。
  • 全站播放器也支持网易云 App 扫码登录、搜索点歌及个人歌单;未登录时使用固定网站曲目。账号会话加密存于服务器,不缓存歌曲文件,播放遵循账号会员及地区权限。配置、隐私与回滚见网易云播放器说明。
  • Room 天气卡片会优先使用用户浏览器定位获取所在地天气,并作为聊天上下文的一部分。

Room 相关设置主要保存在浏览器本地,包括:

  • roomLLMSettings
  • roomTTSSettings
  • roomMCPSettings
  • roomMemorySettings
  • roomKnowledgeSettings
  • roomMusicTrackIndex
  • roomMusicVolume

从 HTTPS 站点连接本机 Ollama 时,需要允许浏览器访问本地网络,并为 Ollama 配置可信来源后完整重启:

[Environment]::SetEnvironmentVariable('OLLAMA_ORIGINS','https://yachiyo.hk,https://yachiyo.com.cn,https://cho-kaguyahime.cn','User')

内容、分享与订阅

  • 文章、留言、图库、像素画和友链等公开列表使用路径级缓存破坏与服务端缓存失效,发布后会请求最新内容。
  • 文章详情和像素作品提供复制链接及社交媒体分享入口;用户分享行为会进入每日成长任务,但奖励只由服务端判定一次。
  • Room 对话分享只发布用户主动选择的单轮内容,不会公开整段私人会话或长期记忆。
  • 全站“探索 → RSS 订阅”提供订阅入口,RSS 地址为 https://yachiyo.hk/rss.xml;将此地址添加到 RSS 阅读器即可订阅文章、公告、留言、图库与像素画的公开动态。/feed.xml 与 /api/site-feed/rss 保持兼容,JSON 动态接口为 /api/site-feed。
  • 对象存储配置位于超级管理员终端;数据库只保存受控资源索引,公开访问仍通过站点资产接口或配置的 CDN 域名。
  • 部署与数据库备份默认各保留最近 10 份,可通过 BACKUP_RETENTION 调整。

海外英文构建使用同一份源码:

VITE_SITE_LANGUAGE=en npm run build:web

安全说明

  • 生产环境的 JWT_SECRET 少于 32 字符时会拒绝启动。
  • 生产环境首次创建管理员时必须提供 ADMIN_PASSWORD。
  • 管理员终端所有数据接口都需要管理员 JWT。
  • API 已加入基础安全响应头、CORS 白名单和 Redis 优先的限流。
  • CSP 由 HTTP 响应头统一下发,并限制脚本、媒体、框架、连接目标和对象资源来源。
  • Cookie 写操作校验可信请求来源,JSON 请求拒绝重复键,上传文件同时校验扩展名、MIME 与文件特征。
  • 外部请求与对象存储地址经过 SSRF 校验,管理员操作按 admin / super_admin 权限分层。
  • 公开内容中的外部链接会经过协议与风险处理,留言、文章、图库、附件和友链提供独立审核边界。
  • SQLite 默认存放在 DATA_DIR,不应提交到 Git。
  • 权限模型见 docs/PERMISSIONS.md。
  • Room 长期记忆说明见 docs/room-memory.md。

支持项目

如果月读空间为你带来了帮助,可以通过爱发电自愿支持服务器、对象存储、CDN 与持续维护。支持不会影响站内功能、内容审核或用户权限。

通过爱发电支持 redchenk 和月读空间

前往爱发电支持月读空间

技术与素材来源

  • 感谢 Mem0(Apache-2.0)、BGE(MIT)、ONNX Runtime(MIT)与 sqlite-vec(MIT/Apache-2.0)。Room 内嵌 Mem0 SDK,使用账号隔离的本地中文语义向量和 SQLite 索引,并保留原话证据;不使用 Mem0 云服务。未安装语义运行时的开发环境仍可使用旧检索;访客使用 IndexedDB。详见 本地语义记忆与好感度。

  • 本站的无刷新平滑切页、Markdown 编辑增强和图片渐显加载等部分前端技术,参考了 LyraVoid/Shirone;原项目的代码与许可证信息请以其仓库说明为准。

  • Agent OS 页面音乐 App 的技术实现来源于 firefly20041001/Yachiyo,原项目采用 Electron、React、TypeScript,并以 Apache-2.0 许可证发布。

  • 全站网易云播放器参考 Yachiyo 的账号与播放流程,网页二维码与接口协议参考 NeteaseCloudMusicApiEnhanced/api-enhanced(MIT);二维码生成使用 qrcode-generator(MIT)。不复制 Electron 登录窗口,也不提供版权解锁。

  • 站内 Live2D、角色视觉与音乐素材版权归原作者及相关权利方所有;项目仅用于非盈利个人展示与交流。

  • 右下角网页宠物来源于 Petdex / Yachiyo,界面图标使用 Lucide。

  • 更完整的来源、隐私和责任边界请查看站内 /reality 页面。

License

项目自有代码以 MIT 许可证发布。第三方代码、模型、音乐、图片和角色素材分别遵循其原始许可证与权利声明。

About

Resources

Stars

40 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages