|
| 1 | +# How to back up a Synapse homeserver |
| 2 | + |
| 3 | +It is critical to maintain good backups of your server, to guard against |
| 4 | +hardware failure as well as potential corruption due to bugs or administrator |
| 5 | +error. |
| 6 | + |
| 7 | +This page documents the things you will need to consider backing up as part of |
| 8 | +a Synapse installation. |
| 9 | + |
| 10 | +## Configuration files |
| 11 | + |
| 12 | +Keep a copy of your configuration file (`homeserver.yaml`), as well as any |
| 13 | +auxiliary config files it refers to such as the |
| 14 | +[`log_config`](../configuration/config_documentation.md#log_config) file, |
| 15 | +[`app_service_config_files`](../configuration/config_documentation.md#app_service_config_files). |
| 16 | +Often, all such config files will be kept in a single directory such as |
| 17 | +`/etc/synapse`, which will make this easier. |
| 18 | + |
| 19 | +## Server signing key |
| 20 | + |
| 21 | +Your server has a [signing |
| 22 | +key](../configuration/config_documentation.md#signing_key_path) which it uses |
| 23 | +to sign events and outgoing federation requests. It is easiest to back it up |
| 24 | +with your configuration files, but an alternative is to have Synapse create a |
| 25 | +new signing key if you have to restore. |
| 26 | + |
| 27 | +If you do decide to replace the signing key, you should add the old *public* |
| 28 | +key to |
| 29 | +[`old_signing_keys`](../configuration/config_documentation.md#old_signing_keys). |
| 30 | + |
| 31 | +## Database |
| 32 | + |
| 33 | +Synapse's support for SQLite is only suitable for testing purposes, so for the |
| 34 | +purposes of this document, we'll assume you are using |
| 35 | +[PostgreSQL](../../postgres.md). |
| 36 | + |
| 37 | +A full discussion of backup strategies for PostgreSQL is out of scope for this |
| 38 | +document; see the [PostgreSQL |
| 39 | +documentation](https://www.postgresql.org/docs/current/backup.html) for |
| 40 | +detailed information. |
| 41 | + |
| 42 | +### Synapse-specfic details |
| 43 | + |
| 44 | + * Be very careful not to restore into a database that already has tables |
| 45 | + present. At best, this will error; at worst, it will lead to subtle database |
| 46 | + inconsistencies. |
| 47 | + |
| 48 | + * The `e2e_one_time_keys_json` table should **not** be backed up, or if it is |
| 49 | + backed up, should be |
| 50 | + [`TRUNCATE`d](https://www.postgresql.org/docs/current/sql-truncate.html) |
| 51 | + after restoring the database before Synapse is started. |
| 52 | + |
| 53 | + [Background: restoring the database to an older backup can cause |
| 54 | + used one-time-keys to be re-issued, causing subsequent [message decryption |
| 55 | + errors](https://github.com/element-hq/element-meta/issues/2155). Clearing |
| 56 | + all one-time-keys from the database ensures that this cannot happen, and |
| 57 | + will prompt clients to generate and upload new one-time-keys.] |
| 58 | + |
| 59 | +### Quick and easy database backup and restore |
| 60 | + |
| 61 | +Typically, the easiest solution is to use `pg_dump` to take a copy of the whole |
| 62 | +database. We recommend `pg_dump`'s custom dump format, as it produces |
| 63 | +significantly smaller backup files. |
| 64 | + |
| 65 | +```shell |
| 66 | +sudo -u postgres pg_dump -Fc --exclude-table-data e2e_one_time_keys_json synapse > synapse.dump |
| 67 | +``` |
| 68 | + |
| 69 | +There is no need to stop Postgres or Synapse while `pg_dump` is running: it |
| 70 | +will take a consistent snapshot of the databse. |
| 71 | + |
| 72 | +To restore, you will need to recreate the database as described in [Using |
| 73 | +Postgres](../../postgres.md#set-up-database), |
| 74 | +then load the dump into it with `pg_restore`: |
| 75 | + |
| 76 | +```shell |
| 77 | +sudo -u postgres createdb --encoding=UTF8 --locale=C --template=template0 --owner=synapse_user synapse |
| 78 | +sudo -u postgres pg_restore -d synapse < synapse.dump |
| 79 | +``` |
| 80 | + |
| 81 | +(If you forgot to exclude `e2e_one_time_keys_json` during `pg_dump`, remember |
| 82 | +to connect to the new database and `TRUNCATE e2e_one_time_keys_json;` before |
| 83 | +starting Synapse.) |
| 84 | + |
| 85 | +To reiterate: do **not** restore a dump over an existing database. |
| 86 | + |
| 87 | +Again, if you plan to run your homeserver at any sort of production level, we |
| 88 | +recommend studying the PostgreSQL documentation on backup options. |
| 89 | + |
| 90 | +## Media store |
| 91 | + |
| 92 | +Synapse keeps a copy of media uploaded by users, including avatars and message |
| 93 | +attachments, in its [Media |
| 94 | +store](../configuration/config_documentation.md#media-store). |
| 95 | + |
| 96 | +It is a directory on the local disk, containing the following directories: |
| 97 | + |
| 98 | + * `local_content`: this is content uploaded by your local users. As a general |
| 99 | + rule, you should back this up: it may represent the only copy of those |
| 100 | + media files anywhere in the federation, and if they are lost, users will |
| 101 | + see errors when viewing user or room avatars, and messages with attachments. |
| 102 | + |
| 103 | + * `local_thumbnails`: "thumbnails" of images uploaded by your users. If |
| 104 | + [`dynamic_thumbnails`](../configuration/config_documentation.md#dynamic_thumbnails) |
| 105 | + is enabled, these will be regenerated if they are removed from the disk, and |
| 106 | + there is therefore no need to back them up. |
| 107 | + |
| 108 | + If `dynamic_thumbnails` is *not* enabled (the default): although this can |
| 109 | + theoretically be regenerated from `local_content`, there is no tooling to do |
| 110 | + so. We recommend that these are backed up too. |
| 111 | + |
| 112 | + * `remote_content`: this is a cache of content that was uploaded by a user on |
| 113 | + another server, and has since been requested by a user on your own server. |
| 114 | + |
| 115 | + Typically there is no need to back up this directory: if a file in this directory |
| 116 | + is removed, Synapse will attempt to fetch it again from the remote |
| 117 | + server. |
| 118 | + |
| 119 | + * `remote_thumbnails`: thumbnails of images uploaded by users on other |
| 120 | + servers. As with `remote_content`, there is normally no need to back this |
| 121 | + up. |
| 122 | + |
| 123 | + * `url_cache`, `url_cache_thumbnails`: temporary caches of files downloaded |
| 124 | + by the [URL previews](../../setup/installation.md#url-previews) feature. |
| 125 | + These do not need to be backed up. |
0 commit comments