Skip to content
Extraits de code Groupes Projets
Valider 32ab5c5e rédigé par Théo - Le Filament's avatar Théo - Le Filament
Parcourir les fichiers

change: improve docker compose and CRON for backups

parent 3a9c91ef
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
- name: "Set empty lists to trigger actions on instances" - name: "Set empty lists to trigger actions on instances"
tags: tags:
- "docker_metabase"
- "docker_metabase_restart" - "docker_metabase_restart"
- "docker_proxy" - "docker_proxy"
set_fact: set_fact:
...@@ -87,7 +88,7 @@ ...@@ -87,7 +88,7 @@
template_metabase_instance_setup: "{{ metabase_instance_setup }}" template_metabase_instance_setup: "{{ metabase_instance_setup }}"
ansible.builtin.template: ansible.builtin.template:
src: "backup.yaml.j2" src: "backup.yaml.j2"
dest: "/home/docker/backups/backup-metabase_{{ template_metabase_instance.key }}{{ template_backup_account.key }}.yaml" dest: "/home/docker/backups/backup-metabase_{{ template_metabase_instance.key }}_{{ template_backup_account.key }}.yaml"
owner: "root" owner: "root"
group: "root" group: "root"
mode: "0400" mode: "0400"
...@@ -107,15 +108,29 @@ ...@@ -107,15 +108,29 @@
item: "{{ item_account_instance.1 }}" item: "{{ item_account_instance.1 }}"
template_backup_account: "{{ item_account_instance.0 }}" template_backup_account: "{{ item_account_instance.0 }}"
template_metabase_instance: "{{ metabase_instance }}" template_metabase_instance: "{{ metabase_instance }}"
# Compute a timestamp: time_start + index * (time_slot_duration - time_max_duration) / (#instance_to_backup - 1)
template_backup_timestamp: >
{{
(
('1970-01-01 ' + metabase_backup_config.time_start) | to_datetime
).timestamp()
+ ansible_loop.index0 * (
(
(metabase_backup_config.time_slot_duration | community.general.to_seconds)
- (metabase_backup_config.time_max_duration | community.general.to_seconds)
) / (ansible_loop.length - 1)
)
}}
ansible.builtin.cron: ansible.builtin.cron:
name: "backup metabase_{{ template_metabase_instance.key }}{{ template_backup_account.key }}" name: "backup metabase_{{ template_metabase_instance.key }}_{{ template_backup_account.key }}"
minute: "{{ '%H' | strftime((('1970-01-01 ' + backup_time_start) | to_datetime).timestamp() + (swift_metabase_accounts | length - template_backup_account.key) * ((backup_time_slot_duration | community.general.to_seconds - swift_metabase_accounts | length * backup_time_max_duration | community.general.to_seconds) / (swift_metabase_accounts | length - 1) + backup_time_max_duration | community.general.to_seconds) | int) }}" minute: "{{ '%M' | strftime(template_backup_timestamp | int) }}"
hour: "{{ '%H' | strftime((('1970-01-01 ' + backup_time_start) | to_datetime).timestamp() + (swift_metabase_accounts | length - template_backup_account.key) * ((backup_time_slot_duration | community.general.to_seconds - swift_metabase_accounts | length * backup_time_max_duration | community.general.to_seconds) / (swift_metabase_accounts | length - 1) + backup_time_max_duration | community.general.to_seconds) | int) }}" hour: "{{ '%H' | strftime(template_backup_timestamp | int) }}"
job: "/usr/bin/docker compose -f /home/docker/backups/backup-metabase_{{ template_metabase_instance.key }}{{ template_backup_account.key }}.yaml run --rm backup_metabase" job: "/usr/bin/docker compose -f /home/docker/backups/backup-metabase_{{ template_metabase_instance.key }}_{{ template_backup_account.key }}.yaml run --rm backup_metabase"
loop: "{{ swift_metabase_accounts | dict2items | product(metabase_instances | dict2items) }}" loop: "{{ swift_metabase_accounts | dict2items | product(metabase_instances | dict2items) }}"
loop_control: loop_control:
label: "account {{ template_backup_account.key }} for metabase {{ template_metabase_instance.key }}" label: "account {{ template_backup_account.key }} for metabase {{ template_metabase_instance.key }}"
loop_var: item_account_instance loop_var: item_account_instance
extended: true
when: > when: >
(metabase_instance.value.backup.enabled | default(false)) (metabase_instance.value.backup.enabled | default(false))
and (inventory_hostname in groups.maintenance_contract) and (inventory_hostname in groups.maintenance_contract)
{% set database_type = template_metabase_instance.value.database.type | default(default_metabase_database_type) %} {% set database_type = template_metabase_instance.value.database.type | default(default_metabase_database_type) %}
version: "2.1"
services: services:
backup_metabase: backup_metabase:
image: ghcr.io/tecnativa/docker-duplicity-postgres:master image: sources.le-filament.com:5050/lefilament/duplicity_image/duplicity:latest
hostname: {{ inventory_hostname_short | lower | regex_replace('_','') }}-metabase_{{ template_metabase_instance.key }} hostname: {{ inventory_hostname_short | lower | regex_replace('_','') }}-metabase_{{ template_metabase_instance.key }}
environment: environment:
SRC: "/mnt/backup/src"
DST: "swift://metabase_{{ template_metabase_instance.key }}_{{ inventory_hostname | lower }}" DST: "swift://metabase_{{ template_metabase_instance.key }}_{{ inventory_hostname | lower }}"
{% if database_type == 'postgres' %} {% if database_type == 'postgres' %}
PGHOST: "db"
PGDATABASE: "{{ template_metabase_instance.value.database.name }}" PGDATABASE: "{{ template_metabase_instance.value.database.name }}"
PGUSER: "{{ template_metabase_instance.value.database.user }}" PGUSER: "{{ template_metabase_instance.value.database.user }}"
PGPASSWORD: "{{ template_metabase_instance.value.database.password }}" PGPASSWORD: "{{ template_metabase_instance.value.database.password }}"
...@@ -19,27 +20,30 @@ services: ...@@ -19,27 +20,30 @@ services:
SWIFT_TENANTNAME: "{{ template_backup_account.value.tenantname }}" SWIFT_TENANTNAME: "{{ template_backup_account.value.tenantname }}"
SWIFT_TENANTID: "{{ template_backup_account.value.tenantid }}" SWIFT_TENANTID: "{{ template_backup_account.value.tenantid }}"
SWIFT_REGIONNAME: "{{ template_backup_account.value.regionname }}" SWIFT_REGIONNAME: "{{ template_backup_account.value.regionname }}"
JOB_200_WHEN: "never"
{% if database_type == 'h2' %}
JOB_300_WHAT: "backup --full-if-older-than 6D"
{% endif %}
{% if database_type == 'postgres' %}
JOB_300_WHAT: "pg_dump --no-owner --format c --file $$SRC/$$PGDATABASE.pgdump && backup --full-if-older-than 6D"
{% endif %}
JOB_302_WHAT: "dup remove-all-but-n-full 5 --force $$DST $$@"
JOB_302_WHEN: "daily"
volumes: volumes:
- metabase_{{ template_metabase_instance.key }}{{ template_backup_account.key }}_backup_cache:/root/.cache/duplicity/:rw - metabase_{{ template_metabase_instance.key }}_{{ template_backup_account.key }}_backup_cache:/root/.cache/duplicity/:rw
{% if database_type == 'h2' %} {% if database_type == 'h2' %}
- metabase_{{ template_metabase_instance.key }}_metabase:/mnt/backup/src/metabase:z - metabase_{{ template_metabase_instance.key }}_metabase:/mnt/backup/src/metabase:ro
{% endif %} {% endif %}
networks: networks:
{% if database_type == 'postgres' %} {% if database_type == 'postgres' %}
- metabase_{{ template_metabase_instance.key }}_default - metabase_{{ template_metabase_instance.key }}_default
{% endif %} {% endif %}
- public - public
command: command: >
- /etc/periodic/daily/jobrunner /bin/ash -c "
echo \"info: start backuping\"
{% if database_type == 'postgres' %}
&& echo \"info: creating '$$SRC' directory...\"
&& mkdir --parents $$SRC
&& echo \"info: dumping '$$PGDATABASE' into '$$SRC/$$PGDATABASE.pgdump'...\"
&& pg_dump --no-owner --format c --file $$SRC/$$PGDATABASE.pgdump
{% endif %}
&& echo \"info: backuping '$$SRC' to '$$DST'...\"
&& duplicity backup --full-if-older-than 6D $$SRC $$DST
&& echo \"info: removing all but 5 full backups in '$$DST'\"
&& duplicity remove-all-but-n-full 5 --force $$DST
&& echo \"info: done\""
networks: networks:
{% if database_type == 'postgres' %} {% if database_type == 'postgres' %}
...@@ -51,7 +55,7 @@ networks: ...@@ -51,7 +55,7 @@ networks:
encrypted: 1 encrypted: 1
volumes: volumes:
metabase_{{ template_metabase_instance.key }}{{ template_backup_account.key }}_backup_cache: metabase_{{ template_metabase_instance.key }}_{{ template_backup_account.key }}_backup_cache:
{% if database_type == 'h2' %} {% if database_type == 'h2' %}
metabase_{{ template_metabase_instance.key }}_metabase: metabase_{{ template_metabase_instance.key }}_metabase:
external: true external: true
......
{% set database_type = template_metabase_instance.value.database.type | default(default_metabase_database_type) %} {% set database_type = template_metabase_instance.value.database.type | default(default_metabase_database_type) %}
{% set default_database_setup = template_metabase_instance_setup.database[database_type] %} {% set default_database_setup = template_metabase_instance_setup.database[database_type] %}
version: "2.1"
services: services:
metabase: metabase:
image: "metabase/metabase" image: "metabase/metabase"
......
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Veuillez vous inscrire ou vous pour commenter