Преглед на файлове

Add MongoDB database hook documentation.

Dan Helfman преди 3 години
родител
ревизия
2ee75546f5

+ 1 - 0
NEWS

@@ -1,4 +1,5 @@
 1.5.22.dev0
 1.5.22.dev0
+ * #288: Database dump hooks for MongoDB.
  * #470: Move mysqldump options to the beginning of the command due to MySQL bug 30994.
  * #470: Move mysqldump options to the beginning of the command due to MySQL bug 30994.
  * #471: When command-line configuration override produces a parse error, error cleanly instead of
  * #471: When command-line configuration override produces a parse error, error cleanly instead of
    tracebacking.
    tracebacking.

+ 1 - 1
README.md

@@ -65,11 +65,11 @@ borgmatic is powered by [Borg Backup](https://www.borgbackup.org/).
 <a href="https://www.postgresql.org/"><img src="docs/static/postgresql.png" alt="PostgreSQL" height="60px" style="margin-bottom:20px;"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 <a href="https://www.postgresql.org/"><img src="docs/static/postgresql.png" alt="PostgreSQL" height="60px" style="margin-bottom:20px;"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 <a href="https://www.mysql.com/"><img src="docs/static/mysql.png" alt="MySQL" height="60px" style="margin-bottom:20px;"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 <a href="https://www.mysql.com/"><img src="docs/static/mysql.png" alt="MySQL" height="60px" style="margin-bottom:20px;"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 <a href="https://mariadb.com/"><img src="docs/static/mariadb.png" alt="MariaDB" height="60px" style="margin-bottom:20px;"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 <a href="https://mariadb.com/"><img src="docs/static/mariadb.png" alt="MariaDB" height="60px" style="margin-bottom:20px;"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<a href="https://www.mongodb.com/"><img src="docs/static/mongodb.png" alt="MongoDB" height="60px" style="margin-bottom:20px;"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 <a href="https://healthchecks.io/"><img src="docs/static/healthchecks.png" alt="Healthchecks" height="60px" style="margin-bottom:20px;"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 <a href="https://healthchecks.io/"><img src="docs/static/healthchecks.png" alt="Healthchecks" height="60px" style="margin-bottom:20px;"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 <a href="https://cronitor.io/"><img src="docs/static/cronitor.png" alt="Cronitor" height="60px" style="margin-bottom:20px;"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 <a href="https://cronitor.io/"><img src="docs/static/cronitor.png" alt="Cronitor" height="60px" style="margin-bottom:20px;"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 <a href="https://cronhub.io/"><img src="docs/static/cronhub.png" alt="Cronhub" height="60px" style="margin-bottom:20px;"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 <a href="https://cronhub.io/"><img src="docs/static/cronhub.png" alt="Cronhub" height="60px" style="margin-bottom:20px;"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 <a href="https://www.pagerduty.com/"><img src="docs/static/pagerduty.png" alt="PagerDuty" height="60px" style="margin-bottom:20px;"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 <a href="https://www.pagerduty.com/"><img src="docs/static/pagerduty.png" alt="PagerDuty" height="60px" style="margin-bottom:20px;"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-<a href="https://www.rsync.net/cgi-bin/borg.cgi?campaign=borg&adgroup=borgmatic"><img src="docs/static/rsyncnet.png" alt="rsync.net" height="60px" style="margin-bottom:20px;"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 <a href="https://www.borgbase.com/?utm_source=borgmatic"><img src="docs/static/borgbase.png" alt="BorgBase" height="60px" style="margin-bottom:20px;"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 <a href="https://www.borgbase.com/?utm_source=borgmatic"><img src="docs/static/borgbase.png" alt="BorgBase" height="60px" style="margin-bottom:20px;"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 
 
 
 

+ 6 - 7
borgmatic/config/schema.yaml

@@ -798,7 +798,7 @@ properties:
                         port:
                         port:
                             type: integer
                             type: integer
                             description: Port to connect to. Defaults to 27017.
                             description: Port to connect to. Defaults to 27017.
-                            example: 27017
+                            example: 27018
                         username:
                         username:
                             type: string
                             type: string
                             description: |
                             description: |
@@ -811,15 +811,14 @@ properties:
                                 Password with which to connect to the database.
                                 Password with which to connect to the database.
                                 Skip it if no authentication is needed.
                                 Skip it if no authentication is needed.
                             example: trustsome1
                             example: trustsome1
-                        auth_db:
+                        authentication_database:
                             type: string
                             type: string
                             description: |
                             description: |
                                 Authentication database where the specified
                                 Authentication database where the specified
-                                username has been created.
-                                If no authentication database is specified,
-                                the databse provided in "name" will be used.
-                                If "name" is "all", the "admin" database will
-                                be used.
+                                username exists. If no authentication database
+                                is specified, the database provided in "name"
+                                is used. If "name" is "all", the "admin"
+                                database is used.
                             example: admin
                             example: admin
                         format:
                         format:
                             type: string
                             type: string

+ 4 - 4
borgmatic/hooks/mongodb.py

@@ -72,8 +72,8 @@ def build_dump_command(database, dump_filename, dump_format):
         command.extend(('--username', database['username']))
         command.extend(('--username', database['username']))
     if 'password' in database:
     if 'password' in database:
         command.extend(('--password', database['password']))
         command.extend(('--password', database['password']))
-    if 'auth_db' in database:
-        command.extend(('--authenticationDatabase', database['auth_db']))
+    if 'authentication_database' in database:
+        command.extend(('--authenticationDatabase', database['authentication_database']))
     if not all_databases:
     if not all_databases:
         command.extend(('--db', database['name']))
         command.extend(('--db', database['name']))
     if 'options' in database:
     if 'options' in database:
@@ -157,6 +157,6 @@ def build_restore_command(extract_process, database, dump_filename):
         command.extend(('--username', database['username']))
         command.extend(('--username', database['username']))
     if 'password' in database:
     if 'password' in database:
         command.extend(('--password', database['password']))
         command.extend(('--password', database['password']))
-    if 'auth_db' in database:
-        command.extend(('--authenticationDatabase', database['auth_db']))
+    if 'authentication_database' in database:
+        command.extend(('--authenticationDatabase', database['authentication_database']))
     return command
     return command

+ 21 - 7
docs/how-to/backup-your-databases.md

@@ -15,7 +15,8 @@ consistent snapshot that is more suited for backups.
 
 
 Fortunately, borgmatic includes built-in support for creating database dumps
 Fortunately, borgmatic includes built-in support for creating database dumps
 prior to running backups. For example, here is everything you need to dump and
 prior to running backups. For example, here is everything you need to dump and
-backup a couple of local PostgreSQL databases and a MySQL/MariaDB database:
+backup a couple of local PostgreSQL databases, a MySQL/MariaDB database, and a
+MongoDB database:
 
 
 ```yaml
 ```yaml
 hooks:
 hooks:
@@ -24,12 +25,15 @@ hooks:
         - name: orders
         - name: orders
     mysql_databases:
     mysql_databases:
         - name: posts
         - name: posts
+    mongodb_databases:
+        - name: messages
 ```
 ```
 
 
 As part of each backup, borgmatic streams a database dump for each configured
 As part of each backup, borgmatic streams a database dump for each configured
 database directly to Borg, so it's included in the backup without consuming
 database directly to Borg, so it's included in the backup without consuming
-additional disk space. (The one exception is PostgreSQL's "directory" dump
-format, which can't stream and therefore does consume temporary disk space.)
+additional disk space. (The exceptions are the PostgreSQL/MongoDB "directory"
+dump formats, which can't stream and therefore do consume temporary disk
+space.)
 
 
 To support this, borgmatic creates temporary named pipes in `~/.borgmatic` by
 To support this, borgmatic creates temporary named pipes in `~/.borgmatic` by
 default. To customize this path, set the `borgmatic_source_directory` option
 default. To customize this path, set the `borgmatic_source_directory` option
@@ -59,6 +63,14 @@ hooks:
           username: root
           username: root
           password: trustsome1
           password: trustsome1
           options: "--skip-comments"
           options: "--skip-comments"
+    mongodb_databases:
+        - name: messages
+          hostname: database3.example.org
+          port: 27018
+          username: dbuser
+          password: trustsome1
+          authentication_database: mongousers
+          options: "--ssl"
 ```
 ```
 
 
 If you want to dump all databases on a host, use `all` for the database name:
 If you want to dump all databases on a host, use `all` for the database name:
@@ -69,13 +81,15 @@ hooks:
         - name: all
         - name: all
     mysql_databases:
     mysql_databases:
         - name: all
         - name: all
+    mongodb_databases:
+        - name: all
 ```
 ```
 
 
 Note that you may need to use a `username` of the `postgres` superuser for
 Note that you may need to use a `username` of the `postgres` superuser for
 this to work with PostgreSQL.
 this to work with PostgreSQL.
 
 
 If you would like to backup databases only and not source directories, you can
 If you would like to backup databases only and not source directories, you can
-specify an empty `source_directories` value because it is a mandatory field:
+specify an empty `source_directories` value (as it is a mandatory field):
 
 
 ```yaml
 ```yaml
 location:
 location:
@@ -97,7 +111,7 @@ bring back any missing configuration files in order to restore a database.
 
 
 ## Supported databases
 ## Supported databases
 
 
-As of now, borgmatic supports PostgreSQL and MySQL/MariaDB databases
+As of now, borgmatic supports PostgreSQL, MySQL/MariaDB, and MongoDB databases
 directly. But see below about general-purpose preparation and cleanup hooks as
 directly. But see below about general-purpose preparation and cleanup hooks as
 a work-around with other database systems. Also, please [file a
 a work-around with other database systems. Also, please [file a
 ticket](https://torsion.org/borgmatic/#issues) for additional database systems
 ticket](https://torsion.org/borgmatic/#issues) for additional database systems
@@ -196,8 +210,8 @@ that may not be exhaustive.
 If you prefer to restore a database without the help of borgmatic, first
 If you prefer to restore a database without the help of borgmatic, first
 [extract](https://torsion.org/borgmatic/docs/how-to/extract-a-backup/) an
 [extract](https://torsion.org/borgmatic/docs/how-to/extract-a-backup/) an
 archive containing a database dump, and then manually restore the dump file
 archive containing a database dump, and then manually restore the dump file
-found within the extracted `~/.borgmatic/` path (e.g. with `pg_restore` or
-`mysql` commands).
+found within the extracted `~/.borgmatic/` path (e.g. with `pg_restore`,
+`mysql`, or `mongorestore`, commands).
 
 
 
 
 ## Preparation and cleanup hooks
 ## Preparation and cleanup hooks

BIN
docs/static/mongodb.png


BIN
docs/static/rsyncnet.png


+ 1 - 1
tests/end-to-end/test_database.py

@@ -52,7 +52,7 @@ hooks:
           hostname: mongodb
           hostname: mongodb
           username: root
           username: root
           password: test
           password: test
-          auth_db: admin
+          authentication_database: admin
         - name: all
         - name: all
           hostname: mongodb
           hostname: mongodb
           username: root
           username: root

+ 14 - 2
tests/unit/hooks/test_mongodb.py

@@ -67,7 +67,14 @@ def test_dump_databases_runs_mongodump_with_hostname_and_port():
 
 
 
 
 def test_dump_databases_runs_mongodump_with_username_and_password():
 def test_dump_databases_runs_mongodump_with_username_and_password():
-    databases = [{'name': 'foo', 'username': 'mongo', 'password': 'trustsome1', 'auth_db': "admin"}]
+    databases = [
+        {
+            'name': 'foo',
+            'username': 'mongo',
+            'password': 'trustsome1',
+            'authentication_database': "admin",
+        }
+    ]
     process = flexmock()
     process = flexmock()
     flexmock(module).should_receive('make_dump_path').and_return('')
     flexmock(module).should_receive('make_dump_path').and_return('')
     flexmock(module.dump).should_receive('make_database_dump_filename').and_return(
     flexmock(module.dump).should_receive('make_database_dump_filename').and_return(
@@ -216,7 +223,12 @@ def test_restore_database_dump_runs_pg_restore_with_hostname_and_port():
 
 
 def test_restore_database_dump_runs_pg_restore_with_username_and_password():
 def test_restore_database_dump_runs_pg_restore_with_username_and_password():
     database_config = [
     database_config = [
-        {'name': 'foo', 'username': 'mongo', 'password': 'trustsome1', 'auth_db': 'admin'}
+        {
+            'name': 'foo',
+            'username': 'mongo',
+            'password': 'trustsome1',
+            'authentication_database': 'admin',
+        }
     ]
     ]
     extract_process = flexmock(stdout=flexmock())
     extract_process = flexmock(stdout=flexmock())