# Обновление PostgreSQL 14 → 18 для Swarmica
:::caution
Данная инструкция применима для версий Swarmica 6.1.2 и выше.
:::

## Инструкция

1\. Создайте резервную копию базы данных:

```bash
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/
```

Проверьте резервную копию:

```bash
ls -lh /root/swarmica/full_backup_pg14.sql
grep -c "CREATE DATABASE" /root/swarmica/full_backup_pg14.sql
```

Если вторая команда вернула ≥ 1 — дамп содержит базы данных, всё в порядке.

2\. Остановите сервисы Swarmica:

```bash
cd /root/swarmica
docker compose down
```

3\. Удалите старый том данных:

PostgreSQL 18 **не сможет запуститься** на томе, инициализированном версией 14, — контейнер упадёт с ошибкой о несовместимости. Поэтому том надо удалить и создать заново.

```bash
docker volume rm swarmica_swarmica_postgres_data
```

4\. Создайте новый пустой том:

```bash
docker volume create swarmica_swarmica_postgres_data
```

5\. Отредактируйте `docker-compose.yml`. Откройте файл в текстовом редакторе и измените `image` и `volume` в сервисе `postgres` как показано ниже:

```yaml
<...>
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:

```bash
docker compose up -d postgres
```

Дождитесь статуса `healthy`:

```bash
docker compose ps
docker compose logs postgres | tail -20
```

В логах должно быть `database system is ready to accept connections`. Это значит, что `initdb` создал новый кластер PostgreSQL 18 в свежем томе.

7\. Скопируйте резервную копию БД из шага 1 внутрь контейнера:

```bash
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\. Восстановите данные из резервной копии:

```bash
docker exec -it swarmica-postgres sh -c 'psql -U $POSTGRES_USER -d postgres < /tmp/full_backup_pg14.sql'
```

9\. Запустите остальные сервисы Swarmica:

```bash
cd /root/swarmica
docker compose up -d
```

10\. Выполните завершающие процедуры:

```txt
docker exec --env-file .env -it swarmica-django-1 python manage.py post_start
```

11\. Удалите временный дамп из контейнера:

```bash
docker exec -it swarmica-postgres rm /tmp/full_backup_pg14.sql
```

Дамп на хосте (`/root/swarmica/full_backup_pg14.sql`) **оставьте** на несколько дней как страховку. Удаляйте только после полной уверенности в стабильности.