weblate/docs/admin/backup.rst
2021-01-05 12:40:51 +01:00

315 lines
10 KiB
ReStructuredText

.. _backup:
Backing up and moving Weblate
=============================
Automated backup using BorgBackup
---------------------------------
.. versionadded:: 3.9
Weblate has built-in support for creating service backups using `BorgBackup`_.
Borg creates space-effective encrypted backups which can be safely stored in
the cloud. The backups can be controlled in the management interface on the
:guilabel:`Backups` tab.
.. versionchanged:: 4.4.1
Both PostgreSQL and MySQL/MariaDB databases are included in the automated backups.
The backups using Borg are incremental and Weblate is configured to keep following backups:
* 14 daily backups
* 8 weekly backups
* 6 monthly backups
.. image:: /images/backups.png
.. _borg-keys:
Borg encryption key
~~~~~~~~~~~~~~~~~~~
`BorgBackup`_ creates encrypted backups and without a passphrase you will not
be able to restore the backup. The passphrase is generated when adding new
backup service and you should copy it and keep it in a secure place.
In case you are using :ref:`cloudbackup`, please backup your private SSH key as
well — it is used to access your backups.
.. seealso::
:doc:`borg:usage/init`
.. _cloudbackup:
Weblate provisioned backup storage
----------------------------------
The easiest approach to backup your Weblate instance is to purchase `backup
service at weblate.org <https://weblate.org/support/#backup>`_. The process of
activating can be performed in few steps:
1. Purchase backup service on https://weblate.org/support/#backup.
2. Enter obtained key in the management interface, see :ref:`activate-support`.
3. Weblate will connect to the cloud service and obtain access information for the backups.
4. Turn on the new backup configuration on the :guilabel:`Backups` tab.
5. Backup Borg credentials in order to be able to restore the backups, see :ref:`borg-keys`.
.. hint::
The manual step of turning on is there for your safety. Without your consent
no data is sent to the backup repository obtained through the registration
process.
.. _custombackup:
Using custom backup storage
---------------------------
You can also use your own storage for the backups. SSH can be used to store backups
on the remote destination, the target server needs to have `BorgBackup`_
installed.
.. seealso::
:doc:`borg:usage/general` in the Borg documentation
Local filesystem
~~~~~~~~~~~~~~~~
It is recommended to specify absolute path for the local backup, for example
`/path/to/backup`. The directory has to be writable by user running Weblate
(see :ref:`file-permissions`). In case it doesn't exist, Weblate will attempt
to create it, but it needs permissions to do so.
.. hint::
When running Weblate in Docker, please make sure that the backup location
is exposed as a volume from the Weblate container. Otherwise the backups
would be discarded by Docker on container restart.
One option is to place backups in existing volume. For example choose
:file:`/app/data/borgbackup`. This is existing volume in the container.
You can also add new container for the backups in the Docker compose file
and use for example :file:`/borgbackup`:
.. code-block:: yaml
services:
weblate:
volumes:
- /home/weblate/data:/app/data
- /home/weblate/borgbackup:/borgbackup
The directory where backups will be stored have to be owned by UID 1000,
otherwise Weblate will not be able to write the backups there.
Remote backups
~~~~~~~~~~~~~~
Remote backups using SSH are supported. The SSH server needs to have
`BorgBackup`_ installed. Weblate connects to the server using SSH key, please
make sure the Weblate SSH key is accepted by the server (see
:ref:`weblate-ssh-key`).
.. hint::
:ref:`cloudbackup` provides you automated remote backups.
Restoring from BorgBackup
-------------------------
1. Restore access to your backup repository and prepare your backup passphrase.
2. List backup existing on the server using ``borg list REPOSITORY``.
3. Restore the desired backup to current directory using ``borg extract REPOSITORY::ARCHIVE``.
4. Restore the database from the SQL dump placed in the ``backup`` directory in the Weblate data dir (see :ref:`backup-dumps`).
5. Copy Weblate configuration (:file:`backups/settings.py`, see :ref:`backup-dumps`) to the correct location, see :ref:`configuration`.
6. Copy the whole restored data dir to location configured by :setting:`DATA_DIR`.
The Borg session might look like:
.. code-block:: console
$ borg list /tmp/xxx
Enter passphrase for key /tmp/xxx:
2019-09-26T14:56:08 Thu, 2019-09-26 14:56:08 [de0e0f13643635d5090e9896bdaceb92a023050749ad3f3350e788f1a65576a5]
$ borg extract /tmp/xxx::2019-09-26T14:56:08
Enter passphrase for key /tmp/xxx:
.. seealso::
:doc:`borg:usage/list`,
:doc:`borg:usage/extract`
.. _BorgBackup: https://www.borgbackup.org/
Manual backup
-------------
Depending on what you want to save, back up the type data Weblate stores in each respective place.
.. hint::
In case you are doing manual backups, you might want to silent Weblate
warning about lack of backups by adding ``weblate.I028`` to
:setting:`django:SILENCED_SYSTEM_CHECKS` in :file:`settings.py` or
:envvar:`WEBLATE_SILENCED_SYSTEM_CHECKS` for Docker.
.. code-block:: python
SILENCED_SYSTEM_CHECKS.append("weblate.I028")
Database
~~~~~~~~
The actual storage location depends on your database setup.
The database is the most important storage. Set up regular
backups of your database, without it all your translation setup will be gone.
Native database backup
++++++++++++++++++++++
The recommended approach is to do dump of the database using database native
tools such as :program:`pg_dump` or :program:`mysqldump`. It usually performs
better than Django backup and restores complete tables with all data.
You can restore this backup in newer Weblate release, it will perform any
necessary migrations when running in :djadmin:`django:migrate`. Please consult
:doc:`upgrade` on more detailed information how to perform upgrade between
versions.
Django database backup
++++++++++++++++++++++
Alternatively you can backup database using Django's :djadmin:`django:dumpdata`
command. That way the backup is database agnostic and can be used in case you
want to change database backend.
Prior to restoring you need to be running exactly same Weblate version as was
used when doing backups. This is necessary as the database structure does
change between releases and you would end up corrupting the data in some way.
After installing the same version, run all database migrations using
:djadmin:`django:migrate`.
Once this is done, some entries will be already created in the database and you
will have them in the database backup as well. The recommended approach is to
delete such entries manually using management shell (see :ref:`invoke-manage`):
.. code-block:: console
weblate shell
>>> from weblate.auth.models import User
>>> User.objects.get(username='anonymous').delete()
Files
~~~~~
If you have enough backup space, simply backup the whole :setting:`DATA_DIR`. This
is safe bet even if it includes some files you don't want.
The following sections describe in detail what you should back up and what you
can skip.
.. _backup-dumps:
Dumped data for backups
+++++++++++++++++++++++
Stored in :setting:`DATA_DIR` ``/backups``.
Weblate dumps various data here, and you can include these files for more complete
backups. The files are updated daily (requires a running Celery beats server, see
:ref:`celery`). Currently, this includes:
* Weblate settings as :file:`settings.py` (there is also expanded version in :file:`settings-expanded.py`).
* PostgreSQL database backup as :file:`database.sql`.
The database backups are by default saved as plain text, but they can also be compressed
or entirely skipped by using :setting:`DATABASE_BACKUP`.
Version control repositories
++++++++++++++++++++++++++++
Stored in :setting:`DATA_DIR` ``/vcs``.
The version control repositories contain a copy of your upstream repositories
with Weblate changes. If you have push on commit enabled for all your
translation components, all Weblate changes are included upstream and you
do not have to backup the repositories on the Weblate side. They can be cloned
again from the upstream locations with no data loss.
SSH and GPG keys
++++++++++++++++
Stored in :setting:`DATA_DIR` ``/ssh`` and :setting:`DATA_DIR` ``/home``.
If you are using SSH or GPG keys generated by Weblate, you should back up these
locations, otherwise you will lose the private keys and you will have to
regenerate new ones.
User uploaded files
+++++++++++++++++++
Stored in :setting:`DATA_DIR` ``/media``.
You should back up user uploaded files (e.g. :ref:`screenshots`).
Celery tasks
++++++++++++
The Celery tasks queue might contain some info, but is usually not needed
for a backup. At most you will lose updates that have not yet been processed to translation
memory. It is recommended to perform the fulltext or repository updates upon
restoring anyhow, so there is no problem in losing these.
.. seealso::
:ref:`celery`
Command line for manual backup
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Using a cron job, you can set up a bash command to be executed on a daily basis, for instance:
.. code-block:: console
$ XZ_OPT="-9" tar -Jcf ~/backup/weblate-backup-$(date -u +%Y-%m-%d_%H%M%S).xz backups vcs ssh home media fonts secret
The string between quotes after XZ_OPT allows you to choose your xz options, for instance the amount of memory used for compression; see https://linux.die.net/man/1/xz
You can adjust the list of folders and files to your needs. For instance, to avoid saving the translation memory (in backups folder), you could use:
.. code-block:: console
$ XZ_OPT="-9" tar -Jcf ~/backup/weblate-backup-$(date -u +%Y-%m-%d_%H%M%S).xz backups/database.sql backups/settings.py vcs ssh home media fonts secret
Restoring manual backup
-----------------------
1. Restore all data you have backed up.
2. Update all repositories using :djadmin:`updategit`.
.. code-block:: sh
weblate updategit --all
Moving a Weblate installation
------------------------------
Relocate your installation to a different system
by following the backup and restore instructions above.
.. seealso::
:ref:`py3`,
:ref:`database-migration`