From e4203555e724f78dd5e7e1b50478e5669051434e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=B7=E4=BA=8C=E5=90=B9=E9=A3=8E=E6=9C=BA?= Date: Fri, 14 Mar 2025 14:32:08 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0NodeBB=5FGHCR=20(#3389)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- nodebb_ghcr/4.1.0/data.yml | 10 +++++++ nodebb_ghcr/4.1.0/docker-compose.yml | 20 +++++++++++++ nodebb_ghcr/4.1.0/scripts/init.sh | 8 +++++ nodebb_ghcr/4.1.1/data.yml | 10 +++++++ nodebb_ghcr/4.1.1/docker-compose.yml | 20 +++++++++++++ nodebb_ghcr/4.1.1/scripts/init.sh | 8 +++++ nodebb_ghcr/README.md | 43 +++++++++++++++++++++++++++ nodebb_ghcr/data.yml | 18 +++++++++++ nodebb_ghcr/logo.png | Bin 0 -> 10005 bytes 9 files changed, 137 insertions(+) create mode 100644 nodebb_ghcr/4.1.0/data.yml create mode 100644 nodebb_ghcr/4.1.0/docker-compose.yml create mode 100644 nodebb_ghcr/4.1.0/scripts/init.sh create mode 100644 nodebb_ghcr/4.1.1/data.yml create mode 100644 nodebb_ghcr/4.1.1/docker-compose.yml create mode 100644 nodebb_ghcr/4.1.1/scripts/init.sh create mode 100644 nodebb_ghcr/README.md create mode 100644 nodebb_ghcr/data.yml create mode 100644 nodebb_ghcr/logo.png diff --git a/nodebb_ghcr/4.1.0/data.yml b/nodebb_ghcr/4.1.0/data.yml new file mode 100644 index 000000000..b9c5be135 --- /dev/null +++ b/nodebb_ghcr/4.1.0/data.yml @@ -0,0 +1,10 @@ +additionalProperties: + formFields: + - default: 4567 + edit: true + envKey: PANEL_APP_PORT_HTTP + labelEn: Port + labelZh: 端口 + required: true + rule: paramPort + type: number diff --git a/nodebb_ghcr/4.1.0/docker-compose.yml b/nodebb_ghcr/4.1.0/docker-compose.yml new file mode 100644 index 000000000..47a878039 --- /dev/null +++ b/nodebb_ghcr/4.1.0/docker-compose.yml @@ -0,0 +1,20 @@ +services: + nodebb: + image: ghcr.io/nodebb/nodebb:4.1.0 + container_name: ${CONTAINER_NAME} + restart: unless-stopped + networks: + - 1panel-network + ports: + - "${PANEL_APP_PORT_HTTP}:4567" + volumes: + - ./data/build:/usr/src/app/build + - ./data/node_modules:/usr/src/app/node_modules + - ./data/uploads:/usr/src/app/public/uploads + - ./data/config:/opt/config + labels: + createdBy: "Apps" + +networks: + 1panel-network: + external: true diff --git a/nodebb_ghcr/4.1.0/scripts/init.sh b/nodebb_ghcr/4.1.0/scripts/init.sh new file mode 100644 index 000000000..3ea50e871 --- /dev/null +++ b/nodebb_ghcr/4.1.0/scripts/init.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +mkdir -p data/build +mkdir -p data/node_modules +mkdir -p data/uploads +mkdir -p data/config + +chmod -R 777 data \ No newline at end of file diff --git a/nodebb_ghcr/4.1.1/data.yml b/nodebb_ghcr/4.1.1/data.yml new file mode 100644 index 000000000..b9c5be135 --- /dev/null +++ b/nodebb_ghcr/4.1.1/data.yml @@ -0,0 +1,10 @@ +additionalProperties: + formFields: + - default: 4567 + edit: true + envKey: PANEL_APP_PORT_HTTP + labelEn: Port + labelZh: 端口 + required: true + rule: paramPort + type: number diff --git a/nodebb_ghcr/4.1.1/docker-compose.yml b/nodebb_ghcr/4.1.1/docker-compose.yml new file mode 100644 index 000000000..18fc0aab0 --- /dev/null +++ b/nodebb_ghcr/4.1.1/docker-compose.yml @@ -0,0 +1,20 @@ +services: + nodebb: + image: ghcr.io/nodebb/nodebb:4.1.1 + container_name: ${CONTAINER_NAME} + restart: unless-stopped + networks: + - 1panel-network + ports: + - "${PANEL_APP_PORT_HTTP}:4567" + volumes: + - ./data/build:/usr/src/app/build + - ./data/node_modules:/usr/src/app/node_modules + - ./data/uploads:/usr/src/app/public/uploads + - ./data/config:/opt/config + labels: + createdBy: "Apps" + +networks: + 1panel-network: + external: true diff --git a/nodebb_ghcr/4.1.1/scripts/init.sh b/nodebb_ghcr/4.1.1/scripts/init.sh new file mode 100644 index 000000000..3ea50e871 --- /dev/null +++ b/nodebb_ghcr/4.1.1/scripts/init.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +mkdir -p data/build +mkdir -p data/node_modules +mkdir -p data/uploads +mkdir -p data/config + +chmod -R 777 data \ No newline at end of file diff --git a/nodebb_ghcr/README.md b/nodebb_ghcr/README.md new file mode 100644 index 000000000..a5cc65f9f --- /dev/null +++ b/nodebb_ghcr/README.md @@ -0,0 +1,43 @@ +# 介绍 + +注:原 Docker 版本已经不再更新,此为 [ghcr](https://github.com/NodeBB/NodeBB/pkgs/container/nodebb) 版(Github Container Registry)。 + +NodeBB 论坛软件由 Node.js 提供支持,支持 Redis、MongoDB 或 PostgreSQL 数据库。它利用 WebSocket 实现即时互动和实时通知。NodeBB 吸收了现代网络的精华:实时流式讨论、移动响应能力、丰富的 RESTful 读/写 API,同时忠实于原始的公告栏/论坛格式 → 分类分层、本地用户账户和异步消息传递。 + +NodeBB 本身包含一个基本功能的 “通用核心”,而其他功能和集成则通过使用第三方插件来实现。 + +# 配置 + +容器首次启动后请等待npm模块安装,当日志显示出 `Web installer listening on http://0.0.0.0:<您选择的端口>` 时,即可通过网页安装程序进行配置。 + +## 数据库 + +NodeBB 有一个数据库抽象层(DBAL),允许用户为自己选择的数据库编写驱动程序。目前我们有以下选项: + +### MongoDB(默认) + +如果您担心使用 Redis 会耗尽内存,或者希望您的论坛更容易扩展,您可以使用 MongoDB 安装 NodeBB。本教程假定你知道如何通过 SSH 登录服务器并拥有 root 访问权限。 + +这些说明适用于 Ubuntu。请根据你的发行版进行相应调整。 + +注:如果你必须在任何命令中添加 sudo,请照做。没人会对你不利;) + +[配置 MongoDB](https://docs.nodebb.org/configuring/databases/mongo/#step-1-install-mongodb)(如果使用docker,请参阅步骤6与步骤7) + +### Redis + +NodeBB 默认使用 MongoDB 作为其主要数据存储,尽管我们也支持 Redis。在 NodeBB 中,Redis 和 MongoDB 都被视为具有一流支持的数据存储,因此,如果您在使用 Redis 而不是 MongoDB 作为数据存储时遇到错误,我们仍然鼓励您[提交问题](https://github.com/NodeBB/NodeBB/issues/new)。 + +Redis 的设计将整个数据库保存在活动内存中,因此在某些高可扩展性场景中可能非常有用。与 MongoDB 相比,Redis 的速度可能会有一些不明显的提高。 + +不过,这种优势也是一把双刃剑。由于 Redis 将整个数据库保存在活动内存中,这意味着系统内存需要比数据集大两倍(如果不是更大的话)(例如,2GB 的数据需要至少 4GB 的系统内存)。Redis 需要两倍于数据集的内存,因为它的备份策略是先克隆内存中的数据,然后再将其持久化到磁盘上。 + +请仔细考虑您的硬件选项,看看您的安装是否值得权衡利弊。请记住,NodeBB 团队为有需要的用户提供 Redis 到 MongoDB 的迁移服务。如需了解更多信息,请联系 sales@nodebb.org。 + +[配置 Redis](https://docs.nodebb.org/configuring/databases/redis/#step-1-install-redis)(如果使用docker,请参阅步骤2) + +### PostgreSQL + +注:尽管 NodeBB 完全支持 PostgreSQL,但我们仍然建议使用MongoDB和Redis,因为这是我们自己和托管客户端上使用的。 + +PostgreSQL 无需多余配置。 \ No newline at end of file diff --git a/nodebb_ghcr/data.yml b/nodebb_ghcr/data.yml new file mode 100644 index 000000000..c70dcdf2d --- /dev/null +++ b/nodebb_ghcr/data.yml @@ -0,0 +1,18 @@ +name: NodeBB - GHCR +tags: + - 建站 +title: 基于 Node.js 的现代化论坛程序(GHCR版本) +description: 基于 Node.js 的现代化论坛程序(GHCR版本) +additionalProperties: + key: nodebb_ghcr + name: NodeBB - GHCR + tags: + - Website + shortDescZh: 基于 Node.js 的现代化论坛程序(GHCR版本) + shortDescEn: Open source Forum Powered by Node.js(GHCR Version) + type: website + crossVersionUpdate: true + limit: 0 + website: https://nodebb.org + github: https://github.com/NodeBB/NodeBB + document: https://docs.nodebb.org \ No newline at end of file diff --git a/nodebb_ghcr/logo.png b/nodebb_ghcr/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..f0afd40265a1d6d3c63fd2548397ed8fbc351537 GIT binary patch literal 10005 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 XH*R>EE5(1dB0y12O}19rJna7grVmm= literal 0 HcmV?d00001