From 156063ee2bd99955aaa1dfa4a7edf19f7a81e1f4 Mon Sep 17 00:00:00 2001 From: Meng Sen Date: Wed, 30 Oct 2024 16:16:27 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8F=91=E5=B8=83=E5=BA=94=E7=94=A8=20Synapse?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Meng Sen --- .github/README.md | 1 + README.md | 1 + apps/synapse/1.118.0/data.yml | 10 ++++ apps/synapse/1.118.0/docker-compose.yml | 20 +++++++ apps/synapse/1.118.0/scripts/init.sh | 26 +++++++++ apps/synapse/1.118.0/scripts/uninstall.sh | 10 ++++ apps/synapse/1.118.0/scripts/upgrade.sh | 15 +++++ apps/synapse/README.md | 68 ++++++++++++++++++++++ apps/synapse/data.yml | 15 +++++ apps/synapse/logo.png | Bin 0 -> 15214 bytes 10 files changed, 166 insertions(+) create mode 100644 apps/synapse/1.118.0/data.yml create mode 100644 apps/synapse/1.118.0/docker-compose.yml create mode 100644 apps/synapse/1.118.0/scripts/init.sh create mode 100644 apps/synapse/1.118.0/scripts/uninstall.sh create mode 100644 apps/synapse/1.118.0/scripts/upgrade.sh create mode 100644 apps/synapse/README.md create mode 100644 apps/synapse/data.yml create mode 100644 apps/synapse/logo.png diff --git a/.github/README.md b/.github/README.md index 0564e9823..9b3ae8531 100644 --- a/.github/README.md +++ b/.github/README.md @@ -153,6 +153,7 @@ | 🟢 | | Stream-Rec | https://github.com/hua0512/stream-rec/ | Stream-rec是一个用于各种流媒体服务的自动流媒体录制工具 | | | 🟢 | | Stream-Rec Web版 | https://github.com/hua0512/stream-rec/ | 【前端版】Stream-rec是一个用于各种流媒体服务的自动流媒体录制工具 | | | 🟢 | | Stream-Rec 服务版 | https://github.com/hua0512/stream-rec/ | 【服务版】Stream-rec是一个用于各种流媒体服务的自动流媒体录制工具 | | +| 🟢 | | Synapse | https://matrix.org/ | 用于安全、分散通信的开放网络 | | | 🟢 | | 唐僧叨叨 | https://tsdaodao.com/ | 让企业轻松拥有自己的即时通讯 | | | 🟢 | | Teemii | https://www.teemii.io/ | 漫画阅读器和管理器 | | | 🟢 | | Telegram Bot Api | https://telegram.org/ | 自建 Telegram Bot API 服务器 | | diff --git a/README.md b/README.md index f94e58a83..ae16965af 100644 --- a/README.md +++ b/README.md @@ -136,6 +136,7 @@ | 🟢 | | Stream-Rec | https://github.com/hua0512/stream-rec/ | Stream-rec是一个用于各种流媒体服务的自动流媒体录制工具 | | | 🟢 | | Stream-Rec Web版 | https://github.com/hua0512/stream-rec/ | 【前端版】Stream-rec是一个用于各种流媒体服务的自动流媒体录制工具 | | | 🟢 | | Stream-Rec 服务版 | https://github.com/hua0512/stream-rec/ | 【服务版】Stream-rec是一个用于各种流媒体服务的自动流媒体录制工具 | | +| 🟢 | | Synapse | https://matrix.org/ | 用于安全、分散通信的开放网络 | | | 🟢 | | 唐僧叨叨 | https://tsdaodao.com/ | 让企业轻松拥有自己的即时通讯 | | | 🟢 | | Teemii | https://www.teemii.io/ | 漫画阅读器和管理器 | | | 🟢 | | Telegram Bot Api | https://telegram.org/ | 自建 Telegram Bot API 服务器 | | diff --git a/apps/synapse/1.118.0/data.yml b/apps/synapse/1.118.0/data.yml new file mode 100644 index 000000000..02b600d34 --- /dev/null +++ b/apps/synapse/1.118.0/data.yml @@ -0,0 +1,10 @@ +additionalProperties: + formFields: + - default: 8008 + edit: true + envKey: PANEL_APP_PORT_HTTP + labelZh: 访问端口 + labelEn: Port + required: true + rule: paramPort + type: number diff --git a/apps/synapse/1.118.0/docker-compose.yml b/apps/synapse/1.118.0/docker-compose.yml new file mode 100644 index 000000000..ccb44cc22 --- /dev/null +++ b/apps/synapse/1.118.0/docker-compose.yml @@ -0,0 +1,20 @@ +networks: + 1panel-network: + external: true + +services: + synapse: + image: matrixdotorg/synapse:v1.118.0 + container_name: ${CONTAINER_NAME} + labels: + createdBy: "Apps" + restart: always + networks: + - 1panel-network + ports: + - ${PANEL_APP_PORT_HTTP}:8008 + env_file: + - /etc/1panel/envs/global.env + - ${ENV_FILE:-/etc/1panel/envs/default.env} + volumes: + - ./data:/data diff --git a/apps/synapse/1.118.0/scripts/init.sh b/apps/synapse/1.118.0/scripts/init.sh new file mode 100644 index 000000000..541fc8375 --- /dev/null +++ b/apps/synapse/1.118.0/scripts/init.sh @@ -0,0 +1,26 @@ +#!/bin/bash + +if [ -f .env ]; then + source .env + + # setup-1 add default values + CURRENT_DIR=$(pwd) + sed -i '/^ENV_FILE=/d' .env + echo "ENV_FILE=${CURRENT_DIR}/.env" >> .env + + # setup-2 generate key + mkdir -p "${CURRENT_DIR}/data" + docker run -it --rm \ + --mount type=bind,src="${CURRENT_DIR}/data",dst=/data \ + -e SYNAPSE_SERVER_NAME="$DOMAIN_NAME" \ + -e SYNAPSE_REPORT_STATS=no \ + matrixdotorg/synapse:latest generate + + # setup-3 check permission + chmod -R 777 "${CURRENT_DIR}/data" + + echo "Check Finish." + +else + echo "Error: .env file not found." +fi diff --git a/apps/synapse/1.118.0/scripts/uninstall.sh b/apps/synapse/1.118.0/scripts/uninstall.sh new file mode 100644 index 000000000..c86c4fbca --- /dev/null +++ b/apps/synapse/1.118.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/synapse/1.118.0/scripts/upgrade.sh b/apps/synapse/1.118.0/scripts/upgrade.sh new file mode 100644 index 000000000..77b849120 --- /dev/null +++ b/apps/synapse/1.118.0/scripts/upgrade.sh @@ -0,0 +1,15 @@ +#!/bin/bash + +if [ -f .env ]; then + source .env + + # setup-1 add default values + CURRENT_DIR=$(pwd) + sed -i '/^ENV_FILE=/d' .env + echo "ENV_FILE=${CURRENT_DIR}/.env" >> .env + + echo "Check Finish." + +else + echo "Error: .env file not found." +fi diff --git a/apps/synapse/README.md b/apps/synapse/README.md new file mode 100644 index 000000000..c6873653c --- /dev/null +++ b/apps/synapse/README.md @@ -0,0 +1,68 @@ +# Synapse + +Synapse 是一个开源的 Matrix 家庭服务器实现,由 Element 开发和维护。Matrix 是安全且可互操作实时通信的开放标准。 + +![Synapse](https://file.lifebus.top/imgs/synapse_cover.png) + +![](https://img.shields.io/badge/%E6%96%B0%E7%96%86%E8%90%8C%E6%A3%AE%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91%E5%B7%A5%E4%BD%9C%E5%AE%A4-%E6%8F%90%E4%BE%9B%E6%8A%80%E6%9C%AF%E6%94%AF%E6%8C%81-blue) + +## 安装说明 + +### 快捷命令 + +#### 查看帮助 + +```sh +register_new_matrix_user http://localhost:8008 -c /data/homeserver.yaml --help +``` + +#### 生成管理员用户 + +> 请替换以下参数 +> +> adminName: 管理员用户名 +> +> password: 管理员密码 + +```sh +register_new_matrix_user http://localhost:8008 -c /data/homeserver.yaml -u adminName -p password -a +``` + +#### 生成普通用户 + +> 请替换以下参数 +> +> userName: 用户名 +> +> password: 密码 + +```sh +register_new_matrix_user http://localhost:8008 -c /data/homeserver.yaml -u userName -p password +``` + +## 反向代理 + +> Nginx + +```nginx + location ~ ^(/_matrix|/_synapse/client) { + # note: do not add a path (even a single /) after the port in `proxy_pass`, + # otherwise nginx will canonicalise the URI and cause signature verification + # errors. + proxy_pass http://localhost:8008; + proxy_set_header X-Forwarded-For $remote_addr; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header Host $host; + + # Nginx by default only allows file uploads up to 1M in size + # Increase client_max_body_size to match max_upload_size defined in homeserver.yaml + client_max_body_size 50M; + + # Synapse responses may be chunked, which is an HTTP/1.1 feature. + proxy_http_version 1.1; + } +``` + +--- + +![Ms Studio](https://file.lifebus.top/imgs/ms_blank_001.png) diff --git a/apps/synapse/data.yml b/apps/synapse/data.yml new file mode 100644 index 000000000..33254f557 --- /dev/null +++ b/apps/synapse/data.yml @@ -0,0 +1,15 @@ +additionalProperties: + key: synapse + name: Synapse + tags: + - WebSite + - Middleware + - Local + shortDescZh: 用于安全、分散通信的开放网络 + shortDescEn: An open network for secure, decentralised communication + type: website + crossVersionUpdate: true + limit: 0 + website: https://matrix.org/ + github: https://github.com/matrix-org/synapse/ + document: https://matrix.org/ diff --git a/apps/synapse/logo.png b/apps/synapse/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..3cebddfa2aca27c9df9bfc7faa32bdd95848aa54 GIT binary patch literal 15214 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 U+xUJJ=7^g-Uo+s5|5dC15A