From 49cf8f8d76f9be2fc2b7c46b37774bbe695a9dfe Mon Sep 17 00:00:00 2001 From: codename-test Date: Mon, 27 Jul 2026 22:47:31 +0800 Subject: [PATCH 01/10] =?UTF-8?q?test:=20=E6=B5=8B=E8=AF=95=E5=AE=A1?= =?UTF-8?q?=E6=A0=B8=E8=A7=84=E5=88=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index f3ba311..59d75f0 100644 --- a/README.md +++ b/README.md @@ -148,3 +148,4 @@ def parse(raw_body: bytes, headers: dict, query_params: dict) -> dict: ## License MIT +# 测试审核规则 From 23428cef5d2115785bbc9e9a777aa484def98a7d Mon Sep 17 00:00:00 2001 From: codename-test Date: Mon, 27 Jul 2026 22:49:36 +0800 Subject: [PATCH 02/10] =?UTF-8?q?test:=20=E6=B5=8B=E8=AF=95=E5=AE=A1?= =?UTF-8?q?=E6=A0=B8=E8=A7=84=E5=88=99=202?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 59d75f0..65f4658 100644 --- a/README.md +++ b/README.md @@ -149,3 +149,4 @@ def parse(raw_body: bytes, headers: dict, query_params: dict) -> dict: MIT # 测试审核规则 +# 测试审核规则 2 From 33e51bf9e8428eb5222882120e365521b4c86efb Mon Sep 17 00:00:00 2001 From: codename-test Date: Mon, 27 Jul 2026 22:54:03 +0800 Subject: [PATCH 03/10] =?UTF-8?q?test:=20=E6=B5=8B=E8=AF=95=E5=AE=A1?= =?UTF-8?q?=E6=A0=B8=E8=A7=84=E5=88=99=203?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 65f4658..f7880c6 100644 --- a/README.md +++ b/README.md @@ -150,3 +150,4 @@ def parse(raw_body: bytes, headers: dict, query_params: dict) -> dict: MIT # 测试审核规则 # 测试审核规则 2 +# 测试审核规则 3 From 740bd95c9bd49b1886410899ed2a04cbd275504f Mon Sep 17 00:00:00 2001 From: codename-test Date: Mon, 27 Jul 2026 22:54:47 +0800 Subject: [PATCH 04/10] =?UTF-8?q?test:=20=E6=B5=8B=E8=AF=95=E5=AE=A1?= =?UTF-8?q?=E6=A0=B8=E8=A7=84=E5=88=99=204?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index f7880c6..d32385b 100644 --- a/README.md +++ b/README.md @@ -151,3 +151,4 @@ MIT # 测试审核规则 # 测试审核规则 2 # 测试审核规则 3 +# 测试审核规则 4 From 57d71899d56d6f77fa9df131445546991d81e37b Mon Sep 17 00:00:00 2001 From: codename-test Date: Mon, 27 Jul 2026 22:57:11 +0800 Subject: [PATCH 05/10] =?UTF-8?q?test:=20=E6=B5=8B=E8=AF=95=E5=AE=A1?= =?UTF-8?q?=E6=A0=B8=E8=A7=84=E5=88=99=205?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index d32385b..b7c1654 100644 --- a/README.md +++ b/README.md @@ -152,3 +152,4 @@ MIT # 测试审核规则 2 # 测试审核规则 3 # 测试审核规则 4 +# 测试审核规则 5 From a9fff22d2e110555321db3647013e415dabedeb6 Mon Sep 17 00:00:00 2001 From: codename-test Date: Tue, 28 Jul 2026 09:31:32 +0800 Subject: [PATCH 06/10] =?UTF-8?q?docs:=20=E6=B7=BB=E5=8A=A0=20README=20?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E4=B9=8B=E9=97=B4=E7=9A=84=E4=BA=92=E7=9B=B8?= =?UTF-8?q?=E8=B7=B3=E8=BD=AC=E9=93=BE=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.en.md | 2 +- README.md | 2 +- deploy/README.en.md | 2 ++ deploy/README.md | 2 ++ 4 files changed, 6 insertions(+), 2 deletions(-) diff --git a/README.en.md b/README.en.md index 4ae36a9..a4c7682 100644 --- a/README.en.md +++ b/README.en.md @@ -89,7 +89,7 @@ chmod +x init.sh Supports 5 deployment modes: default (quick start), t1-host (host network), t2-bridge (bridge network), t3-nginx (Nginx + manual cert), t4-certbot (Nginx + Let's Encrypt auto cert). -> More deployment options are in the `deploy/` directory with `README.en.md` (English) and `README.md` (Chinese). +> More deployment options are in the [deploy/README.en.md](deploy/README.en.md) (English) and [deploy/README.md](deploy/README.md) (Chinese). After startup: admin UI at `https://:5001` (self-signed cert, accept the browser warning); webhook receivers and health check at `http://:5000`. diff --git a/README.md b/README.md index b7c1654..83ac446 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ chmod +x init.sh 支持 5 种部署模式:default(快速起步)、t1-host(host 网络)、t2-bridge(bridge 网络)、t3-nginx(Nginx + 手动证书)、t4-certbot(Nginx + Let's Encrypt 全自动证书)。 -> 更多部署形态说明见 `deploy/` 目录下的 `README.md`(中文)和 `README.en.md`(英文)。 +> 更多部署形态说明见 [deploy/README.md](deploy/README.md)(中文)和 [deploy/README.en.md](deploy/README.en.md)(英文)。 启动后:管理页面 `https://<主机IP>:5001`(自签名证书,浏览器需放行);Webhook 接收与健康检查走 `http://<主机IP>:5000`。 diff --git a/deploy/README.en.md b/deploy/README.en.md index 222e1c6..f74db71 100644 --- a/deploy/README.en.md +++ b/deploy/README.en.md @@ -1,5 +1,7 @@ # EGo Deployment Configurations +> Back to project home: [README.en.md](../README.en.md) (English) | [README.md](../README.md) (Chinese) + All Docker Compose configs are in this directory. `default/` is the recommended quick start; `t1`–`t4` correspond to the four deployment tiers in `doc/architecture.md`. Pick one, `cd` into it, and run. | Config | Directory | Network | Admin UI | Certificate | Use Case | diff --git a/deploy/README.md b/deploy/README.md index 5d6716b..a950355 100644 --- a/deploy/README.md +++ b/deploy/README.md @@ -1,5 +1,7 @@ # EGo 部署配置 +> 返回项目主页:[README.md](../README.md)(中文)| [README.en.md](../README.en.md)(英文) + 所有 Docker Compose 配置统一放在本目录。`default/` 是推荐快速起步;`t1`–`t4` 对应 `doc/architecture.md` 部署架构的四个层级。选一套、进入对应目录即可使用。 | 配置 | 目录 | 网络 | 管理页面 | 证书 | 适用场景 | From d7996de2f8ee69e5d8c61fc6b52dc047a062e003 Mon Sep 17 00:00:00 2001 From: codename-test Date: Tue, 28 Jul 2026 09:35:12 +0800 Subject: [PATCH 07/10] =?UTF-8?q?docs:=20=E6=B7=BB=E5=8A=A0=E4=B8=AD?= =?UTF-8?q?=E8=8B=B1=E6=96=87=20README=20=E4=BA=92=E7=9B=B8=E8=B7=B3?= =?UTF-8?q?=E8=BD=AC=E9=93=BE=E6=8E=A5=EF=BC=8C=E6=B8=85=E7=90=86=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.en.md | 2 ++ README.md | 7 ++----- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/README.en.md b/README.en.md index a4c7682..07b6c75 100644 --- a/README.en.md +++ b/README.en.md @@ -1,6 +1,8 @@ # EverywhereYouGo (EGo) v1.2.3 +[中文](README.md) | English + > Universal Message Forwarding Platform — Data → Parse → Route → Push EGo receives arbitrary HTTP requests, extracts structured fields through parsers, matches routes by conditions, and pushes to multiple channels. diff --git a/README.md b/README.md index 83ac446..b1e07e7 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # EverywhereYouGo (EGo) v1.2.3 +[English](README.en.md) | 中文 + > 通用信息转发平台 — 数据 → 解析 → 路由 → 推送 接收任意 HTTP 请求,经解析器提取结构化字段,按条件路由到多个推送渠道。 @@ -148,8 +150,3 @@ def parse(raw_body: bytes, headers: dict, query_params: dict) -> dict: ## License MIT -# 测试审核规则 -# 测试审核规则 2 -# 测试审核规则 3 -# 测试审核规则 4 -# 测试审核规则 5 From a923e9bdebbde3f12fcb81af421b62b9c2b74954 Mon Sep 17 00:00:00 2001 From: codename-test Date: Tue, 28 Jul 2026 09:44:26 +0800 Subject: [PATCH 08/10] =?UTF-8?q?docs:=20=E4=BC=98=E5=8C=96=20README=20?= =?UTF-8?q?=E8=B7=B3=E8=BD=AC=E9=93=BE=E6=8E=A5=EF=BC=8C=E5=90=8C=E8=AF=AD?= =?UTF-8?q?=E7=A7=8D=E8=B7=B3=E8=BD=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.en.md | 2 +- README.md | 2 +- deploy/README.en.md | 4 +++- deploy/README.md | 4 +++- 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/README.en.md b/README.en.md index 07b6c75..319de0b 100644 --- a/README.en.md +++ b/README.en.md @@ -91,7 +91,7 @@ chmod +x init.sh Supports 5 deployment modes: default (quick start), t1-host (host network), t2-bridge (bridge network), t3-nginx (Nginx + manual cert), t4-certbot (Nginx + Let's Encrypt auto cert). -> More deployment options are in the [deploy/README.en.md](deploy/README.en.md) (English) and [deploy/README.md](deploy/README.md) (Chinese). +> More deployment options are in the [deploy/README.en.md](deploy/README.en.md). After startup: admin UI at `https://:5001` (self-signed cert, accept the browser warning); webhook receivers and health check at `http://:5000`. diff --git a/README.md b/README.md index b1e07e7..1d9d45d 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ chmod +x init.sh 支持 5 种部署模式:default(快速起步)、t1-host(host 网络)、t2-bridge(bridge 网络)、t3-nginx(Nginx + 手动证书)、t4-certbot(Nginx + Let's Encrypt 全自动证书)。 -> 更多部署形态说明见 [deploy/README.md](deploy/README.md)(中文)和 [deploy/README.en.md](deploy/README.en.md)(英文)。 +> 更多部署形态说明见 [deploy/README.md](deploy/README.md)。 启动后:管理页面 `https://<主机IP>:5001`(自签名证书,浏览器需放行);Webhook 接收与健康检查走 `http://<主机IP>:5000`。 diff --git a/deploy/README.en.md b/deploy/README.en.md index f74db71..65c9413 100644 --- a/deploy/README.en.md +++ b/deploy/README.en.md @@ -1,6 +1,8 @@ # EGo Deployment Configurations -> Back to project home: [README.en.md](../README.en.md) (English) | [README.md](../README.md) (Chinese) +[中文](README.md) | English + +> Back to project home: [README.en.md](../README.en.md) All Docker Compose configs are in this directory. `default/` is the recommended quick start; `t1`–`t4` correspond to the four deployment tiers in `doc/architecture.md`. Pick one, `cd` into it, and run. diff --git a/deploy/README.md b/deploy/README.md index a950355..95103a3 100644 --- a/deploy/README.md +++ b/deploy/README.md @@ -1,6 +1,8 @@ # EGo 部署配置 -> 返回项目主页:[README.md](../README.md)(中文)| [README.en.md](../README.en.md)(英文) +[English](README.en.md) | 中文 + +> 返回项目主页:[README.md](../README.md) 所有 Docker Compose 配置统一放在本目录。`default/` 是推荐快速起步;`t1`–`t4` 对应 `doc/architecture.md` 部署架构的四个层级。选一套、进入对应目录即可使用。 From 309d2edc47fcd01e3deab65d2794671f0c388e09 Mon Sep 17 00:00:00 2001 From: codename-test Date: Tue, 28 Jul 2026 09:49:32 +0800 Subject: [PATCH 09/10] =?UTF-8?q?docs:=20=E8=A1=A5=E5=85=A8=E8=8B=B1?= =?UTF-8?q?=E6=96=87=E7=89=88=20README=EF=BC=8C=E4=B8=8E=E4=B8=AD=E6=96=87?= =?UTF-8?q?=E7=89=88=E5=86=85=E5=AE=B9=E4=B8=80=E8=87=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.en.md | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/README.en.md b/README.en.md index 319de0b..d6a0f41 100644 --- a/README.en.md +++ b/README.en.md @@ -30,6 +30,20 @@ HTTP POST → Source → Parser → Route Match → Template Render → Push Cha | **Template** | Simple / Jinja2 rendering for title and content | | **Channel** | WeChat Work, DingTalk, Feishu, Telegram, Bark | +## Authentication + +Set `EGO_AUTH_TOKEN` environment variable to enable access control: + +```bash +EGO_AUTH_TOKEN=your-secret-token python3 main.py +``` + +- Web UI requires login via token input page +- API calls require `Authorization: Bearer your-secret-token` header +- Health check `/api/health` does not require authentication + +Optionally set `EGO_SECRET_KEY` to customize Flask session key. + ## Config Persistent configuration is stored as JSON files in `config/`: @@ -76,6 +90,32 @@ Supports `and`, `or`, and parenthesized expressions: | `event == 'library.new' or event == 'test'` | New items or test messages | | `media_type in ('Movie', 'Series')` | Movies or series | +## Features + +### Do Not Disturb (DND) +Set a DND time window, messages enter a queue and are automatically flushed when the period ends. Urgent routes are not affected by DND. + +### Message Deduplication +Channel bindings can configure `dedup_key_expr` and `dedup_window` (default 3600 seconds). Messages with the same dedup key are not sent repeatedly within the window. + +### Parallel Push +When multiple channels match, messages are sent in parallel via thread pool. Total latency depends on the slowest channel. + +### Sample Data & Online Debugging +Each source automatically saves the last 20 request samples. You can select samples in the WebUI for test parsing and pushing. + +### Message Resend +Failed messages support original resend (using parsed msg_json) or re-parse and resend. + +### Import & Export +- **Backup**: Download ZIP package (`config/*.json` + `parsers/*.py`) +- **Restore**: Upload ZIP package, config is automatically reloaded +- **JSON Import**: Supports dry_run preview, insert/overwrite modes, and dependency check + +## Internationalization + +Built-in Chinese and English bilingual support. Switch languages anytime via the button in the top-right corner of the navigation bar. + ## Deploy ### Docker @@ -108,6 +148,7 @@ After startup: admin UI at `https://:5001` (self-signed cert, accept th | `DB_PATH` | `ego.db` | Database path | | `LOG_LEVEL` | `INFO` | Log level | | `EGO_AUTH_TOKEN` | `""` | Bearer token for API auth (empty = no auth) | +| `EGO_SECRET_KEY` | *(auto)* | Flask session key | ## Channel Types From 02c65eabfedfc4cc23d2b9b0b89677ae05b9f477 Mon Sep 17 00:00:00 2001 From: codename-test Date: Tue, 28 Jul 2026 09:51:46 +0800 Subject: [PATCH 10/10] =?UTF-8?q?docs:=20=E5=AE=8C=E5=85=A8=E9=87=8D?= =?UTF-8?q?=E5=86=99=E8=8B=B1=E6=96=87=E7=89=88=20README=EF=BC=8C=E4=B8=8E?= =?UTF-8?q?=E4=B8=AD=E6=96=87=E7=89=88=E7=BB=93=E6=9E=84=E4=B8=80=E8=87=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.en.md | 123 +++++++++++++++++++++------------------------------ 1 file changed, 51 insertions(+), 72 deletions(-) diff --git a/README.en.md b/README.en.md index d6a0f41..787d0fe 100644 --- a/README.en.md +++ b/README.en.md @@ -1,33 +1,40 @@ - # EverywhereYouGo (EGo) v1.2.3 [中文](README.md) | English > Universal Message Forwarding Platform — Data → Parse → Route → Push -EGo receives arbitrary HTTP requests, extracts structured fields through parsers, matches routes by conditions, and pushes to multiple channels. +Receives any HTTP request, extracts structured fields through parsers, routes by conditions to multiple push channels. + +## Docker Deployment -## Quick Start +**One-click Deployment (Recommended):** ```bash -pip install -r requirements.txt -python3 main.py +curl -O https://raw.githubusercontent.com/codename-test/EverywhereYouGo/main/deploy/init.sh +chmod +x init.sh +./init.sh +# Follow prompts to select deployment mode ``` -Open `https://localhost:5001` for the admin UI (self-signed cert; accept the browser warning). Webhook receivers and the health check run over plain HTTP on `http://localhost:5000`. +Supports 5 deployment modes: default (quick start), t1-host (host network), t2-bridge (bridge network), t3-nginx (Nginx + manual certificate), t4-certbot (Nginx + Let's Encrypt auto certificate). + +> More deployment options in [deploy/README.en.md](deploy/README.en.md). + +After startup: Admin UI at `https://:5001` (self-signed certificate, browser needs to allow); Webhook receiver and health check on `http://:5000`. ## Architecture ``` -HTTP POST → Source → Parser → Route Match → Template Render → Push Channel +HTTP POST → Data Source → Parser → Route Match → Template Render → Push Channel ``` | Component | Description | -|-----------|-------------| -| **Source** | Listens on a port, receives HTTP POST | +|------|------| +| **Data Source** | Listens on port to receive HTTP POST | | **Parser** | Python script, extracts fields and defines variable names | -| **Route** | Condition expression matching channel-template pairs | -| **Template** | Simple / Jinja2 rendering for title and content | +| **Route** | Condition expression matches channel-template pairs | +| **Template** | Simple / Jinja2 renders title and content | | **Channel** | WeChat Work, DingTalk, Feishu, Telegram, Bark | ## Authentication @@ -38,29 +45,29 @@ Set `EGO_AUTH_TOKEN` environment variable to enable access control: EGO_AUTH_TOKEN=your-secret-token python3 main.py ``` -- Web UI requires login via token input page +- Web pages require login via token input page - API calls require `Authorization: Bearer your-secret-token` header - Health check `/api/health` does not require authentication Optionally set `EGO_SECRET_KEY` to customize Flask session key. -## Config +## Configuration Files -Persistent configuration is stored as JSON files in `config/`: +Configuration is persisted as JSON files in `config/` directory: | File | Content | -|------|---------| +|------|------| | `config/parsers.json` | Parser metadata | -| `config/sources.json` | Source definitions | -| `config/channels.json` | Push channel configs | +| `config/sources.json` | Data source definitions | +| `config/channels.json` | Push channel configurations | | `config/templates.json` | Push templates | | `config/bindings.json` | Channel bindings (with condition expressions) | -Edit JSON directly and restart, or manage via WebUI. System settings (DND, log level) and runtime data (message logs) are stored in SQLite (`ego.db`). +Can directly edit JSON and restart to take effect, or manage via WebUI. System settings (DND, log level, etc.) and runtime data (message logs) are stored in SQLite (`ego.db`). -## Parser +## Parsers -Place `.py` files in `parsers/`, define a `parse()` function: +Place `.py` files in `parsers/` directory, define a `parse()` function: ```python def parse(raw_body: bytes, headers: dict, query_params: dict) -> dict: @@ -69,91 +76,55 @@ def parse(raw_body: bytes, headers: dict, query_params: dict) -> dict: name = data.get("Item", {}).get("Name", "") return { "title": name, - "content": "- **event**: " + event + "\n- **name**: " + name, "event": event, "name": name, } ``` -Fields other than `title`/`content` are used for: +Fields in returned dict except `title` are also used for: - **Route condition matching**: `event == 'library.new' and media_type == 'Movie'` - **Template variable reference**: `{name}` / `{{ msg.name }}` ## Route Conditions -Supports `and`, `or`, and parenthesized expressions: +Supports `and`, `or`, parentheses grouping: | Example | Description | -|---------|-------------| +|------|------| | `event == 'library.new'` | New items only | | `event == 'library.new' and media_type == 'Movie'` | New movies only | | `event == 'library.new' or event == 'test'` | New items or test messages | -| `media_type in ('Movie', 'Series')` | Movies or series | ## Features ### Do Not Disturb (DND) -Set a DND time window, messages enter a queue and are automatically flushed when the period ends. Urgent routes are not affected by DND. +Set DND time period, messages enter queue and wait, automatically flush when period ends. Urgent routes are not affected by DND. ### Message Deduplication -Channel bindings can configure `dedup_key_expr` and `dedup_window` (default 3600 seconds). Messages with the same dedup key are not sent repeatedly within the window. +Channel bindings can configure `dedup_key_expr` and `dedup_window` (default 3600 seconds). Same dedup key will not be sent repeatedly within the window. ### Parallel Push -When multiple channels match, messages are sent in parallel via thread pool. Total latency depends on the slowest channel. +When multiple channels match, thread pool sends in parallel, total latency depends on the slowest single channel. ### Sample Data & Online Debugging -Each source automatically saves the last 20 request samples. You can select samples in the WebUI for test parsing and pushing. +Each data source automatically saves the last 20 request samples, can select samples in WebUI for test parsing and pushing. ### Message Resend Failed messages support original resend (using parsed msg_json) or re-parse and resend. ### Import & Export - **Backup**: Download ZIP package (`config/*.json` + `parsers/*.py`) -- **Restore**: Upload ZIP package, config is automatically reloaded -- **JSON Import**: Supports dry_run preview, insert/overwrite modes, and dependency check +- **Restore**: Upload ZIP package, automatically takes effect after overwriting configuration +- **JSON Import**: Supports dry_run preview, insert/overwrite two modes, dependency check ## Internationalization -Built-in Chinese and English bilingual support. Switch languages anytime via the button in the top-right corner of the navigation bar. - -## Deploy - -### Docker - -**One-click deployment (recommended):** - -```bash -curl -O https://raw.githubusercontent.com/codename-test/EverywhereYouGo/main/deploy/init.sh -chmod +x init.sh -./init.sh -# Follow prompts to select deployment mode -``` - -Supports 5 deployment modes: default (quick start), t1-host (host network), t2-bridge (bridge network), t3-nginx (Nginx + manual cert), t4-certbot (Nginx + Let's Encrypt auto cert). - -> More deployment options are in the [deploy/README.en.md](deploy/README.en.md). - -After startup: admin UI at `https://:5001` (self-signed cert, accept the browser warning); webhook receivers and health check at `http://:5000`. - -### Env Variables - -| Variable | Default | Description | -|----------|---------|-------------| -| `WEB_PORT` | `5000` | HTTP port (webhook receivers / health check) | -| `WEB_SSL_PORT` | `5001` | HTTPS port (admin UI; disabled if no cert) | -| `EGO_SSL_ENABLED` | `1` | Set to `0` to fully disable built-in HTTPS (HTTP only, no redirect, no cert generation) | -| `EGO_SSL_DIR` | `./certs` | SSL certificate directory for `ego.crt` and `ego.key` | -| `EGO_SSL_CERT` | `./certs/ego.crt` | Certificate file path (overrides `EGO_SSL_DIR`) | -| `EGO_SSL_KEY` | `./certs/ego.key` | Private key file path (overrides `EGO_SSL_DIR`) | -| `DB_PATH` | `ego.db` | Database path | -| `LOG_LEVEL` | `INFO` | Log level | -| `EGO_AUTH_TOKEN` | `""` | Bearer token for API auth (empty = no auth) | -| `EGO_SECRET_KEY` | *(auto)* | Flask session key | +Built-in Chinese and English bilingual support, switch languages anytime via language switch button in top-right corner of navigation bar. ## Channel Types | Channel | Method | Type Identifier | -|---------|--------|-----------------| +|------|------|---------| | WeChat Work Bot | Webhook | `wechat_work_bot` | | WeChat Work API | App Message | `wechat_work_api` | | DingTalk | Webhook | `dingtalk` | @@ -161,12 +132,20 @@ After startup: admin UI at `https://:5001` (self-signed cert, accept th | Telegram | Bot API | `telegram_bot` | | Bark | API | `bark` | -## Backup & Restore - -Available in System Settings: +## Environment Variables -- **Backup**: Download ZIP containing `config/*.json` + `parsers/*.py` -- **Restore**: Upload ZIP, config is automatically reloaded +| Variable | Default | Description | +|------|--------|------| +| `WEB_PORT` | `5000` | HTTP port (Webhook receiver / health check) | +| `WEB_SSL_PORT` | `5001` | HTTPS port (Admin page, not enabled when certificate is missing) | +| `EGO_SSL_ENABLED` | `1` | Set to `0` to completely disable built-in HTTPS (HTTP only, no redirect, no certificate generation) | +| `EGO_SSL_DIR` | `./certs` | SSL certificate directory, where `ego.crt` and `ego.key` are stored | +| `EGO_SSL_CERT` | `./certs/ego.crt` | Certificate file path (overrides `EGO_SSL_DIR`) | +| `EGO_SSL_KEY` | `./certs/ego.key` | Private key file path (overrides `EGO_SSL_DIR`) | +| `DB_PATH` | `ego.db` | Database path | +| `LOG_LEVEL` | `INFO` | Log level | +| `EGO_AUTH_TOKEN` | *(empty)* | Access control Token | +| `EGO_SECRET_KEY` | *(auto)* | Flask session key | ## License