#!/bin/sh set -e echo "=== Настройка репликации ===" echo "Этот узел: NODE_ID=${NODE_ID}" echo "Удаленный хост: ${REMOTE_HOST}" echo "Ждем локальную базу..." sleep 10 until PGPASSWORD="${POSTGRES_PASSWORD}" psql -h db -U "${POSTGRES_USER}" -d "${POSTGRES_DB}" -c '\q' 2>/dev/null; do echo "Локальная база не готова, ждем..." sleep 2 done echo "Локальная база готова" echo "Настройка генераторов ID (NODE_ID=${NODE_ID})..." PGPASSWORD="${POSTGRES_PASSWORD}" psql -h db -U "${POSTGRES_USER}" -d "${POSTGRES_DB}" </dev/null; do sleep 5 ELAPSED=$((ELAPSED + 5)) if [ $ELAPSED -ge $TIMEOUT ]; then echo "Таймаут ожидания удаленного хоста. Подписка НЕ настроена." echo "Публикация создана - удаленный хост сможет подписаться на нас." echo "Для создания подписки запустите позже:" echo "docker compose restart replication-setup" exit 0 fi echo "Удаленный хост недоступен, ждем... (${ELAPSED}s/${TIMEOUT}s)" done echo "Удаленный хост доступен" REMOTE_PUB=$(PGPASSWORD="${POSTGRES_PASSWORD}" psql -h "${REMOTE_HOST}" -p ${REMOTE_PORT} -U "${POSTGRES_USER}" -d "${POSTGRES_DB}" -tAc "SELECT COUNT(*) FROM pg_publication WHERE pubname = 'all_tables_pub';" 2>/dev/null || echo "0") if [ "$REMOTE_PUB" -eq 0 ]; then echo "ВНИМАНИЕ: На удалённом хосте нет публикации 'all_tables_pub'!" echo "Подписка не будет создана. Сначала запустите скрипт на удалённом хосте." exit 0 fi EXISTING=$(PGPASSWORD="${POSTGRES_PASSWORD}" psql -h db -U "${POSTGRES_USER}" -d "${POSTGRES_DB}" -tAc "SELECT COUNT(*) FROM pg_subscription WHERE subname = 'sub_from_remote';") if [ "$EXISTING" -gt 0 ]; then echo "Подписка уже существует, пропускаем создание" else echo "Создаем подписку на удаленный хост..." PGPASSWORD="${POSTGRES_PASSWORD}" psql -h db -U "${POSTGRES_USER}" -d "${POSTGRES_DB}" <