13 KiB
PostgreSQL-проверка на отдельном стенде VPS
Команды выполняет владелец под root. Подготовка не подключается к VPS и не
запускает стенд. Не используйте production Compose/.env, Docker context,
volumes, сети, mounts или production credentials. Никаких production-ролей БД,
SSH-ключей и правил firewall эти команды не создают и не изменяют.
Сначала только read-only проверка
Следующий блок не создаёт контейнеров, не скачивает образов и не меняет данные. Docker CLI использует локальный Unix socket и очищенное окружение; конфигурация CLI указывает на отдельный каталог, который здесь не создаётся.
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.
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 должна совпасть с источником.
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:
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
Запуск и адресная очистка (пока не выполнять)
Только после согласования владельцем ресурсов и проверенного состава стенда:
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. Сохраните вывод/код выхода и логи:
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-проектов:
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-интеграция ещё не подтверждена.