diff --git a/roles/minio/defaults/main.yml b/roles/minio/defaults/main.yml
new file mode 100644
index 0000000000000000000000000000000000000000..263a0cb7162325e18bb5e5c36cffe883b8e2aaaf
--- /dev/null
+++ b/roles/minio/defaults/main.yml
@@ -0,0 +1,7 @@
+minio_extra_opts: []
+
+minio_volumes:
+  - /srv/minio/data/
+
+minio_bind_address: :9000
+minio_console_bind_address: :9001
diff --git a/roles/minio/files/systemd-minio-override.conf b/roles/minio/files/systemd-minio-override.conf
new file mode 100644
index 0000000000000000000000000000000000000000..8a764e3478830b4ffef3c88efded878d90e9b72a
--- /dev/null
+++ b/roles/minio/files/systemd-minio-override.conf
@@ -0,0 +1,2 @@
+[Service]
+Restart=always
diff --git a/roles/minio/handlers/main.yml b/roles/minio/handlers/main.yml
new file mode 100644
index 0000000000000000000000000000000000000000..f71335a372be3e38ffa7bbc0cf280d1a953c779b
--- /dev/null
+++ b/roles/minio/handlers/main.yml
@@ -0,0 +1,6 @@
+- name: Restart MinIO
+  systemd:
+    name: minio
+    state: restarted
+    daemon_reload: true
+  when: not systemd_minio_started is changed
diff --git a/roles/minio/molecule/default/converge.yml b/roles/minio/molecule/default/converge.yml
new file mode 100644
index 0000000000000000000000000000000000000000..884e854bde159babb01415f9705666d28a57d3c6
--- /dev/null
+++ b/roles/minio/molecule/default/converge.yml
@@ -0,0 +1,19 @@
+- name: Converge
+  hosts: all
+  become: true
+  pre_tasks:
+    - name: Upgrade archlinux-keyring
+      pacman:
+        name: archlinux-keyring
+        state: latest
+        update_cache: true
+
+    - name: Upgrade systemd
+      pacman:
+        upgrade: true
+
+  roles:
+    - role: minio
+      vars:
+        minio_root_user: username
+        minio_root_password: password
diff --git a/roles/minio/molecule/default/molecule.yml b/roles/minio/molecule/default/molecule.yml
new file mode 100644
index 0000000000000000000000000000000000000000..deaf564d8beb15b6c93d2c869f078bd6f7b64a05
--- /dev/null
+++ b/roles/minio/molecule/default/molecule.yml
@@ -0,0 +1,14 @@
+driver:
+  name: vagrant
+
+platforms:
+  - name: instance
+    box: archlinux/archlinux
+    memory: 512
+    cpu: 1
+
+provisioner:
+  name: ansible
+
+verifier:
+  name: testinfra
diff --git a/roles/minio/molecule/default/tests/test_default.py b/roles/minio/molecule/default/tests/test_default.py
new file mode 100644
index 0000000000000000000000000000000000000000..f061f6ffe59176470e435b88caf3c5815b67f1c7
--- /dev/null
+++ b/roles/minio/molecule/default/tests/test_default.py
@@ -0,0 +1,25 @@
+def test_minio_client_installed(host):
+    assert host.exists("mcli")
+
+
+def test_minio_config(host):
+    config = host.file("/etc/minio/minio.conf")
+
+    assert config.exists
+    assert config.user == "minio"
+    assert config.group == "minio"
+    assert config.mode == 0o600
+    with host.sudo():
+        assert config.content == (
+            b"MINIO_VOLUMES=/srv/minio/data/\n"
+            b"MINIO_ROOT_USER=username\n"
+            b"MINIO_ROOT_PASSWORD=password\n"
+            b"MINIO_OPTS=--address=:9000 --console-address=:9001\n"
+        )
+
+
+def test_minio_started_and_enabled(host):
+    minio = host.service("minio")
+    assert minio.is_running
+    assert minio.is_enabled
+    assert minio.systemd_properties["Restart"] == "always"
diff --git a/roles/minio/tasks/main.yml b/roles/minio/tasks/main.yml
new file mode 100644
index 0000000000000000000000000000000000000000..27fffc24da4645d98edd5212c47299a43518c0aa
--- /dev/null
+++ b/roles/minio/tasks/main.yml
@@ -0,0 +1,39 @@
+- name: Install MinIO
+  pacman:
+    name: "{{ item }}"
+    state: present
+  loop:
+    - minio
+    - minio-client
+
+- name: Configure MinIO
+  template:
+    src: minio.conf.j2
+    dest: /etc/minio/minio.conf
+    owner: minio
+    group: minio
+    mode: "0600"
+  notify:
+    - Restart MinIO
+
+- name: Create systemd minio.service.d directory
+  file:
+    path: /etc/systemd/system/minio.service.d/
+    state: directory
+    recurse: true
+  register: systemd_minio_service_d
+
+- name: Override systemd minio.service
+  copy:
+    src: systemd-minio-override.conf
+    dest: "{{ systemd_minio_service_d.path }}/override.conf"
+  notify:
+    - Restart MinIO
+
+- name: Start and enable MinIO
+  systemd:
+    name: minio
+    state: started
+    enabled: true
+    daemon_reload: true
+  register: systemd_minio_started
diff --git a/roles/minio/templates/minio.conf.j2 b/roles/minio/templates/minio.conf.j2
new file mode 100644
index 0000000000000000000000000000000000000000..d4df39697d8554bd916c01c49147ca3e65e21e33
--- /dev/null
+++ b/roles/minio/templates/minio.conf.j2
@@ -0,0 +1,4 @@
+MINIO_VOLUMES={{ minio_volumes | map("quote") | join(" ") }}
+MINIO_ROOT_USER={{ minio_root_user | quote }}
+MINIO_ROOT_PASSWORD={{ minio_root_password | quote }}
+MINIO_OPTS={{ (minio_standard_opts + minio_extra_opts) | map("quote") | join(" ") }}
diff --git a/roles/minio/vars/main.yml b/roles/minio/vars/main.yml
new file mode 100644
index 0000000000000000000000000000000000000000..dc49c695dcb7383314eb819e2f415794fd0ac4d9
--- /dev/null
+++ b/roles/minio/vars/main.yml
@@ -0,0 +1,3 @@
+minio_standard_opts:
+  - "--address={{ minio_bind_address }}"
+  - "--console-address={{ minio_console_bind_address }}"