跳到主要内容
CNode

CNode 换新了:老站已经迁移到 CNode Next

置顶精华分享
Tthonatos发布于 20 天前最后回复 8 小时前
1515350
目录 · 7 个章节

最近打开 CNode 的同学可能已经发现,网站和之前不太一样了。

没错,我们把运行多年的老站迁到了新的 CNode Next

这不是一次简单的页面改版。Web、API、数据库和部署方式都换成了新的实现,不过我们尽量保留了大家熟悉的账号、话题、回复、收藏、消息和 API 使用方式。

为什么要迁移

旧版 CNode 基于 nodeclub,使用 Express、MongoDB 和 EJS,从 2013 年前后一直运行到现在。

它很稳定,也承载了社区多年的内容,但代码和依赖确实已经比较老了。继续在原来的基础上修补,新功能、安全治理和日常维护都会越来越困难。

之前也有过一次基于 Egg.js 的迁移尝试,不过没有完整上线。这次我们没有继续补中间版本,而是重新梳理业务行为,直接做了一个新的实现。

现在用了什么

新站是一个 TypeScript monorepo,主要包括:

  • React Router SSR Web
  • Hono API
  • PostgreSQL
  • Redis
  • Drizzle ORM
  • Tailwind CSS 与 shadcn/ui
  • Docker Compose 和 GHCR 镜像部署

简单来说,浏览器访问 SSR Web,Web 和浏览器分别调用 API,业务数据进入 PostgreSQL,session、缓存和限流等状态交给 Redis。

这些变化对普通用户不需要额外操作,但对后续维护、新功能开发和问题排查会友好很多。

数据也迁过去了

这次同时把数据从 MongoDB 迁到了 PostgreSQL,包括:

  • 用户
  • 话题
  • 回复
  • 收藏
  • 消息
  • 回复点赞

迁移过程会先建立新旧 ID 的对应关系,再按依赖顺序导入数据,最后进行数量对账和功能检查。

因为旧站使用 MongoDB ObjectId,新站使用 PostgreSQL 整数 ID,一些带旧 ObjectId 的历史链接可能无法继续访问。这是目前已知的一项兼容差异。

账号登录、GitHub OAuth、话题回复、收藏、消息和主要 API v1 行为都做了兼容处理,但这么多年的历史数据里难免存在一些特殊情况。

如果你发现自己的账号或内容不对,请告诉我们。

页面也重新做了

新站没有逐像素复刻旧版,而是重新整理了页面结构和交互,主要希望改善:

  • 移动端浏览
  • Markdown 阅读和编辑
  • 用户主页
  • 招聘专区
  • 后台管理
  • 键盘操作和无障碍体验
  • 加载、错误和提交状态提示

站点的 favicon、分享预览和搜索引擎元数据最近也重新补齐了。现在分享话题时,会输出对应的 Open Graph、Twitter Card、canonical URL 和 JSON-LD。

导航栏中的经典 CNode 字标没有替换,新图标主要用于 favicon、manifest 和分享图片。

API 尽量保持兼容

CNode 有不少第三方客户端和脚本依赖 API v1,因此新 API 仍然保留主要的响应结构和 access token 使用方式。

不过这是一次完整重写,不敢保证所有边缘行为都和旧站完全一致。如果你的客户端在迁移后出现问题,欢迎带上请求路径、响应状态和可复现步骤反馈。

请不要在公开 issue 中粘贴 access token、cookie 或其他敏感信息。

发布方式也变了

现在每次发布会先在 CI 中完成 lint、类型检查、测试、构建和密钥扫描,再生成带 commit SHA 的 API/Web 镜像。

生产服务器只负责拉取指定镜像并启动服务,不会在服务器上临时构建。每次发布也会保留上一版镜像,方便出现问题时快速回滚。

数据库迁移不会跟着普通发布自动执行,避免一次日常部署意外修改生产数据。

还需要大家帮忙找问题

迁移已经完成,但这并不代表所有问题都已经被发现。

如果你遇到下面这些情况,欢迎反馈:

  • 无法登录或账号信息不正确
  • 话题、回复、收藏或消息缺失
  • Markdown 内容显示异常
  • 旧链接无法访问
  • API 响应和之前不一致
  • 移动端布局问题
  • 页面报错、加载失败或操作无响应
  • 分享卡片、头像或图片显示异常

项目仓库:

https://github.com/cnodejs/cnode-next

可以直接在 GitHub 提交 issue,也可以在社区里回复这篇话题。

CNode 的代码换新了,但社区还是原来的社区。感谢大家这些年的使用、讨论和内容积累,也欢迎继续帮我们把新站打磨得更好。

查看回复

回复 (15)

T
thonatos#158 小时前
引用 nexmoe好像我变成新号了

@nexmoe 这个账号没有历史数据,没法修复,当前的时间是使用 github 登录的时间

T
thonatos#149 小时前
引用 nexmoe好像我变成新号了

@nexmoe 还真是,我看看什么原因

N
nexmoe#1317 小时前

好像我变成新号了

N
nexmoe#1217 小时前

牛逼,不过貌似用户系统还有 bug,我登录后没有正确显示状态

T
thonatos#114 天前
引用 udbmnm__legacy_51970b2863e9f8a542405430账号还在,上一次来还是好多年前,想不到还在

@udbmnm__legacy_51970b2863e9f8a542405430 不发违规内容,数据一般不会“丢”的呢(

账号还在,上一次来还是好多年前,想不到还在

H
hyj1991#911 天前

真不错

T
thonatos#814 天前
引用 yuu2lee4这个评论是不是最新评论排前面,或者搞个排序

@yuu2lee4 已提供排序选择以及默认新评论优先,另外增加了更多的 tabs 类型

Y
yuu2lee4#516 天前

这个评论是不是最新评论排前面,或者搞个排序

Y
yuu2lee4#416 天前

cnode应该改变一下定位了,应该开设nodejs deno bun等等板块,也可以加入nextjs nestjs koa midway等分组,成为一个综合性的js社区

T
thonatos#317 天前
引用 qinyang912希望新版的文章质量能够高一些,禁止发测试贴。

@qinyang912 测试帖不会展示的,并且现在添加了屏蔽词库 + 巡检能力,可以禁止发布违规内容

Q
qinyang912#218 天前

希望新版的文章质量能够高一些,禁止发测试贴。

F
fengmk2#119 天前

好久没来,新版本真好看😍

参与回复

登录后即可参与回复。登录