--- # We used to store Postgres data directly under `/matrix/postgres` (what is now considered `matrix_postgres_base_path`). # # From now on, we expect to store Postgres data one directory below now (`/matrix/postgres/data` - `matrix_postgres_data_path`). # We wish to use the base directory for other purposes (storing environment variable files, etc.). # Mixing those with the Postgres data is no good and it leads to Postgres's `initdb` complaining to initialize # a database in a non-empty directory. # # For this reason, we store the Postgres data in `/matrix/postgres/data` and need to relocate any installations # which still store it in the parent directory (`/matrix/postgres`). # # This utility is intentionally not in `tasks/util`, because if it were, it wouldn't be possible # to include it in other roles via the import_role module: https://docs.ansible.com/ansible/latest/collections/ansible/builtin/import_role_module.html - name: Check if old Postgres data directory is used ansible.builtin.stat: path: "{{ matrix_postgres_base_path }}/PG_VERSION" register: result_pg_old_data_dir_stat - name: Warn if old Postgres data directory detected ansible.builtin.debug: msg: > Found that you have Postgres data in `{{ matrix_postgres_base_path }}`. From now on, Postgres data is supposed to be stored in `{{ matrix_postgres_data_path }}` instead. We'll stop Postgres and relocate the files there for you. when: "result_pg_old_data_dir_stat.stat.exists" # We should stop Postgres first, before building a list of files, # as to ignore any `postmaster.pid` files, etc. - name: Ensure matrix-postgres is stopped ansible.builtin.service: name: matrix-postgres state: stopped daemon_reload: true when: "result_pg_old_data_dir_stat.stat.exists" - name: Find files and directories in old Postgres data path ansible.builtin.find: paths: "{{ matrix_postgres_base_path }}" file_type: any excludes: ["data"] register: "result_pg_old_data_dir_find" when: "result_pg_old_data_dir_stat.stat.exists" - name: Ensure new Postgres data path exists ansible.builtin.file: path: "{{ matrix_postgres_data_path }}" state: directory mode: 0700 owner: "{{ matrix_user_username }}" group: "{{ matrix_user_groupname }}" when: "result_pg_old_data_dir_stat.stat.exists" - when: "result_pg_old_data_dir_stat.stat.exists" block: - name: Relocate Postgres data files from old directory to new ansible.builtin.command: cmd: "mv {{ item.path }} {{ matrix_postgres_data_path }}/{{ item.path | basename }}" with_items: "{{ result_pg_old_data_dir_find.files }}" register: matrix_postgres_migrate_postgres_data_directory_move_result changed_when: matrix_postgres_migrate_postgres_data_directory_move_result.rc == 0 # Intentionally not starting matrix-postgres here. # It likely needs to be updated to point to the new directory. # In fact, let's even get rid of the outdated service, to ensure no one will start it # and have it initialize a new database. - name: Ensure outdated matrix-postgres.service doesn't exist ansible.builtin.file: path: "{{ devture_systemd_docker_base_systemd_path }}/matrix-postgres.service" state: absent when: "result_pg_old_data_dir_stat.stat.exists" - name: Ensure systemd reloaded after getting rid of outdated matrix-postgres.service ansible.builtin.service: daemon_reload: true when: "result_pg_old_data_dir_stat.stat.exists"