#2121: Обновление PostgreSQL 14 → 18 для Swarmica
Отредактирована: сегодняДанная инструкция применима для версий Swarmica 6.1.2 и выше.
Инструкция
1. Создайте резервную копию базы данных:
cd /root/swarmica
# Полный логический дамп всех баз и ролей внутри контейнера
docker exec -it --env-file .env swarmica-postgres sh -c 'pg_dumpall -U $POSTGRES_USER > /backups/full_backup_pg14.sql'
# Копируем дамп на хост
docker cp swarmica-postgres:/backups/full_backup_pg14.sql /root/swarmica/
Проверьте резервную копию:
ls -lh /root/swarmica/full_backup_pg14.sql
grep -c "CREATE DATABASE" /root/swarmica/full_backup_pg14.sql
Если вторая команда вернула ≥ 1 — дамп содержит базы данных, всё в порядке.
2. Остановите сервисы Swarmica:
cd /root/swarmica
docker compose down
3. Удалите старый том данных:
PostgreSQL 18 не сможет запуститься на томе, инициализированном версией 14, — контейнер упадёт с ошибкой о несовместимости. Поэтому том надо удалить и создать заново.
docker volume rm swarmica_swarmica_postgres_data
4. Создайте новый пустой том:
docker volume create swarmica_swarmica_postgres_data
5. Отредактируйте docker-compose.yml. Откройте файл в текстовом редакторе и измените image и volume в сервисе postgres как показано ниже:
<...>
postgres:
image: postgres:18-bookworm # ← ИЗМЕНЕНО: было postgres:14.2-bullseye
container_name: swarmica-postgres
shm_size: 1gb
command: postgres -N 200 -c work_mem=8MB -c temp_buffers=16MB -c shared_buffers=1GB -c track_activity_query_size=16384
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
interval: 10s
timeout: 5s
retries: 5
start_period: 10s
restart: always
volumes:
- swarmica_postgres_data:/var/lib/postgresql:z # ← ИЗМЕНЕНО: было /var/lib/postgresql/data
<...>
6. Запустите только PostgreSQL 18:
docker compose up -d postgres
Дождитесь статуса healthy:
docker compose ps
docker compose logs postgres | tail -20
В логах должно быть database system is ready to accept connections. Это значит, что initdb создал новый кластер PostgreSQL 18 в свежем томе.
7. Скопируйте резервную копию БД из шага 1 внутрь контейнера:
docker cp /root/swarmica/full_backup_pg14.sql swarmica-postgres:/tmp/full_backup_pg14.sql
docker exec -it swarmica-postgres ls -lh /tmp/full_backup_pg14.sql
8. Восстановите данные из резервной копии:
docker exec -it swarmica-postgres sh -c 'psql -U $POSTGRES_USER -d postgres < /tmp/full_backup_pg14.sql'
9. Запустите остальные сервисы Swarmica:
cd /root/swarmica
docker compose up -d
10. Выполните завершающие процедуры:
docker exec --env-file .env -it swarmica-django-1 python manage.py post_start
11. Удалите временный дамп из контейнера:
docker exec -it swarmica-postgres rm /tmp/full_backup_pg14.sql
Дамп на хосте (/root/swarmica/full_backup_pg14.sql) оставьте на несколько дней как страховку. Удаляйте только после полной уверенности в стабильности.