| @@ -1081,13 +1081,33 @@ matrix_bot_mjolnir_systemd_required_services_list: | | |||
| ###################################################################### | |||
| matrix_backup_borg_enabled: false | |||
| matrix_backup_borg_container_image_self_build: "{{ matrix_architecture not in ['amd64', 'arm32', 'arm64'] }}" | |||
| matrix_backup_borg_postgresql_enabled: "{{ matrix_postgres_enabled }}" | |||
| matrix_backup_borg_postgresql_databases_hostname: "{{ matrix_postgres_connection_hostname }}" | |||
| matrix_backup_borg_postgresql_databases_username: "{{ matrix_postgres_connection_username }}" | |||
| matrix_backup_borg_postgresql_databases_password: "{{ matrix_postgres_connection_password }}" | |||
| matrix_backup_borg_postgresql_databases_port: "{{ matrix_postgres_connection_port }}" | |||
| matrix_backup_borg_postgresql_databases: | | |||
| {{ | |||
| (([{ | |||
| 'name': matrix_synapse_database_database | |||
| }] if (matrix_synapse_enabled and matrix_synapse_database_database == matrix_postgres_db_name and matrix_synapse_database_host == 'matrix-postgres') else []) | |||
| + | |||
| matrix_postgres_additional_databases)|map(attribute='name')|list | |||
| }} | |||
| matrix_backup_borg_location_source_directories: | |||
| - "{{ matrix_base_data_path }}" | |||
| matrix_backup_borg_location_exclude_patterns: | | |||
| {{ | |||
| { | |||
| 'synapse': ["{{ matrix_synapse_media_store_path }}/local_thumbnails", "{{ matrix_synapse_media_store_path }}/remote_thumbnail", "{{ matrix_synapse_media_store_path }}/url_cache", "{{ matrix_synapse_media_store_path }}/url_cache_thumbnails"], | |||
| }[matrix_homeserver_implementation] | |||
| ([matrix_synapse_media_store_path + '/local_thumbnails', matrix_synapse_media_store_path + '/remote_thumbnail', matrix_synapse_media_store_path + '/url_cache', matrix_synapse_media_store_path + '/url_cache_thumbnails'] if matrix_homeserver_implementation == 'synapse' else []) | |||
| + | |||
| ([matrix_postgres_data_path] if matrix_postgres_enabled else []) | |||
| }} | |||
| matrix_backup_borg_systemd_required_services_list: | | |||
| {{ | |||
| ['docker.service'] | |||
| + | |||
| (['matrix-postgres.service'] if matrix_postgres_enabled else []) | |||
| }} | |||
| ###################################################################### | |||
| @@ -1,17 +1,17 @@ | |||
| --- | |||
| matrix_backup_borg_enabled: true | |||
| matrix_backup_borg_base_path: "{{ matrix_base_data_path }}/backup-borg" | |||
| matrix_backup_borg_config_path: "{{ matrix_backup_borg_base_path }}/config" | |||
| matrix_backup_borg_container_image_self_build: false | |||
| matrix_backup_borg_docker_repo: "https://github.com/borgmatic-collective/docker-borgmatic" | |||
| matrix_backup_borg_docker_src_files_path: "{{ matrix_base_data_path }}/borg/docker-src" | |||
| matrix_backup_borg_docker_src_files_path: "{{ matrix_backup_borg_base_path }}/docker-src" | |||
| matrix_backup_borg_version: latest | |||
| matrix_backup_borg_version: "" | |||
| matrix_backup_borg_docker_image: "{{ matrix_backup_borg_docker_image_name_prefix }}etke.cc/borgmatic:{{ matrix_backup_borg_version }}" | |||
| matrix_backup_borg_docker_image_name_prefix: "{{ 'localhost/' if matrix_backup_borg_container_image_self_build else 'registry.gitlab.com/' }}" | |||
| matrix_backup_borg_docker_image_force_pull: "{{ matrix_backup_borg_docker_image.endswith(':latest') }}" | |||
| matrix_backup_borg_base_path: "{{ matrix_base_data_path }}/backup-borg" | |||
| matrix_backup_borg_config_path: "{{ matrix_backup_borg_base_path }}/config" | |||
| matrix_backup_borg_docker_image_force_pull: "{{ matrix_backup_borg_docker_image.endswith(':latest') or matrix_backup_borg_version|default('') == '' }}" | |||
| # A list of extra arguments to pass to the container | |||
| matrix_backup_borg_container_extra_arguments: [] | |||
| @@ -28,6 +28,14 @@ matrix_backup_borg_schedule: "*-*-* 04:00:00" | |||
| # what directories should be added to backup | |||
| matrix_backup_borg_location_source_directories: [] | |||
| # postgres db backup | |||
| matrix_backup_borg_postgresql_enabled: true | |||
| matrix_backup_borg_postgresql_databases: [] | |||
| matrix_backup_borg_postgresql_databases_hostname: "matrix-postgres" | |||
| matrix_backup_borg_postgresql_databases_username: "matrix" | |||
| matrix_backup_borg_postgresql_databases_password: "" | |||
| matrix_backup_borg_postgresql_databases_port: 5432 | |||
| # target repositories | |||
| matrix_backup_borg_location_repositories: [] | |||
| @@ -61,3 +69,25 @@ matrix_backup_borg_retention_keep_yearly: 2 | |||
| # retention prefix | |||
| matrix_backup_borg_retention_prefix: "matrix-" | |||
| # Default borgmatic configuration template which covers the generic use case. | |||
| # You can customize it by controlling the various variables inside it. | |||
| # | |||
| # For a more advanced customization, you can extend the default (see `matrix_backup_borg_configuration_extension_yaml`) | |||
| # or completely replace this variable with your own template. | |||
| matrix_backup_borg_configuration_yaml: "{{ lookup('template', 'templates/config.yaml.j2') }}" | |||
| matrix_backup_borg_configuration_extension_yaml: | | |||
| # Your custom YAML configuration for borgmatic goes here. | |||
| # This configuration extends the default starting configuration (`matrix_borg_configuration_yaml`). | |||
| # | |||
| # You can override individual variables from the default configuration, or introduce new ones. | |||
| # | |||
| # If you need something more special, you can take full control by | |||
| # completely redefining `matrix_backup_borg_configuration_yaml`. | |||
| matrix_backup_borg_configuration_extension: "{{ matrix_backup_borg_configuration_extension_yaml|from_yaml if matrix_backup_borg_configuration_extension_yaml|from_yaml is mapping else {} }}" | |||
| # Holds the final borgmatic configuration (a combination of the default and its extension). | |||
| # You most likely don't need to touch this variable. Instead, see `matrix_backup_borg_configuration_yaml`. | |||
| matrix_backup_borg_configuration: "{{ matrix_backup_borg_configuration_yaml|from_yaml|combine(matrix_backup_borg_configuration_extension, recursive=True) }}" | |||
| @@ -1,4 +1,7 @@ | |||
| --- | |||
| - import_tasks: "{{ role_path }}/tasks/util/detect_existing_postgres_version.yml" | |||
| when: 'matrix_backup_borg_enabled|bool and matrix_backup_borg_postgresql_enabled|bool and matrix_postgres_backup_postgres_data_path != ""' | |||
| - name: Ensure borg paths exist | |||
| file: | |||
| path: "{{ item.path }}" | |||
| @@ -11,9 +14,9 @@ | |||
| - {path: "{{ matrix_backup_borg_docker_src_files_path }}", when: true} | |||
| when: "item.when|bool" | |||
| - name: Ensure borg config is created | |||
| template: | |||
| src: "{{ role_path }}/templates/config.yaml.j2" | |||
| - name: Ensure borgmatic config is created | |||
| copy: | |||
| content: "{{ matrix_backup_borg_configuration|to_nice_yaml(indent=2, width=999999) }}" | |||
| dest: "{{ matrix_backup_borg_config_path }}/config.yaml" | |||
| owner: "{{ matrix_user_username }}" | |||
| group: "{{ matrix_user_groupname }}" | |||
| @@ -0,0 +1,42 @@ | |||
| --- | |||
| # This utility aims to determine if there is some existing Postgres version in use or not. | |||
| # If there is, it also tries to detect the Docker image that corresponds to that version. | |||
| - name: Initialize Postgres version determination variables (default to empty) | |||
| set_fact: | |||
| matrix_backup_borg_postgresql_detection_pg_version_path: "{{ matrix_postgres_data_path }}/PG_VERSION" | |||
| matrix_backup_borg_postgresql_detected_existing: false | |||
| matrix_backup_borg_postgresql_detected_version: "" | |||
| matrix_backup_borg_version: "" | |||
| - name: Determine existing Postgres version (check PG_VERSION file) | |||
| stat: | |||
| path: "{{ matrix_backup_borg_postgresql_detection_pg_version_path }}" | |||
| register: result_pg_version_stat | |||
| - set_fact: | |||
| matrix_backup_borg_postgresql_detected_existing: true | |||
| when: "result_pg_version_stat.stat.exists" | |||
| - name: Determine existing Postgres version (read PG_VERSION file) | |||
| slurp: | |||
| src: "{{ matrix_backup_borg_postgresql_detection_pg_version_path }}" | |||
| register: result_pg_version | |||
| when: matrix_backup_borg_postgresql_detected_existing|bool | |||
| - name: Determine existing Postgres version (make sense of PG_VERSION file) | |||
| set_fact: | |||
| matrix_backup_borg_postgresql_detected_version: "{{ result_pg_version['content']|b64decode|replace('\n', '') }}" | |||
| when: matrix_backup_borg_postgresql_detected_existing|bool | |||
| - name: Determine corresponding Docker image version to detected version | |||
| set_fact: | |||
| matrix_backup_borg_version: "{{ matrix_backup_borg_postgresql_detected_version }}" | |||
| when: "matrix_backup_borg_postgresql_detected_version == '12' or matrix_backup_borg_postgresql_detected_version.startswith('12.') or matrix_backup_borg_postgresql_detected_version == '13' or matrix_backup_borg_postgresql_detected_version.startswith('13.') or matrix_backup_borg_postgresql_detected_version == '14' or matrix_backup_borg_postgresql_detected_version.startswith('14.')" | |||
| - name: Fail if existing Postgres version is not supported by borgmatic docker image | |||
| fail: | |||
| msg: >- | |||
| Your Postgres v{{ matrix_backup_borg_postgresql_detected_version }} is not supported. | |||
| when: "matrix_backup_borg_version == ''" | |||
| @@ -26,6 +26,16 @@ consistency: | |||
| - archives | |||
| hooks: | |||
| {% if matrix_backup_borg_postgresql_enabled %} | |||
| postgresql_databases: | |||
| {% for database in matrix_backup_borg_postgresql_databases %} | |||
| - name: {{ database }} | |||
| hostname: {{ matrix_backup_borg_postgresql_databases_hostname }} | |||
| username: {{ matrix_backup_borg_postgresql_databases_username }} | |||
| password: {{ matrix_backup_borg_postgresql_databases_password }} | |||
| port: {{ matrix_backup_borg_postgresql_databases_port }} | |||
| {% endfor %} | |||
| {% endif %} | |||
| after_backup: | |||
| - echo "Backup created." | |||
| on_error: | |||
| @@ -13,7 +13,6 @@ | |||
| - matrix-postgres | |||
| - matrix-redis | |||
| - matrix-corporal | |||
| - matrix-backup-borg | |||
| - matrix-bridge-appservice-discord | |||
| - matrix-bridge-appservice-slack | |||
| - matrix-bridge-appservice-webhooks | |||
| @@ -62,4 +61,5 @@ | |||
| - matrix-aux | |||
| - matrix-postgres-backup | |||
| - matrix-prometheus-postgres-exporter | |||
| - matrix-backup-borg | |||
| - matrix-common-after | |||