diff --git a/lib/music_library_web/components/layouts/app.html.heex b/lib/music_library_web/components/layouts/app.html.heex
index 8f7bea40..49eddcd7 100644
--- a/lib/music_library_web/components/layouts/app.html.heex
+++ b/lib/music_library_web/components/layouts/app.html.heex
@@ -28,6 +28,15 @@
{gettext("Errors")}
+
+ <.icon
+ name="hero-archive-box-arrow-down"
+ class="h-4 w-4 mr-2"
+ aria-hidden="true"
+ data-slot="icon"
+ />
+ {gettext("Backup")}
+
<.icon
name="hero-arrow-left-start-on-rectangle"
diff --git a/lib/music_library_web/controllers/archive_controller.ex b/lib/music_library_web/controllers/archive_controller.ex
new file mode 100644
index 00000000..607a6625
--- /dev/null
+++ b/lib/music_library_web/controllers/archive_controller.ex
@@ -0,0 +1,18 @@
+defmodule MusicLibraryWeb.ArchiveController do
+ use MusicLibraryWeb, :controller
+
+ def backup(conn, _params) do
+ database_path = database_path()
+ current_time = DateTime.utc_now()
+ file_name = "music_library_#{DateTime.to_unix(current_time)}.db"
+
+ send_download(conn, {:file, database_path},
+ filename: file_name,
+ content_type: "application/x-sqlite3"
+ )
+ end
+
+ defp database_path do
+ Application.get_env(:music_library, MusicLibrary.Repo)[:database]
+ end
+end
diff --git a/lib/music_library_web/router.ex b/lib/music_library_web/router.ex
index 467ffdd2..48b70513 100644
--- a/lib/music_library_web/router.ex
+++ b/lib/music_library_web/router.ex
@@ -31,6 +31,8 @@ defmodule MusicLibraryWeb.Router do
scope "/" do
pipe_through :logged_in
+ get "/backup", ArchiveController, :backup
+
get "/covers/:record_id", CoverController, :show
live "/", StatsLive.Index, :index
diff --git a/priv/gettext/default.pot b/priv/gettext/default.pot
index 67eace7b..e1382592 100644
--- a/priv/gettext/default.pot
+++ b/priv/gettext/default.pot
@@ -123,7 +123,7 @@ msgstr ""
msgid "Login"
msgstr ""
-#: lib/music_library_web/components/layouts/app.html.heex:38
+#: lib/music_library_web/components/layouts/app.html.heex:47
#, elixir-autogen, elixir-format
msgid "Logout"
msgstr ""
@@ -550,6 +550,7 @@ msgstr ""
msgid "Album"
msgstr ""
+#: lib/music_library_web/components/layouts/app.html.heex:38
#: lib/music_library_web/components/record_components.ex:213
#, elixir-autogen, elixir-format
msgid "Backup"