From 096d6d2ed767b4610934e567521e52f1f382ac11 Mon Sep 17 00:00:00 2001
From: okxlin <61420215+okxlin@users.noreply.github.com>
Date: Tue, 2 Jul 2024 11:41:15 +0800
Subject: [PATCH] =?UTF-8?q?feat:=E6=B7=BB=E5=8A=A0discourse=E5=88=B0?=
=?UTF-8?q?=E5=88=97=E8=A1=A8=20(#1686)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
apps/discourse/3.2.2/data.yml | 321 ++++++++++++++++++++++++
apps/discourse/3.2.2/docker-compose.yml | 111 ++++++++
apps/discourse/README.md | 5 +
apps/discourse/data.yml | 19 ++
apps/discourse/logo.png | Bin 0 -> 8538 bytes
5 files changed, 456 insertions(+)
create mode 100644 apps/discourse/3.2.2/data.yml
create mode 100644 apps/discourse/3.2.2/docker-compose.yml
create mode 100644 apps/discourse/README.md
create mode 100644 apps/discourse/data.yml
create mode 100644 apps/discourse/logo.png
diff --git a/apps/discourse/3.2.2/data.yml b/apps/discourse/3.2.2/data.yml
new file mode 100644
index 00000000..d114e3d1
--- /dev/null
+++ b/apps/discourse/3.2.2/data.yml
@@ -0,0 +1,321 @@
+additionalProperties:
+ formFields:
+ - default: "40268"
+ edit: true
+ envKey: PANEL_APP_PORT_HTTP
+ labelEn: Port
+ labelZh: 端口
+ required: true
+ rule: paramPort
+ type: number
+ - default: "plugins public/backups public/uploads"
+ disabled: true
+ envKey: DISCOURSE_DATA_TO_PERSIST
+ labelEn: Data to Persist
+ labelZh: 持久化数据
+ required: true
+ type: text
+ - default: "no"
+ edit: true
+ envKey: DISCOURSE_ENABLE_HTTPS
+ labelEn: Enable HTTPS
+ labelZh: 启用 HTTPS
+ required: true
+ type: select
+ values:
+ - label: "yes"
+ value: "yes"
+ - label: "no"
+ value: "no"
+ - default: "80"
+ edit: true
+ envKey: DISCOURSE_EXTERNAL_HTTP_PORT_NUMBER
+ labelEn: External HTTP Port
+ labelZh: 外部 HTTP 端口
+ required: true
+ type: number
+ - default: "443"
+ edit: true
+ envKey: DISCOURSE_EXTERNAL_HTTPS_PORT_NUMBER
+ labelEn: External HTTPS Port
+ labelZh: 外部 HTTPS 端口
+ required: true
+ type: number
+ - default: "www.example.com"
+ edit: true
+ envKey: DISCOURSE_HOST
+ labelEn: Discourse Host
+ labelZh: Discourse 主机
+ required: true
+ type: text
+ - default: "3000"
+ edit: true
+ envKey: DISCOURSE_PORT_NUMBER
+ labelEn: Discourse Port
+ labelZh: Discourse 端口
+ required: true
+ type: number
+ - default: ""
+ edit: true
+ envKey: DISCOURSE_SKIP_BOOTSTRAP
+ labelEn: Skip Bootstrap
+ labelZh: 跳过引导
+ required: false
+ type: text
+ - default: "My site!"
+ edit: true
+ envKey: DISCOURSE_SITE_NAME
+ labelEn: Site Name
+ labelZh: 网站名称
+ required: true
+ type: text
+ - default: "production"
+ edit: true
+ envKey: DISCOURSE_ENV
+ labelEn: Environment
+ labelZh: 环境
+ required: true
+ type: select
+ values:
+ - label: development
+ value: "development"
+ - label: production
+ value: "production"
+ - label: test
+ value: "test"
+ - default: "yes"
+ edit: true
+ envKey: DISCOURSE_PRECOMPILE_ASSETS
+ labelEn: Precompile Assets
+ labelZh: 预编译资产
+ required: true
+ type: select
+ values:
+ - label: "yes"
+ value: "yes"
+ - label: "no"
+ value: "no"
+ - default: "no"
+ edit: true
+ envKey: DISCOURSE_ENABLE_CONF_PERSISTENCE
+ labelEn: Enable Config Persistence
+ labelZh: 启用配置持久化
+ required: true
+ type: select
+ values:
+ - label: "yes"
+ value: "yes"
+ - label: "no"
+ value: "no"
+ - default: "yes"
+ edit: true
+ envKey: DISCOURSE_EXTRA_CONF_CONTENT
+ labelEn: Extra Config Content
+ labelZh: 额外配置内容
+ required: true
+ type: select
+ values:
+ - label: "yes"
+ value: "yes"
+ - label: "no"
+ value: "no"
+ - default: "direct"
+ edit: true
+ envKey: DISCOURSE_PASSENGER_SPAWN_METHOD
+ labelEn: Passenger Spawn Method
+ labelZh: Passenger 启动方法
+ required: true
+ type: select
+ values:
+ - label: "direct"
+ value: "direct"
+ - label: "smart"
+ value: "smart"
+ - default: ""
+ edit: true
+ envKey: DISCOURSE_PASSENGER_EXTRA_FLAGS
+ labelEn: Passenger Extra Flags
+ labelZh: Passenger 额外标志
+ required: false
+ type: text
+ - default: "siteadmin"
+ edit: true
+ envKey: DISCOURSE_USERNAME
+ labelEn: Username
+ labelZh: 用户名
+ required: true
+ type: text
+ - default: "siteadmin12345"
+ edit: true
+ envKey: DISCOURSE_PASSWORD
+ labelEn: Password
+ labelZh: 密码
+ random: true
+ required: true
+ rule: paramComplexity
+ type: password
+ - default: "admin@localhost.com"
+ edit: true
+ envKey: DISCOURSE_EMAIL
+ labelEn: Email
+ labelZh: 电子邮箱
+ required: true
+ type: text
+ - default: "Admin"
+ edit: true
+ envKey: DISCOURSE_FIRST_NAME
+ labelEn: First Name
+ labelZh: 名
+ required: true
+ type: text
+ - default: "User"
+ edit: true
+ envKey: DISCOURSE_LAST_NAME
+ labelEn: Last Name
+ labelZh: 姓
+ required: true
+ type: text
+ - default: ""
+ edit: true
+ envKey: DISCOURSE_SMTP_HOST
+ labelEn: SMTP Host
+ labelZh: SMTP 主机
+ required: false
+ type: text
+ - default: ""
+ edit: true
+ envKey: DISCOURSE_SMTP_PORT_NUMBER
+ labelEn: SMTP Port
+ labelZh: SMTP 端口
+ required: false
+ type: number
+ - default: ""
+ edit: true
+ envKey: DISCOURSE_SMTP_USER
+ labelEn: SMTP User
+ labelZh: SMTP 用户名
+ required: false
+ type: text
+ - default: ""
+ edit: true
+ envKey: DISCOURSE_SMTP_PASSWORD
+ labelEn: SMTP Password
+ labelZh: SMTP 密码
+ required: false
+ type: password
+ - default: ""
+ edit: true
+ envKey: DISCOURSE_SMTP_PROTOCOL
+ labelEn: SMTP Protocol
+ labelZh: SMTP 协议
+ required: false
+ type: text
+ - default: "login"
+ edit: true
+ envKey: DISCOURSE_SMTP_AUTH
+ labelEn: SMTP Auth
+ labelZh: SMTP 认证
+ required: true
+ type: select
+ values:
+ - label: login
+ value: "login"
+ - label: plain
+ value: "plain"
+ - label: cram_md5
+ value: "cram_md5"
+ - default: ""
+ edit: true
+ envKey: DISCOURSE_SMTP_OPEN_TIMEOUT
+ labelEn: SMTP Open Timeout
+ labelZh: SMTP 打开超时
+ required: false
+ type: number
+ - default: ""
+ edit: true
+ envKey: DISCOURSE_SMTP_READ_TIMEOUT
+ labelEn: SMTP Read Timeout
+ labelZh: SMTP 读取超时
+ required: false
+ type: number
+ - default: ""
+ edit: true
+ envKey: PANEL_DB_HOST
+ key: postgresql
+ labelEn: Database Service
+ labelZh: 数据库服务
+ required: true
+ type: service
+ - default: "5432"
+ edit: true
+ envKey: PANEL_DB_PORT
+ labelEn: Database Port Number
+ labelZh: 数据库端口号
+ required: true
+ rule: paramPort
+ type: number
+ - default: "bitnami_discourse"
+ envKey: PANEL_DB_NAME
+ labelEn: Database
+ labelZh: 数据库名
+ random: true
+ required: true
+ rule: paramCommon
+ type: text
+ - default: "bn_discourse"
+ envKey: PANEL_DB_USER
+ labelEn: User
+ labelZh: 数据库用户
+ random: true
+ required: true
+ rule: paramCommon
+ type: text
+ - default: discourse
+ envKey: PANEL_DB_USER_PASSWORD
+ labelEn: Password
+ labelZh: 数据库用户密码
+ random: true
+ required: true
+ rule: paramComplexity
+ type: password
+ - default: ""
+ edit: true
+ envKey: REDIS_HOST
+ key: redis
+ labelEn: Redis Service
+ labelZh: Redis服务
+ required: true
+ type: service
+ - default: "6379"
+ edit: true
+ envKey: REDIS_PORT
+ labelEn: Redis Service Port
+ labelZh: Redis服务端口
+ required: true
+ rule: paramPort
+ type: number
+ - default: ""
+ envKey: PANEL_REDIS_ROOT_PASSWORD
+ labelEn: Redis Password
+ labelZh: Redis 密码
+ required: false
+ type: password
+ - default: "no"
+ edit: true
+ envKey: DISCOURSE_REDIS_USE_SSL
+ labelEn: Redis Use SSL
+ labelZh: Redis 使用 SSL
+ required: true
+ type: select
+ values:
+ - label: "yes"
+ value: "yes"
+ - label: "no"
+ value: "no"
+ - default: "hstore,pg_trgm"
+ disabled: true
+ envKey: POSTGRESQL_CLIENT_CREATE_DATABASE_EXTENSIONS
+ labelEn: PostgreSQL Client Create Database Extensions
+ labelZh: PostgreSQL 客户端创建数据库扩展
+ required: true
+ type: text
diff --git a/apps/discourse/3.2.2/docker-compose.yml b/apps/discourse/3.2.2/docker-compose.yml
new file mode 100644
index 00000000..c5b226a0
--- /dev/null
+++ b/apps/discourse/3.2.2/docker-compose.yml
@@ -0,0 +1,111 @@
+services:
+ discourse:
+ image: "bitnami/discourse:3.2.2"
+ container_name: ${CONTAINER_NAME}
+ restart: always
+ networks:
+ - 1panel-network
+ ports:
+ - "${PANEL_APP_PORT_HTTP}:${DISCOURSE_PORT_NUMBER}"
+ volumes:
+ - ./data/discourse:/bitnami/discourse
+ environment:
+ - DISCOURSE_DATA_TO_PERSIST=${DISCOURSE_DATA_TO_PERSIST}
+ - DISCOURSE_ENABLE_HTTPS=${DISCOURSE_ENABLE_HTTPS}
+ - DISCOURSE_EXTERNAL_HTTP_PORT_NUMBER=${DISCOURSE_EXTERNAL_HTTP_PORT_NUMBER}
+ - DISCOURSE_EXTERNAL_HTTPS_PORT_NUMBER=${DISCOURSE_EXTERNAL_HTTPS_PORT_NUMBER}
+ - DISCOURSE_HOST=${DISCOURSE_HOST}
+ - DISCOURSE_PORT_NUMBER=${DISCOURSE_PORT_NUMBER}
+ - DISCOURSE_SKIP_BOOTSTRAP=${DISCOURSE_SKIP_BOOTSTRAP}
+ - DISCOURSE_SITE_NAME=${DISCOURSE_SITE_NAME}
+ - DISCOURSE_ENV=${DISCOURSE_ENV}
+ - DISCOURSE_PRECOMPILE_ASSETS=${DISCOURSE_PRECOMPILE_ASSETS}
+ - DISCOURSE_ENABLE_CONF_PERSISTENCE=${DISCOURSE_ENABLE_CONF_PERSISTENCE}
+ - DISCOURSE_EXTRA_CONF_CONTENT=${DISCOURSE_EXTRA_CONF_CONTENT}
+ - DISCOURSE_PASSENGER_SPAWN_METHOD=${DISCOURSE_PASSENGER_SPAWN_METHOD}
+ - DISCOURSE_PASSENGER_EXTRA_FLAGS=${DISCOURSE_PASSENGER_EXTRA_FLAGS}
+ - DISCOURSE_USERNAME=${DISCOURSE_USERNAME}
+ - DISCOURSE_PASSWORD=${DISCOURSE_PASSWORD}
+ - DISCOURSE_EMAIL=${DISCOURSE_EMAIL}
+ - DISCOURSE_FIRST_NAME=${DISCOURSE_FIRST_NAME}
+ - DISCOURSE_LAST_NAME=${DISCOURSE_LAST_NAME}
+ - DISCOURSE_SMTP_HOST=${DISCOURSE_SMTP_HOST}
+ - DISCOURSE_SMTP_PORT_NUMBER=${DISCOURSE_SMTP_PORT_NUMBER}
+ - DISCOURSE_SMTP_USER=${DISCOURSE_SMTP_USER}
+ - DISCOURSE_SMTP_PASSWORD=${DISCOURSE_SMTP_PASSWORD}
+ - DISCOURSE_SMTP_PROTOCOL=${DISCOURSE_SMTP_PROTOCOL}
+ - DISCOURSE_SMTP_AUTH=${DISCOURSE_SMTP_AUTH}
+ - DISCOURSE_SMTP_OPEN_TIMEOUT=${DISCOURSE_SMTP_OPEN_TIMEOUT}
+ - DISCOURSE_SMTP_READ_TIMEOUT=${DISCOURSE_SMTP_READ_TIMEOUT}
+ - DISCOURSE_DATABASE_HOST=${PANEL_DB_HOST}
+ - DISCOURSE_DATABASE_PORT_NUMBER=${PANEL_DB_PORT}
+ - DISCOURSE_DATABASE_NAME=${PANEL_DB_NAME}
+ - DISCOURSE_DATABASE_USER=${PANEL_DB_USER}
+ - DISCOURSE_DATABASE_PASSWORD=${PANEL_DB_USER_PASSWORD}
+ - DISCOURSE_DB_BACKUP_HOST=${PANEL_DB_HOST}
+ - DISCOURSE_DB_BACKUP_PORT=${PANEL_DB_PORT}
+ - DISCOURSE_REDIS_HOST=${REDIS_HOST}
+ - DISCOURSE_REDIS_PORT_NUMBER=${REDIS_PORT}
+ - DISCOURSE_REDIS_PASSWORD=${PANEL_REDIS_ROOT_PASSWORD}
+ - DISCOURSE_REDIS_USE_SSL=${DISCOURSE_REDIS_USE_SSL}
+ - POSTGRESQL_CLIENT_POSTGRES_USER=${PANEL_DB_USER}
+ - POSTGRESQL_CLIENT_POSTGRES_PASSWORD=${PANEL_DB_USER_PASSWORD}
+ - POSTGRESQL_CLIENT_CREATE_DATABASE_NAME=${PANEL_DB_NAME}
+ - POSTGRESQL_CLIENT_CREATE_DATABASE_EXTENSIONS=${POSTGRESQL_CLIENT_CREATE_DATABASE_EXTENSIONS}
+ labels:
+ createdBy: "Apps"
+
+ discourse-sidekiq:
+ image: "bitnami/discourse:3.2.2"
+ container_name: ${CONTAINER_NAME}-sidekiq
+ restart: always
+ networks:
+ - 1panel-network
+ volumes:
+ - ./data/sidekiq:/bitnami/discourse
+ command: /opt/bitnami/scripts/discourse-sidekiq/run.sh
+ environment:
+ - DISCOURSE_DATA_TO_PERSIST=${DISCOURSE_DATA_TO_PERSIST}
+ - DISCOURSE_ENABLE_HTTPS=${DISCOURSE_ENABLE_HTTPS}
+ - DISCOURSE_EXTERNAL_HTTP_PORT_NUMBER=${DISCOURSE_EXTERNAL_HTTP_PORT_NUMBER}
+ - DISCOURSE_EXTERNAL_HTTPS_PORT_NUMBER=${DISCOURSE_EXTERNAL_HTTPS_PORT_NUMBER}
+ - DISCOURSE_HOST=${DISCOURSE_HOST}
+ - DISCOURSE_PORT_NUMBER=${DISCOURSE_PORT_NUMBER}
+ - DISCOURSE_SKIP_BOOTSTRAP=${DISCOURSE_SKIP_BOOTSTRAP}
+ - DISCOURSE_SITE_NAME=${DISCOURSE_SITE_NAME}
+ - DISCOURSE_ENV=${DISCOURSE_ENV}
+ - DISCOURSE_PRECOMPILE_ASSETS=${DISCOURSE_PRECOMPILE_ASSETS}
+ - DISCOURSE_ENABLE_CONF_PERSISTENCE=${DISCOURSE_ENABLE_CONF_PERSISTENCE}
+ - DISCOURSE_EXTRA_CONF_CONTENT=${DISCOURSE_EXTRA_CONF_CONTENT}
+ - DISCOURSE_PASSENGER_SPAWN_METHOD=${DISCOURSE_PASSENGER_SPAWN_METHOD}
+ - DISCOURSE_PASSENGER_EXTRA_FLAGS=${DISCOURSE_PASSENGER_EXTRA_FLAGS}
+ - DISCOURSE_USERNAME=${DISCOURSE_USERNAME}
+ - DISCOURSE_PASSWORD=${DISCOURSE_PASSWORD}
+ - DISCOURSE_EMAIL=${DISCOURSE_EMAIL}
+ - DISCOURSE_FIRST_NAME=${DISCOURSE_FIRST_NAME}
+ - DISCOURSE_LAST_NAME=${DISCOURSE_LAST_NAME}
+ - DISCOURSE_SMTP_HOST=${DISCOURSE_SMTP_HOST}
+ - DISCOURSE_SMTP_PORT_NUMBER=${DISCOURSE_SMTP_PORT_NUMBER}
+ - DISCOURSE_SMTP_USER=${DISCOURSE_SMTP_USER}
+ - DISCOURSE_SMTP_PASSWORD=${DISCOURSE_SMTP_PASSWORD}
+ - DISCOURSE_SMTP_PROTOCOL=${DISCOURSE_SMTP_PROTOCOL}
+ - DISCOURSE_SMTP_AUTH=${DISCOURSE_SMTP_AUTH}
+ - DISCOURSE_SMTP_OPEN_TIMEOUT=${DISCOURSE_SMTP_OPEN_TIMEOUT}
+ - DISCOURSE_SMTP_READ_TIMEOUT=${DISCOURSE_SMTP_READ_TIMEOUT}
+ - DISCOURSE_DATABASE_HOST=${PANEL_DB_HOST}
+ - DISCOURSE_DATABASE_PORT_NUMBER=${PANEL_DB_PORT}
+ - DISCOURSE_DATABASE_NAME=${PANEL_DB_NAME}
+ - DISCOURSE_DATABASE_USER=${PANEL_DB_USER}
+ - DISCOURSE_DATABASE_PASSWORD=${PANEL_DB_USER_PASSWORD}
+ - DISCOURSE_DB_BACKUP_HOST=${PANEL_DB_HOST}
+ - DISCOURSE_DB_BACKUP_PORT=${PANEL_DB_PORT}
+ - DISCOURSE_REDIS_HOST=${REDIS_HOST}
+ - DISCOURSE_REDIS_PORT_NUMBER=${REDIS_PORT}
+ - DISCOURSE_REDIS_PASSWORD=${PANEL_REDIS_ROOT_PASSWORD}
+ - DISCOURSE_REDIS_USE_SSL=${DISCOURSE_REDIS_USE_SSL}
+ labels:
+ createdBy: "Apps"
+
+networks:
+ 1panel-network:
+ external: true
diff --git a/apps/discourse/README.md b/apps/discourse/README.md
new file mode 100644
index 00000000..1aa16677
--- /dev/null
+++ b/apps/discourse/README.md
@@ -0,0 +1,5 @@
+
+
+
+
+Discourse 是您社区的在线家园。我们为那些想要完全控制其网站运行方式和位置的用户提供 100% 开源社区平台。
\ No newline at end of file
diff --git a/apps/discourse/data.yml b/apps/discourse/data.yml
new file mode 100644
index 00000000..e062eaba
--- /dev/null
+++ b/apps/discourse/data.yml
@@ -0,0 +1,19 @@
+name: Discourse
+tags:
+ - 建站
+title: 开源讨论平台
+description: 开源讨论平台
+additionalProperties:
+ key: discourse
+ name: Discourse
+ tags:
+ - WebSite
+ shortDescZh: 开源讨论平台
+ shortDescEn: Open-source discussion platform
+ type: website
+ crossVersionUpdate: true
+ limit: 0
+ recommend: 0
+ website: https://www.discourse.org
+ github: https://github.com/discourse/discourse
+ document: https://docs.discourse.org
diff --git a/apps/discourse/logo.png b/apps/discourse/logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..0596417f45980cd45dcd46b8d66f0aec3dcd5bfa
GIT binary patch
literal 8538
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