From ed4f1e021d30acc8a2e795eb19e0d7edf8d6fdfb Mon Sep 17 00:00:00 2001
From: okxlin <61420215+okxlin@users.noreply.github.com>
Date: Sun, 28 Jun 2026 03:20:05 +0800
Subject: [PATCH] feat: add Rocket.Chat app
---
apps/rocketchat/README.md | 64 +++++++++
apps/rocketchat/data.yml | 30 ++++
apps/rocketchat/latest/.env.sample | 10 ++
apps/rocketchat/latest/data.yml | 150 ++++++++++++++++++++
apps/rocketchat/latest/data/.gitkeep | 0
apps/rocketchat/latest/docker-compose.yml | 142 ++++++++++++++++++
apps/rocketchat/latest/scripts/.gitkeep | 0
apps/rocketchat/latest/scripts/init.sh | 6 +
apps/rocketchat/latest/scripts/uninstall.sh | 2 +
apps/rocketchat/latest/scripts/upgrade.sh | 3 +
apps/rocketchat/logo.png | Bin 0 -> 4768 bytes
apps/rocketchat/source-evidence.json | 17 +++
12 files changed, 424 insertions(+)
create mode 100644 apps/rocketchat/README.md
create mode 100644 apps/rocketchat/data.yml
create mode 100644 apps/rocketchat/latest/.env.sample
create mode 100644 apps/rocketchat/latest/data.yml
create mode 100644 apps/rocketchat/latest/data/.gitkeep
create mode 100644 apps/rocketchat/latest/docker-compose.yml
create mode 100644 apps/rocketchat/latest/scripts/.gitkeep
create mode 100755 apps/rocketchat/latest/scripts/init.sh
create mode 100755 apps/rocketchat/latest/scripts/uninstall.sh
create mode 100755 apps/rocketchat/latest/scripts/upgrade.sh
create mode 100644 apps/rocketchat/logo.png
create mode 100644 apps/rocketchat/source-evidence.json
diff --git a/apps/rocketchat/README.md b/apps/rocketchat/README.md
new file mode 100644
index 000000000..32312879d
--- /dev/null
+++ b/apps/rocketchat/README.md
@@ -0,0 +1,64 @@
+# Rocket.Chat
+
+## 产品介绍
+Rocket.Chat 是一套开源团队通信协作平台,支持频道、私聊、用户管理、集成和工作区协作。
+
+## 主要功能
+- 创建团队频道和私聊会话
+- 管理工作区用户、角色和权限
+- 支持机器人、Webhook 和应用集成
+
+## 访问说明
+安装后通过安装表单中的 `ROOT_URL` 访问。默认地址为 `http://<服务器 IP>:18087`,实际端口以 `PANEL_APP_PORT_HTTP` 为准。
+
+## Introduction
+Rocket.Chat is an open source team communication platform for channels, direct messages, user management, integrations and workspace collaboration.
+
+## Features
+- Create team channels and direct messages
+- Manage workspace users, roles and permissions
+- Use bots, webhooks and app integrations
+
+## 部署说明
+- 本应用基于官方 `rocketchat-compose` 的核心服务适配,包含 Rocket.Chat、MongoDB 单节点复制集和 NATS。
+- 当前固定使用 `registry.rocket.chat/rocketchat/rocket.chat:8.0.1`、`mongodb/mongodb-community-server:8.2-ubi8` 和 `nats:2.11-alpine`。
+- 应用分类:工具。
+- 支持架构:amd64、arm64。
+- 可选版本:`latest`,但镜像版本固定,避免自动跨版本升级。
+
+## 端口
+| 变量 | 说明 | 默认值 | 必填 |
+| --- | --- | --- | --- |
+| PANEL_APP_PORT_HTTP | HTTP 访问端口 | 18087 | 是 |
+
+## 数据持久化
+| 变量 | 说明 | 默认值 | 必填 |
+| --- | --- | --- | --- |
+| APP_DATA_DIR | MongoDB 数据目录 | ./data | 是 |
+
+升级、迁移或修改 MongoDB/Rocket.Chat 版本前,请先在 1Panel 中备份 `APP_DATA_DIR`。
+
+## 参数说明
+| 变量 | 说明 | 默认值 | 必填 |
+| --- | --- | --- | --- |
+| ROOT_URL | Rocket.Chat 对外访问地址,必须和真实访问协议、域名或端口保持一致 | http://127.0.0.1:18087 | 是 |
+| REG_TOKEN | Rocket.Chat Cloud 注册令牌,没有可留空 | 空 | 否 |
+| ADMIN_USERNAME | 初始管理员用户名 | admin | 是 |
+| ADMIN_NAME | 初始管理员显示名 | Admin | 是 |
+| ADMIN_EMAIL | 初始管理员邮箱 | admin@example.com | 是 |
+| ADMIN_PASS | 初始管理员密码 | 随机生成 | 是 |
+
+## 使用说明
+- 首次访问后,使用安装表单中的初始管理员信息登录并完成工作区设置。
+- 生产环境建议使用真实域名和 HTTPS 反向代理,并将 `ROOT_URL` 设置为最终访问地址。
+- Rocket.Chat 官方建议生产环境固定版本,不要使用浮动的 `latest` 标签。
+- Rocket.Chat 升级前必须阅读目标版本发布说明,确认 MongoDB 兼容版本,并按版本顺序升级;不要跳过大版本。
+- 本应用未加入 Renovate 自动合并白名单,后续升级需要人工审计 MongoDB、NATS 和 Rocket.Chat 版本兼容性,并执行真实升级测试。
+
+## 参考资料
+- 官网:
+- 项目仓库:
+- 官方 Docker Compose 文档:
+- 官方 Compose 仓库:
+- 初始管理员文档:
+- 安全升级指南:
diff --git a/apps/rocketchat/data.yml b/apps/rocketchat/data.yml
new file mode 100644
index 000000000..eefac738c
--- /dev/null
+++ b/apps/rocketchat/data.yml
@@ -0,0 +1,30 @@
+name: Rocket.Chat
+tags:
+ - 实用工具
+title: 开源团队通信协作平台
+description: 开源团队通信协作平台
+additionalProperties:
+ key: rocketchat
+ name: Rocket.Chat
+ tags:
+ - Tool
+ shortDescZh: 开源团队通信协作平台
+ shortDescEn: Open source team communication platform
+ description:
+ en: An open source team communication platform for messaging, channels and workspace collaboration.
+ zh: 面向消息、频道和团队协作的开源通信平台。
+ zh-Hant: 面向訊息、頻道和團隊協作的開源通訊平台。
+ ja: メッセージ、チャンネル、ワークスペース協業向けのオープンソースチーム通信プラットフォームです。
+ ko: 메시지, 채널 및 워크스페이스 협업을 위한 오픈소스 팀 커뮤니케이션 플랫폼입니다.
+ ru: Открытая платформа командного общения для сообщений, каналов и совместной работы.
+ ms: Platform komunikasi pasukan sumber terbuka untuk mesej, saluran dan kerjasama ruang kerja.
+ pt-br: Plataforma open source de comunicação em equipe para mensagens, canais e colaboração.
+ type: website
+ crossVersionUpdate: false
+ limit: 0
+ website: https://www.rocket.chat/
+ github: https://github.com/RocketChat/Rocket.Chat
+ document: https://docs.rocket.chat/docs/deploy-with-docker-docker-compose
+ architectures:
+ - amd64
+ - arm64
diff --git a/apps/rocketchat/latest/.env.sample b/apps/rocketchat/latest/.env.sample
new file mode 100644
index 000000000..bf415f917
--- /dev/null
+++ b/apps/rocketchat/latest/.env.sample
@@ -0,0 +1,10 @@
+PANEL_APP_PORT_HTTP=18087
+ROOT_URL=http://127.0.0.1:18087
+TZ=Asia/Shanghai
+APP_DATA_DIR=./data
+REG_TOKEN=
+ADMIN_USERNAME=admin
+ADMIN_NAME=Admin
+ADMIN_EMAIL=admin@example.com
+ADMIN_PASS=rocket_admin_password
+CONTAINER_NAME=rocketchat
diff --git a/apps/rocketchat/latest/data.yml b/apps/rocketchat/latest/data.yml
new file mode 100644
index 000000000..16f50a9db
--- /dev/null
+++ b/apps/rocketchat/latest/data.yml
@@ -0,0 +1,150 @@
+additionalProperties:
+ formFields:
+ - default: 18087
+ edit: true
+ envKey: PANEL_APP_PORT_HTTP
+ labelEn: Port
+ labelZh: 端口
+ label:
+ en: Port
+ zh: 端口
+ zh-Hant: 埠
+ ja: ポート
+ ko: 포트
+ ru: Порт
+ ms: Port
+ pt-br: Porta
+ required: true
+ rule: paramPort
+ type: number
+ - default: http://127.0.0.1:18087
+ edit: true
+ envKey: ROOT_URL
+ labelEn: Public URL
+ labelZh: 外部访问地址
+ label:
+ en: Public URL
+ zh: 外部访问地址
+ zh-Hant: 外部存取位址
+ ja: 公開 URL
+ ko: 공개 URL
+ ru: Публичный URL
+ ms: URL awam
+ pt-br: URL publico
+ required: true
+ rule: paramExtUrl
+ type: text
+ - default: Asia/Shanghai
+ edit: true
+ envKey: TZ
+ labelEn: Timezone
+ labelZh: 时区
+ label:
+ en: Timezone
+ zh: 时区
+ zh-Hant: 時區
+ ja: タイムゾーン
+ ko: 시간대
+ ru: Часовой пояс
+ ms: Zon waktu
+ pt-br: Fuso horario
+ required: true
+ type: text
+ - default: ./data
+ edit: true
+ envKey: APP_DATA_DIR
+ labelEn: Data Directory
+ labelZh: 数据目录
+ label:
+ en: Data Directory
+ zh: 数据目录
+ zh-Hant: 資料目錄
+ ja: データディレクトリ
+ ko: 데이터 디렉터리
+ ru: Каталог данных
+ ms: Direktori data
+ pt-br: Diretorio de dados
+ required: true
+ type: text
+ - default: ""
+ edit: true
+ envKey: REG_TOKEN
+ labelEn: Registration Token
+ labelZh: 注册令牌
+ label:
+ en: Registration Token
+ zh: 注册令牌
+ zh-Hant: 註冊權杖
+ ja: 登録トークン
+ ko: 등록 토큰
+ ru: Токен регистрации
+ ms: Token pendaftaran
+ pt-br: Token de registro
+ required: false
+ type: text
+ - default: admin
+ edit: true
+ envKey: ADMIN_USERNAME
+ labelEn: Admin Username
+ labelZh: 管理员用户名
+ label:
+ en: Admin Username
+ zh: 管理员用户名
+ zh-Hant: 管理員使用者名稱
+ ja: 管理者ユーザー名
+ ko: 관리자 사용자 이름
+ ru: Имя администратора
+ ms: Nama pengguna pentadbir
+ pt-br: Nome de usuario administrador
+ required: true
+ type: text
+ - default: Admin
+ edit: true
+ envKey: ADMIN_NAME
+ labelEn: Admin Name
+ labelZh: 管理员姓名
+ label:
+ en: Admin Name
+ zh: 管理员姓名
+ zh-Hant: 管理員姓名
+ ja: 管理者名
+ ko: 관리자 이름
+ ru: Имя администратора
+ ms: Nama pentadbir
+ pt-br: Nome do administrador
+ required: true
+ type: text
+ - default: admin@example.com
+ edit: true
+ envKey: ADMIN_EMAIL
+ labelEn: Admin Email
+ labelZh: 管理员邮箱
+ label:
+ en: Admin Email
+ zh: 管理员邮箱
+ zh-Hant: 管理員信箱
+ ja: 管理者メール
+ ko: 관리자 이메일
+ ru: Email администратора
+ ms: E-mel pentadbir
+ pt-br: Email do administrador
+ required: true
+ type: text
+ - default: rocket_admin_password
+ edit: true
+ envKey: ADMIN_PASS
+ labelEn: Admin Password
+ labelZh: 管理员密码
+ label:
+ en: Admin Password
+ zh: 管理员密码
+ zh-Hant: 管理員密碼
+ ja: 管理者パスワード
+ ko: 관리자 비밀번호
+ ru: Пароль администратора
+ ms: Kata laluan pentadbir
+ pt-br: Senha do administrador
+ random: true
+ required: true
+ rule: paramComplexity
+ type: password
diff --git a/apps/rocketchat/latest/data/.gitkeep b/apps/rocketchat/latest/data/.gitkeep
new file mode 100644
index 000000000..e69de29bb
diff --git a/apps/rocketchat/latest/docker-compose.yml b/apps/rocketchat/latest/docker-compose.yml
new file mode 100644
index 000000000..407a5da40
--- /dev/null
+++ b/apps/rocketchat/latest/docker-compose.yml
@@ -0,0 +1,142 @@
+services:
+ rocketchat:
+ image: "registry.rocket.chat/rocketchat/rocket.chat:8.0.1"
+ container_name: ${CONTAINER_NAME}
+ restart: always
+ depends_on:
+ mongodb:
+ condition: service_healthy
+ nats:
+ condition: service_healthy
+ networks:
+ - 1panel-network
+ - rocketchat-network
+ ports:
+ - "${PANEL_APP_PORT_HTTP}:3000"
+ entrypoint: sh
+ command:
+ - -c
+ - |
+ protocol=$(echo $$MONGO_URL | awk -F'://' '{print $$1}')
+ if [ "$$protocol" = "mongodb+srv" ]; then
+ echo "MongoDB is using SRV protocol, starting Rocket.Chat without local TCP wait"
+ exec node main.js
+ fi
+ host_port=$(echo $$MONGO_URL | awk -F/ '{print $$3}')
+ if echo $$host_port | grep -q @; then
+ host_port=$(echo $$host_port | awk -F@ '{print $$2}')
+ fi
+ host=$(echo $$host_port | awk -F: '{print $$1}')
+ port=$(echo $$host_port | awk -F: '{print $$2}')
+ if [ -z "$$port" ]; then
+ port=27017
+ fi
+ echo "Waiting for MongoDB ($$host:$$port) before starting Rocket.Chat"
+ for i in $(seq 1 60); do
+ if nc -z $$host $$port >/dev/null 2>&1; then
+ exec node main.js
+ fi
+ sleep 5
+ done
+ echo "MongoDB did not become reachable in time"
+ exit 1
+ environment:
+ - TZ=${TZ}
+ - ROOT_URL=${ROOT_URL}
+ - PORT=3000
+ - DEPLOY_METHOD=docker
+ - DEPLOY_PLATFORM=compose
+ - REG_TOKEN=${REG_TOKEN}
+ - MONGO_URL=mongodb://mongodb:27017/rocketchat?replicaSet=rs0
+ - TRANSPORTER=monolith+nats://nats:4222
+ - INSTANCE_IP=
+ - ADMIN_USERNAME=${ADMIN_USERNAME}
+ - ADMIN_NAME=${ADMIN_NAME}
+ - ADMIN_EMAIL=${ADMIN_EMAIL}
+ - ADMIN_PASS=${ADMIN_PASS}
+ healthcheck:
+ test: ["CMD-SHELL", "nc -z -w 10 127.0.0.1 3000"]
+ interval: 30s
+ timeout: 10s
+ retries: 10
+ start_period: 90s
+ labels:
+ createdBy: "Apps"
+
+ mongodb:
+ image: "docker.io/mongodb/mongodb-community-server:8.2-ubi8"
+ container_name: ${CONTAINER_NAME}-mongodb
+ user: root
+ restart: always
+ networks:
+ - rocketchat-network
+ volumes:
+ - "${APP_DATA_DIR}/mongodb:/data/db"
+ entrypoint:
+ - sh
+ - -ec
+ - |
+ install -d -o mongod -g mongod -m 755 /data/db
+ if [ "$(stat -c '%u:%g' /data/db)" != "1000:1000" ]; then
+ chown -R mongod:mongod /data/db
+ fi
+ su -s /bin/sh mongod -c 'exec mongod --replSet rs0 --bind_ip_all' &
+ pid=$$!
+ until mongosh 'mongodb://127.0.0.1:27017/?directConnection=true' --quiet --eval 'db.adminCommand("ping")' >/dev/null 2>&1; do
+ sleep 2
+ done
+ cat >/tmp/rs-init.js </dev/null 2>&1; then
+ break
+ fi
+ sleep 2
+ done
+ wait "$$pid"
+ healthcheck:
+ test: ["CMD-SHELL", "mongosh 'mongodb://127.0.0.1:27017/?directConnection=true' --quiet --eval 'try { quit(rs.status().ok === 1 ? 0 : 1) } catch (error) { quit(1) }'"]
+ interval: 30s
+ timeout: 10s
+ retries: 10
+ start_period: 60s
+ labels:
+ createdBy: "Apps"
+
+ nats:
+ image: "docker.io/nats:2.11-alpine"
+ container_name: ${CONTAINER_NAME}-nats
+ restart: always
+ command: --http_port 8222
+ networks:
+ - rocketchat-network
+ healthcheck:
+ test: ["CMD-SHELL", "nc -z -w 10 127.0.0.1 4222"]
+ interval: 30s
+ timeout: 10s
+ retries: 10
+ start_period: 10s
+ labels:
+ createdBy: "Apps"
+
+networks:
+ 1panel-network:
+ external: true
+ rocketchat-network:
+ driver: bridge
diff --git a/apps/rocketchat/latest/scripts/.gitkeep b/apps/rocketchat/latest/scripts/.gitkeep
new file mode 100644
index 000000000..e69de29bb
diff --git a/apps/rocketchat/latest/scripts/init.sh b/apps/rocketchat/latest/scripts/init.sh
new file mode 100755
index 000000000..0aaff5e31
--- /dev/null
+++ b/apps/rocketchat/latest/scripts/init.sh
@@ -0,0 +1,6 @@
+#!/usr/bin/env bash
+set -euo pipefail
+
+DATA_DIR="${APP_DATA_DIR:-./data}"
+mkdir -p "${DATA_DIR}/mongodb"
+chown -R 1000:1000 "${DATA_DIR}/mongodb" 2>/dev/null || true
diff --git a/apps/rocketchat/latest/scripts/uninstall.sh b/apps/rocketchat/latest/scripts/uninstall.sh
new file mode 100755
index 000000000..ab8a8d674
--- /dev/null
+++ b/apps/rocketchat/latest/scripts/uninstall.sh
@@ -0,0 +1,2 @@
+#!/bin/bash
+docker-compose down --volumes
diff --git a/apps/rocketchat/latest/scripts/upgrade.sh b/apps/rocketchat/latest/scripts/upgrade.sh
new file mode 100755
index 000000000..9879df4c3
--- /dev/null
+++ b/apps/rocketchat/latest/scripts/upgrade.sh
@@ -0,0 +1,3 @@
+#!/usr/bin/env bash
+set -euo pipefail
+exit 0
diff --git a/apps/rocketchat/logo.png b/apps/rocketchat/logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..9cec3e62d1817bf3fe702d0d21ccdd15beb049a2
GIT binary patch
literal 4768
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
u)zeQLhv-{v{-Yu3Xm({aFaH6