fix: настройка OPENBAO__MINIO__MINIO_SECURE — http-MinIO из compose без SSL-ошибки при старте (R-20)

MinioSettings.MINIO_SECURE (по умолчанию true — https, как в шаблоне и на платформе) передаётся в Minio(secure=...);
.env.example и .env.test — false (MinIO из docker compose слушает http). README: трейсбэк S3 из раздела
«что в логе» убран, переменная добавлена в таблицу конфигурации.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
Andrey Epifancev 2026-10-03 23:47:39 +04:00
parent 4e5e1a7b5b
commit 4d13a1ddb2
7 changed files with 36 additions and 6 deletions

View File

@ -155,15 +155,16 @@ Dev-пользователи (`api/seed/dev/users.yaml`, создаются `mak
### Что вы увидите в логе при запуске
Старт занимает около секунды; в логе два трейсбэка — это ожидаемо в dev, приложение при этом работает:
Старт занимает около секунды; в логе один трейсбэк — это ожидаемо в dev, приложение при этом работает:
- Трейсбэк SMB: `Ошибка при регистрации сессии SMB ... Failed to connect to 'localhost:445': Connection refused`.
Настройки `OPENBAO__SMB__*` — заглушки, SMB в Срезе 0 не используется; игнорируйте. Пока на `localhost:445` ничего
не слушает, отказ приходит сразу (старт не задерживается); если порт отвечает, но молчит, ожидание ограничено
тайм-аутом `smbclient` (60 с).
- Трейсбэк S3: `ClientConnectorSSLError ... localhost:9000`. Клиент S3 из шаблона ходит по `https`, а MinIO из compose
слушает `http`. S3 в Срезе 0 не используется (`app.state.storage` остаётся пустым). Это до исправления в задаче 22
(отдельная настройка схемы подключения к MinIO).
Строки `Бакет проверен`, `Подключение к NATS установлено` и `Подписка NATS активна. subject=recognition.result,
queue=arm-core` означают, что S3 и NATS из compose подключены (MinIO из compose слушает `http`, поэтому в `.env`
задано `OPENBAO__MINIO__MINIO_SECURE=false`).
Недоступность SMB, S3 или NATS при старте приложение не роняет и не задерживает: ошибка логируется, состояние NATS
видно в `/healthcheck`. К NATS ядро подключается в фоне и повторяет попытки само (`nats=down`, пока связи нет; warning
@ -202,6 +203,7 @@ docker compose -f ../docs/dev/docker-compose.yml down -v # полный сб
| `OPENBAO__MINIO__MINIO_ADMIN_LOGIN` | — (обязательно) | логин MinIO |
| `OPENBAO__MINIO__MINIO_ADMIN_PASSWORD` | — (обязательно) | пароль MinIO |
| `OPENBAO__MINIO__MINIO_BUCKET` | — (обязательно) | бакет MinIO (`arm-ka`) |
| `OPENBAO__MINIO__MINIO_SECURE` | `true` | `true` — MinIO по `https` (платформа), `false` — по `http` (MinIO из compose; так в `.env.example`) |
| `OPENBAO__NATS__NATS_URL` | — (обязательно) | адрес NATS (`nats://localhost:4222`) |
| `OPENBAO__NATS__NATS_SEED` | пусто | nkey seed; пусто — подключение без учётных данных (compose, тесты). Задаётся вместе с `NATS_JWT` или не задаётся вовсе |
| `OPENBAO__NATS__NATS_JWT` | пусто | JWT NATS; см. `NATS_SEED` |

View File

@ -11,6 +11,8 @@ OPENBAO__MINIO__MINIO_URL=localhost:9000
OPENBAO__MINIO__MINIO_ADMIN_LOGIN=minioadmin
OPENBAO__MINIO__MINIO_ADMIN_PASSWORD=minioadmin
OPENBAO__MINIO__MINIO_BUCKET=arm-ka
# false — MinIO по http (docker compose); по умолчанию true (https, как на платформе)
OPENBAO__MINIO__MINIO_SECURE=false
# NATS без JetStream; пустые NATS_SEED/NATS_JWT — подключение без nkeys
OPENBAO__NATS__NATS_URL=nats://localhost:4222

View File

@ -9,6 +9,8 @@ OPENBAO__MINIO__MINIO_URL=localhost:59000
OPENBAO__MINIO__MINIO_ADMIN_LOGIN=minioadmin
OPENBAO__MINIO__MINIO_ADMIN_PASSWORD=minioadmin
OPENBAO__MINIO__MINIO_BUCKET=arm-ka
# false — MinIO по http (docker compose); по умолчанию true (https, как на платформе)
OPENBAO__MINIO__MINIO_SECURE=false
OPENBAO__NATS__NATS_URL=nats://localhost:54222
OPENBAO__NATS__NATS_SEED=

View File

@ -1,6 +1,6 @@
"""Точка входа FastAPI. Каркас из шаблона команды: инфраструктура без доменного кода.
Что здесь есть: настройки, подключение S3 (MinIO), NATS (`src/core/nats.py`: core
Что здесь есть: настройки, подключение S3 (MinIO; `MINIO_SECURE` — https или http), NATS (`src/core/nats.py`: core
NATS без JetStream, подключение в фоне при NATS_ENABLED=true независимо от DEBUG, подписка `recognition.result` в queue
group `arm-core`), SMB (горячие папки ИС Сканирование), middleware (gzip, proxy headers, CORS, РАИСА при DEBUG=False),
healthcheck (uptime, version, nats: ok|down|off), раздача собранного SPA.
@ -72,6 +72,7 @@ async def _connect_s3() -> S3Storage | None:
settings.OPENBAO.MINIO.MINIO_URL,
access_key=settings.OPENBAO.MINIO.MINIO_ADMIN_LOGIN,
secret_key=settings.OPENBAO.MINIO.MINIO_ADMIN_PASSWORD,
secure=settings.OPENBAO.MINIO.MINIO_SECURE,
cert_check=False,
)
try:

View File

@ -12,6 +12,7 @@ class MinioSettings(BaseSettings):
MINIO_ADMIN_LOGIN: str
MINIO_ADMIN_PASSWORD: str
MINIO_BUCKET: str
MINIO_SECURE: bool = True # https (шаблон, платформа); false — http (MinIO из docker compose)
class NATSSettings(BaseSettings):

View File

@ -1,4 +1,4 @@
"""Быстрые тесты каркаса приложения: lifespan, /healthcheck, префикс API (без БД и NATS).
"""Быстрые тесты каркаса приложения: lifespan, /healthcheck, префикс API, клиент S3 (без БД и NATS).
Аутентификация и supervisor NATS — tests/test_nats_core.py (подключение переехало в src/core/nats.py, рулинг R-3).
"""
@ -178,3 +178,23 @@ def test_create_nats_enabled_returns_connection_for_results(monkeypatch: pytest.
assert isinstance(nats, NatsConnection)
assert (nats.result_subject, nats.queue) == ("recognition.result", "arm-core")
assert not nats.is_connected # создание не подключает: подключение — в start()
@pytest.mark.parametrize("secure", [True, False])
async def test_connect_s3_passes_secure_flag(monkeypatch: pytest.MonkeyPatch, secure: bool):
created: dict[str, Any] = {}
class _FakeMinio:
def __init__(self, endpoint: str, **kwargs: Any) -> None:
created.update(kwargs, endpoint=endpoint)
async def bucket_exists(self, bucket: str) -> bool:
return True
monkeypatch.setattr(app_module, "Minio", _FakeMinio)
monkeypatch.setattr(app_module.settings.OPENBAO.MINIO, "MINIO_SECURE", secure)
storage = await app_module._connect_s3()
assert storage is not None
assert created["secure"] is secure

View File

@ -26,6 +26,7 @@ def test_env_test_is_read(clean_env: pytest.MonkeyPatch) -> None:
assert s.OPENBAO.NATS.NATS_URL == "nats://localhost:54222"
assert s.AUTH_DEV_ISSUER is True
assert s.NATS_ENABLED is False
assert s.OPENBAO.MINIO.MINIO_SECURE is False
def test_defaults(clean_env: pytest.MonkeyPatch) -> None:
@ -57,6 +58,7 @@ def test_defaults(clean_env: pytest.MonkeyPatch) -> None:
assert (s.OUTBOX_POLL_SECONDS, s.ACK_TIMEOUT_SECONDS, s.OUTBOX_MAX_REPUBLISH) == (5, 30, 3)
assert s.OPENBAO.NATS.NATS_SEED == ""
assert s.OPENBAO.NATS.NATS_JWT == ""
assert s.OPENBAO.MINIO.MINIO_SECURE is True
def test_empty_nats_seed_and_jwt_allowed(clean_env: pytest.MonkeyPatch) -> None: