1a6f326aa4
Локально гоняем mongo как standalone. Раньше был --replSet rs0 +
rs.initiate в entrypoint, но проект не использует ни transactions
(нет startSession), ни change streams (нет .watch()), ни
readConcern:'majority' — replica-set серверно избыточен. Клиенты
(mongoose в controller, MongoClient в parser, notifications) уже
подключаются по URL без replicaSet=/directConnection= параметров,
для них переход прозрачен.
Бонусы:
- pnpm run reboot больше не висит на «MongoDB еще не готов
(нет PRIMARY)»: на arm64 sleep 5 в entrypoint не успевал поднять
mongod до того, как rs.initiate пытался выполниться, и rs.status()
внутри try/catch ловил неправильную ошибку — replica config не
применялся, oplog.rs не создавался, PRIMARY никогда не наступал
(инцидент 2026-05-23).
- Старт mongo на 5-10 сек быстрее.
- Меньше состояния в volume — нет oplog/replica-config.
reboot.sh: ждать db.adminCommand({ping:1}) вместо db.hello().isWritablePrimary.
Прод-конфигурация (k8s/swarm) этого файла не использует — там
своя replica-схема для HA, не затронута.
Если в будущем потребуются transactions — вернуть --replSet rs0
+ rs.initiate в entrypoint обратно. Триггер: появление в коде
session = await mongoose.startSession() или .watch().
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
58 lines
2.2 KiB
Bash
Executable File
58 lines
2.2 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# Загружаем per-instance конфиг из корня репо (для CHAIN_URL/MONGODB_URL/API_URL,
|
|
# которые читают TS-код boot и шелл-скрипты networks.sh/preactivate.sh).
|
|
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../../.." && pwd)"
|
|
if [ -f "$ROOT_DIR/.env" ]; then
|
|
set -a
|
|
# shellcheck disable=SC1091
|
|
source "$ROOT_DIR/.env"
|
|
set +a
|
|
fi
|
|
|
|
# Останавливаем и удаляем контейнеры вместе с volumes
|
|
echo "Останавливаем и удаляем контейнеры с volumes..."
|
|
docker compose down -v mongo postgres monoredis cooparser coopback || true
|
|
|
|
# Останавливаем blockchain контейнер перед удалением данных
|
|
echo "Останавливаем blockchain контейнер..."
|
|
docker compose stop node || true
|
|
|
|
# Удаляем blockchain data
|
|
echo "Удаляем blockchain data..."
|
|
# sudo chmod -R 755 ../blockchain-data/ 2>/dev/null || true
|
|
docker run --rm -v "$(cd .. && pwd)/blockchain-data:/d" alpine sh -c 'rm -rf /d/* /d/.[!.]* 2>/dev/null || true'
|
|
|
|
# Пересоздаем и запускаем базы данных
|
|
echo "Пересоздаем и запускаем базы данных..."
|
|
docker compose up -d mongo postgres monoredis
|
|
|
|
# Ждем готовности MongoDB (standalone, ping вместо ожидания PRIMARY).
|
|
echo "Ждем готовности MongoDB..."
|
|
until docker compose exec -T mongo mongosh --quiet --eval "db.adminCommand({ping:1}).ok" > /dev/null 2>&1; do
|
|
echo "MongoDB еще не готов, ждем..."
|
|
sleep 2
|
|
done
|
|
echo "MongoDB готов!"
|
|
|
|
# Ждем готовности PostgreSQL
|
|
echo "Ждем готовности PostgreSQL..."
|
|
until docker compose exec -T postgres pg_isready -U postgres -d voskhod > /dev/null 2>&1; do
|
|
echo "PostgreSQL еще не готов, ждем..."
|
|
sleep 2
|
|
done
|
|
echo "PostgreSQL готов!"
|
|
|
|
# Запускаем boot процесс
|
|
echo "Запускаем boot процесс..."
|
|
pnpm run boot
|
|
|
|
# Запускаем parser
|
|
echo "Запускаем parser..."
|
|
docker compose up -d cooparser
|
|
|
|
echo "Запускаем контроллер..."
|
|
docker compose up -d --force-recreate coopback || true
|
|
|
|
echo "Перезапуск завершен!"
|