Skip to content
View in the app

A better way to browse. Learn more.

Unraid

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

[Support] Borgitory - Web-based Borg Scheduling

Featured Replies

logo.png

Borgitory is a comprehensive web-based management interface for BorgBackup repositories with real-time monitoring, automated scheduling, and cloud synchronization capabilities. It's a docker container here.

It's currently in Beta so don't use it with production backups yet.

GitHub
No image preview

GitHub - mlapaglia/Borgitory: Web UI for managing BorgBac...

Web UI for managing BorgBackup repositories with scheduling, monitoring, and cloud sync - mlapaglia/Borgitory

image.png

image.png

image.png

image.png

image.png

image.png

Screenshot 2025-09-04 111517.png

Screenshot 2025-09-04 111556.png

Screenshot 2025-09-04 112339.png

I am working on making it a community app.

Edited by mlapaglia

  • 2 weeks later...

This looks awesome, and I'm looking forward to following it.

Any chance you can make it easy to migrate from Borgmatic directly to this? I find Borgmatic works great, but the learning curve for starting it was extremely difficult. It also only has a log file for monitoring. This would be very nice to monitor.

Keep up the good work!

Hi,

i wanted to test this but im getting this error on a fresh install via the community app. any hints?

File "/opt/venv/lib/python3.13/site-packages/sqlalchemy/engine/default.py", line 629, in connect
return self.loaded_dbapi.connect(*cargs, **cparams) # type: ignore[no-any-return] # NOQA: E501
~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^
sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) unable to open database file
(Background on this error at: https://sqlalche.me/e/20/e3q8)
Database migration failed!

** Press ANY KEY to close this window **

  • Author
9 hours ago, shinexx said:

Hi,

i wanted to test this but im getting this error on a fresh install via the community app. any hints?

File "/opt/venv/lib/python3.13/site-packages/sqlalchemy/engine/default.py", line 629, in connect
return self.loaded_dbapi.connect(*cargs, **cparams) # type: ignore[no-any-return] # NOQA: E501
~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^
sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) unable to open database file
(Background on this error at: https://sqlalche.me/e/20/e3q8)
Database migration failed!

** Press ANY KEY to close this window **

sorry 2.0 was just released and the template broke. i have updated it. in the mean time change your data directory to mount to /app/data instead of /app/app/data and it should start working again.

17 hours ago, gamerayers said:

This looks awesome, and I'm looking forward to following it.

Any chance you can make it easy to migrate from Borgmatic directly to this? I find Borgmatic works great, but the learning curve for starting it was extremely difficult. It also only has a log file for monitoring. This would be very nice to monitor.

Keep up the good work!

You should be able to mount the repository to the container and import the repository into the app.

it's working! Thank you!

I get this error:

util.load_python_file(self.dir, "env.py")
~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^
File "/opt/venv/lib/python3.13/site-packages/alembic/util/pyfiles.py", line 116, in load_python_file
module = load_module_py(module_id, path)
File "/opt/venv/lib/python3.13/site-packages/alembic/util/pyfiles.py", line 136, in load_module_py
spec.loader.exec_module(module) # type: ignore
~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^
File "<frozen importlib._bootstrap_external>", line 1026, in exec_module
File "<frozen importlib._bootstrap>", line 488, in _call_with_frames_removed
File "/app/alembic/env.py", line 109, in <module>
run_migrations_online()
~~~~~~~~~~~~~~~~~~~~~^^
File "/app/alembic/env.py", line 103, in run_migrations_online
context.run_migrations()
~~~~~~~~~~~~~~~~~~~~~~^^
File "<string>", line 8, in run_migrations
File "/opt/venv/lib/python3.13/site-packages/alembic/runtime/environment.py", line 946, in run_migrations
self.get_context().run_migrations(**kw)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^
File "/opt/venv/lib/python3.13/site-packages/alembic/runtime/migration.py", line 627, in run_migrations
step.migration_fn(**kw)
~~~~~~~~~~~~~~~~~^^^^^^
File "/app/alembic/versions/d930de046be6_migrate_cloud_sync_configs_to_json_.py", line 25, in upgrade
with op.batch_alter_table("apscheduler_jobs", schema=None) as batch_op:
~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.13/contextlib.py", line 148, in __exit__
next(self.gen)
~~~~^^^^^^^^^^
File "/opt/venv/lib/python3.13/site-packages/alembic/operations/base.py", line 397, in batch_alter_table
impl.flush()
~~~~~~~~~~^^
File "/opt/venv/lib/python3.13/site-packages/alembic/operations/batch.py", line 115, in flush
fn(*arg, **kw)
~~^^^^^^^^^^^^
File "/opt/venv/lib/python3.13/site-packages/alembic/ddl/impl.py", line 464, in drop_index
self._exec(schema.DropIndex(index, **kw))
~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/opt/venv/lib/python3.13/site-packages/alembic/ddl/impl.py", line 246, in _exec
return conn.execute(construct, params)
~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^
File "/opt/venv/lib/python3.13/site-packages/sqlalchemy/engine/base.py", line 1419, in execute
return meth(
self,
distilled_parameters,
execution_options or NO_OPTIONS,
)
File "/opt/venv/lib/python3.13/site-packages/sqlalchemy/sql/ddl.py", line 187, in _execute_on_connection
return connection._execute_ddl(
~~~~~~~~~~~~~~~~~~~~~~~^
self, distilled_params, execution_options
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
)
^
File "/opt/venv/lib/python3.13/site-packages/sqlalchemy/engine/base.py", line 1530, in _execute_ddl
ret = self._execute_context(
dialect,
...<4 lines>...
compiled,
)
File "/opt/venv/lib/python3.13/site-packages/sqlalchemy/engine/base.py", line 1846, in _execute_context
return self._exec_single_context(
~~~~~~~~~~~~~~~~~~~~~~~~~^
dialect, context, statement, parameters
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
)
^
File "/opt/venv/lib/python3.13/site-packages/sqlalchemy/engine/base.py", line 1986, in _exec_single_context
self._handle_dbapi_exception(
~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
e, str_statement, effective_parameters, cursor, context
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
)
^
File "/opt/venv/lib/python3.13/site-packages/sqlalchemy/engine/base.py", line 2355, in _handle_dbapi_exception
raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
File "/opt/venv/lib/python3.13/site-packages/sqlalchemy/engine/base.py", line 1967, in _exec_single_context
self.dialect.do_execute(
~~~~~~~~~~~~~~~~~~~~~~~^
cursor, str_statement, effective_parameters, context
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
)
^
File "/opt/venv/lib/python3.13/site-packages/sqlalchemy/engine/default.py", line 951, in do_execute
cursor.execute(statement, parameters)
~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^
sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) no such index: ix_apscheduler_jobs_next_run_time
[SQL:
DROP INDEX ix_apscheduler_jobs_next_run_time]
(Background on this error at: https://sqlalche.me/e/20/e3q8)
Database migration failed!

  • Author
6 hours ago, Ulvster said:

I get this error:

util.load_python_file(self.dir, "env.py")
~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^
File "/opt/venv/lib/python3.13/site-packages/alembic/util/pyfiles.py", line 116, in load_python_file
module = load_module_py(module_id, path)
File "/opt/venv/lib/python3.13/site-packages/alembic/util/pyfiles.py", line 136, in load_module_py
spec.loader.exec_module(module) # type: ignore
~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^
File "<frozen importlib._bootstrap_external>", line 1026, in exec_module
File "<frozen importlib._bootstrap>", line 488, in _call_with_frames_removed
File "/app/alembic/env.py", line 109, in <module>
run_migrations_online()
~~~~~~~~~~~~~~~~~~~~~^^
File "/app/alembic/env.py", line 103, in run_migrations_online
context.run_migrations()
~~~~~~~~~~~~~~~~~~~~~~^^
File "<string>", line 8, in run_migrations
File "/opt/venv/lib/python3.13/site-packages/alembic/runtime/environment.py", line 946, in run_migrations
self.get_context().run_migrations(**kw)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^
File "/opt/venv/lib/python3.13/site-packages/alembic/runtime/migration.py", line 627, in run_migrations
step.migration_fn(**kw)
~~~~~~~~~~~~~~~~~^^^^^^
File "/app/alembic/versions/d930de046be6_migrate_cloud_sync_configs_to_json_.py", line 25, in upgrade
with op.batch_alter_table("apscheduler_jobs", schema=None) as batch_op:
~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.13/contextlib.py", line 148, in __exit__
next(self.gen)
~~~~^^^^^^^^^^
File "/opt/venv/lib/python3.13/site-packages/alembic/operations/base.py", line 397, in batch_alter_table
impl.flush()
~~~~~~~~~~^^
File "/opt/venv/lib/python3.13/site-packages/alembic/operations/batch.py", line 115, in flush
fn(*arg, **kw)
~~^^^^^^^^^^^^
File "/opt/venv/lib/python3.13/site-packages/alembic/ddl/impl.py", line 464, in drop_index
self._exec(schema.DropIndex(index, **kw))
~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/opt/venv/lib/python3.13/site-packages/alembic/ddl/impl.py", line 246, in _exec
return conn.execute(construct, params)
~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^
File "/opt/venv/lib/python3.13/site-packages/sqlalchemy/engine/base.py", line 1419, in execute
return meth(
self,
distilled_parameters,
execution_options or NO_OPTIONS,
)
File "/opt/venv/lib/python3.13/site-packages/sqlalchemy/sql/ddl.py", line 187, in _execute_on_connection
return connection._execute_ddl(
~~~~~~~~~~~~~~~~~~~~~~~^
self, distilled_params, execution_options
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
)
^
File "/opt/venv/lib/python3.13/site-packages/sqlalchemy/engine/base.py", line 1530, in _execute_ddl
ret = self._execute_context(
dialect,
...<4 lines>...
compiled,
)
File "/opt/venv/lib/python3.13/site-packages/sqlalchemy/engine/base.py", line 1846, in _execute_context
return self._exec_single_context(
~~~~~~~~~~~~~~~~~~~~~~~~~^
dialect, context, statement, parameters
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
)
^
File "/opt/venv/lib/python3.13/site-packages/sqlalchemy/engine/base.py", line 1986, in _exec_single_context
self._handle_dbapi_exception(
~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
e, str_statement, effective_parameters, cursor, context
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
)
^
File "/opt/venv/lib/python3.13/site-packages/sqlalchemy/engine/base.py", line 2355, in _handle_dbapi_exception
raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
File "/opt/venv/lib/python3.13/site-packages/sqlalchemy/engine/base.py", line 1967, in _exec_single_context
self.dialect.do_execute(
~~~~~~~~~~~~~~~~~~~~~~~^
cursor, str_statement, effective_parameters, context
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
)
^
File "/opt/venv/lib/python3.13/site-packages/sqlalchemy/engine/default.py", line 951, in do_execute
cursor.execute(statement, parameters)
~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^
sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) no such index: ix_apscheduler_jobs_next_run_time
[SQL:
DROP INDEX ix_apscheduler_jobs_next_run_time]
(Background on this error at: https://sqlalche.me/e/20/e3q8)
Database migration failed!

Can you try moving your db file and then restart the app so it will make a new DB and see if you still have the issue?

Still the same problem

  • Author

I see the issue. this is from before i had a db migration process created. i'll create a patch version shortly.

EDIT: v2.2.0 should fix your issue. i am also adding integration tests to keep this from happening again ❤️

Edited by mlapaglia

Just forced update. Logged in. Looks fabulous!

Edited by paladin

Working so far, I've imported my 31Tb Repo from Vorta, no problem so far. Thank you!☺️

  • Author

2.3.0 is out with support for pre/post hooks so you can run custom commands before and after a backup

Using latest version 2.4.3 of borgitory.

I tried to mount /mnt/remotes/192.168.1.105_share11/borgbackup/ to /mnt/repos.

I also tried /mnt/remotes/192.168.1.105_share11 to /mnt/repos or even /mnt/remotes/ to /mnt/repos.

The scan logic does not pick up any of the repos.

Is there a way I can manually add one or more directories/repos?
I have the feeling it scans for ages and it does not find anything.

Thanks

When I try to add linodes object storage (equal to aws) as the cloud sync configuration I am getting an error

"GET /api/shared/notification?type=error&message=An%20error%20occurred%3A%20Unprocessable%20Content HTTP/1.1" 200 OK

Anyone know what could be the cause of it?

  • Author
1 hour ago, mastervol said:

Using latest version 2.4.3 of borgitory.

I tried to mount /mnt/remotes/192.168.1.105_share11/borgbackup/ to /mnt/repos.

I also tried /mnt/remotes/192.168.1.105_share11 to /mnt/repos or even /mnt/remotes/ to /mnt/repos.

The scan logic does not pick up any of the repos.

Is there a way I can manually add one or more directories/repos?
I have the feeling it scans for ages and it does not find anything.

Thanks

Go to the debug screen and see if the app sees those mounted volumes.

  • Author
8 minutes ago, 2TC said:

When I try to add linodes object storage (equal to aws) as the cloud sync configuration I am getting an error

"GET /api/shared/notification?type=error&message=An%20error%20occurred%3A%20Unprocessable%20Content HTTP/1.1" 200 OK

Anyone know what could be the cause of it?

If you look at the response of the http call in dev tools it usually has more information in there.

8 minutes ago, mlapaglia said:

If you look at the response of the http call in dev tools it usually has more information in there.

Alright, this explains it. The AWS part seems hardcoded, and the linode expects "AKIA"-prefix of the Key ID and Access Key.

From the payload I can read

provider: s3

provider_config[access_key]

provider_config[secret_key]

So unless I make a change to the actual config or it is being added as an alternative in the base, it will most likely fail.

  • Author

1 hour ago, 2TC said:

So unless I make a change to the actual config or it is being added as an alternative in the base, it will most likely fail.

Adding additional providers is documented here if you want to contribute! https://borgitory.com/en/latest/cloud-providers.html

  • Author
22 hours ago, mastervol said:

try v2.5.0-alpha3 and see if that works better.

2 hours ago, mlapaglia said:

try v2.5.0-alpha3 and see if that works better.

Cool, thanks, this works.

Now I can use the remotes share from unraid.

Now exploring the application ;-)

image.png

  • Author

Oof, that css needs some work 😂

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

Account

Navigation

Search

Search

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.