diff --git a/plugins/modules/docker_volume_backupper.py b/plugins/modules/docker_volume_backupper.py
new file mode 100644
index 0000000..ed87a2b
--- /dev/null
+++ b/plugins/modules/docker_volume_backupper.py
@@ -0,0 +1,79 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright: (c) 2024, Luca Bilke <luca@bil.ke>
+# MIT License (see LICENSE)
+
+# TODO: write ansible sections
+
+DOCUMENTATION = r"""
+"""
+
+EXAMPLES = r"""
+"""
+
+RETURN = r"""
+"""
+
+from __future__ import annotations  # pyright: ignore[reportGeneralTypeIssues]
+
+from ansible_collections.snailed.ez_compose.plugins.module_utils.common import (
+    State,
+    run_service,
+    update_service,
+)
+
+
+def helper(state: State) -> State:
+    archive = state.module.params.get("archive")
+    backup_volumes = state.module.params.get("backup_volumes", [])
+    name = state.module.params["name"]
+    project_name = state.module.params["project_name"]
+
+    volumes = [
+        {
+            "type": "volume",
+            "source": volume,
+            "target": f"/backup/{volume}",
+            "read_only": True,
+        }
+        for volume in backup_volumes
+    ]
+
+    environment = {
+        "BACKUP_FILENAME": f"{project_name}-%Y-%m-%dT%H-%M-%S.{'{{ .Extension }}'}",
+        "BACKUP_LATEST_SYMLINK": f"{project_name}-latest",
+        "BACKUP_PRUNING_PREFIX": f"{project_name}-",
+        "BACKUP_STOP_DURING_BACKUP_LABEL": project_name,
+        "BACKUP_ARCHIVE": "/archive",
+        "DOCKER_HOST": f"tcp://{project_name}_{name}_socket_proxy:2375",
+    }
+
+    if archive:
+        volumes.append(
+            {
+                "type": "bind",
+                "source": f"{archive}/{project_name}",
+                "target": "/archive",
+                "bind": {"create_host_path": True},
+            }
+        )
+
+    update = {
+        "environment": environment,
+        "volumes": volumes,
+    }
+
+    return update_service(state, update)
+
+
+def main():
+    extra_args = {
+        "archive": {"type": "str"},
+        "backup_volumes": {"type": "list"},
+    }
+    run_service(extra_args, helper)
+
+
+if __name__ == "__main__":
+    main()