From 10664f10cb4502bc1c5128c0fb57fbb4290e8637 Mon Sep 17 00:00:00 2001 From: Jef Roosens Date: Thu, 20 Mar 2025 08:47:12 +0100 Subject: [PATCH] otter: local-only config --- roles/otter/files/compose.yml | 10 ++++ roles/otter/files/otter.data.backup.sh | 12 +++++ roles/otter/files/otter.service | 13 +++++ roles/otter/handlers/main.yml | 5 ++ roles/otter/tasks/main.yml | 68 ++++++++++++++++++++++++++ ruby.yml | 6 +++ web.yml | 6 +++ 7 files changed, 120 insertions(+) create mode 100644 roles/otter/files/compose.yml create mode 100644 roles/otter/files/otter.data.backup.sh create mode 100644 roles/otter/files/otter.service create mode 100644 roles/otter/handlers/main.yml create mode 100644 roles/otter/tasks/main.yml diff --git a/roles/otter/files/compose.yml b/roles/otter/files/compose.yml new file mode 100644 index 0000000..781c93e --- /dev/null +++ b/roles/otter/files/compose.yml @@ -0,0 +1,10 @@ +services: + app: + image: 'git.rustybever.be/chewing_bever/otter:latest' + + environment: + - 'RUST_LOG=debug' + ports: + - '8017:8080' + volumes: + - '/mnt/data1/otter/data:/data' diff --git a/roles/otter/files/otter.data.backup.sh b/roles/otter/files/otter.data.backup.sh new file mode 100644 index 0000000..dc63b24 --- /dev/null +++ b/roles/otter/files/otter.data.backup.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env bash + +data_dir='/mnt/data1/otter/data' +snapshot_dir="${data_dir}.snapshot" + +# Read-only snapshot for atomic backup +btrfs subvolume snapshot -r "$data_dir" "$snapshot_dir" || exit $? + +/usr/local/bin/restic backup "$snapshot_dir" + +# Always remove snapshot subvolume, even if restic fails +btrfs subvolume delete "$snapshot_dir" diff --git a/roles/otter/files/otter.service b/roles/otter/files/otter.service new file mode 100644 index 0000000..e9e43fb --- /dev/null +++ b/roles/otter/files/otter.service @@ -0,0 +1,13 @@ +[Unit] +Description=Gpodder.net API implementation +After=docker.service +Requires=docker.service + +[Service] +Type=exec +WorkingDirectory=/etc/otter +ExecStart=/usr/bin/docker compose up +ExecStop=/usr/bin/docker compose down + +[Install] +WantedBy=multi-user.target diff --git a/roles/otter/handlers/main.yml b/roles/otter/handlers/main.yml new file mode 100644 index 0000000..c4bf72e --- /dev/null +++ b/roles/otter/handlers/main.yml @@ -0,0 +1,5 @@ +--- +- name: 'restart otter' + ansible.builtin.service: + name: 'otter' + state: 'restarted' diff --git a/roles/otter/tasks/main.yml b/roles/otter/tasks/main.yml new file mode 100644 index 0000000..997da11 --- /dev/null +++ b/roles/otter/tasks/main.yml @@ -0,0 +1,68 @@ +--- +- name: Ensure data directory is present + ansible.builtin.file: + path: '/mnt/data1/otter' + state: directory + mode: '0755' + owner: 'root' + group: 'root' + +- name: Ensure data subvolumes are present + community.general.btrfs_subvolume: + name: '/otter/{{ item }}' + loop: + - 'data' + +- name: Ensure subvolume permissions are correct + ansible.builtin.file: + path: "/mnt/data1/otter/{{ item }}" + state: directory + mode: '0755' + owner: '82' + group: '82' + loop: + - 'data' + +- name: Ensure configuration directory is present + ansible.builtin.file: + path: '/etc/otter' + state: directory + mode: '0755' + +- name: Ensure compose file is present + ansible.builtin.copy: + src: 'compose.yml' + dest: '/etc/otter/compose.yml' + mode: '0644' + owner: 'root' + group: 'root' + notify: 'restart otter' + +- name: Ensure backup scripts are present + ansible.builtin.copy: + src: "otter.{{ item }}.backup.sh" + dest: "/etc/backups/otter.{{ item }}.backup.sh" + owner: 'root' + group: 'root' + mode: '0644' + loop: + - 'data' + +- name: Ensure service file is present + ansible.builtin.copy: + src: 'otter.service' + dest: '/lib/systemd/system/otter.service' + owner: 'root' + group: 'root' + mode: '0644' + register: res + +- name: systemd-reload + ansible.builtin.systemd_service: + daemon_reload: true + when: 'res.changed' + +- name: Ensure otter service is enabled + ansible.builtin.service: + name: 'otter' + enabled: true diff --git a/ruby.yml b/ruby.yml index a47d1a7..bac77d4 100644 --- a/ruby.yml +++ b/ruby.yml @@ -87,3 +87,9 @@ roles: - digikam tags: digikam + +- hosts: ruby + become: yes + roles: + - otter + tags: otter diff --git a/web.yml b/web.yml index d0c0954..989a5ad 100644 --- a/web.yml +++ b/web.yml @@ -76,3 +76,9 @@ roles: - actual-web tags: actual + +- hosts: web + become: yes + roles: + - otter-web + tags: otter