make pg-upgrade: она делает всё сама и ничего не удаляет.
Новая установка? Ничего делать не нужно:
docker compose up -d сразу поднимет PostgreSQL 18.Как понять, что вам нужно обновление
Обновление нужно, если бот уже работал у вас на PostgreSQL 15, а вdocker-compose.yml после git pull стоит image: postgres:18-alpine.
Если после обновления бот не запускается, а в логах базы (docker compose logs postgres) такое сообщение:
Перенос
1
Обновите бота
2
Запустите перенос
make не установлен: bash scripts/pg-upgrade.sh.Скрипт покажет, что собирается сделать — какие тома, какая база, сколько данных, — и попросит подтверждения. Ответьте y.3
Дождитесь «✅ Готово»
Бот будет остановлен на время переноса — обычно минута-другая, на больших базах дольше. В конце скрипт сам соберёт и запустит бота и напечатает, где лежит резервная копия и как откатиться.
Что делает make pg-upgrade
- Проверяет, что места на диске хватит на резервную копию и новую базу.
- Останавливает бота и базу, чтобы во время переноса никто не писал в базу.
- Снимает полную резервную копию в
backups/postgres-upgrade-<дата>/и проверяет, что она читается. - Запоминает, сколько строк в каждой таблице и какие значения у счётчиков.
- Разворачивает PostgreSQL 18 в новом томе и восстанавливает туда копию.
- Сверяет строки и счётчики один в один. Если хоть что-то не сошлось — новый том удаляется, и всё остаётся как было.
- Запускает базу на PostgreSQL 18, ещё раз сверяет данные, затем собирает и запускает бота.
<проект>_postgres_data) не удаляется и не меняется — это ваш откат.
Запускать повторно безопасно: если перенос уже сделан, скрипт напишет «Перенос уже выполнен» и ничего не тронет.
Параметры
Через
make параметры передаются так: make pg-upgrade ARGS="--yes --no-bot".
Откат на PostgreSQL 15
Если после перехода что-то не так:Когда всё работает
Через неделю-другую, убедившись, что всё в порядке, можно освободить место на диске:Если что-то пошло не так
«Мало места для Docker» или «Мало места для резервной копии»
«Мало места для Docker» или «Мало места для резервной копии»
Скрипт проверяет место до начала переноса и ничего не меняет, если его не хватает. Освободите диск (например,
docker system prune удаляет неиспользуемые образы) и запустите make pg-upgrade ещё раз.«Пользователь ... не найден в старой базе»
«Пользователь ... не найден в старой базе»
Значит,
POSTGRES_USER в .env изменили после установки бота. Верните в .env значение, с которым база создавалась, и запустите перенос ещё раз.«После восстановления база не совпадает с исходной»
«После восстановления база не совпадает с исходной»
Перенос остановлен, новый том удалён, старая база не тронута. Подробности расхождения — в файле
*.diff.txt в папке резервной копии. Пришлите его в чат поддержки.Перенос прервался (обрыв SSH, перезагрузка сервера)
Перенос прервался (обрыв SSH, перезагрузка сервера)
Старая база не тронута. Недоделанный новый том скрипт удаляет сам; если прерывание было жёстким, просто запустите
make pg-upgrade ещё раз.Бот не запустился после «✅ Готово»
Бот не запустился после «✅ Готово»
База перенесена и сверена. Посмотрите логи бота:
docker compose logs bot. Запустить вручную: docker compose up -d --build.Свои установки
- Свой
docker-compose.ymlилиdocker-compose.override.yml. Образpostgres:18хранит данные в/var/lib/postgresql/18/docker, поэтому том монтируется в/var/lib/postgresql, а не в/var/lib/postgresql/data, как раньше. Со старым путём данные окажутся вне тома и пропадут при пересоздании контейнера. Актуальный пример — в разделе Docker развёртывание. - Внешняя база (не из compose бота). Скрипт вам не нужен: переносите её привычным для вашего хостинга способом. Бот работает и с PostgreSQL 15, и с 18.
