Files
LibraryAPI/setup-replication.sh

78 lines
2.8 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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}" <<EOF
DO \$\$
DECLARE
r RECORD;
BEGIN
FOR r IN
SELECT table_schema, table_name, column_name
FROM information_schema.columns
WHERE is_identity = 'YES'
AND table_schema = 'public'
LOOP
EXECUTE format(
'ALTER TABLE %I.%I ALTER COLUMN %I SET GENERATED BY DEFAULT AS IDENTITY (START WITH %s INCREMENT BY 2)',
r.table_schema, r.table_name, r.column_name, ${NODE_ID}
);
RAISE NOTICE 'Настроен ID для %.%', r.table_name, r.column_name;
END LOOP;
END \$\$;
EOF
echo "Ждем удаленный хост ${REMOTE_HOST}:${REMOTE_PORT}..."
TIMEOUT=300
ELAPSED=0
while ! PGPASSWORD="${POSTGRES_PASSWORD}" psql -h "${REMOTE_HOST}" -p ${REMOTE_PORT} -U "${POSTGRES_USER}" -d "${POSTGRES_DB}" -c '\q' 2>/dev/null; do
sleep 5
ELAPSED=$((ELAPSED + 5))
if [ $ELAPSED -ge $TIMEOUT ]; then
echo "Таймаут ожидания удаленного хоста. Репликация НЕ настроена."
echo "Вы можете запустить этот скрипт вручную позже:"
echo "docker compose restart replication-setup"
exit 0
fi
echo "Удаленный хост недоступен, ждем... (${ELAPSED}s/${TIMEOUT}s)"
done
echo "Удаленный хост доступен"
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}" <<EOF
CREATE SUBSCRIPTION sub_from_remote
CONNECTION 'host=${REMOTE_HOST} port=${REMOTE_PORT} user=${POSTGRES_USER} password=${POSTGRES_PASSWORD} dbname=${POSTGRES_DB}'
PUBLICATION all_tables_pub
WITH (
origin = none
);
EOF
echo "Подписка создана!"
fi
echo ""
echo "Репликация настроена!"
echo "Этот узел (${NODE_ID}) теперь синхронизирован с ${REMOTE_HOST}"