diff --git a/.dockerignore b/.dockerignore index cb7bcb4..b5b35ce 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,5 +1,6 @@ # Secrets and local runtime state magnit_session.json +data/ .env .env.* *.log diff --git a/.gitignore b/.gitignore index 071d1db..19aba68 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,7 @@ # Secrets and local runtime state magnit_session.json +data/* +!data/.gitkeep .env .env.* diff --git a/Dockerfile b/Dockerfile index 9cd155a..719f95c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -13,4 +13,4 @@ COPY README.md /app/README.md EXPOSE 8080 -CMD ["python3", "magnit_api.py", "--session-file", "/app/magnit_session.json", "serve", "--host", "0.0.0.0", "--port", "8080"] +CMD ["python3", "magnit_api.py", "--session-file", "/data/magnit_session.json", "serve", "--host", "0.0.0.0", "--port", "8080"] diff --git a/README.md b/README.md index 84c2fbf..632c728 100644 --- a/README.md +++ b/README.md @@ -25,6 +25,7 @@ docker compose up -d --build ``` По умолчанию сервис публикуется только в loopback на `127.0.0.1:18080`. +Docker хранит session-файл в `./data/magnit_session.json`, а не в корне проекта. Проверка: @@ -140,3 +141,5 @@ curl -X POST "http://127.0.0.1:18080/session/bootstrap" \ -H "Content-Type: application/json" \ -d @payload.json ``` + +При Docker session сохранится в `./data/magnit_session.json`. diff --git a/data/.gitkeep b/data/.gitkeep new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/data/.gitkeep @@ -0,0 +1 @@ + diff --git a/docker-compose.yml b/docker-compose.yml index d74d28c..5ae6322 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -8,7 +8,7 @@ services: ports: - "127.0.0.1:${MAGNIT_API_PORT:-18080}:8080" volumes: - - ./magnit_session.json:/app/magnit_session.json:rw + - ./data:/data healthcheck: test: [ diff --git a/magnit_api.py b/magnit_api.py index 8a8c1de..da81935 100644 --- a/magnit_api.py +++ b/magnit_api.py @@ -54,15 +54,30 @@ class SessionConfig: f"Файл сессии не найден: {path}. " "Создайте его через POST /session/bootstrap или команду bootstrap." ) + if path.is_dir(): + raise MagnitError( + f"Ожидался JSON-файл сессии, но путь является директорией: {path}. " + "Проверьте docker volume mount." + ) return cls(**json.loads(path.read_text(encoding="utf-8"))) @classmethod def load_or_default(cls, path: Path) -> "SessionConfig": if not path.exists(): return cls() + if path.is_dir(): + raise MagnitError( + f"Ожидался JSON-файл сессии, но путь является директорией: {path}. " + "Проверьте docker volume mount." + ) return cls.load(path) def save(self, path: Path) -> None: + if path.exists() and path.is_dir(): + raise MagnitError( + f"Невозможно сохранить сессию: путь является директорией, а не файлом: {path}." + ) + path.parent.mkdir(parents=True, exist_ok=True) path.write_text( json.dumps(asdict(self), ensure_ascii=False, indent=2) + "\n", encoding="utf-8", @@ -193,7 +208,7 @@ class MagnitClient: def __init__(self, session_path: Path = SESSION_FILE, timeout_seconds: int = DEFAULT_TIMEOUT_SECONDS): self.session_path = session_path self.timeout_seconds = timeout_seconds - self.session_config = SessionConfig.load(session_path) + self.session_config = SessionConfig.load_or_default(session_path) self.http = requests.Session() self._sync_cookies()