diff --git a/.github/renovate.json b/.github/renovate.json index 5d5190931..1e8cc5a20 100644 --- a/.github/renovate.json +++ b/.github/renovate.json @@ -356,6 +356,12 @@ "apps/lucky/2.20.*/*.yml" ], "allowedVersions": "<2.23.1" + }, + { + "matchFileNames": [ + "apps/outline/1.2.*/*.yml" + ], + "allowedVersions": "<1.3.0" } ], "prCreation": "immediate" diff --git a/apps/outline/1.2.0/data.yml b/apps/outline/1.2.0/data.yml new file mode 100644 index 000000000..c2e78f0e1 --- /dev/null +++ b/apps/outline/1.2.0/data.yml @@ -0,0 +1,274 @@ +additionalProperties: + formFields: + - child: + default: "" + envKey: PANEL_REDIS_SERVICE + required: true + type: service + default: redis + envKey: PANEL_REDIS_TYPE + labelZh: Redis 服务 (前置检查) + labelEn: Redis Service (Pre-check) + required: true + type: apps + values: + - label: Redis + value: redis + - child: + default: "" + envKey: PANEL_POSTGRES_SERVICE + required: true + type: service + default: postgresql + envKey: PANEL_POSTGRES_TYPE + labelZh: Postgres 服务 (前置检查) + labelEn: Postgres Service (Pre-check) + required: true + type: apps + values: + - label: PostgreSQL + value: postgresql + - default: "/home/outline" + edit: true + envKey: OUTLINE_ROOT_PATH + labelZh: 数据持久化路径 + labelEn: Data persistence path + required: true + type: text + - default: 3000 + edit: true + envKey: PANEL_APP_PORT_HTTP + labelZh: WebUI 端口 + labelEn: WebUI port + required: true + rule: paramPort + type: number + - default: "fbad4f5da794acbc10f060cdfcf8673300f3302d87f076d7f6e781d4840e9c3d" + edit: true + envKey: SECRET_KEY + labelZh: 加密密钥 + labelEn: Secret Key + required: true + type: password + - default: "b2be1c54acbfe6d965bda01e63195cc815e4743a6fb5ba5f82eae916d98989b5" + edit: true + envKey: UTILS_SECRET + labelZh: 工具密钥 + labelEn: Utils Secret + required: true + type: password + - default: "http://127.0.0.1:3000" + edit: true + envKey: URL + labelZh: 域名 + labelEn: Domain + required: true + rule: paramExtUrl + type: text + - default: "" + edit: true + envKey: CDN_URL + labelZh: CDN 域名 + labelEn: CDN Domain + required: false + type: text + - default: "https://iframe.ly/api/iframely" + edit: true + envKey: IFRAMELY_URL + labelZh: iFramely 地址 + labelEn: iFramely URL + required: true + rule: paramExtUrl + type: text + - default: "" + edit: true + envKey: IFRAMELY_API_KEY + labelZh: iFramely 密钥 + labelEn: iFramely API Key + required: false + type: text + - default: "127.0.0.1" + edit: true + envKey: DB_HOSTNAME + labelZh: 数据库 主机地址 + labelEn: Database Host + required: true + type: text + - default: 5432 + edit: true + envKey: DB_PORT + labelZh: 数据库 端口 + labelEn: Database Port + required: true + rule: paramPort + type: number + - default: "outline" + edit: true + envKey: DB_USERNAME + labelZh: 数据库 用户名 + labelEn: Database User + required: true + type: text + - default: "" + edit: true + envKey: DB_PASSWORD + labelZh: 数据库 密码 + labelEn: Database Password + random: true + required: true + rule: paramComplexity + type: password + - default: "outline" + edit: true + envKey: DB_DATABASE_NAME + labelZh: 数据库 名称 + labelEn: Database Name + required: true + type: text + - default: "redis://localhost:6379" + edit: true + envKey: REDIS_URL + labelZh: Redis 链接 + labelEn: Redis URL + required: true + type: text + - default: "" + edit: true + envKey: SLACK_CLIENT_ID + labelZh: Slack 客户端 ID (鉴权) + labelEn: Slack Client ID (Auth) + required: false + type: text + - default: "" + edit: true + envKey: SLACK_CLIENT_SECRET + labelZh: Slack 客户端密钥 (鉴权) + labelEn: Slack Client Secret (Auth) + required: false + type: password + - default: "" + edit: true + envKey: GOOGLE_CLIENT_ID + labelZh: Google 客户端 ID (鉴权) + labelEn: Google Client ID (Auth) + required: false + type: text + - default: "" + edit: true + envKey: GOOGLE_CLIENT_SECRET + labelZh: Google 客户端密钥 (鉴权) + labelEn: Google Client Secret (Auth) + required: false + type: password + - default: "" + edit: true + envKey: DISCORD_CLIENT_ID + labelZh: Discord 客户端 ID (鉴权) + labelEn: Discord Client ID (Auth) + required: false + type: text + - default: "" + edit: true + envKey: DISCORD_CLIENT_SECRET + labelZh: Discord 客户端密钥 (鉴权) + labelEn: Discord Client Secret (Auth) + required: false + type: password + - default: "" + edit: true + envKey: DISCORD_SERVER_ID + labelZh: Discord 服务端 ID (鉴权) + labelEn: Discord Server ID (Auth) + required: false + type: text + - default: "" + edit: true + envKey: DISCORD_SERVER_ROLES + labelZh: Discord 服务端角色 (鉴权) + labelEn: Discord Server Roles (Auth) + required: false + type: text + - default: "" + edit: true + envKey: SMTP_HOST + labelZh: SMTP 主机 + labelEn: SMTP Host + required: false + type: text + - default: 465 + edit: true + envKey: SMTP_PORT + labelZh: SMTP 端口 + labelEn: SMTP Port + required: false + type: number + - default: "" + edit: true + envKey: SMTP_USERNAME + labelZh: SMTP 用户名 + labelEn: SMTP Username + required: false + type: text + - default: "" + edit: true + envKey: SMTP_PASSWORD + labelZh: SMTP 密码 + labelEn: SMTP Password + required: false + type: password + - default: "" + edit: true + envKey: SMTP_FROM_EMAIL + labelZh: SMTP 发件人 + labelEn: SMTP From Email + required: false + type: text + - default: "" + edit: true + envKey: SLACK_VERIFICATION_TOKEN + labelZh: Slack 验证令牌 (Slack 集成) + labelEn: Slack Verification Token (Slack Integration) + required: false + type: text + - default: "" + edit: true + envKey: SLACK_APP_ID + labelZh: Slack 应用ID (Slack 集成) + labelEn: Slack App ID (Slack Integration) + required: false + type: text + - default: "" + edit: true + envKey: GITHUB_CLIENT_ID + labelZh: GitHub 客户端 ID (GitHub 集成) + labelEn: GitHub Client ID (GitHub Integration) + required: false + type: text + - default: "" + edit: true + envKey: GITHUB_CLIENT_SECRET + labelZh: GitHub 客户端密钥 (GitHub 集成) + labelEn: GitHub Client Secret (GitHub Integration) + required: false + type: password + - default: "" + edit: true + envKey: GITHUB_APP_NAME + labelZh: GitHub 应用名称 (GitHub 集成) + labelEn: GitHub App Name (GitHub Integration) + required: false + type: text + - default: "" + edit: true + envKey: GITHUB_APP_ID + labelZh: GitHub 应用ID (GitHub 集成) + labelEn: GitHub App ID (GitHub Integration) + required: false + type: text + - default: "" + edit: true + envKey: GITHUB_APP_PRIVATE_KEY + labelZh: GitHub 应用私钥 (GitHub 集成) + labelEn: GitHub App Private Key (GitHub Integration) + required: false + type: password diff --git a/apps/outline/1.2.0/docker-compose.yml b/apps/outline/1.2.0/docker-compose.yml new file mode 100644 index 000000000..f7a7d8ed0 --- /dev/null +++ b/apps/outline/1.2.0/docker-compose.yml @@ -0,0 +1,23 @@ +networks: + 1panel-network: + external: true + +services: + outline: + image: outlinewiki/outline:1.2.0 + container_name: ${CONTAINER_NAME} + labels: + createdBy: "Apps" + restart: always + networks: + - 1panel-network + ports: + - ${PANEL_APP_PORT_HTTP}:3000 + volumes: + - ${OUTLINE_ROOT_PATH}/data:/var/lib/outline/data + env_file: + - ${GLOBAL_ENV_FILE:-/etc/1panel/envs/global.env} + - ${APP_ENV_FILE:-/etc/1panel/envs/outline/outline.env} + - ${ENV_FILE:-/etc/1panel/envs/default.env} + environment: + - DATABASE_URL=postgres://${DB_USERNAME}:${DB_PASSWORD}@${DB_HOSTNAME}:${DB_PORT}/${DB_DATABASE_NAME} diff --git a/apps/outline/1.2.0/envs/default.env b/apps/outline/1.2.0/envs/default.env new file mode 100644 index 000000000..cd05f46e6 --- /dev/null +++ b/apps/outline/1.2.0/envs/default.env @@ -0,0 +1,2 @@ +# copyright© 2024 XinJiang Ms Studio +ENV_FILE=.env diff --git a/apps/outline/1.2.0/envs/global.env b/apps/outline/1.2.0/envs/global.env new file mode 100644 index 000000000..e10989fe4 --- /dev/null +++ b/apps/outline/1.2.0/envs/global.env @@ -0,0 +1,2 @@ +# copyright© 2024 XinJiang Ms Studio +TZ=Asia/Shanghai diff --git a/apps/outline/1.2.0/envs/outline.env b/apps/outline/1.2.0/envs/outline.env new file mode 100644 index 000000000..1e366c08f --- /dev/null +++ b/apps/outline/1.2.0/envs/outline.env @@ -0,0 +1,224 @@ +# –––––––––––––––– REQUIRED –––––––––––––––– + +NODE_ENV=production + +# Generate a hex-encoded 32-byte random key. You should use `openssl rand -hex 32` +# in your terminal to generate a random value. +SECRET_KEY=generate_a_new_key + +# Generate a unique random key. The format is not important but you could still use +# `openssl rand -hex 32` in your terminal to produce this. +UTILS_SECRET=generate_a_new_key + +# For production point these at your databases, in development the default +# should work out of the box. +DATABASE_URL=postgres://user:pass@localhost:5432/outline +DATABASE_CONNECTION_POOL_MIN= +DATABASE_CONNECTION_POOL_MAX= +# Uncomment this to disable SSL for connecting to Postgres +PGSSLMODE=disable + +# For redis you can either specify an ioredis compatible url like this +REDIS_URL=redis://localhost:6379 +# or alternatively, if you would like to provide additional connection options, +# use a base64 encoded JSON connection option object. Refer to the ioredis documentation +# for a list of available options. +# Example: Use Redis Sentinel for high availability +# {"sentinels":[{"host":"sentinel-0","port":26379},{"host":"sentinel-1","port":26379}],"name":"mymaster"} +# REDIS_URL=ioredis://eyJzZW50aW5lbHMiOlt7Imhvc3QiOiJzZW50aW5lbC0wIiwicG9ydCI6MjYzNzl9LHsiaG9zdCI6InNlbnRpbmVsLTEiLCJwb3J0IjoyNjM3OX1dLCJuYW1lIjoibXltYXN0ZXIifQ== + +# URL should point to the fully qualified, publicly accessible URL. If using a +# proxy the port in URL and PORT may be different. +URL=http://127.0.0.1:3000 +PORT=3000 + +# See [documentation](docs/SERVICES.md) on running a separate collaboration +# server, for normal operation this does not need to be set. +COLLABORATION_URL= + +# Specify what storage system to use. Possible value is one of "s3" or "local". +# For "local", the avatar images and document attachments will be saved on local disk. +FILE_STORAGE=local + +# If "local" is configured for FILE_STORAGE above, then this sets the parent directory under +# which all attachments/images go. Make sure that the process has permissions to create +# this path and also to write files to it. +FILE_STORAGE_LOCAL_ROOT_DIR=/var/lib/outline/data + +# Maximum allowed size for the uploaded attachment. +FILE_STORAGE_UPLOAD_MAX_SIZE=262144000 + +# Override the maximum size of document imports, generally this should be lower +# than the document attachment maximum size. +FILE_STORAGE_IMPORT_MAX_SIZE= + +# Override the maximum size of workspace imports, these can be especially large +# and the files are temporary being automatically deleted after a period of time. +FILE_STORAGE_WORKSPACE_IMPORT_MAX_SIZE= + +# To support uploading of images for avatars and document attachments in a distributed +# architecture an s3-compatible storage can be configured if FILE_STORAGE=s3 above. +AWS_ACCESS_KEY_ID=get_a_key_from_aws +AWS_SECRET_ACCESS_KEY=get_the_secret_of_above_key +AWS_REGION=xx-xxxx-x +AWS_S3_ACCELERATE_URL= +AWS_S3_UPLOAD_BUCKET_URL=http://s3:4569 +AWS_S3_UPLOAD_BUCKET_NAME=bucket_name_here +AWS_S3_FORCE_PATH_STYLE=true +AWS_S3_ACL=private + +# –––––––––––––– AUTHENTICATION –––––––––––––– + +# Third party signin credentials, at least ONE OF EITHER Google, Slack, +# or Microsoft is required for a working installation or you'll have no sign-in +# options. + +# To configure Slack auth, you'll need to create an Application at +# => https://api.slack.com/apps +# +# When configuring the Client ID, add a redirect URL under "OAuth & Permissions": +# https:///auth/slack.callback +SLACK_CLIENT_ID=get_a_key_from_slack +SLACK_CLIENT_SECRET=get_the_secret_of_above_key + +# To configure Google auth, you'll need to create an OAuth Client ID at +# => https://console.cloud.google.com/apis/credentials +# +# When configuring the Client ID, add an Authorized redirect URI: +# https:///auth/google.callback +GOOGLE_CLIENT_ID= +GOOGLE_CLIENT_SECRET= + +# To configure Microsoft/Azure auth, you'll need to create an OAuth Client. See +# the guide for details on setting up your Azure App: +# => https://wiki.generaloutline.com/share/dfa77e56-d4d2-4b51-8ff8-84ea6608faa4 +AZURE_CLIENT_ID= +AZURE_CLIENT_SECRET= +AZURE_RESOURCE_APP_ID= + +# To configure generic OIDC auth, you'll need some kind of identity provider. +# See documentation for whichever IdP you use to acquire the following info: +# Redirect URI is https:///auth/oidc.callback +OIDC_CLIENT_ID= +OIDC_CLIENT_SECRET= +OIDC_AUTH_URI= +OIDC_TOKEN_URI= +OIDC_USERINFO_URI= +OIDC_LOGOUT_URI= + +# Specify which claims to derive user information from +# Supports any valid JSON path with the JWT payload +OIDC_USERNAME_CLAIM=preferred_username + +# Display name for OIDC authentication +OIDC_DISPLAY_NAME=OpenID Connect + +# Space separated auth scopes. +OIDC_SCOPES=openid profile email + +# To configure the GitHub integration, you'll need to create a GitHub App at +# => https://github.com/settings/apps +# +# When configuring the Client ID, add a redirect URL under "Permissions & events": +# https:///api/github.callback +GITHUB_CLIENT_ID= +GITHUB_CLIENT_SECRET= +GITHUB_APP_NAME= +GITHUB_APP_ID= +GITHUB_APP_PRIVATE_KEY= + +# To configure Discord auth, you'll need to create a Discord Application at +# => https://discord.com/developers/applications/ +# +# When configuring the Client ID, add a redirect URL under "OAuth2": +# https:///auth/discord.callback +DISCORD_CLIENT_ID= +DISCORD_CLIENT_SECRET= + +# DISCORD_SERVER_ID should be the ID of the Discord server that Outline is +# integrated with. +# Used to verify that the user is a member of the server as well as server +# metadata such as nicknames, server icon and name. +DISCORD_SERVER_ID= + +# DISCORD_SERVER_ROLES should be a comma separated list of role IDs that are +# allowed to access Outline. If this is not set, all members of the server +# will be allowed to access Outline. +# DISCORD_SERVER_ID and DISCORD_SERVER_ROLES must be set together. +DISCORD_SERVER_ROLES= + +# –––––––––––––––– OPTIONAL –––––––––––––––– + +# Base64 encoded private key and certificate for HTTPS termination. This is only +# required if you do not use an external reverse proxy. See documentation: +# https://wiki.generaloutline.com/share/1c922644-40d8-41fe-98f9-df2b67239d45 +SSL_KEY= +SSL_CERT= + +# If using a Cloudfront/Cloudflare distribution or similar it can be set below. +# This will cause paths to javascript, stylesheets, and images to be updated to +# the hostname defined in CDN_URL. In your CDN configuration the origin server +# should be set to the same as URL. +CDN_URL= + +# Auto-redirect to https in production. The default is true but you may set to +# false if you can be sure that SSL is terminated at an external loadbalancer. +FORCE_HTTPS=false + +# Have the installation check for updates by sending anonymized statistics to +# the maintainers +ENABLE_UPDATES=true + +# How many processes should be spawned. As a reasonable rule divide your servers +# available memory by 512 for a rough estimate +WEB_CONCURRENCY=1 + +# You can remove this line if your reverse proxy already logs incoming http +# requests and this ends up being duplicative +DEBUG=http + +# Configure lowest severity level for server logs. Should be one of +# error, warn, info, http, verbose, debug and silly +LOG_LEVEL=info + +# For a complete Slack integration with search and posting to channels the +# following configs are also needed, some more details +# => https://wiki.generaloutline.com/share/be25efd1-b3ef-4450-b8e5-c4a4fc11e02a +# +SLACK_VERIFICATION_TOKEN=your_token +SLACK_APP_ID=A0XXXXXXX +SLACK_MESSAGE_ACTIONS=true + +# Optionally enable Sentry (sentry.io) to track errors and performance, +# and optionally add a Sentry proxy tunnel for bypassing ad blockers in the UI: +# https://docs.sentry.io/platforms/javascript/troubleshooting/#using-the-tunnel-option) +SENTRY_DSN= +SENTRY_TUNNEL= + +# To support sending outgoing transactional emails such as "document updated" or +# "you've been invited" you'll need to provide authentication for an SMTP server +SMTP_HOST= +SMTP_PORT= +SMTP_USERNAME= +SMTP_PASSWORD= +SMTP_FROM_EMAIL= +SMTP_REPLY_EMAIL= +SMTP_TLS_CIPHERS= +SMTP_SECURE=true + +# The default interface language. See translate.getoutline.com for a list of +# available language codes and their rough percentage translated. +DEFAULT_LANGUAGE=zh_CN + +# Optionally enable rate limiter at application web server +RATE_LIMITER_ENABLED=true + +# Configure default throttling parameters for rate limiter +RATE_LIMITER_REQUESTS=1000 +RATE_LIMITER_DURATION_WINDOW=60 + +# Iframely API config +# https://iframe.ly/api/oembed +# https://iframe.ly/api/iframely +IFRAMELY_URL=https://iframe.ly/api/iframely +# IFRAMELY_API_KEY= diff --git a/apps/outline/1.2.0/scripts/init.sh b/apps/outline/1.2.0/scripts/init.sh new file mode 100644 index 000000000..4c7fbfcb7 --- /dev/null +++ b/apps/outline/1.2.0/scripts/init.sh @@ -0,0 +1,29 @@ +#!/bin/bash + +if [ -f .env ]; then + source .env + + # setup-1 add default values + CURRENT_DIR=$(pwd) + sed -i '/^ENV_FILE=/d' .env + sed -i '/^GLOBAL_ENV_FILE=/d' .env + sed -i '/^APP_ENV_FILE=/d' .env + echo "ENV_FILE=${CURRENT_DIR}/.env" >> .env + echo "GLOBAL_ENV_FILE=${CURRENT_DIR}/envs/global.env" >> .env + echo "APP_ENV_FILE=${CURRENT_DIR}/envs/outline.env" >> .env + + # setup-2 remove empty values + sed -i '/^.*=""/d' .env + + # setup-3 update directory permissions + mkdir -p "$OUTLINE_ROOT_PATH" + mkdir -p "$OUTLINE_ROOT_PATH/data" + + chown -R 1001:1001 "$OUTLINE_ROOT_PATH" + chmod -R 1777 "$OUTLINE_ROOT_PATH" + + echo "Check Finish." + +else + echo "Error: .env file not found." +fi diff --git a/apps/outline/1.2.0/scripts/uninstall.sh b/apps/outline/1.2.0/scripts/uninstall.sh new file mode 100644 index 000000000..c86c4fbca --- /dev/null +++ b/apps/outline/1.2.0/scripts/uninstall.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +if [ -f .env ]; then + source .env + + echo "Check Finish." + +else + echo "Error: .env file not found." +fi diff --git a/apps/outline/1.2.0/scripts/upgrade.sh b/apps/outline/1.2.0/scripts/upgrade.sh new file mode 100644 index 000000000..4c7fbfcb7 --- /dev/null +++ b/apps/outline/1.2.0/scripts/upgrade.sh @@ -0,0 +1,29 @@ +#!/bin/bash + +if [ -f .env ]; then + source .env + + # setup-1 add default values + CURRENT_DIR=$(pwd) + sed -i '/^ENV_FILE=/d' .env + sed -i '/^GLOBAL_ENV_FILE=/d' .env + sed -i '/^APP_ENV_FILE=/d' .env + echo "ENV_FILE=${CURRENT_DIR}/.env" >> .env + echo "GLOBAL_ENV_FILE=${CURRENT_DIR}/envs/global.env" >> .env + echo "APP_ENV_FILE=${CURRENT_DIR}/envs/outline.env" >> .env + + # setup-2 remove empty values + sed -i '/^.*=""/d' .env + + # setup-3 update directory permissions + mkdir -p "$OUTLINE_ROOT_PATH" + mkdir -p "$OUTLINE_ROOT_PATH/data" + + chown -R 1001:1001 "$OUTLINE_ROOT_PATH" + chmod -R 1777 "$OUTLINE_ROOT_PATH" + + echo "Check Finish." + +else + echo "Error: .env file not found." +fi diff --git a/apps/outline/1.3.0/data.yml b/apps/outline/1.3.0/data.yml index c2e78f0e1..6fcd59524 100644 --- a/apps/outline/1.3.0/data.yml +++ b/apps/outline/1.3.0/data.yml @@ -43,20 +43,20 @@ additionalProperties: required: true rule: paramPort type: number - - default: "fbad4f5da794acbc10f060cdfcf8673300f3302d87f076d7f6e781d4840e9c3d" + - default: "" edit: true envKey: SECRET_KEY labelZh: 加密密钥 labelEn: Secret Key required: true - type: password - - default: "b2be1c54acbfe6d965bda01e63195cc815e4743a6fb5ba5f82eae916d98989b5" + type: text + - default: "" edit: true envKey: UTILS_SECRET labelZh: 工具密钥 labelEn: Utils Secret required: true - type: password + type: text - default: "http://127.0.0.1:3000" edit: true envKey: URL @@ -65,28 +65,6 @@ additionalProperties: required: true rule: paramExtUrl type: text - - default: "" - edit: true - envKey: CDN_URL - labelZh: CDN 域名 - labelEn: CDN Domain - required: false - type: text - - default: "https://iframe.ly/api/iframely" - edit: true - envKey: IFRAMELY_URL - labelZh: iFramely 地址 - labelEn: iFramely URL - required: true - rule: paramExtUrl - type: text - - default: "" - edit: true - envKey: IFRAMELY_API_KEY - labelZh: iFramely 密钥 - labelEn: iFramely API Key - required: false - type: text - default: "127.0.0.1" edit: true envKey: DB_HOSTNAME @@ -146,129 +124,15 @@ additionalProperties: labelEn: Slack Client Secret (Auth) required: false type: password - - default: "" + - default: "false" edit: true - envKey: GOOGLE_CLIENT_ID - labelZh: Google 客户端 ID (鉴权) - labelEn: Google Client ID (Auth) - required: false - type: text - - default: "" - edit: true - envKey: GOOGLE_CLIENT_SECRET - labelZh: Google 客户端密钥 (鉴权) - labelEn: Google Client Secret (Auth) - required: false - type: password - - default: "" - edit: true - envKey: DISCORD_CLIENT_ID - labelZh: Discord 客户端 ID (鉴权) - labelEn: Discord Client ID (Auth) - required: false - type: text - - default: "" - edit: true - envKey: DISCORD_CLIENT_SECRET - labelZh: Discord 客户端密钥 (鉴权) - labelEn: Discord Client Secret (Auth) - required: false - type: password - - default: "" - edit: true - envKey: DISCORD_SERVER_ID - labelZh: Discord 服务端 ID (鉴权) - labelEn: Discord Server ID (Auth) - required: false - type: text - - default: "" - edit: true - envKey: DISCORD_SERVER_ROLES - labelZh: Discord 服务端角色 (鉴权) - labelEn: Discord Server Roles (Auth) - required: false - type: text - - default: "" - edit: true - envKey: SMTP_HOST - labelZh: SMTP 主机 - labelEn: SMTP Host - required: false - type: text - - default: 465 - edit: true - envKey: SMTP_PORT - labelZh: SMTP 端口 - labelEn: SMTP Port - required: false - type: number - - default: "" - edit: true - envKey: SMTP_USERNAME - labelZh: SMTP 用户名 - labelEn: SMTP Username - required: false - type: text - - default: "" - edit: true - envKey: SMTP_PASSWORD - labelZh: SMTP 密码 - labelEn: SMTP Password - required: false - type: password - - default: "" - edit: true - envKey: SMTP_FROM_EMAIL - labelZh: SMTP 发件人 - labelEn: SMTP From Email - required: false - type: text - - default: "" - edit: true - envKey: SLACK_VERIFICATION_TOKEN - labelZh: Slack 验证令牌 (Slack 集成) - labelEn: Slack Verification Token (Slack Integration) - required: false - type: text - - default: "" - edit: true - envKey: SLACK_APP_ID - labelZh: Slack 应用ID (Slack 集成) - labelEn: Slack App ID (Slack Integration) - required: false - type: text - - default: "" - edit: true - envKey: GITHUB_CLIENT_ID - labelZh: GitHub 客户端 ID (GitHub 集成) - labelEn: GitHub Client ID (GitHub Integration) - required: false - type: text - - default: "" - edit: true - envKey: GITHUB_CLIENT_SECRET - labelZh: GitHub 客户端密钥 (GitHub 集成) - labelEn: GitHub Client Secret (GitHub Integration) - required: false - type: password - - default: "" - edit: true - envKey: GITHUB_APP_NAME - labelZh: GitHub 应用名称 (GitHub 集成) - labelEn: GitHub App Name (GitHub Integration) - required: false - type: text - - default: "" - edit: true - envKey: GITHUB_APP_ID - labelZh: GitHub 应用ID (GitHub 集成) - labelEn: GitHub App ID (GitHub Integration) - required: false - type: text - - default: "" - edit: true - envKey: GITHUB_APP_PRIVATE_KEY - labelZh: GitHub 应用私钥 (GitHub 集成) - labelEn: GitHub App Private Key (GitHub Integration) - required: false - type: password + envKey: FORCE_HTTPS + labelZh: 强制使用 HTTPS + labelEn: Force HTTPS + required: true + type: select + values: + - label: 启用 + value: "true" + - label: 禁止 + value: "false" diff --git a/apps/outline/1.3.0/envs/outline.env b/apps/outline/1.3.0/envs/outline.env index 1e366c08f..f247c73fb 100644 --- a/apps/outline/1.3.0/envs/outline.env +++ b/apps/outline/1.3.0/envs/outline.env @@ -1,104 +1,156 @@ -# –––––––––––––––– REQUIRED –––––––––––––––– - NODE_ENV=production -# Generate a hex-encoded 32-byte random key. You should use `openssl rand -hex 32` -# in your terminal to generate a random value. -SECRET_KEY=generate_a_new_key +# 访问地址 +URL= -# Generate a unique random key. The format is not important but you could still use -# `openssl rand -hex 32` in your terminal to produce this. -UTILS_SECRET=generate_a_new_key - -# For production point these at your databases, in development the default -# should work out of the box. -DATABASE_URL=postgres://user:pass@localhost:5432/outline -DATABASE_CONNECTION_POOL_MIN= -DATABASE_CONNECTION_POOL_MAX= -# Uncomment this to disable SSL for connecting to Postgres -PGSSLMODE=disable - -# For redis you can either specify an ioredis compatible url like this -REDIS_URL=redis://localhost:6379 -# or alternatively, if you would like to provide additional connection options, -# use a base64 encoded JSON connection option object. Refer to the ioredis documentation -# for a list of available options. -# Example: Use Redis Sentinel for high availability -# {"sentinels":[{"host":"sentinel-0","port":26379},{"host":"sentinel-1","port":26379}],"name":"mymaster"} -# REDIS_URL=ioredis://eyJzZW50aW5lbHMiOlt7Imhvc3QiOiJzZW50aW5lbC0wIiwicG9ydCI6MjYzNzl9LHsiaG9zdCI6InNlbnRpbmVsLTEiLCJwb3J0IjoyNjM3OX1dLCJuYW1lIjoibXltYXN0ZXIifQ== - -# URL should point to the fully qualified, publicly accessible URL. If using a -# proxy the port in URL and PORT may be different. -URL=http://127.0.0.1:3000 +# 服务端口 PORT=3000 -# See [documentation](docs/SERVICES.md) on running a separate collaboration -# server, for normal operation this does not need to be set. +# 运行一个独立的协作服务 COLLABORATION_URL= -# Specify what storage system to use. Possible value is one of "s3" or "local". -# For "local", the avatar images and document attachments will be saved on local disk. +# CDN 分发服务 +CDN_URL= + +# 启动多少个 Web 进程 +WEB_CONCURRENCY=1 + +# 生成一个 32 字节的随机密钥(十六进制编码)。 +# 可在终端中使用命令:`openssl rand -hex 32` +# SECRET_KEY= + +# 生成一个唯一的随机密钥。 +# 格式并不重要,但同样可以使用:`openssl rand -hex 32` +# UTILS_SECRET= + +# 默认界面语言。 +# 可用语言代码及其大致翻译完成度请参考:https://translate.getoutline.com +DEFAULT_LANGUAGE=zh_CN + + +# –––––––––––––––––––––––––––––––––––––– +# ––––––––––––– 数据库(DATABASE) ––––––––––––– +# –––––––––––––––––––––––––––––––––––––– + +# 生产环境数据库连接地址, +# 需包含用户名、密码、主机、端口以及数据库名。 +# DATABASE_URL=postgres://user:pass@postgres:5432/outline + +# 每个进程的数据库连接池(内存中)配置。 +# 请确保连接池大小不会超过数据库允许的最大连接数。 +# 默认最小值为 0,最大值为 5。 +DATABASE_CONNECTION_POOL_MIN=0 +DATABASE_CONNECTION_POOL_MAX=5 + +# 如果你不打算使用 SSL 连接 Postgres,请取消注释此行。 +# 当数据库与应用部署在同一台机器上时,这是可以接受的。 +PGSSLMODE=disable + + +# –––––––––––––––––––––––––––––––––––––– +# –––––––––––––– Redis ––––––––––––––– +# –––––––––––––––––––––––––––––––––––––– + +# Redis 连接地址。 +# 可以是 ioredis 兼容的 URL,或者 Base64 编码后的配置对象。 +# 文档:https://docs.getoutline.com/s/hosting/doc/redis-LGM4BFXYp4 +# REDIS_URL=redis://redis:6379 + +# 若要启用协作服务的横向扩展(多实例),必须提供 Redis 地址。 +# 可以与上面的 REDIS_URL 相同,也可以使用不同的 Redis 服务。 +# 文档:https://docs.getoutline.com/s/hosting/doc/horizontal-scaling-hkfU5Stao7 +# REDIS_COLLABORATION_URL= + + +# –––––––––––––––––––––––––––––––––––––– +# ––––––––––– 文件存储(FILE STORAGE) ––––––––––– +# –––––––––––––––––––––––––––––––––––––– + +# 指定使用的存储系统。 +# 可选值:"s3" 或 "local"。 +# - local:图片和文档附件存储在本地磁盘 +# - s3:存储在兼容 S3 的对象存储服务中 +# 文档:https://docs.getoutline.com/s/hosting/doc/file-storage-N4M0T6Ypu7 FILE_STORAGE=local -# If "local" is configured for FILE_STORAGE above, then this sets the parent directory under -# which all attachments/images go. Make sure that the process has permissions to create -# this path and also to write files to it. +# 当 FILE_STORAGE=local 时, +# 此路径为所有附件 / 图片的父目录。 +# 请确保进程有权限创建该目录并写入文件。 FILE_STORAGE_LOCAL_ROOT_DIR=/var/lib/outline/data -# Maximum allowed size for the uploaded attachment. +# 单个附件允许上传的最大大小(字节)。 FILE_STORAGE_UPLOAD_MAX_SIZE=262144000 -# Override the maximum size of document imports, generally this should be lower -# than the document attachment maximum size. +# 覆盖“文档导入”的最大文件大小, +# 通常应小于普通文档附件的最大限制。 FILE_STORAGE_IMPORT_MAX_SIZE= -# Override the maximum size of workspace imports, these can be especially large -# and the files are temporary being automatically deleted after a period of time. +# 覆盖“工作区导入”的最大文件大小。 +# 该类文件通常非常大,并且是临时文件, +# 在一段时间后会被自动删除。 FILE_STORAGE_WORKSPACE_IMPORT_MAX_SIZE= -# To support uploading of images for avatars and document attachments in a distributed -# architecture an s3-compatible storage can be configured if FILE_STORAGE=s3 above. -AWS_ACCESS_KEY_ID=get_a_key_from_aws -AWS_SECRET_ACCESS_KEY=get_the_secret_of_above_key -AWS_REGION=xx-xxxx-x -AWS_S3_ACCELERATE_URL= -AWS_S3_UPLOAD_BUCKET_URL=http://s3:4569 -AWS_S3_UPLOAD_BUCKET_NAME=bucket_name_here -AWS_S3_FORCE_PATH_STYLE=true -AWS_S3_ACL=private +# 若要在分布式架构中支持头像图片和文档附件上传, +# 当 FILE_STORAGE=s3 时,可配置兼容 S3 的对象存储。 +# AWS_ACCESS_KEY_ID=get_a_key_from_aws +# AWS_SECRET_ACCESS_KEY=get_the_secret_of_above_key +# AWS_REGION=xx-xxxx-x +# AWS_S3_ACCELERATE_URL= +# AWS_S3_UPLOAD_BUCKET_URL=http://s3:4569 +# AWS_S3_UPLOAD_BUCKET_NAME=bucket_name_here +# AWS_S3_FORCE_PATH_STYLE=true +# AWS_S3_ACL=private -# –––––––––––––– AUTHENTICATION –––––––––––––– -# Third party signin credentials, at least ONE OF EITHER Google, Slack, -# or Microsoft is required for a working installation or you'll have no sign-in -# options. +# –––––––––––––––––––––––––––––––––––––– +# –––––––––––––––– SSL ––––––––––––––– +# –––––––––––––––––––––––––––––––––––––– -# To configure Slack auth, you'll need to create an Application at -# => https://api.slack.com/apps -# -# When configuring the Client ID, add a redirect URL under "OAuth & Permissions": -# https:///auth/slack.callback -SLACK_CLIENT_ID=get_a_key_from_slack -SLACK_CLIENT_SECRET=get_the_secret_of_above_key +# HTTPS 终止所需的私钥和证书(Base64 编码)。 +# 这是三种 SSL 配置方式之一,可以留空。 +# 文档:https://docs.getoutline.com/s/hosting/doc/ssl-pzk7WO8d1n +SSL_KEY= +SSL_CERT= -# To configure Google auth, you'll need to create an OAuth Client ID at -# => https://console.cloud.google.com/apis/credentials -# -# When configuring the Client ID, add an Authorized redirect URI: -# https:///auth/google.callback +# 在生产环境中是否强制跳转到 HTTPS。 +# 默认值为 true; +# 如果你确定 SSL 已由外部负载均衡器终止,可以设置为 false。 +# FORCE_HTTPS=true + + +# –––––––––––––––––––––––––––––––––––––– +# –––––––––– 认证(AUTHENTICATION) –––––––––– +# –––––––––––––––––––––––––––––––––––––– + +# 第三方登录配置。 +# 至少需要配置以下之一:Google、Slack、Discord 或 Microsoft, +# 否则系统将没有任何登录方式。 + +# Slack 登录 +# 文档:https://docs.getoutline.com/s/hosting/doc/slack-sgMujR8J9J +SLACK_CLIENT_ID= +SLACK_CLIENT_SECRET= + +# Google 登录 +# 文档:https://docs.getoutline.com/s/hosting/doc/google-hOuvtCmTqQ GOOGLE_CLIENT_ID= GOOGLE_CLIENT_SECRET= -# To configure Microsoft/Azure auth, you'll need to create an OAuth Client. See -# the guide for details on setting up your Azure App: -# => https://wiki.generaloutline.com/share/dfa77e56-d4d2-4b51-8ff8-84ea6608faa4 +# Microsoft Entra / Azure AD 登录 +# 文档:https://docs.getoutline.com/s/hosting/doc/microsoft-entra-UVz6jsIOcv AZURE_CLIENT_ID= AZURE_CLIENT_SECRET= AZURE_RESOURCE_APP_ID= -# To configure generic OIDC auth, you'll need some kind of identity provider. -# See documentation for whichever IdP you use to acquire the following info: -# Redirect URI is https:///auth/oidc.callback +# Discord 登录 +# 文档:https://docs.getoutline.com/s/hosting/doc/discord-g4JdWFFub6 +DISCORD_CLIENT_ID= +DISCORD_CLIENT_SECRET= +DISCORD_SERVER_ID= +DISCORD_SERVER_ROLES= + +# 通用 OIDC(OpenID Connect)提供方 +# 文档:https://docs.getoutline.com/s/hosting/doc/oidc-8CPBm6uC0I OIDC_CLIENT_ID= OIDC_CLIENT_SECRET= OIDC_AUTH_URI= @@ -106,119 +158,107 @@ OIDC_TOKEN_URI= OIDC_USERINFO_URI= OIDC_LOGOUT_URI= -# Specify which claims to derive user information from -# Supports any valid JSON path with the JWT payload +# 指定用于派生用户信息的声明(claim)。 +# 支持任何 JWT payload 中的合法 JSON Path。 OIDC_USERNAME_CLAIM=preferred_username -# Display name for OIDC authentication +# OIDC 登录方式在界面上显示的名称 OIDC_DISPLAY_NAME=OpenID Connect -# Space separated auth scopes. +# OIDC 授权作用域(以空格分隔) OIDC_SCOPES=openid profile email -# To configure the GitHub integration, you'll need to create a GitHub App at -# => https://github.com/settings/apps -# -# When configuring the Client ID, add a redirect URL under "Permissions & events": -# https:///api/github.callback + +# –––––––––––––––––––––––––––––––––––––– +# –––––––––––––– 邮件(EMAIL) ––––––––––––––– +# –––––––––––––––––––––––––––––––––––––– + +# 若要发送诸如“文档更新通知”或“邮箱登录”等事务性邮件, +# 需要配置一个 SMTP 服务器。 +# 可使用以下列表中的任意服务: +# https://community.nodemailer.com/2-0-0-beta/setup-smtp/well-known-services/ +# 文档:https://docs.getoutline.com/s/hosting/doc/smtp-cqCJyZGMIB +SMTP_SERVICE= +SMTP_USERNAME= +SMTP_PASSWORD= +SMTP_FROM_EMAIL= + + +# –––––––––––––––––––––––––––––––––––––– +# –––––––––– 限流器(RATE LIMITER) –––––––––––– +# –––––––––––––––––––––––––––––––––––––– + +# 是否启用限流器 +RATE_LIMITER_ENABLED=true + +# 各个接口本身有硬编码的限流规则(在启用上项后生效), +# 以下是一个全局限流器配置,作用于所有请求。 +RATE_LIMITER_REQUESTS=1000 +RATE_LIMITER_DURATION_WINDOW=60 + + +# –––––––––––––––––––––––––––––––––––––– +# ––––––––––– 集成(INTEGRATIONS) ––––––––––– +# –––––––––––––––––––––––––––––––––––––– + +# GitHub 集成,用于预览 Issue 和 Pull Request 链接 +# 文档:https://docs.getoutline.com/s/hosting/doc/github-GchT3NNxI9 GITHUB_CLIENT_ID= GITHUB_CLIENT_SECRET= +GITHUB_WEBHOOK_SECRET= GITHUB_APP_NAME= GITHUB_APP_ID= GITHUB_APP_PRIVATE_KEY= -# To configure Discord auth, you'll need to create a Discord Application at -# => https://discord.com/developers/applications/ -# -# When configuring the Client ID, add a redirect URL under "OAuth2": -# https:///auth/discord.callback -DISCORD_CLIENT_ID= -DISCORD_CLIENT_SECRET= +# Linear 集成,用于将 Issue 链接显示为富文本提及 +LINEAR_CLIENT_ID= +LINEAR_CLIENT_SECRET= -# DISCORD_SERVER_ID should be the ID of the Discord server that Outline is -# integrated with. -# Used to verify that the user is a member of the server as well as server -# metadata such as nicknames, server icon and name. -DISCORD_SERVER_ID= - -# DISCORD_SERVER_ROLES should be a comma separated list of role IDs that are -# allowed to access Outline. If this is not set, all members of the server -# will be allowed to access Outline. -# DISCORD_SERVER_ID and DISCORD_SERVER_ROLES must be set together. -DISCORD_SERVER_ROLES= - -# –––––––––––––––– OPTIONAL –––––––––––––––– - -# Base64 encoded private key and certificate for HTTPS termination. This is only -# required if you do not use an external reverse proxy. See documentation: -# https://wiki.generaloutline.com/share/1c922644-40d8-41fe-98f9-df2b67239d45 -SSL_KEY= -SSL_CERT= - -# If using a Cloudfront/Cloudflare distribution or similar it can be set below. -# This will cause paths to javascript, stylesheets, and images to be updated to -# the hostname defined in CDN_URL. In your CDN configuration the origin server -# should be set to the same as URL. -CDN_URL= - -# Auto-redirect to https in production. The default is true but you may set to -# false if you can be sure that SSL is terminated at an external loadbalancer. -FORCE_HTTPS=false - -# Have the installation check for updates by sending anonymized statistics to -# the maintainers -ENABLE_UPDATES=true - -# How many processes should be spawned. As a reasonable rule divide your servers -# available memory by 512 for a rough estimate -WEB_CONCURRENCY=1 - -# You can remove this line if your reverse proxy already logs incoming http -# requests and this ends up being duplicative -DEBUG=http - -# Configure lowest severity level for server logs. Should be one of -# error, warn, info, http, verbose, debug and silly -LOG_LEVEL=info - -# For a complete Slack integration with search and posting to channels the -# following configs are also needed, some more details -# => https://wiki.generaloutline.com/share/be25efd1-b3ef-4450-b8e5-c4a4fc11e02a -# -SLACK_VERIFICATION_TOKEN=your_token -SLACK_APP_ID=A0XXXXXXX +# 若要实现完整的 Slack 集成(搜索、向频道发送消息), +# 除 Slack 登录外,还需要以下配置: +# 文档:https://docs.getoutline.com/s/hosting/doc/slack-G2mc8DOJHk +SLACK_VERIFICATION_TOKEN= +SLACK_APP_ID= SLACK_MESSAGE_ACTIONS=true -# Optionally enable Sentry (sentry.io) to track errors and performance, -# and optionally add a Sentry proxy tunnel for bypassing ad blockers in the UI: -# https://docs.sentry.io/platforms/javascript/troubleshooting/#using-the-tunnel-option) +# Figma 集成,用于将设计文件显示为富文本预览 +FIGMA_CLIENT_ID= +FIGMA_CLIENT_SECRET= + +# Dropbox 集成。 +# 按以下说明获取 key:https://www.dropbox.com/developers/embedder#setup +# 并记得在应用设置中将你的域名加入白名单。 +DROPBOX_APP_KEY= + +# 可选:启用 Sentry(sentry.io)用于错误和性能监控 +# 文档:https://docs.getoutline.com/s/hosting/doc/sentry-jxcFttcDl5 SENTRY_DSN= SENTRY_TUNNEL= -# To support sending outgoing transactional emails such as "document updated" or -# "you've been invited" you'll need to provide authentication for an SMTP server -SMTP_HOST= -SMTP_PORT= -SMTP_USERNAME= -SMTP_PASSWORD= -SMTP_FROM_EMAIL= -SMTP_REPLY_EMAIL= -SMTP_TLS_CIPHERS= -SMTP_SECURE=true +# 启用从 Notion 工作区导入页面 +# 文档:https://docs.getoutline.com/s/hosting/doc/notion-2v6g7WY3l3 +NOTION_CLIENT_ID= +NOTION_CLIENT_SECRET= -# The default interface language. See translate.getoutline.com for a list of -# available language codes and their rough percentage translated. -DEFAULT_LANGUAGE=zh_CN +# Iframely 集成,允许在 Outline 中预览第三方内容。 +# 例如:鼠标悬停在外部链接上时显示预览。 +# 文档:https://docs.getoutline.com/s/hosting/doc/iframely-HwLF1EZ9mo +IFRAMELY_URL= +IFRAMELY_API_KEY= -# Optionally enable rate limiter at application web server -RATE_LIMITER_ENABLED=true -# Configure default throttling parameters for rate limiter -RATE_LIMITER_REQUESTS=1000 -RATE_LIMITER_DURATION_WINDOW=60 +# –––––––––––––––––––––––––––––––––––––– +# ––––––––––––– 调试(DEBUGGING) –––––––––––– +# –––––––––––––––––––––––––––––––––––––– -# Iframely API config -# https://iframe.ly/api/oembed -# https://iframe.ly/api/iframely -IFRAMELY_URL=https://iframe.ly/api/iframely -# IFRAMELY_API_KEY= +# 是否通过发送匿名统计信息来检查更新 +ENABLE_UPDATES=false + +# 启用的调试分类。 +# 如果你的代理已经记录了 HTTP 请求日志, +# 可移除默认的 "http",以避免重复日志。 +DEBUG=http + +# 服务器日志的最低级别,可选值: +# error, warn, info, http, verbose, debug, silly +LOG_LEVEL=info diff --git a/apps/outline/README.md b/apps/outline/README.md index 1527f6d18..f2d7bb071 100644 --- a/apps/outline/README.md +++ b/apps/outline/README.md @@ -77,6 +77,10 @@ redis://password@127.0.0.1:6379/1?timeout=10&pool_size=10 } ``` +## 其他配置 + +请前往安装目录找到 `emvs/outline.env` 文件,进行配置。 + --- ![Ms Studio](https://file.lifebus.top/imgs/ms_blank_001.png)