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:
parent
4e5e1a7b5b
commit
4d13a1ddb2
10
README.md
10
README.md
@ -155,15 +155,16 @@ Dev-пользователи (`api/seed/dev/users.yaml`, создаются `mak
|
|||||||
|
|
||||||
### Что вы увидите в логе при запуске
|
### Что вы увидите в логе при запуске
|
||||||
|
|
||||||
Старт занимает около секунды; в логе два трейсбэка — это ожидаемо в dev, приложение при этом работает:
|
Старт занимает около секунды; в логе один трейсбэк — это ожидаемо в dev, приложение при этом работает:
|
||||||
|
|
||||||
- Трейсбэк SMB: `Ошибка при регистрации сессии SMB ... Failed to connect to 'localhost:445': Connection refused`.
|
- Трейсбэк SMB: `Ошибка при регистрации сессии SMB ... Failed to connect to 'localhost:445': Connection refused`.
|
||||||
Настройки `OPENBAO__SMB__*` — заглушки, SMB в Срезе 0 не используется; игнорируйте. Пока на `localhost:445` ничего
|
Настройки `OPENBAO__SMB__*` — заглушки, SMB в Срезе 0 не используется; игнорируйте. Пока на `localhost:445` ничего
|
||||||
не слушает, отказ приходит сразу (старт не задерживается); если порт отвечает, но молчит, ожидание ограничено
|
не слушает, отказ приходит сразу (старт не задерживается); если порт отвечает, но молчит, ожидание ограничено
|
||||||
тайм-аутом `smbclient` (60 с).
|
тайм-аутом `smbclient` (60 с).
|
||||||
- Трейсбэк S3: `ClientConnectorSSLError ... localhost:9000`. Клиент S3 из шаблона ходит по `https`, а MinIO из compose
|
|
||||||
слушает `http`. S3 в Срезе 0 не используется (`app.state.storage` остаётся пустым). Это до исправления в задаче 22
|
Строки `Бакет проверен`, `Подключение к NATS установлено` и `Подписка NATS активна. subject=recognition.result,
|
||||||
(отдельная настройка схемы подключения к MinIO).
|
queue=arm-core` означают, что S3 и NATS из compose подключены (MinIO из compose слушает `http`, поэтому в `.env`
|
||||||
|
задано `OPENBAO__MINIO__MINIO_SECURE=false`).
|
||||||
|
|
||||||
Недоступность SMB, S3 или NATS при старте приложение не роняет и не задерживает: ошибка логируется, состояние NATS
|
Недоступность SMB, S3 или NATS при старте приложение не роняет и не задерживает: ошибка логируется, состояние NATS
|
||||||
видно в `/healthcheck`. К NATS ядро подключается в фоне и повторяет попытки само (`nats=down`, пока связи нет; warning
|
видно в `/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_LOGIN` | — (обязательно) | логин MinIO |
|
||||||
| `OPENBAO__MINIO__MINIO_ADMIN_PASSWORD` | — (обязательно) | пароль MinIO |
|
| `OPENBAO__MINIO__MINIO_ADMIN_PASSWORD` | — (обязательно) | пароль MinIO |
|
||||||
| `OPENBAO__MINIO__MINIO_BUCKET` | — (обязательно) | бакет MinIO (`arm-ka`) |
|
| `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_URL` | — (обязательно) | адрес NATS (`nats://localhost:4222`) |
|
||||||
| `OPENBAO__NATS__NATS_SEED` | пусто | nkey seed; пусто — подключение без учётных данных (compose, тесты). Задаётся вместе с `NATS_JWT` или не задаётся вовсе |
|
| `OPENBAO__NATS__NATS_SEED` | пусто | nkey seed; пусто — подключение без учётных данных (compose, тесты). Задаётся вместе с `NATS_JWT` или не задаётся вовсе |
|
||||||
| `OPENBAO__NATS__NATS_JWT` | пусто | JWT NATS; см. `NATS_SEED` |
|
| `OPENBAO__NATS__NATS_JWT` | пусто | JWT NATS; см. `NATS_SEED` |
|
||||||
|
|||||||
@ -11,6 +11,8 @@ OPENBAO__MINIO__MINIO_URL=localhost:9000
|
|||||||
OPENBAO__MINIO__MINIO_ADMIN_LOGIN=minioadmin
|
OPENBAO__MINIO__MINIO_ADMIN_LOGIN=minioadmin
|
||||||
OPENBAO__MINIO__MINIO_ADMIN_PASSWORD=minioadmin
|
OPENBAO__MINIO__MINIO_ADMIN_PASSWORD=minioadmin
|
||||||
OPENBAO__MINIO__MINIO_BUCKET=arm-ka
|
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
|
# NATS без JetStream; пустые NATS_SEED/NATS_JWT — подключение без nkeys
|
||||||
OPENBAO__NATS__NATS_URL=nats://localhost:4222
|
OPENBAO__NATS__NATS_URL=nats://localhost:4222
|
||||||
|
|||||||
@ -9,6 +9,8 @@ OPENBAO__MINIO__MINIO_URL=localhost:59000
|
|||||||
OPENBAO__MINIO__MINIO_ADMIN_LOGIN=minioadmin
|
OPENBAO__MINIO__MINIO_ADMIN_LOGIN=minioadmin
|
||||||
OPENBAO__MINIO__MINIO_ADMIN_PASSWORD=minioadmin
|
OPENBAO__MINIO__MINIO_ADMIN_PASSWORD=minioadmin
|
||||||
OPENBAO__MINIO__MINIO_BUCKET=arm-ka
|
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_URL=nats://localhost:54222
|
||||||
OPENBAO__NATS__NATS_SEED=
|
OPENBAO__NATS__NATS_SEED=
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
"""Точка входа FastAPI. Каркас из шаблона команды: инфраструктура без доменного кода.
|
"""Точка входа 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
|
NATS без JetStream, подключение в фоне при NATS_ENABLED=true независимо от DEBUG, подписка `recognition.result` в queue
|
||||||
group `arm-core`), SMB (горячие папки ИС Сканирование), middleware (gzip, proxy headers, CORS, РАИСА при DEBUG=False),
|
group `arm-core`), SMB (горячие папки ИС Сканирование), middleware (gzip, proxy headers, CORS, РАИСА при DEBUG=False),
|
||||||
healthcheck (uptime, version, nats: ok|down|off), раздача собранного SPA.
|
healthcheck (uptime, version, nats: ok|down|off), раздача собранного SPA.
|
||||||
@ -72,6 +72,7 @@ async def _connect_s3() -> S3Storage | None:
|
|||||||
settings.OPENBAO.MINIO.MINIO_URL,
|
settings.OPENBAO.MINIO.MINIO_URL,
|
||||||
access_key=settings.OPENBAO.MINIO.MINIO_ADMIN_LOGIN,
|
access_key=settings.OPENBAO.MINIO.MINIO_ADMIN_LOGIN,
|
||||||
secret_key=settings.OPENBAO.MINIO.MINIO_ADMIN_PASSWORD,
|
secret_key=settings.OPENBAO.MINIO.MINIO_ADMIN_PASSWORD,
|
||||||
|
secure=settings.OPENBAO.MINIO.MINIO_SECURE,
|
||||||
cert_check=False,
|
cert_check=False,
|
||||||
)
|
)
|
||||||
try:
|
try:
|
||||||
|
|||||||
@ -12,6 +12,7 @@ class MinioSettings(BaseSettings):
|
|||||||
MINIO_ADMIN_LOGIN: str
|
MINIO_ADMIN_LOGIN: str
|
||||||
MINIO_ADMIN_PASSWORD: str
|
MINIO_ADMIN_PASSWORD: str
|
||||||
MINIO_BUCKET: str
|
MINIO_BUCKET: str
|
||||||
|
MINIO_SECURE: bool = True # https (шаблон, платформа); false — http (MinIO из docker compose)
|
||||||
|
|
||||||
|
|
||||||
class NATSSettings(BaseSettings):
|
class NATSSettings(BaseSettings):
|
||||||
|
|||||||
@ -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).
|
Аутентификация и 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 isinstance(nats, NatsConnection)
|
||||||
assert (nats.result_subject, nats.queue) == ("recognition.result", "arm-core")
|
assert (nats.result_subject, nats.queue) == ("recognition.result", "arm-core")
|
||||||
assert not nats.is_connected # создание не подключает: подключение — в start()
|
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
|
||||||
|
|||||||
@ -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.OPENBAO.NATS.NATS_URL == "nats://localhost:54222"
|
||||||
assert s.AUTH_DEV_ISSUER is True
|
assert s.AUTH_DEV_ISSUER is True
|
||||||
assert s.NATS_ENABLED is False
|
assert s.NATS_ENABLED is False
|
||||||
|
assert s.OPENBAO.MINIO.MINIO_SECURE is False
|
||||||
|
|
||||||
|
|
||||||
def test_defaults(clean_env: pytest.MonkeyPatch) -> None:
|
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.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_SEED == ""
|
||||||
assert s.OPENBAO.NATS.NATS_JWT == ""
|
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:
|
def test_empty_nats_seed_and_jwt_allowed(clean_env: pytest.MonkeyPatch) -> None:
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user