From aaa0a65f933afa3aeda1bcfe241821aaecdf1a8f Mon Sep 17 00:00:00 2001 From: jp170na Date: Mon, 26 Oct 2026 20:03:15 +0100 Subject: [PATCH] Presun nasadenia --- README.md | 33 ++++++++++++------- Dockerfile => deployment/Dockerfile | 4 +-- .../docker-compose.yml | 11 ++++--- .../requirements-dev.txt | 0 .../requirements.txt | 0 scripts/compose.sh | 10 ++++++ scripts/start_project.sh | 3 +- scripts/verify_project.py | 5 ++- test/test_configuration.py | 10 +++--- tools/graphrag/evaluation/reproducibility.py | 4 +-- tools/graphrag/tests/test_evaluation_v5.py | 1 + 11 files changed, 53 insertions(+), 28 deletions(-) rename Dockerfile => deployment/Dockerfile (92%) rename docker-compose.yml => deployment/docker-compose.yml (94%) rename requirements-dev.txt => deployment/requirements-dev.txt (100%) rename requirements.txt => deployment/requirements.txt (100%) create mode 100755 scripts/compose.sh diff --git a/README.md b/README.md index 4e24916..c62d662 100644 --- a/README.md +++ b/README.md @@ -274,6 +274,7 @@ zp-agent/ │ ├── scripts/ │ ├── start_project.sh +│ ├── compose.sh │ └── verify_project.py │ ├── data/ @@ -281,10 +282,11 @@ zp-agent/ │ ├── chunks.json │ └── zp_index.sqlite │ -├── Dockerfile -├── docker-compose.yml -├── requirements.txt -├── requirements-dev.txt +├── deployment/ +│ ├── Dockerfile +│ ├── docker-compose.yml +│ ├── requirements.txt +│ └── requirements-dev.txt └── README.md ``` @@ -679,6 +681,13 @@ Po vytvorení `.env`, klonu `../zpwiki` a SSH konfigurácie spusti: ./scripts/start_project.sh ``` +Dockerfile, Compose a oba zoznamy závislostí sú v `deployment/`. +`.env`, `.gitignore` a `.dockerignore` zostávajú v koreni projektu. +Príkazy Compose spúšťaj cez `./scripts/compose.sh`, napríklad +`./scripts/compose.sh ps`. Obal nastavuje absolútne cesty, koreň build +kontextu a pôvodný názov projektu `zp-agent`, takže sa nemenia dátové volume. +Funguje aj pri spustení cez absolútnu cestu z iného pracovného priečinka. + Skript štandardne používa kontext `default`, nemení globálny Docker kontext a spravuje iba projekt `zp-agent`. Iný cieľ nastav cez `ZP_DOCKER_CONTEXT`. Zostaví image, počká na zdravý Neo4j, overí existujúce indexy a podľa @@ -721,13 +730,13 @@ http://127.0.0.1:8000/openapi.json Logy: ```bash -docker compose logs -f zp-agent-api +./scripts/compose.sh logs -f zp-agent-api ``` Zastavenie: ```bash -docker compose down +./scripts/compose.sh down ``` Hugging Face cache volume zostáva persistentné; predvolený embeddingový @@ -737,7 +746,7 @@ Neo4j je spustené ako samostatná služba v rovnakom Docker Compose prostredí. Stav služieb je možné skontrolovať: ```bash -docker compose ps +./scripts/compose.sh ps ``` Neo4j Browser je lokálne dostupný na: @@ -749,7 +758,7 @@ http://127.0.0.1:7474/browser/ Kontrola spojenia z API kontajnera: ```bash -docker compose exec zp-agent-api \ +./scripts/compose.sh exec zp-agent-api \ python -m tools.graphrag.neo4j_smoke ``` @@ -760,7 +769,7 @@ a Neo4j graf z jedného snapshotu wiki. Nová generácia sa aktivuje až po úspešnej príprave oboch indexov: ```bash -docker compose run --rm zp-agent-api python -m tools.rag.rebuild_index +./scripts/compose.sh run --rm zp-agent-api python -m tools.rag.rebuild_index ``` Vzniknú súbory: @@ -831,7 +840,7 @@ význam môže dostať embeddingové vyhľadávanie. Test z terminálu: ```bash -docker compose run --rm zp-agent-api \ +./scripts/compose.sh run --rm zp-agent-api \ python -m tools.rag.search_db "rag agent" --limit 5 ``` @@ -943,7 +952,7 @@ Document -[:DESCRIBES]-> Topic Knowledge graph sa vytvorí príkazom: ```bash -docker compose exec zp-agent-api \ +./scripts/compose.sh exec zp-agent-api \ python -m tools.graphrag.build_graphrag ``` @@ -1233,7 +1242,7 @@ hodnôt. Inštalácia testovacích závislostí: ```bash -pip install -r requirements-dev.txt +pip install -r deployment/requirements-dev.txt ``` Bežné automatizované testy: diff --git a/Dockerfile b/deployment/Dockerfile similarity index 92% rename from Dockerfile rename to deployment/Dockerfile index 4ca3ffa..d93db00 100644 --- a/Dockerfile +++ b/deployment/Dockerfile @@ -19,10 +19,10 @@ RUN python -m pip install --no-cache-dir \ torch==2.11.0 \ --index-url https://download.pytorch.org/whl/cpu -COPY requirements.txt . +COPY deployment/requirements.txt ./deployment/requirements.txt RUN python -m pip install --no-cache-dir \ - -r requirements.txt + -r deployment/requirements.txt COPY app ./app COPY tools ./tools diff --git a/docker-compose.yml b/deployment/docker-compose.yml similarity index 94% rename from docker-compose.yml rename to deployment/docker-compose.yml index 53883af..dd5af9d 100644 --- a/docker-compose.yml +++ b/deployment/docker-compose.yml @@ -1,7 +1,10 @@ +name: zp-agent + services: zp-agent-api: build: - context: . + context: .. + dockerfile: deployment/Dockerfile args: EMBEDDING_MODEL: ${EMBEDDING_MODEL:-intfloat/multilingual-e5-small} EMBEDDING_REVISION: ${EMBEDDING_REVISION:-} @@ -12,7 +15,7 @@ services: - "8000:8000" env_file: - - .env + - ../.env environment: ZPWIKI_ROOT: /zpwiki @@ -37,8 +40,8 @@ services: NEO4J_DATABASE: ${NEO4J_DATABASE:-neo4j} volumes: - - ./data:/app/data - - ../zpwiki:/zpwiki + - ../data:/app/data + - ../../zpwiki:/zpwiki - hf-cache:/cache/huggingface - type: bind source: ${ZPWIKI_SSH_KEY:-${HOME}/.ssh/id_ed25519} diff --git a/requirements-dev.txt b/deployment/requirements-dev.txt similarity index 100% rename from requirements-dev.txt rename to deployment/requirements-dev.txt diff --git a/requirements.txt b/deployment/requirements.txt similarity index 100% rename from requirements.txt rename to deployment/requirements.txt diff --git a/scripts/compose.sh b/scripts/compose.sh new file mode 100755 index 0000000..2007fde --- /dev/null +++ b/scripts/compose.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env bash +set -euo pipefail + +project_root="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")/.." && pwd)" +docker_context="${ZP_DOCKER_CONTEXT:-default}" + +exec docker --context "$docker_context" compose --project-name zp-agent \ + --project-directory "$project_root/deployment" \ + --env-file "$project_root/.env" \ + -f "$project_root/deployment/docker-compose.yml" "$@" diff --git a/scripts/start_project.sh b/scripts/start_project.sh index 1a4b4f4..768247d 100755 --- a/scripts/start_project.sh +++ b/scripts/start_project.sh @@ -3,8 +3,7 @@ set -euo pipefail project_root="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")/.." && pwd)" docker_context="${ZP_DOCKER_CONTEXT:-default}" -compose=(docker --context "$docker_context" compose --project-name zp-agent - --project-directory "$project_root" -f "$project_root/docker-compose.yml") +compose=("$project_root/scripts/compose.sh") docker --context "$docker_context" info --format '{{.ServerVersion}}' >/dev/null "${compose[@]}" version >/dev/null diff --git a/scripts/verify_project.py b/scripts/verify_project.py index 62d268c..f87d65b 100644 --- a/scripts/verify_project.py +++ b/scripts/verify_project.py @@ -124,7 +124,10 @@ def main() -> int: return result.stdout.strip() docker = ['docker', '--context', args.docker_context] - compose = [*docker, 'compose', '--project-directory', str(ROOT)] + compose = [*docker, 'compose', '--project-name', 'zp-agent', + '--project-directory', str(ROOT / 'deployment'), + '--env-file', str(ROOT / '.env'), + '-f', str(ROOT / 'deployment/docker-compose.yml')] check('python_and_shell', verify_code) check('git_diff', lambda: command('git', 'diff', '--check')) check('git_integrity', lambda: command('git', 'fsck', '--connectivity-only')) diff --git a/test/test_configuration.py b/test/test_configuration.py index ce57cab..079f760 100644 --- a/test/test_configuration.py +++ b/test/test_configuration.py @@ -28,7 +28,7 @@ def requirement_names(text: str) -> set[str]: def test_no_development_secret_is_committed_in_runtime_config() -> None: files = [ - read_project_file("docker-compose.yml"), + read_project_file("deployment/docker-compose.yml"), read_project_file("app/main.py"), ] @@ -36,7 +36,7 @@ def test_no_development_secret_is_committed_in_runtime_config() -> None: def test_compose_uses_env_file_and_keeps_chunk_configuration() -> None: - compose = read_project_file("docker-compose.yml") + compose = read_project_file("deployment/docker-compose.yml") assert "env_file:" in compose assert ".env" in compose @@ -44,8 +44,8 @@ def test_compose_uses_env_file_and_keeps_chunk_configuration() -> None: assert "CHUNK_OVERLAP_TOKENS" in compose assert "CHUNK_MIN_TOKENS" in compose assert "CHUNK_TOKEN_ENCODING" in compose - assert "./data:/app/data" in compose - assert "../zpwiki:/zpwiki" in compose + assert "../data:/app/data" in compose + assert "../../zpwiki:/zpwiki" in compose def test_secrets_are_ignored_by_git_and_docker() -> None: @@ -57,7 +57,7 @@ def test_secrets_are_ignored_by_git_and_docker() -> None: def test_runtime_requirements_contain_only_direct_dependencies() -> None: - names = requirement_names(read_project_file("requirements.txt")) + names = requirement_names(read_project_file("deployment/requirements.txt")) required = { "fastapi", diff --git a/tools/graphrag/evaluation/reproducibility.py b/tools/graphrag/evaluation/reproducibility.py index dbe04b6..8f07ddc 100644 --- a/tools/graphrag/evaluation/reproducibility.py +++ b/tools/graphrag/evaluation/reproducibility.py @@ -37,9 +37,9 @@ def content_fingerprints(questions: Path, root: Path = ROOT) -> dict[str, Any]: # too, so a freeze cannot silently overlook new runtime/delivery helpers. for package in ('answers', 'retrieval', 'runtime', 'sync'): files.extend(sorted((root / 'tools' / package).rglob('*.py'))) - # requirements.txt and tools/ are present both in the checkout and image. + # Deployment requirements and tools/ exist in both checkout and image. files.extend(root / name for name in [ - 'requirements.txt', 'tools/retrieval/publication.py', 'tools/retrieval/retrieval_contract.py', + 'deployment/requirements.txt', 'tools/retrieval/publication.py', 'tools/retrieval/retrieval_contract.py', 'tools/sync/index_state.py', 'tools/rag/common.py', 'tools/sync/sync_indexes.py', 'tools/rag/rag_utils.py', 'tools/answer_evaluation/context_policy.py', 'tools/answer_evaluation/checked_generation.py', 'tools/answer_evaluation/answer_format.py', diff --git a/tools/graphrag/tests/test_evaluation_v5.py b/tools/graphrag/tests/test_evaluation_v5.py index efb2258..0260ef0 100644 --- a/tools/graphrag/tests/test_evaluation_v5.py +++ b/tools/graphrag/tests/test_evaluation_v5.py @@ -101,6 +101,7 @@ def test_freeze_includes_shared_modules_and_effective_publication_policy(): questions=Path('tools/graphrag/evaluation/graphrag_questions_v4.json') fp=content_fingerprints(questions) assert {'tools/retrieval/publication.py','tools/retrieval/retrieval_contract.py','tools/sync/index_state.py'} <= fp['implementation'].keys() + assert 'deployment/requirements.txt' in fp['implementation'] assert fp['retrieval_policy']['published_only'] is True assert fp['retrieval_policy']['academic_preparation_is_work'] is False