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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