Files
miem_workers/docs/postgresql-import-vps.md
T
codex 4c609cc7ea
CI / test (pull_request) Successful in 9m10s
CI / deploy (pull_request) Has been skipped
test: prepare resource-limited isolated VPS PostgreSQL stand
2026-10-05 12:48:06 +03:00

13 KiB
Raw Blame History

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-интеграция ещё не подтверждена.