Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Mise à jour PostgreSQL #115

Open
njouanin opened this issue Mar 16, 2024 · 6 comments
Open

Mise à jour PostgreSQL #115

njouanin opened this issue Mar 16, 2024 · 6 comments
Assignees

Comments

@njouanin
Copy link
Collaborator

Mettre à jour la configuration docker pour utiliser une image plus récente de PostgreSQL (16+)

@rv2931
Copy link
Collaborator

rv2931 commented Mar 16, 2024

Le souci c'est que passer à du postgres pose des porblème de compatibilité avec les données
J'ai une erreur "The data directory was initialized by PostgreSQL version 14, which is not compatible with this version 16.2" au lancement du conteneur

et je peux même pas gérer ça dans le conteneur init vu que le conteneur postgres ne se lance pas
Idem avec une 15 The data directory was initialized by PostgreSQL version 14, which is not compatible with this version 15.6.'

A priori pour faire ça proprement va falloir créer un job docker/commande de migration dédié
https://pankajconnect.medium.com/how-to-migrate-your-postgresql-database-to-docker-a-practical-guide-6014fb066b8f

@rv2931
Copy link
Collaborator

rv2931 commented Mar 17, 2024

Ok.
Je pense qu'il y a moyen de faire une migration de donnée "assistée" avec une stack docker compose dédiée du genre:

docker compose -f docker-compose-migrate-data.yaml up
Et un fichier docker-compose-migrate-data.yml qui ressemblerait à ça (faut juste fixer le nom du volume postgres utilisé dans la stack standard pour qu'il soit le même que le volume migré):

x-common-infos:
  # Env variables stored in a .env file at same level than docker-compose.yaml
  environment: &common-env
    POSTGRES_HOSTNAME: ${POSTGRES_HOSTNAME:-postgres_bloom}
    POSTGRES_DB: ${POSTGRES_DB:-bloom_db}
    POSTGRES_USER: ${POSTGRES_USER:-bloom_user}
    POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-bloom}
    LOGGING_LEVEL: ${LOGGING_LEVEL:-INFO}

services:

  postgres-14:
    container_name: postgres_bloom_14
    image: ${POSTGIS_IMAGE:-postgis/postgis:14-3.3-alpine}
    environment:
      <<: *common-env
    networks:
        - bloom_net
    healthcheck:
      test: ['CMD-SHELL', "pg_isready --quiet --dbname=$${POSTGRES_DB:-bloom_db} --username=$${POSTGRES_USER:-bloom_user}"]
      interval: 100ms
      timeout: 14s
      retries: 140
      start_period: 0s
      
  
  postgres-16:
    container_name: postgres_bloom_16
    image: ${POSTGIS_IMAGE:-postgis/postgis:16}
    environment:
      <<: *common-env
    networks:
        - bloom_net
    healthcheck:
      test: ['CMD-SHELL', "pg_isready --quiet --dbname=$${POSTGRES_DB:-bloom_db} --username=$${POSTGRES_USER:-bloom_user}"]
      interval: 100ms
      timeout: 14s
      retries: 140
      start_period: 0s


  dump-postgres-14:
    container_name: migrate_from_14
    image: ${POSTGIS_IMAGE:-postgis/postgis:14-3.3-alpine}
    environment:
      <<: *common-env
    networks:
        - bloom_net
    volumes:
        #- bloom-data-migration-14:/var/lib/postgresql
        - ./data/migration:/migration
    command: >
        sh -c "
            export PGPASSWORD=${POSTGRES_PASSWORD}
            pg_dump --host postgres-14 -U ${POSTGRES_USER} --dbname ${POSTGRES_DB} > /migration/dump-14.sql
            "
    depends_on:
      postgres-14:
        condition: service_healthy
   
  restore-postgres-16:
    container_name: migrate_to_16
    image: ${POSTGIS_IMAGE:-postgis/postgis:16}
    environment:
      <<: *common-env
    networks:
        - bloom_net
    volumes:
        - bloom-postgres:/var/lib/postgresql
        - ./data/migration:/migration
    command: >
        sh -c "
            export PGPASSWORD=${POSTGRES_PASSWORD}
            psql --host postgres-16 -U ${POSTGRES_USER} --dbname ${POSTGRES_DB} < /migration/dump-14.sql
            "
    depends_on:
      postgres-16:
        condition: service_healthy
      dump-postgres-14:
        condition: service_completed_successfully

networks:
  bloom_net:
    name: bloom_net
    
volumes:
    bloom-data-migration-share:
    bloom-postgres:

Mise à jour du docker-compose.yaml standard:

[...]
  postgres:
[...]
    volumes:
        - bloom-postgres:/var/lib/postgresql
[...]
    
volumes:
    bloom-postgres:

@rv2931
Copy link
Collaborator

rv2931 commented Mar 17, 2024

Je trouve assez crade que le conteneur postgres crée un volume par défaut directement dans le dockerfile avec une directive volume
C'est assez nul car j'ai déjà eu le cas ou je ne souhaitais pas que les données soient persistantes et là ben tu ne peux pas. En plus tu ne peux pas fixer le nom du volume donc très difficile de savoir quel volume supprimer quand tu fais du docker volume ls/docker volume rm
Pas fan du tout, là postgres me déçoit un peu

@njouanin
Copy link
Collaborator Author

Le format des fichiers de la BDD sont incompatibles entre 2 versions majeures => il faut forcément passer par dump/restore.
C'est pas aussi simple que ?

  • dump Pg14 sur un volume externe
  • reconstruction du container en Pg16
  • restauration des données en Pg16 depuis le volume externe

Sinon, il y a un outil pg_upgrade qui peut faire le TAF, mais je n'ai jamais testé.

@rv2931
Copy link
Collaborator

rv2931 commented Mar 17, 2024

Oui c'est le principe du fichier docker compose que je propose mais si pg_upgrade fonctionne comme je le pense c'est une commande qu'il faudrait appeler systématiquement. Par contre idéalement faudrait proposer la même chose pour downgrader au cas où selon la procédure actuelle car il n'y pas de pg_downgrade et pg_upgrade ne downgrade pas

@njouanin
Copy link
Collaborator Author

pg_upgrade ou pas, c'est toujours bon de passer par un dump avant "au cas où" ...

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants