mirror of
https://github.com/umap-project/umap.git
synced 2025-05-04 21:51:50 +02:00
Add and document backup-related commands
This commit is contained in:
parent
ef024c772d
commit
7d62453408
4 changed files with 104 additions and 0 deletions
44
docs/backup.md
Normal file
44
docs/backup.md
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
# Backups
|
||||||
|
|
||||||
|
There are two important places where your data are located,
|
||||||
|
in your database and in your media folder. The following `umap` commands
|
||||||
|
might help you to backup these data:
|
||||||
|
|
||||||
|
## `backup`
|
||||||
|
|
||||||
|
The `backup` command requires a `path` as a parameter where two archives
|
||||||
|
will be generated:
|
||||||
|
|
||||||
|
* `<path>/database.<isodate>.tar.gz` contains a JSON dump of the database
|
||||||
|
ready to be passed to a `loaddata` command.
|
||||||
|
* `<path>/media.<isodate>.tar.gz` contains the content of your media
|
||||||
|
folder as declared in your `MEDIA_ROOT` setting.
|
||||||
|
|
||||||
|
### Examples
|
||||||
|
|
||||||
|
```
|
||||||
|
umap backup /tmp/test_backup
|
||||||
|
```
|
||||||
|
|
||||||
|
will generate (if run on May, 4th 2017!):
|
||||||
|
|
||||||
|
```
|
||||||
|
/tmp/test_backup/database.2017-05-04.tar.gz
|
||||||
|
/tmp/test_backup/media.2017-05-04.tar.gz
|
||||||
|
```
|
||||||
|
|
||||||
|
## `sync_backup`
|
||||||
|
|
||||||
|
The `sync_backup` command requires a `path` as a parameter and
|
||||||
|
a `destination` to synchronize to.
|
||||||
|
|
||||||
|
It will take both database and media archives files for the current day
|
||||||
|
and `rsync` these to the destination.
|
||||||
|
|
||||||
|
### Examples
|
||||||
|
|
||||||
|
```
|
||||||
|
umap sync_backup /tmp/test_backup root@ip:/backups
|
||||||
|
```
|
||||||
|
|
||||||
|
will sync generated files from the `backup` command to your distant server.
|
|
@ -5,4 +5,5 @@ pages:
|
||||||
- Contributing: contributing.md
|
- Contributing: contributing.md
|
||||||
- how-tos:
|
- how-tos:
|
||||||
- Ubuntu from scratch: ubuntu.md
|
- Ubuntu from scratch: ubuntu.md
|
||||||
|
- Backups and sync: backup.md
|
||||||
theme: readthedocs
|
theme: readthedocs
|
||||||
|
|
39
umap/management/commands/backup.py
Normal file
39
umap/management/commands/backup.py
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
import os
|
||||||
|
import tarfile
|
||||||
|
from datetime import date
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
from django.conf import settings
|
||||||
|
from django.core.management import call_command
|
||||||
|
from django.core.management.base import BaseCommand
|
||||||
|
|
||||||
|
|
||||||
|
class Command(BaseCommand):
|
||||||
|
help = 'Backup database (postgresql) and geojsons.'
|
||||||
|
|
||||||
|
def add_arguments(self, parser):
|
||||||
|
parser.add_argument('path', help='Location of the backups.')
|
||||||
|
|
||||||
|
def archive(self, source, destination):
|
||||||
|
try:
|
||||||
|
archive = tarfile.open(str(destination), mode='w:gz')
|
||||||
|
archive.add(str(source), arcname='./', recursive=True,
|
||||||
|
exclude=os.path.islink)
|
||||||
|
except: # NOQA
|
||||||
|
raise
|
||||||
|
finally:
|
||||||
|
archive.close()
|
||||||
|
|
||||||
|
def handle(self, *args, **options):
|
||||||
|
today = date.today().isoformat()
|
||||||
|
root = Path(options['path'])
|
||||||
|
if not root.exists():
|
||||||
|
root.mkdir()
|
||||||
|
database_tmp = root.joinpath('database.{}.json'.format(today))
|
||||||
|
with database_tmp.open('w') as out:
|
||||||
|
call_command('dumpdata', format='json', stdout=out)
|
||||||
|
self.archive(database_tmp,
|
||||||
|
root.joinpath('database.{}.tar.gz'.format(today)))
|
||||||
|
self.archive(settings.MEDIA_ROOT,
|
||||||
|
root.joinpath('media.{}.tar.gz'.format(today)))
|
||||||
|
os.unlink(str(database_tmp))
|
20
umap/management/commands/sync_backup.py
Normal file
20
umap/management/commands/sync_backup.py
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
import subprocess
|
||||||
|
from datetime import date
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
from django.core.management.base import BaseCommand
|
||||||
|
|
||||||
|
|
||||||
|
class Command(BaseCommand):
|
||||||
|
help = "Synchronize today's backup with whatever rsync-able."
|
||||||
|
|
||||||
|
def add_arguments(self, parser):
|
||||||
|
parser.add_argument('path', help='Location of the backups.')
|
||||||
|
parser.add_argument('destination', help='Destination of the backups.')
|
||||||
|
|
||||||
|
def handle(self, *args, **options):
|
||||||
|
today = date.today().isoformat()
|
||||||
|
root = Path(options['path'])
|
||||||
|
subprocess.call(
|
||||||
|
['rsync', '-rv', str(root), '--include', '*{}*'.format(today),
|
||||||
|
options['destination']])
|
Loading…
Reference in a new issue