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