# PostgreSQL-проверка на отдельном стенде VPS Команды выполняет владелец под root. Подготовка не подключается к VPS и не запускает стенд. Не используйте production Compose/`.env`, Docker context, volumes, сети, mounts или production credentials. Никаких production-ролей БД, SSH-ключей и правил firewall эти команды не создают и не изменяют. ## Сначала только read-only проверка Следующий блок не создаёт контейнеров, не скачивает образов и не меняет данные. Docker CLI использует локальный Unix socket и очищенное окружение; конфигурация CLI указывает на отдельный каталог, который здесь не создаётся. ```sh free -h nproc uptime df -h / /var/lib/docker env -i PATH="$PATH" docker --config /root/miem-publication-integration/docker-config --host unix:///var/run/docker.sock info --format 'CPUs={{.NCPU}} RAM_bytes={{.MemTotal}} cgroup={{.CgroupVersion}} DockerRootDir={{.DockerRootDir}} warnings={{json .Warnings}}' env -i PATH="$PATH" docker --config /root/miem-publication-integration/docker-config --host unix:///var/run/docker.sock compose version env -i PATH="$PATH" docker --config /root/miem-publication-integration/docker-config --host unix:///var/run/docker.sock stats --no-stream --format 'table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.PIDs}}' env -i PATH="$PATH" docker --config /root/miem-publication-integration/docker-config --host unix:///var/run/docker.sock image inspect postgres:16-alpine python:3.12-slim miem-publication-integration-postgres:pr55 miem-publication-integration-runner:pr55 --format '{{.RepoTags}} id={{.Id}} revision={{index .Config.Labels "org.opencontainers.image.revision"}}' ``` Как читать результат: - `free`: нужна колонка **available**, а не только free. Предварительный запас — не менее 2 GiB: стенд ограничен суммарно 1 GiB, ещё минимум 1 GiB остаётся системе/сервисам. Это ориентир, решение зависит от их нагрузки и пиков. - `nproc` и `uptime`: сравните число CPU и load average. Постоянный load на уровне числа CPU или выше — основание отложить тест, а не останавливать сервисы. - `df`: желательно не менее 4 GiB свободно для загрузки образов и запаса работы Docker. Если DockerRootDir отличается от `/var/lib/docker`, отдельно выполните `df -h` для показанного каталога. Не используйте prune для освобождения места. - `stats`: показывает потребление уже работающих контейнеров, но не их пиковые требования. Docker warnings о недоступных memory/swap/cgroup limits нужно устранить до запуска; без действующих лимитов этот вариант не запускать. - `image inspect`: существующие образы показывают tags, ID и revision. `No such image` означает отсутствие образа, **не** разрешение на pull/build. Для запуска нужны два образа `miem-publication-integration-*:pr55` с revision проверенного commit PR #55. Base-образы нужны только для сборки, не для самого запуска уже подготовленного стенда. Пришлите только этот диагностический вывод. Не присылайте `docker inspect` production-контейнеров целиком, env, конфигурации подключения или секреты. До оценки ресурсов и завершения независимого review остальные действия ниже не выполнять. ## Изоляция и лимиты подготовленного стенда Используется только `tests/postgres/compose.vps.yml`, не override production или локального Compose. Project name фиксирован: `miem-publication-integration-vps`. | Ресурс | Лимит / область | |---|---| | PostgreSQL | Отдельный контейнер `postgres-test`, 0.5 CPU, 512 MiB RAM, без дополнительного swap, 128 процессов | | PostgreSQL настройки | shared_buffers 64 MiB, max_connections 12 | | Test runner | 0.5 CPU, 512 MiB RAM, без дополнительного swap, 128 процессов; UID 65534, read-only rootfs, no-new-privileges, без capabilities | | Данные PostgreSQL | Только named volume `miem-publication-integration-vps_pgdata`; local driver tmpfs до 256 MiB | | Временные файлы runner | tmpfs `/tmp` до 128 MiB; входят в memory limit контейнера | | Сеть | Только `miem-publication-integration-vps_isolated`, internal; опубликованных портов нет | | Логи | json-file, до 5 MiB на контейнер, один файл | Volume с tmpfs выбран намеренно: отдельное имя для адресной очистки и предел размера синтетических данных. Данные не сохраняются после остановки/размонтирования. Образы содержат только код и синтетический init.sql. Host bind mounts, Docker socket, production networks и env_file отсутствуют. Docker socket доступен только CLI владельца на хосте, ни одному контейнеру он не передаётся. Нет restart policy. Pull запрещён; ресурсы не создаются автоматически при отсутствии заранее подготовленного образа. Лимиты процесса сборки/загрузки образов отличаются от runtime: Compose CPU/RAM limits **не ограничивают Docker build**. Поэтому на VPS с рабочими сервисами не выполняйте незапланированную сборку. Если готовых образов нет, отдельно согласуйте место сборки и окно загрузки после read-only диагностики. ## Подготовка образов после review (не запуск стенда) На отдельной согласованной машине сборки с Docker, из проверенной копии PR #55, укажите полный SHA проверенного commit в переменной `TEST_COMMIT` (не секрет). Сначала `git status --short` должен быть пустым, `git rev-parse HEAD` — совпадать с TEST_COMMIT. Это не команды для немедленного выполнения на VPS. ```sh git status --short git rev-parse HEAD env -i PATH="$PATH" docker --host unix:///var/run/docker.sock build --label org.opencontainers.image.revision="$TEST_COMMIT" -t miem-publication-integration-runner:pr55 -f tests/postgres/Dockerfile . env -i PATH="$PATH" docker --host unix:///var/run/docker.sock build --label org.opencontainers.image.revision="$TEST_COMMIT" -t miem-publication-integration-postgres:pr55 -f tests/postgres/Dockerfile.postgres tests/postgres env -i PATH="$PATH" docker --host unix:///var/run/docker.sock image save --output miem-publication-integration-images.tar miem-publication-integration-postgres:pr55 miem-publication-integration-runner:pr55 sha256sum miem-publication-integration-images.tar tests/postgres/compose.vps.yml ``` Dockerfile-specific ignore-файлы исключают секреты, реальные CSV и остальные файлы workspace из обоих контекстов сборки. Передайте владельцу только архив этих двух образов и `compose.vps.yml` с проверенными SHA256, без полного workspace и `.env`. Транспорт выбирает владелец; инструкция не получает SSH/production credentials. Base-образы могут скачиваться только на согласованной машине сборки. На VPS после оценки ресурсов/отдельного разрешения владельца: файлы размещаются в `/root/miem-publication-integration`, Compose переименован в `compose.vps.yml`, архив — в `images.tar`. Проверка checksum должна совпасть с источником. ```sh install -d -m 700 /root/miem-publication-integration /root/miem-publication-integration/docker-config sha256sum /root/miem-publication-integration/images.tar /root/miem-publication-integration/compose.vps.yml env -i PATH="$PATH" docker --config /root/miem-publication-integration/docker-config --host unix:///var/run/docker.sock image load --input /root/miem-publication-integration/images.tar env -i PATH="$PATH" docker --config /root/miem-publication-integration/docker-config --host unix:///var/run/docker.sock image inspect miem-publication-integration-postgres:pr55 miem-publication-integration-runner:pr55 --format '{{.RepoTags}} id={{.Id}} revision={{index .Config.Labels "org.opencontainers.image.revision"}}' env -i PATH="$PATH" docker --config /root/miem-publication-integration/docker-config --host unix:///var/run/docker.sock compose --env-file /dev/null --project-name miem-publication-integration-vps -f /root/miem-publication-integration/compose.vps.yml config --quiet ``` Проверьте отсутствие уже существующих ресурсов с этим project name. Если они есть, выясните их назначение; не запускайте второй стенд и не удаляйте чужие ресурсы. Следующие команды только читают labels Docker Compose: ```sh env -i PATH="$PATH" docker --config /root/miem-publication-integration/docker-config --host unix:///var/run/docker.sock ps -a --filter label=com.docker.compose.project=miem-publication-integration-vps env -i PATH="$PATH" docker --config /root/miem-publication-integration/docker-config --host unix:///var/run/docker.sock network ls --filter label=com.docker.compose.project=miem-publication-integration-vps env -i PATH="$PATH" docker --config /root/miem-publication-integration/docker-config --host unix:///var/run/docker.sock volume ls --filter label=com.docker.compose.project=miem-publication-integration-vps ``` ## Запуск и адресная очистка (пока не выполнять) Только после согласования владельцем ресурсов и проверенного состава стенда: ```sh env -i PATH="$PATH" docker --config /root/miem-publication-integration/docker-config --host unix:///var/run/docker.sock compose --env-file /dev/null --project-name miem-publication-integration-vps -f /root/miem-publication-integration/compose.vps.yml up --no-build --pull never --abort-on-container-exit --exit-code-from tests ``` Ожидаемый успех — `10 passed`, exit code 0. Сохраните вывод/код выхода и логи: ```sh env -i PATH="$PATH" docker --config /root/miem-publication-integration/docker-config --host unix:///var/run/docker.sock compose --env-file /dev/null --project-name miem-publication-integration-vps -f /root/miem-publication-integration/compose.vps.yml logs --no-color > /root/miem-publication-integration/test.log ``` **Следующая команда удаляет контейнеры, внутреннюю сеть и named volume именно этого теста; все его синтетические данные будут потеряны.** Перед ней сохраните отчёт. Она не затрагивает ресурсы других Compose-проектов: ```sh env -i PATH="$PATH" docker --config /root/miem-publication-integration/docker-config --host unix:///var/run/docker.sock compose --env-file /dev/null --project-name miem-publication-integration-vps -f /root/miem-publication-integration/compose.vps.yml down --volumes ``` Не используйте `--remove-orphans`, `docker system prune`, общие rm/rmi/volume prune или down рабочего проекта. Base-образы и образы теста оставьте: они могут быть общими для других проверок. Архив и журнал также не удаляются этой командой. Для подтверждения очистки повторите три read-only команды с project label: в выводе должны остаться только заголовки. ## Статус VPS-стенд не запускался, Docker/Compose-проверка не выполнялась в среде подготовки из-за отсутствия Docker. PostgreSQL-интеграция ещё не подтверждена.