From 49ac1f929f8ed156be01a065cda1b27cffa588f0 Mon Sep 17 00:00:00 2001 From: ms Date: Mon, 29 Sep 2025 00:26:43 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8F=91=E5=B8=83=E5=BA=94=E7=94=A8=20Telegram?= =?UTF-8?q?=20Search?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/README.md | 1 + README.md | 2 + apps/telegram-search/1.1.9/config/config.yaml | 34 ++++++++++++ apps/telegram-search/1.1.9/config/init.sql | 4 ++ apps/telegram-search/1.1.9/data.yml | 52 ++++++++++++++++++ apps/telegram-search/1.1.9/docker-compose.yml | 48 ++++++++++++++++ apps/telegram-search/1.1.9/envs/default.env | 2 + apps/telegram-search/1.1.9/envs/global.env | 2 + apps/telegram-search/1.1.9/scripts/init.sh | 17 ++++++ .../1.1.9/scripts/uninstall.sh | 10 ++++ apps/telegram-search/1.1.9/scripts/upgrade.sh | 17 ++++++ apps/telegram-search/README.md | 15 +++++ apps/telegram-search/data.yml | 14 +++++ apps/telegram-search/logo.png | Bin 0 -> 11652 bytes 14 files changed, 218 insertions(+) create mode 100644 apps/telegram-search/1.1.9/config/config.yaml create mode 100644 apps/telegram-search/1.1.9/config/init.sql create mode 100644 apps/telegram-search/1.1.9/data.yml create mode 100644 apps/telegram-search/1.1.9/docker-compose.yml create mode 100644 apps/telegram-search/1.1.9/envs/default.env create mode 100644 apps/telegram-search/1.1.9/envs/global.env create mode 100644 apps/telegram-search/1.1.9/scripts/init.sh create mode 100644 apps/telegram-search/1.1.9/scripts/uninstall.sh create mode 100644 apps/telegram-search/1.1.9/scripts/upgrade.sh create mode 100644 apps/telegram-search/README.md create mode 100644 apps/telegram-search/data.yml create mode 100644 apps/telegram-search/logo.png diff --git a/.github/README.md b/.github/README.md index 8f55684b6..d0895f4e4 100644 --- a/.github/README.md +++ b/.github/README.md @@ -183,6 +183,7 @@ | 🟢 | | 唐僧叨叨 | https://tsdaodao.com/ | 让企业轻松拥有自己的即时通讯 | | | 🟢 | | Teemii | https://www.teemii.io/ | 漫画阅读器和管理器 | | | 🟢 | | Telegram Bot Api | https://telegram.org/ | 自建 Telegram Bot API 服务器 | | +| 🟢 | | Telegram Search | https://search.lingogram.app/ | Telegram 聊天搜索工具 | | | 🟢 | | Tissue | https://github.com/chris-2s/tissue/ | 老师教材刮削工具,提供海报下载、元数据匹配等功能 | | | 🟢 | | TOPIAM | https://topiam.cn/ | IAM/IDaaS 身份管理平台 | | | 🟢 | | Traccar 轨迹 | https://www.traccar.org/ | 现代 GPS 追踪系统 | | diff --git a/README.md b/README.md index 6554c4b33..16ffda421 100644 --- a/README.md +++ b/README.md @@ -98,6 +98,7 @@ | 🟢 | | Komga | https://komga.org/ | 漫画、漫画、蓝光光盘、杂志和电子书的媒体服务器 | | | 🟢 | | Kotatsu | https://kotatsu.app/ | 口袋里的漫画 | | | 🟢 | | KSpeeder | https://kspeeder.istoreos.com/ | Docker镜像加速专家 | | +| 🟢 | | Kvrocks | https://kvrocks.apache.org/ | 分布式键值 NoSQL 数据库 | | | 🟢 | | LibreTV | https://libretv.is-an.org/ | 免费在线视频搜索与观看平台 | | | 🟢 | | 问卷星 | https://www.limesurvey.org/ | 在线问卷调查程序 | | | 🟢 | | LinkDing | https://github.com/sissbruecker/linkding/ | 自托管书签管理器 | | @@ -177,6 +178,7 @@ | 🟢 | | 唐僧叨叨 | https://tsdaodao.com/ | 让企业轻松拥有自己的即时通讯 | | | 🟢 | | Teemii | https://www.teemii.io/ | 漫画阅读器和管理器 | | | 🟢 | | Telegram Bot Api | https://telegram.org/ | 自建 Telegram Bot API 服务器 | | +| 🟢 | | Telegram Search | https://search.lingogram.app/ | Telegram 聊天搜索工具 | | | 🟢 | | Tissue | https://github.com/chris-2s/tissue/ | 老师教材刮削工具,提供海报下载、元数据匹配等功能 | | | 🟢 | | TOPIAM | https://topiam.cn/ | IAM/IDaaS 身份管理平台 | | | 🟢 | | Traccar 轨迹 | https://www.traccar.org/ | 现代 GPS 追踪系统 | | diff --git a/apps/telegram-search/1.1.9/config/config.yaml b/apps/telegram-search/1.1.9/config/config.yaml new file mode 100644 index 000000000..3ca9b3161 --- /dev/null +++ b/apps/telegram-search/1.1.9/config/config.yaml @@ -0,0 +1,34 @@ +database: + # Database type: postgres, pglite + type: postgres + host: telegram_search_pgvector + port: 5432 + user: postgres + password: 'telegram_search' + database: postgres + +api: + telegram: + apiId: '611335' + apiHash: d524b414d21f4d37f08684c1df41ac9c + receiveMessage: false + proxy: + ip: '' + port: 0 + MTProxy: false + secret: '' + socksType: 5 + timeout: 2 + username: '' + password: '' + embedding: + # Embedding provider (openai or ollama) + provider: openai + # Embedding model + model: text-embedding-3-small + # API key for provider + apiKey: your_openai_api_key + # Optional, available dimensions: 1536, 1024, 768. Default dimension is 1536. #If using gemini-embedding-exp-03-07, choose 768 + dimension: 1536 + # Optional, for custom API providers + apiBase: 'https://api.openai.com/v1' diff --git a/apps/telegram-search/1.1.9/config/init.sql b/apps/telegram-search/1.1.9/config/init.sql new file mode 100644 index 000000000..f4063dfa7 --- /dev/null +++ b/apps/telegram-search/1.1.9/config/init.sql @@ -0,0 +1,4 @@ +ALTER SYSTEM SET vectors.pgvector_compatibility=on; + +DROP EXTENSION IF EXISTS vectors; +CREATE EXTENSION vectors; diff --git a/apps/telegram-search/1.1.9/data.yml b/apps/telegram-search/1.1.9/data.yml new file mode 100644 index 000000000..d1d4ed61f --- /dev/null +++ b/apps/telegram-search/1.1.9/data.yml @@ -0,0 +1,52 @@ +additionalProperties: + formFields: + - default: "/home/telegram-search" + edit: true + envKey: TELEGRAM_SEARCH_ROOT_PATH + labelZh: 数据持久化路径 + labelEn: Data persistence path + required: true + type: text + - default: 3333 + edit: true + envKey: PANEL_APP_PORT_HTTP + labelZh: WebUI 端口 + labelEn: WebUI port + required: true + rule: paramPort + type: number + - default: "telegram_search" + edit: true + envKey: POSTGRES_DATABASE + labelZh: 数据库 名称 + labelEn: Database Name + required: true + type: text + - default: "telegram_search" + edit: true + envKey: POSTGRES_USER + labelZh: 数据库 用户名 + labelEn: Database Username + required: true + type: text + - default: "telegram_search" + edit: true + envKey: POSTGRES_PASSWORD + labelZh: 数据库 密码 + labelEn: Database Password + required: true + type: password + - default: "" + edit: true + envKey: TELEGRAM_API_ID + labelZh: Telegram 应用程序 ID + labelEn: Telegram APPID + required: false + type: text + - default: "" + edit: true + envKey: TELEGRAM_API_HASH + labelZh: Telegram 应用程序 哈希 + labelEn: Telegram APP HASH + required: false + type: text diff --git a/apps/telegram-search/1.1.9/docker-compose.yml b/apps/telegram-search/1.1.9/docker-compose.yml new file mode 100644 index 000000000..68ee83881 --- /dev/null +++ b/apps/telegram-search/1.1.9/docker-compose.yml @@ -0,0 +1,48 @@ +networks: + 1panel-network: + external: true + +services: + telegram_search: + image: ghcr.io/groupultra/telegram-search:1.1.9 + depends_on: + telegram_search_pgvector: + condition: service_healthy + container_name: ${CONTAINER_NAME} + labels: + createdBy: "Apps" + restart: always + networks: + - 1panel-network + ports: + - ${PANEL_APP_PORT_HTTP}:3333 + env_file: + - ${GLOBAL_ENV_FILE:-/etc/1panel/envs/global.env} + - ${ENV_FILE:-/etc/1panel/envs/default.env} + volumes: + - ${TELEGRAM_SEARCH_ROOT_PATH}/data:/app/data + environment: + - TZ=Asia/Shanghai + - DATABASE_TYPE=postgres + - DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@telegram_search_pgvector:5432/${POSTGRES_DATABASE} + telegram_search_pgvector: + image: ghcr.io/tensorchord/pgvecto-rs:pg17-v0.4.0 + container_name: db-${CONTAINER_NAME} + restart: always + networks: + - 1panel-network + env_file: + - ${GLOBAL_ENV_FILE:-/etc/1panel/envs/global.env} + - ${ENV_FILE:-/etc/1panel/envs/default.env} + volumes: + - ./config/init.sql:/docker-entrypoint-initdb.d/init.sql + - ${TELEGRAM_SEARCH_ROOT_PATH}/db:/var/lib/postgresql/data + environment: + - POSTGRES_USER=${POSTGRES_USER} + - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} + - POSTGRES_DATABASE=${POSTGRES_DATABASE} + healthcheck: + test: [ CMD-SHELL, pg_isready -d postgres -U postgres ] + interval: 10s + timeout: 5s + retries: 5 diff --git a/apps/telegram-search/1.1.9/envs/default.env b/apps/telegram-search/1.1.9/envs/default.env new file mode 100644 index 000000000..cd05f46e6 --- /dev/null +++ b/apps/telegram-search/1.1.9/envs/default.env @@ -0,0 +1,2 @@ +# copyright© 2024 XinJiang Ms Studio +ENV_FILE=.env diff --git a/apps/telegram-search/1.1.9/envs/global.env b/apps/telegram-search/1.1.9/envs/global.env new file mode 100644 index 000000000..e10989fe4 --- /dev/null +++ b/apps/telegram-search/1.1.9/envs/global.env @@ -0,0 +1,2 @@ +# copyright© 2024 XinJiang Ms Studio +TZ=Asia/Shanghai diff --git a/apps/telegram-search/1.1.9/scripts/init.sh b/apps/telegram-search/1.1.9/scripts/init.sh new file mode 100644 index 000000000..07fb8c3fe --- /dev/null +++ b/apps/telegram-search/1.1.9/scripts/init.sh @@ -0,0 +1,17 @@ +#!/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 + echo "ENV_FILE=${CURRENT_DIR}/.env" >> .env + echo "GLOBAL_ENV_FILE=${CURRENT_DIR}/envs/global.env" >> .env + + echo "Check Finish." + +else + echo "Error: .env file not found." +fi diff --git a/apps/telegram-search/1.1.9/scripts/uninstall.sh b/apps/telegram-search/1.1.9/scripts/uninstall.sh new file mode 100644 index 000000000..c86c4fbca --- /dev/null +++ b/apps/telegram-search/1.1.9/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/telegram-search/1.1.9/scripts/upgrade.sh b/apps/telegram-search/1.1.9/scripts/upgrade.sh new file mode 100644 index 000000000..07fb8c3fe --- /dev/null +++ b/apps/telegram-search/1.1.9/scripts/upgrade.sh @@ -0,0 +1,17 @@ +#!/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 + echo "ENV_FILE=${CURRENT_DIR}/.env" >> .env + echo "GLOBAL_ENV_FILE=${CURRENT_DIR}/envs/global.env" >> .env + + echo "Check Finish." + +else + echo "Error: .env file not found." +fi diff --git a/apps/telegram-search/README.md b/apps/telegram-search/README.md new file mode 100644 index 000000000..ce8b97449 --- /dev/null +++ b/apps/telegram-search/README.md @@ -0,0 +1,15 @@ +# Telegram Search + +Telegram 聊天搜索工具,具有矢量搜索和语义匹配功能 + +![Telegram Search](https://file.lifebus.top/imgs/telegram-search_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) + +## 简介 + +功能强大的 Telegram 聊天搜索工具,具有矢量搜索和语义匹配功能。 + +--- + +![Ms Studio](https://file.lifebus.top/imgs/ms_blank_001.png) diff --git a/apps/telegram-search/data.yml b/apps/telegram-search/data.yml new file mode 100644 index 000000000..6a6bad5fe --- /dev/null +++ b/apps/telegram-search/data.yml @@ -0,0 +1,14 @@ +additionalProperties: + key: telegram-search + name: Telegram Search + tags: + - WebSite + - Local + shortDescZh: Telegram 聊天搜索工具 + shortDescEn: Telegram Chat Search Tool + type: website + crossVersionUpdate: true + limit: 0 + website: https://search.lingogram.app/ + github: https://github.com/groupultra/telegram-search/ + document: https://github.com/groupultra/telegram-search/ diff --git a/apps/telegram-search/logo.png b/apps/telegram-search/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..2512e2b9c51ec76297a259267e8856d202b6695e GIT binary patch literal 11652 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 literal 0 HcmV?d00001