Append YAML file with docker-compose definition for new PostgreSQL 18 database:
nextcloud-postgres18:
container_name: nextcloud-postgres18
hostname: nextcloud-postgres18
image: postgres:18-alpine
restart: always
volumes:
- /data/nextcloud-postgresql18-data64:/var/lib/postgresql
environment:
- POSTGRES_PASSWORD=
- POSTGRES_DB=nextcloud
- POSTGRES_USER=nextcloud
container_name: nextcloud-postgres18
hostname: nextcloud-postgres18
image: postgres:18-alpine
restart: always
volumes:
- /data/nextcloud-postgresql18-data64:/var/lib/postgresql
environment:
- POSTGRES_PASSWORD=
- POSTGRES_DB=nextcloud
- POSTGRES_USER=nextcloud
Prepare new directory for PostgreSQL 18 data:
mkdir /data/nextcloud-postgresql18-data64
chown postgres: /data/nextcloud-postgresql18-data64/
chown postgres: /data/nextcloud-postgresql18-data64/
Stop and remove current containers:
docker compose -f /root/docker-compose-nextcloud.yml stop
docker compose -f /root/docker-compose-nextcloud.yml rm
docker compose -f /root/docker-compose-nextcloud.yml rm
Start only containers with old PostgreSQL 17 and new PostgreSQL 18
docker compose -f /root/docker-compose-nextcloud.yml up --build nextcloud-postgres -d
docker compose -f /root/docker-compose-nextcloud.yml up --build nextcloud-postgres18 -d
docker compose -f /root/docker-compose-nextcloud.yml up --build nextcloud-postgres18 -d
Dump old database content directly to new database using pipe:
docker exec -it nextcloud-postgres17 pg_dumpall -U nextcloud | docker exec -i nextcloud-postgres18 psql -U nextcloud
Stop services (both old and new database):
docker compose -f /root/docker-compose-nextcloud.yml stop
docker compose -f /root/docker-compose-nextcloud.yml rm
docker compose -f /root/docker-compose-nextcloud.yml rm
Remove old PostgreSQL container defintion from YAML docker-compose file, change service name from "nextcloud-postgres18" to "nextcloud-postgres".
Start all services again:
docker compose -f /root/docker-compose-nextcloud.yml up -d --remove-orphans