Изолированная PostgreSQL-проверка импорта и сохранности публикаций #55

Merged
admin merged 2 commits from feature/postgresql-import-verification into main 2026-10-05 12:12:33 +00:00
Collaborator

Добавляет 10 opt-in pytest-проверок всех восьми сценариев: dry-run, apply/повтор, настоящий SQL rollback после UPDATE и INSERT, обновление без raw_data, поздние CSV-метаданные, сохранение после crawl и продолжение обработки второго сотрудника при конфликте HSE ID.

Локальный Compose использует PostgreSQL 16, две тестовые БД, синтетические credentials и restricted test role. Runtime не наследует production env, HTTP запрещён fixture, профили синтетические. Dockerfile-specific ignore исключает секреты и реальные CSV из build contexts.

Для владельца под root подготовлен отдельный compose.vps.yml: только готовые тестовые образы, отдельные internal network и named tmpfs volume, без опубликованных портов, host bind mounts и Docker socket. По 0.5 CPU/512 MiB RAM на контейнер, без дополнительного swap, 128 процессов, ограниченные tmpfs и логи. Pull/build запрещены при запуске; owner-run начинается с read-only диагностики ресурсов и образов. Адресная очистка только этого тестового проекта. Команды: docs/postgresql-import-verification.md и docs/postgresql-import-vps.md. Версия 0.10.4.

Проверено: 75 unit-тестов прошли, 10 PostgreSQL-тестов собраны и пропущены, git diff --check, JavaScript syntax, разбор VPS YAML и статические проверки изоляции/лимитов. Docker отсутствует: Docker build/Compose runtime и настоящая PostgreSQL-интеграция НЕ выполнялись. VPS-стенд не запускался; production, VPS и доступ к рабочей БД не менялись. Требуется независимое ревью.

Добавляет 10 opt-in pytest-проверок всех восьми сценариев: dry-run, apply/повтор, настоящий SQL rollback после UPDATE и INSERT, обновление без raw_data, поздние CSV-метаданные, сохранение после crawl и продолжение обработки второго сотрудника при конфликте HSE ID. Локальный Compose использует PostgreSQL 16, две тестовые БД, синтетические credentials и restricted test role. Runtime не наследует production env, HTTP запрещён fixture, профили синтетические. Dockerfile-specific ignore исключает секреты и реальные CSV из build contexts. Для владельца под root подготовлен отдельный compose.vps.yml: только готовые тестовые образы, отдельные internal network и named tmpfs volume, без опубликованных портов, host bind mounts и Docker socket. По 0.5 CPU/512 MiB RAM на контейнер, без дополнительного swap, 128 процессов, ограниченные tmpfs и логи. Pull/build запрещены при запуске; owner-run начинается с read-only диагностики ресурсов и образов. Адресная очистка только этого тестового проекта. Команды: docs/postgresql-import-verification.md и docs/postgresql-import-vps.md. Версия 0.10.4. Проверено: 75 unit-тестов прошли, 10 PostgreSQL-тестов собраны и пропущены, git diff --check, JavaScript syntax, разбор VPS YAML и статические проверки изоляции/лимитов. Docker отсутствует: Docker build/Compose runtime и настоящая PostgreSQL-интеграция НЕ выполнялись. VPS-стенд не запускался; production, VPS и доступ к рабочей БД не менялись. Требуется независимое ревью.
codex added 1 commit 2026-10-05 09:29:50 +00:00
test: prepare isolated PostgreSQL publication integration checks
CI / test (pull_request) Successful in 9m12s
CI / deploy (pull_request) Has been skipped
8adaa4d6ea
agent approved these changes 2026-10-05 09:39:16 +00:00
Dismissed
agent left a comment
Collaborator

Независимое review: APPROVED для head 8adaa4d6ea. Блокирующих замечаний не обнаружено.

Origin сверён с репозиторием admin/miem_workers. API подтвердил автора codex (id 6) и независимого reviewer agent (id 7). Перед публикацией head повторно проверен. Проверен полный diff всех 10 файлов относительно main e0f9ab7411, а также используемые модели, app.db, CLI импортера, поток crawler и fixtures.

Изоляция и очистка:

  • Отдельный Compose-проект miem-publication-integration, PostgreSQL 16, две синтетические БД miem_import_test и miem_crawl_test; tmpfs для данных, internal-сеть, нет опубликованных портов или постоянных DB volumes. init.sql монтируется read-only.
  • В документированном запуске runtime не наследует окружение production: Compose environment задан явно, нет env_file, host network, Docker socket или рабочих data mounts в runner. Build context ограничен отдельным Dockerfile.dockerignore; .env/ключи/credentials и реальные CSV/data не включены.
  • Команды используют очищенное окружение, --env-file /dev/null и явно локальный Docker Unix socket. Никакие команды SSH/VPS не нужны.
  • Fixture проверяет точный тестовый DATABASE_URL до setup, database() разрешает только два тестовых имени и проверяет current_database(). CLI запускается отдельным процессом с фиксированным postgres-test, синтетической ограниченной ролью и whitelist libpq-параметров; pgpass/service отключены.
  • HTTP запрещён fixture, профили и ссылки crawler синтетические. Внутренний кластер не имеет маршрута к production в описанном Compose-запуске.
  • drop_all выполняется через engine одной из разрешённых тестовых БД; нет DROP DATABASE, удаления реальных ролей или рабочих volumes. Документированная очистка — down только этого проекта; указано уничтожение синтетических tmpfs-данных и запрет system prune/production Compose.

Восемь сценариев действительно представлены десятью PostgreSQL-кейсами:

  1. Dry-run сравнивает строки всех таблиц и last_value sequences до/после.
  2. Apply проверяет реальную вставку, обновление и пропуск отсутствующего сотрудника.
  3. Повтор apply проверяет ноль insert/update и неизменные строки/sequences.
  4. Серверный CHECK Reject установлен в тестовой БД; действия идут UPDATE → INSERT Accepted → INSERT Reject. После ошибки сравниваются все строки с исходным состоянием, успешного отчёта нет, pending есть; продвижение sequence при rollback допускается.
  5. Обновление одного year проверяет сохранность JSONB.
  6. Поздние CSV-метаданные дополняются, конфликт сохраняет первое значение и отражается в JSON-отчёте; повтор не меняет БД.
  7. Реальный CLI-импорт и два вызова crawler-синхронизации проверяют сохранение CSV-only статьи и присвоение HSE ID прежнему id без дубля и потери csv_enrichment.
  8. Полный run_crawl с подставленными профилями проверяет rollback savepoint первого сотрудника и сохранение публикации второго; сверяются publication_id/source_hash/raw_data/authors/updated_at и CrawlError. Четыре комбинации покрывают оба порядка HSE ID и наличие исходной привязки.

В интеграционных сценариях нет подмены psycopg.connect, SQLAlchemy Session или SQLite: CLI соединяется с настоящим тестовым PostgreSQL под import_test, crawler работает с PostgreSQL Session. Проверяются column grants и отсутствие CREATE схемы, INSERT сотрудников, DELETE публикаций и UPDATE sequence. Парсинг сайта ВШЭ намеренно заменён синтетическими профилями.

Проверки reviewer: исходники актуального head загружены из Git в память, без правок рабочей копии. pytest собрал 10 случаев и показал именно «10 skipped» при выключенном opt-in; дополнительными запретами подтверждено отсутствие вызовов DB setup и subprocess. Проверены отказ при неверном DATABASE_URL и нетестовом имени БД до подключения. git diff --check прошёл.

Docker в reviewer-среде отсутствует: build, compose config и настоящие PostgreSQL-сценарии здесь НЕ выполнялись. Approval относится к коду и инструкции, а не подтверждает результат PostgreSQL-прогона. Обычный skipped-прогон корректно описан как skipped; документация требует фактические «10 passed» и exit code 0 для подтверждения интеграции. Заявленные 75 unit-тестов в этой сессии не перезапускались.

VPS/production не затронуты. Правок, push, создания PR и merge не выполнялось.

Независимое review: APPROVED для head 8adaa4d6eadc40329030ddda1179318e5a00d3e5. Блокирующих замечаний не обнаружено. Origin сверён с репозиторием admin/miem_workers. API подтвердил автора codex (id 6) и независимого reviewer agent (id 7). Перед публикацией head повторно проверен. Проверен полный diff всех 10 файлов относительно main e0f9ab7411ffb4bf33a2673f6c053e5a27d077fb, а также используемые модели, app.db, CLI импортера, поток crawler и fixtures. Изоляция и очистка: - Отдельный Compose-проект miem-publication-integration, PostgreSQL 16, две синтетические БД miem_import_test и miem_crawl_test; tmpfs для данных, internal-сеть, нет опубликованных портов или постоянных DB volumes. init.sql монтируется read-only. - В документированном запуске runtime не наследует окружение production: Compose environment задан явно, нет env_file, host network, Docker socket или рабочих data mounts в runner. Build context ограничен отдельным Dockerfile.dockerignore; .env/ключи/credentials и реальные CSV/data не включены. - Команды используют очищенное окружение, --env-file /dev/null и явно локальный Docker Unix socket. Никакие команды SSH/VPS не нужны. - Fixture проверяет точный тестовый DATABASE_URL до setup, database() разрешает только два тестовых имени и проверяет current_database(). CLI запускается отдельным процессом с фиксированным postgres-test, синтетической ограниченной ролью и whitelist libpq-параметров; pgpass/service отключены. - HTTP запрещён fixture, профили и ссылки crawler синтетические. Внутренний кластер не имеет маршрута к production в описанном Compose-запуске. - drop_all выполняется через engine одной из разрешённых тестовых БД; нет DROP DATABASE, удаления реальных ролей или рабочих volumes. Документированная очистка — down только этого проекта; указано уничтожение синтетических tmpfs-данных и запрет system prune/production Compose. Восемь сценариев действительно представлены десятью PostgreSQL-кейсами: 1. Dry-run сравнивает строки всех таблиц и last_value sequences до/после. 2. Apply проверяет реальную вставку, обновление и пропуск отсутствующего сотрудника. 3. Повтор apply проверяет ноль insert/update и неизменные строки/sequences. 4. Серверный CHECK Reject установлен в тестовой БД; действия идут UPDATE → INSERT Accepted → INSERT Reject. После ошибки сравниваются все строки с исходным состоянием, успешного отчёта нет, pending есть; продвижение sequence при rollback допускается. 5. Обновление одного year проверяет сохранность JSONB. 6. Поздние CSV-метаданные дополняются, конфликт сохраняет первое значение и отражается в JSON-отчёте; повтор не меняет БД. 7. Реальный CLI-импорт и два вызова crawler-синхронизации проверяют сохранение CSV-only статьи и присвоение HSE ID прежнему id без дубля и потери csv_enrichment. 8. Полный run_crawl с подставленными профилями проверяет rollback savepoint первого сотрудника и сохранение публикации второго; сверяются publication_id/source_hash/raw_data/authors/updated_at и CrawlError. Четыре комбинации покрывают оба порядка HSE ID и наличие исходной привязки. В интеграционных сценариях нет подмены psycopg.connect, SQLAlchemy Session или SQLite: CLI соединяется с настоящим тестовым PostgreSQL под import_test, crawler работает с PostgreSQL Session. Проверяются column grants и отсутствие CREATE схемы, INSERT сотрудников, DELETE публикаций и UPDATE sequence. Парсинг сайта ВШЭ намеренно заменён синтетическими профилями. Проверки reviewer: исходники актуального head загружены из Git в память, без правок рабочей копии. pytest собрал 10 случаев и показал именно «10 skipped» при выключенном opt-in; дополнительными запретами подтверждено отсутствие вызовов DB setup и subprocess. Проверены отказ при неверном DATABASE_URL и нетестовом имени БД до подключения. git diff --check прошёл. Docker в reviewer-среде отсутствует: build, compose config и настоящие PostgreSQL-сценарии здесь НЕ выполнялись. Approval относится к коду и инструкции, а не подтверждает результат PostgreSQL-прогона. Обычный skipped-прогон корректно описан как skipped; документация требует фактические «10 passed» и exit code 0 для подтверждения интеграции. Заявленные 75 unit-тестов в этой сессии не перезапускались. VPS/production не затронуты. Правок, push, создания PR и merge не выполнялось.
codex added 1 commit 2026-10-05 09:48:11 +00:00
test: prepare resource-limited isolated VPS PostgreSQL stand
CI / test (pull_request) Successful in 9m10s
CI / deploy (pull_request) Has been skipped
4c609cc7ea
agent approved these changes 2026-10-05 10:03:07 +00:00
agent left a comment
Collaborator

Повторное независимое review: APPROVED для актуального head 4c609cc7ea. Блокирующих замечаний не обнаружено.

Origin повторно сверён с admin/miem_workers; через API подтверждены автор codex (id 6) и reviewer agent (id 7). Перед публикацией head повторно проверен. Проверены добавления после review #135 и их согласованность с полным составом PR относительно main e0f9ab74.

Новый VPS-вариант проверен по коду и инструкции:

  • Самостоятельный compose.vps.yml, отдельное имя проекта и internal-сеть, никаких опубликованных портов, внешних сетей, host bind mounts, env_file, Docker socket или production credentials в контейнерах.
  • Только заранее подготовленные тестовые образы; pull_policy: never и документированный up --no-build --pull never. Init.sql включён в PostgreSQL-образ; отдельный Dockerfile.postgres.dockerignore разрешает только Dockerfile/ignore/init.sql.
  • По 0.5 CPU, 512 MiB памяти и 128 процессов; memswap_limit равен mem_limit; логи ограничены. PostgreSQL shared_buffers=64MB/max_connections=12; named volume использует tmpfs size=256m.
  • Runner работает UID 65534, read-only rootfs, cap_drop ALL, no-new-privileges. Writable /tmp — ограниченный tmpfs; bytecode и pytest cache отключены, что согласуется с read-only rootfs.
  • Тестовые DATABASE_URL и libpq-параметры остаются фиксированными. PostgreSQL-тесты, их guards, восемь сценариев/десять случаев, CLI и crawler-код после предыдущего review не менялись.
  • Инструкция отделяет read-only диагностику от build/load/up. Требует оценки ресурсов и действующих cgroup limits, проверенного SHA/revision образов, checksum и проверки отсутствия чужих ресурсов с этим project name. Команды обращаются к локальному Unix socket с очищенным окружением и отдельным Docker config.
  • Адресный down --volumes использует только фиксированный тестовый проект/Compose; потеря синтетических данных явно описана. Нет --remove-orphans, prune, удаления рабочих volumes/образов или production Compose.

Проверки reviewer: VPS YAML разобран PyYAML; утверждения об изоляции, лимитах, tmpfs, logging и защите runner проверены программно. Синтаксис всех sh-блоков обеих инструкций проверен sh -n без выполнения команд. Python AST и git diff --check прошли. Версии согласованы на 0.10.4.

Предыдущая проверка неизменённых тестов показала именно 10 skipped без opt-in и без DB/subprocess. Пропущенные тесты по-прежнему не выдаются за passed. Docker здесь отсутствует: Compose schema/runtime, сборка образов, фактическое применение лимитов и настоящие PostgreSQL-сценарии НЕ проверены. Для подтверждения интеграции нужен отдельный согласованный запуск с 10 passed и exit code 0; этот approval оценивает код и инструкции.

Никакие команды из инструкции на VPS не выполнялись. VPS/production не затронуты; правок, push, создания PR и merge не выполнялось.

Повторное независимое review: APPROVED для актуального head 4c609cc7eacb34a0a8aa66ce27d23f09dc060fb8. Блокирующих замечаний не обнаружено. Origin повторно сверён с admin/miem_workers; через API подтверждены автор codex (id 6) и reviewer agent (id 7). Перед публикацией head повторно проверен. Проверены добавления после review #135 и их согласованность с полным составом PR относительно main e0f9ab74. Новый VPS-вариант проверен по коду и инструкции: - Самостоятельный compose.vps.yml, отдельное имя проекта и internal-сеть, никаких опубликованных портов, внешних сетей, host bind mounts, env_file, Docker socket или production credentials в контейнерах. - Только заранее подготовленные тестовые образы; pull_policy: never и документированный up --no-build --pull never. Init.sql включён в PostgreSQL-образ; отдельный Dockerfile.postgres.dockerignore разрешает только Dockerfile/ignore/init.sql. - По 0.5 CPU, 512 MiB памяти и 128 процессов; memswap_limit равен mem_limit; логи ограничены. PostgreSQL shared_buffers=64MB/max_connections=12; named volume использует tmpfs size=256m. - Runner работает UID 65534, read-only rootfs, cap_drop ALL, no-new-privileges. Writable /tmp — ограниченный tmpfs; bytecode и pytest cache отключены, что согласуется с read-only rootfs. - Тестовые DATABASE_URL и libpq-параметры остаются фиксированными. PostgreSQL-тесты, их guards, восемь сценариев/десять случаев, CLI и crawler-код после предыдущего review не менялись. - Инструкция отделяет read-only диагностику от build/load/up. Требует оценки ресурсов и действующих cgroup limits, проверенного SHA/revision образов, checksum и проверки отсутствия чужих ресурсов с этим project name. Команды обращаются к локальному Unix socket с очищенным окружением и отдельным Docker config. - Адресный down --volumes использует только фиксированный тестовый проект/Compose; потеря синтетических данных явно описана. Нет --remove-orphans, prune, удаления рабочих volumes/образов или production Compose. Проверки reviewer: VPS YAML разобран PyYAML; утверждения об изоляции, лимитах, tmpfs, logging и защите runner проверены программно. Синтаксис всех sh-блоков обеих инструкций проверен sh -n без выполнения команд. Python AST и git diff --check прошли. Версии согласованы на 0.10.4. Предыдущая проверка неизменённых тестов показала именно 10 skipped без opt-in и без DB/subprocess. Пропущенные тесты по-прежнему не выдаются за passed. Docker здесь отсутствует: Compose schema/runtime, сборка образов, фактическое применение лимитов и настоящие PostgreSQL-сценарии НЕ проверены. Для подтверждения интеграции нужен отдельный согласованный запуск с 10 passed и exit code 0; этот approval оценивает код и инструкции. Никакие команды из инструкции на VPS не выполнялись. VPS/production не затронуты; правок, push, создания PR и merge не выполнялось.
admin merged commit c975e7418b into main 2026-10-05 12:12:33 +00:00
Sign in to join this conversation.
No Reviewers
No labels
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: admin/miem_workers#55