diff --git a/playbooks/restore-docker-volumes.yml b/playbooks/restore-docker-volumes.yml index b6b673a..188078e 100644 --- a/playbooks/restore-docker-volumes.yml +++ b/playbooks/restore-docker-volumes.yml @@ -6,6 +6,8 @@ include_vars: '../{{vault_file}}' tags: [always] roles: - - role: docker_restore - vars: - container_restore: linkding + - role: docker_s3_volume_restore + +# - role: docker_restore_container +# vars: +# container_restore: linkding diff --git a/roles/docker_archive_volume_restore/defaults/main.yml b/roles/docker_archive_volume_restore/defaults/main.yml new file mode 100644 index 0000000..a4f6355 --- /dev/null +++ b/roles/docker_archive_volume_restore/defaults/main.yml @@ -0,0 +1,2 @@ +--- +# defaults file for docker_archive_volume_restore diff --git a/roles/docker_archive_volume_restore/handlers/main.yml b/roles/docker_archive_volume_restore/handlers/main.yml new file mode 100644 index 0000000..f03414b --- /dev/null +++ b/roles/docker_archive_volume_restore/handlers/main.yml @@ -0,0 +1,2 @@ +--- +# handlers file for docker_archive_volume_restore diff --git a/roles/docker_restore/meta/main.yml b/roles/docker_archive_volume_restore/meta/main.yml similarity index 100% rename from roles/docker_restore/meta/main.yml rename to roles/docker_archive_volume_restore/meta/main.yml diff --git a/roles/docker_archive_volume_restore/tasks/main.yml b/roles/docker_archive_volume_restore/tasks/main.yml new file mode 100644 index 0000000..6b2d162 --- /dev/null +++ b/roles/docker_archive_volume_restore/tasks/main.yml @@ -0,0 +1,2 @@ +--- +# tasks file for docker_archive_volume_restore diff --git a/roles/docker_archive_volume_restore/vars/main.yml b/roles/docker_archive_volume_restore/vars/main.yml new file mode 100644 index 0000000..57ef4d7 --- /dev/null +++ b/roles/docker_archive_volume_restore/vars/main.yml @@ -0,0 +1,2 @@ +--- +# vars file for docker_archive_volume_restore diff --git a/roles/docker_backup/tasks/main.yml b/roles/docker_backup/tasks/main.yml index cecb03b..78509fb 100644 --- a/roles/docker_backup/tasks/main.yml +++ b/roles/docker_backup/tasks/main.yml @@ -19,18 +19,19 @@ - name: Extract only the volume mounts (not bind mounts) set_fact: volume_mounts="{{ result.container.Mounts | selectattr("Type", "equalto", "volume")}}" +- debug: msg="{{volume_mounts}}" + - name: Create Backup of Container Volumes community.docker.docker_container: name: "backup-container-{{ item.Name }}-{{ 10 | random }}" image: ubuntu - command: "tar cvf /backups/{{ item.Name }}-{{ backup_time }}.tar.gz {{ item.Destination }}" + command: "tar -czvf /backups/{{ item.Name }}-{{ backup_time }}.tar.gz /data" auto_remove: true detach: false # block until this container exists. state: started volumes: + - "{{ item.Name }}:/data" - /mnt/mergerfs/backups:/backups - volumes_from: - - "{{ container_backup }}" with_items: "{{ volume_mounts }}" - name: Start the container diff --git a/roles/docker_restore/defaults/main.yml b/roles/docker_restore_container/defaults/main.yml similarity index 100% rename from roles/docker_restore/defaults/main.yml rename to roles/docker_restore_container/defaults/main.yml diff --git a/roles/docker_restore/handlers/main.yml b/roles/docker_restore_container/handlers/main.yml similarity index 100% rename from roles/docker_restore/handlers/main.yml rename to roles/docker_restore_container/handlers/main.yml diff --git a/roles/docker_restore_container/meta/main.yml b/roles/docker_restore_container/meta/main.yml new file mode 100644 index 0000000..c572acc --- /dev/null +++ b/roles/docker_restore_container/meta/main.yml @@ -0,0 +1,52 @@ +galaxy_info: + author: your name + description: your role description + company: your company (optional) + + # If the issue tracker for your role is not on github, uncomment the + # next line and provide a value + # issue_tracker_url: http://example.com/issue/tracker + + # Choose a valid license ID from https://spdx.org - some suggested licenses: + # - BSD-3-Clause (default) + # - MIT + # - GPL-2.0-or-later + # - GPL-3.0-only + # - Apache-2.0 + # - CC-BY-4.0 + license: license (GPL-2.0-or-later, MIT, etc) + + min_ansible_version: 2.1 + + # If this a Container Enabled role, provide the minimum Ansible Container version. + # min_ansible_container_version: + + # + # Provide a list of supported platforms, and for each platform a list of versions. + # If you don't wish to enumerate all versions for a particular platform, use 'all'. + # To view available platforms and versions (or releases), visit: + # https://galaxy.ansible.com/api/v1/platforms/ + # + # platforms: + # - name: Fedora + # versions: + # - all + # - 25 + # - name: SomePlatform + # versions: + # - all + # - 1.0 + # - 7 + # - 99.99 + + galaxy_tags: [] + # List tags for your role here, one per line. A tag is a keyword that describes + # and categorizes the role. Users find roles by searching for tags. Be sure to + # remove the '[]' above, if you add tags to this list. + # + # NOTE: A tag is limited to a single word comprised of alphanumeric characters. + # Maximum 20 tags per role. + +dependencies: [] + # List your role dependencies here, one per line. Be sure to remove the '[]' above, + # if you add dependencies to this list. diff --git a/roles/docker_restore/tasks/main.yml b/roles/docker_restore_container/tasks/main.yml similarity index 100% rename from roles/docker_restore/tasks/main.yml rename to roles/docker_restore_container/tasks/main.yml diff --git a/roles/docker_restore/vars/main.yml b/roles/docker_restore_container/vars/main.yml similarity index 100% rename from roles/docker_restore/vars/main.yml rename to roles/docker_restore_container/vars/main.yml diff --git a/roles/docker_s3_volume_restore/defaults/main.yml b/roles/docker_s3_volume_restore/defaults/main.yml new file mode 100644 index 0000000..dbb8ec6 --- /dev/null +++ b/roles/docker_s3_volume_restore/defaults/main.yml @@ -0,0 +1,5 @@ +--- +# defaults file for docker_s3_volume_restore +docker_volume_s3_restores: + - volume_name: "linkding_data" + s3_key: "linkding_data/linkding_data-2022-09-01T21:32:54Z.tar.gz" diff --git a/roles/docker_s3_volume_restore/handlers/main.yml b/roles/docker_s3_volume_restore/handlers/main.yml new file mode 100644 index 0000000..738fbd7 --- /dev/null +++ b/roles/docker_s3_volume_restore/handlers/main.yml @@ -0,0 +1,2 @@ +--- +# handlers file for docker_s3_volume_restore diff --git a/roles/docker_s3_volume_restore/meta/main.yml b/roles/docker_s3_volume_restore/meta/main.yml new file mode 100644 index 0000000..c572acc --- /dev/null +++ b/roles/docker_s3_volume_restore/meta/main.yml @@ -0,0 +1,52 @@ +galaxy_info: + author: your name + description: your role description + company: your company (optional) + + # If the issue tracker for your role is not on github, uncomment the + # next line and provide a value + # issue_tracker_url: http://example.com/issue/tracker + + # Choose a valid license ID from https://spdx.org - some suggested licenses: + # - BSD-3-Clause (default) + # - MIT + # - GPL-2.0-or-later + # - GPL-3.0-only + # - Apache-2.0 + # - CC-BY-4.0 + license: license (GPL-2.0-or-later, MIT, etc) + + min_ansible_version: 2.1 + + # If this a Container Enabled role, provide the minimum Ansible Container version. + # min_ansible_container_version: + + # + # Provide a list of supported platforms, and for each platform a list of versions. + # If you don't wish to enumerate all versions for a particular platform, use 'all'. + # To view available platforms and versions (or releases), visit: + # https://galaxy.ansible.com/api/v1/platforms/ + # + # platforms: + # - name: Fedora + # versions: + # - all + # - 25 + # - name: SomePlatform + # versions: + # - all + # - 1.0 + # - 7 + # - 99.99 + + galaxy_tags: [] + # List tags for your role here, one per line. A tag is a keyword that describes + # and categorizes the role. Users find roles by searching for tags. Be sure to + # remove the '[]' above, if you add tags to this list. + # + # NOTE: A tag is limited to a single word comprised of alphanumeric characters. + # Maximum 20 tags per role. + +dependencies: [] + # List your role dependencies here, one per line. Be sure to remove the '[]' above, + # if you add dependencies to this list. diff --git a/roles/docker_s3_volume_restore/tasks/main.yml b/roles/docker_s3_volume_restore/tasks/main.yml new file mode 100644 index 0000000..d7eca8a --- /dev/null +++ b/roles/docker_s3_volume_restore/tasks/main.yml @@ -0,0 +1,54 @@ +--- +# https://docs.ansible.com/ansible/latest/collections/community/docker/docker_container_module.html#ansible-collections-community-docker-docker-container-module +# https://docs.docker.com/storage/volumes/#backup-restore-or-migrate-data-volumes +# +- name: Download archive from S3 + amazon.aws.aws_s3: + bucket: "{{ aws_s3.bucket }}" + object: "{{ item.s3_key }}" + aws_access_key: "{{ aws_s3.aws_access_key }}" + aws_secret_key: "{{ aws_s3.aws_secret_key }}" + region: "{{ aws_s3.region }}" + s3_url: "https://{{ aws_s3.s3_url }}" + mode: get + dest: "/tmp/{{ item.s3_key }}" + register: get_out + with_items: "{{ docker_volume_s3_restores }}" + +- debug: msg="{{ get_out }}" + +- name: Ensure Volume + docker_volume: + name: "{{ item.volume_name }}" + state: present + with_items: "{{ docker_volume_s3_restores }}" + +# TODO: skip if the volume was just created +- name: Remove contents of volumes + community.docker.docker_container: + name: "restore-container-{{ item.volume_name }}-{{ 10 | random }}" + image: ubuntu + command: "rm -rf ./*" + auto_remove: true + detach: false # block until this container exists. + state: started + # start inside the directory we want to wipe + working_dir: "/data" + volumes: + - "{{ item.volume_name }}:/data" + with_items: "{{ docker_volume_s3_restores }}" + +- name: Restore contents of volumes + community.docker.docker_container: + name: "restore-container-{{ item.volume_name }}-{{ 10 | random }}" + image: ubuntu + # extract the tar into the volume. + command: "tar xvf /tmp/{{ item.s3_key }} -C /data --strip-components 1" + auto_remove: true + detach: false # block until this container exists. + state: started + volumes: + - "{{ item.volume_name }}:/data" + - /tmp:/tmp + with_items: "{{ docker_volume_s3_restores }}" + diff --git a/roles/docker_s3_volume_restore/vars/main.yml b/roles/docker_s3_volume_restore/vars/main.yml new file mode 100644 index 0000000..a2212b8 --- /dev/null +++ b/roles/docker_s3_volume_restore/vars/main.yml @@ -0,0 +1,2 @@ +--- +# vars file for docker_s3_volume_restore diff --git a/roles/setup_hosted_services/tasks/main.yml b/roles/setup_hosted_services/tasks/main.yml index f5377a8..5da99af 100644 --- a/roles/setup_hosted_services/tasks/main.yml +++ b/roles/setup_hosted_services/tasks/main.yml @@ -63,8 +63,7 @@ register: find_volumes changed_when: false -- debug: msg="{{find_volumes.results | map(attribute='stdout_lines') | list | flatten - }}" +- debug: msg="{{ find_volumes.results | map(attribute='stdout_lines') | list | flatten }}" - name: Docker | Find volumes that need to be restored script: scripts/find-volumes-to-restore.py @@ -110,8 +109,7 @@ chatton.portainer.portainer_stack: username: admin password: '{{portainer.password}}' - docker_compose_file_path: '{{directories.docker_compose_directory}}/{{ item.name - }}/docker-compose.yml' + docker_compose_file_path: '{{ directories.docker_compose_directory }}/{{ item.name }}/docker-compose.yml' stack_name: '{{ item.name }}' endpoint_id: '{{ item.endpoint_id }}' state: present