From d695f1991f1c9c0bd0becb3705423e776a7cfab7 Mon Sep 17 00:00:00 2001 From: MpakobecEx Date: Mon, 19 Oct 2026 03:46:24 +0500 Subject: [PATCH] =?UTF-8?q?=D0=A3=20=D0=B0=D0=B4=D0=BC=D0=B8=D0=BD=D0=BA?= =?UTF-8?q?=D0=B8=20=D1=82=D0=B5=D0=BF=D0=B5=D1=80=D1=8C=20=D0=BF=D0=BE?= =?UTF-8?q?=D1=81=D1=82=D0=BE=D1=8F=D0=BD=D0=BD=D1=8B=D0=B5=20=D0=BF=D0=BE?= =?UTF-8?q?=D1=80=D1=82=D1=8B,=20=D0=BA=D0=BE=D1=82=D0=BE=D1=80=D1=8B?= =?UTF-8?q?=D0=B5=20=D0=BD=D0=B5=20=D1=81=D0=BF=D0=BE=D1=80=D1=8F=D1=82=20?= =?UTF-8?q?=D1=81=20Portainer?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Тестовый контур слушает 8100, прод — 8101 на хосте VPS (8000 занят Portainer). Адрес привязки вынесен в ADMIN_BIND_IP: по умолчанию только loopback, а для nginx-proxy-manager ставится 172.17.0.1, чтобы контейнер NPM мог достучаться до админки, но порт не оказался в интернете. Примеры окружений и DEPLOY обновлены. --- .env.example | 1 + DEPLOY.md | 14 +++++++++----- README.md | 7 ++++--- common/version.py | 2 +- docker-compose.prod.yml | 4 +++- docker-compose.yml | 2 +- env/prod.env.example | 8 +++++--- env/test.env.example | 8 +++++--- tests/test_version.py | 2 +- 9 files changed, 30 insertions(+), 18 deletions(-) diff --git a/.env.example b/.env.example index 977fa36..e9d2abd 100644 --- a/.env.example +++ b/.env.example @@ -49,3 +49,4 @@ TEMPLATE_CACHE_TTL=45 # Админка (FastAPI, Блок 4). Порт на loopback хоста для docker compose. ADMIN_HTTP_PORT=8000 +ADMIN_BIND_IP=127.0.0.1 diff --git a/DEPLOY.md b/DEPLOY.md index 161787c..242ba11 100644 --- a/DEPLOY.md +++ b/DEPLOY.md @@ -21,7 +21,9 @@ cp env/test.env.example env/test.env Порт ClickHouse на хосте (`CLICKHOUSE_HTTP_PORT`) у контуров должен различаться: `prod` — `8123`, `test` — `8124` (иначе контейнеры конфликтуют на одной VPS). -Порт админки (`ADMIN_HTTP_PORT`) — так же: `prod` — `8000`, `test` — `8001`. +Порт админки (`ADMIN_HTTP_PORT`) — так же: `prod` — `8101`, `test` — `8100` +(8000 на VPS занят Portainer). `ADMIN_BIND_IP` по умолчанию `127.0.0.1`; чтобы +nginx-proxy-manager (контейнер) видел админку, ставьте `172.17.0.1`. ## 3. Логин в registry (если пакет приватный) @@ -84,13 +86,15 @@ docker compose -p test --env-file env/test.env -f docker-compose.prod.yml exec - ## Админка (FastAPI) Сервис `admin` — отдельный образ `mpakobecex/dispelevilbot-admin`, общий пакет `common`. -Наружу пока **не публикуется**: только loopback хоста (`127.0.0.1:${ADMIN_HTTP_PORT}`). -Домен и TLS появятся вместе с входом через Telegram (Блоки 2.4/4.2). +Наружу пока **не публикуется**: по умолчанию только loopback хоста +(`127.0.0.1:${ADMIN_HTTP_PORT}`). Для nginx-proxy-manager (он в контейнере) задайте +`ADMIN_BIND_IP=172.17.0.1` и указывайте в NPM цель `172.17.0.1:8100` (test) / +`172.17.0.1:8101` (prod). Домен и TLS — Блок 4.2. ```bash # проверка живости -curl -s http://127.0.0.1:8001/healthz # test -curl -s http://127.0.0.1:8000/healthz # prod +curl -s http://127.0.0.1:8100/healthz # test +curl -s http://127.0.0.1:8101/healthz # prod ``` Локально без Docker: `pip install -r requirements-admin.txt && python -m admin` diff --git a/README.md b/README.md index c0986f6..5fc516a 100644 --- a/README.md +++ b/README.md @@ -92,8 +92,9 @@ docker compose up --build ``` CI собирает два образа: `dispelevilbot-bot` и `dispelevilbot-admin`. Админка в compose -публикуется только на loopback (`127.0.0.1:${ADMIN_HTTP_PORT}`), наружу выйдет вместе -с доменом и TLS (Блок 2.4/4.2). +по умолчанию публикуется только на loopback (`127.0.0.1:${ADMIN_HTTP_PORT}`, test 8100 / +prod 8101); для nginx-proxy-manager задаётся `ADMIN_BIND_IP=172.17.0.1`, наружу выйдет +вместе с доменом и TLS (Блок 4.2). Прод/test-контуры — один `docker-compose.prod.yml`, разделяются Compose-проектом и env-файлом: @@ -126,7 +127,7 @@ make backup E=test # на домашнем сервере: ./scripts/clickho ## Версионирование -- Единый источник версии — `common/version.py` (`__version__`), текущая — `0.4.3`. +- Единый источник версии — `common/version.py` (`__version__`), текущая — `0.4.4`. - Схема — SemVer-подобная (`MAJOR.MINOR.PATCH`); git-тег = `v` + версия (`v0.1`). - Docker-образы тегируются версией (Блок 2), события ClickHouse получают `bot_version` (Блок 3). - Выпуск: изменить `common/version.py` → коммит → аннотированный тег `vX.Y` → `git push --tags`. diff --git a/common/version.py b/common/version.py index c1ca057..b154c72 100644 --- a/common/version.py +++ b/common/version.py @@ -7,4 +7,4 @@ from __future__ import annotations -__version__ = "0.4.3" +__version__ = "0.4.4" diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml index c53373b..c77af0b 100644 --- a/docker-compose.prod.yml +++ b/docker-compose.prod.yml @@ -75,7 +75,9 @@ services: ADMIN_HOST: 0.0.0.0 ADMIN_PORT: "8000" ports: - - "127.0.0.1:${ADMIN_HTTP_PORT:-8000}:8000" + # По умолчанию только loopback. Для NPM (контейнер) задайте ADMIN_BIND_IP=172.17.0.1: + # порт остаётся недоступен из интернета, но виден контейнерам на bridge. + - "${ADMIN_BIND_IP:-127.0.0.1}:${ADMIN_HTTP_PORT:-8101}:8000" depends_on: postgres: condition: service_healthy diff --git a/docker-compose.yml b/docker-compose.yml index b5e7f54..93348d1 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -83,7 +83,7 @@ services: ADMIN_HOST: 0.0.0.0 ADMIN_PORT: "8000" ports: - - "127.0.0.1:${ADMIN_HTTP_PORT:-8000}:8000" + - "${ADMIN_BIND_IP:-127.0.0.1}:${ADMIN_HTTP_PORT:-8000}:8000" depends_on: postgres: condition: service_healthy diff --git a/env/prod.env.example b/env/prod.env.example index a5f0333..05d605a 100644 --- a/env/prod.env.example +++ b/env/prod.env.example @@ -40,9 +40,11 @@ CLICKHOUSE_PASSWORD= # Порт на хосте (для бэкапа). У test и prod он должен различаться. CLICKHOUSE_HTTP_PORT=8123 -# Админка (FastAPI). Порт на loopback хоста; у test и prod должен различаться. -# Наружу пока не публикуется (домен/TLS — Блок 2.4). -ADMIN_HTTP_PORT=8000 +# Админка (FastAPI). Порт на хосте; у test и prod должен различаться +# (test 8100, prod 8101 — 8000 занят Portainer). +# ADMIN_BIND_IP=127.0.0.1 — только хост; для nginx-proxy-manager поставьте 172.17.0.1. +ADMIN_HTTP_PORT=8101 +ADMIN_BIND_IP=127.0.0.1 # Шаблоны сообщений: TTL кеша бота (правки из админки без перезапуска). TEMPLATE_CACHE_TTL=45 diff --git a/env/test.env.example b/env/test.env.example index 88140e2..4efed63 100644 --- a/env/test.env.example +++ b/env/test.env.example @@ -38,9 +38,11 @@ CLICKHOUSE_PASSWORD= # Порт на хосте: у test он отличается от prod (8123), иначе конфликт на одной VPS. CLICKHOUSE_HTTP_PORT=8124 -# Админка (FastAPI). Порт на loopback хоста; у test и prod должен различаться. -# Наружу пока не публикуется (домен/TLS — Блок 2.4). -ADMIN_HTTP_PORT=8001 +# Админка (FastAPI). Порт на хосте; у test и prod должен различаться +# (test 8100, prod 8101 — 8000 занят Portainer). +# ADMIN_BIND_IP=127.0.0.1 — только хост; для nginx-proxy-manager поставьте 172.17.0.1. +ADMIN_HTTP_PORT=8100 +ADMIN_BIND_IP=127.0.0.1 # Шаблоны сообщений: TTL кеша бота (правки из админки без перезапуска). TEMPLATE_CACHE_TTL=45 diff --git a/tests/test_version.py b/tests/test_version.py index 7934f22..e9384ea 100644 --- a/tests/test_version.py +++ b/tests/test_version.py @@ -7,4 +7,4 @@ from common import __version__ def test_version_is_set(): assert __version__ - assert __version__ == "0.4.3" + assert __version__ == "0.4.4"