From 526eb56c82cecd3c6eba10c7de8ae7f1da88af1c Mon Sep 17 00:00:00 2001 From: Lacky1234union Date: Fri, 16 Oct 2026 00:21:36 +0300 Subject: [PATCH] =?UTF-8?q?feat(bot):=20Telegram=20=D1=87=D0=B5=D1=80?= =?UTF-8?q?=D0=B5=D0=B7=20=D0=BF=D1=80=D0=BE=D0=BA=D1=81=D0=B8=20(TELEGRAM?= =?UTF-8?q?=5FPROXY=5FURL);=20=D0=BB=D0=B8=D0=BC=D0=B8=D1=82=20=D0=BF?= =?UTF-8?q?=D0=B0=D0=BC=D1=8F=D1=82=D0=B8=20=D0=B1=D0=BE=D1=82=D0=B0=20384?= =?UTF-8?q?m?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit С сервера Vobot api.telegram.org недоступен (ни IPv4, ни IPv6) — как и meditron, ходим через прокси; aiohttp-socks для http/socks. Бот в простое ~190 МБ — 256m мало. Refs #12 Co-Authored-By: Claude Opus 5.5 --- .env.example | 1 + app/config.py | 2 ++ app/main.py | 12 ++++++++++-- docker-compose.yml | 2 +- pyproject.toml | 1 + uv.lock | 24 ++++++++++++++++++++++++ 6 files changed, 39 insertions(+), 3 deletions(-) diff --git a/.env.example b/.env.example index 4d8eb43..37c887f 100644 --- a/.env.example +++ b/.env.example @@ -5,6 +5,7 @@ TELEGRAM_BOT_TOKEN= # (secret) токен от @BotFather ADMIN_IDS= # Telegram ID первых администраторов через запятую LOG_LEVEL=INFO +TELEGRAM_PROXY_URL= # (secret) http://user:pass@host:port или socks5://… — на RF-сервере Telegram недоступен напрямую # --- База данных --- POSTGRES_PASSWORD=tgit # (secret на сервере) пароль Postgres в Compose diff --git a/app/config.py b/app/config.py index 689f438..15f52b4 100644 --- a/app/config.py +++ b/app/config.py @@ -13,6 +13,8 @@ class TelegramSettings(BaseSettings): model_config = SettingsConfigDict(**_ENV, env_prefix="TELEGRAM_") bot_token: SecretStr + # http://user:pass@host:port or socks5://… — the RF server has no route to api.telegram.org (same as meditron) + proxy_url: SecretStr | None = None class AccessSettings(BaseSettings): diff --git a/app/main.py b/app/main.py index 789e390..4b47d8c 100644 --- a/app/main.py +++ b/app/main.py @@ -5,6 +5,7 @@ import contextlib import logging from aiogram import Bot, Dispatcher +from aiogram.client.session.aiohttp import AiohttpSession from app import __version__ from app.access.service import AccessService @@ -54,8 +55,15 @@ async def run(settings: Settings) -> None: asyncio.create_task(heartbeat(rt.heartbeat_file, rt.heartbeat_interval)), asyncio.create_task(cleanup_loop(sessions)), ] - bot = Bot(settings.telegram.bot_token.get_secret_value()) - log.info("tgit %s starting, %d bootstrap admin(s)", __version__, len(settings.access.admin_ids)) + proxy = settings.telegram.proxy_url + session = AiohttpSession(proxy=proxy.get_secret_value()) if proxy else None + bot = Bot(settings.telegram.bot_token.get_secret_value(), session=session) + log.info( + "tgit %s starting, %d bootstrap admin(s), telegram %s", + __version__, + len(settings.access.admin_ids), + "via proxy" if proxy else "direct", + ) try: await dp.start_polling(bot, handle_signals=True) finally: diff --git a/docker-compose.yml b/docker-compose.yml index 3639ecc..f4158fd 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -12,7 +12,7 @@ services: postgres: condition: service_healthy restart: unless-stopped - mem_limit: 256m + mem_limit: 384m # ~190 MB idle; git clone/push and aiogram spikes need headroom labels: tgit.managed: "true" logging: diff --git a/pyproject.toml b/pyproject.toml index dd0ca9b..10243bf 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -14,6 +14,7 @@ dependencies = [ "pyyaml>=6.0", "regex>=2024.7", "segno>=1.6", + "aiohttp-socks>=0.9", ] [dependency-groups] diff --git a/uv.lock b/uv.lock index 9f9f9aa..036ecf3 100644 --- a/uv.lock +++ b/uv.lock @@ -74,6 +74,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/68/30/173960c42b05a6c59f7558e4b12a4b0d9ba376cf6aa9bde7f9e08a30ca8d/aiohttp-3.14.5-py3-none-any.whl", hash = "sha256:efc21a454892828368b11c2c780de0ff8bc991f73f6b99c6b66e56205470929b", size = 279517, upload-time = "2026-10-11T01:05:08.523Z" }, ] +[[package]] +name = "aiohttp-socks" +version = "0.12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "aiohttp" }, + { name = "python-socks" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/18/1d/a306e0111222180e60f17131a3f5d9bc694dd999a8115959a7dd76c2238e/aiohttp_socks-0.12.0.tar.gz", hash = "sha256:3caf9f5a4164611122d412bc11b2f9114fd29c85e1ba27bb38060d3c236bdc8d", size = 12061, upload-time = "2026-08-12T04:43:15.791Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/86/64/ca6289632020523ea1841f01363f83ada10eeb0f21dd931fc1118dd85668/aiohttp_socks-0.12.0-py3-none-any.whl", hash = "sha256:ba6f95ec775c761d87f8578ab48f137d0457c676da104984202bf75e747d5ee6", size = 10693, upload-time = "2026-08-12T04:43:14.524Z" }, +] + [[package]] name = "aiosignal" version = "1.4.0" @@ -642,6 +655,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/60/d1/38f3a3405989a89ac18390803e70c6ad7c7760da4f9b83cbeca0c44a0c72/python_dotenv-1.2.4-py3-none-any.whl", hash = "sha256:42269a8a5b3fd54ffa6f3d84b18abed50064717576b4ecf03dc4a55d8aa04fdc", size = 23266, upload-time = "2026-10-01T05:36:08.633Z" }, ] +[[package]] +name = "python-socks" +version = "3.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/04/ad/484ffb79532517b11a90af38647c38652224650b31a7ae1cedd5a418d8ab/python_socks-3.1.1.tar.gz", hash = "sha256:8d3e817cdbe858dc0bb8c8fdc8e79b6ce37acce110d33374c6f57a675cc9029e", size = 232781, upload-time = "2026-09-08T13:03:31.058Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3b/23/2c2cef1b4313c55d1713201acd4ee2043fb2cf22e546ca9d36bf4317faea/python_socks-3.1.1-py3-none-any.whl", hash = "sha256:327e0d6378702c73a7790bf732e9f01392f17b48c7348a50b5bd1f710c2df1be", size = 49566, upload-time = "2026-09-08T13:03:29.604Z" }, +] + [[package]] name = "pyyaml" version = "6.0.3" @@ -763,6 +785,7 @@ version = "0.1.0" source = { editable = "." } dependencies = [ { name = "aiogram" }, + { name = "aiohttp-socks" }, { name = "alembic" }, { name = "asyncpg" }, { name = "httpx" }, @@ -789,6 +812,7 @@ dev = [ [package.metadata] requires-dist = [ { name = "aiogram", specifier = ">=3.13" }, + { name = "aiohttp-socks", specifier = ">=0.9" }, { name = "alembic", specifier = ">=1.13" }, { name = "asyncpg", specifier = ">=0.29" }, { name = "httpx", specifier = ">=0.27" },