2015-04-27 09:53:35 -04:00
|
|
|
Using Postgres
|
|
|
|
--------------
|
|
|
|
|
2017-09-01 09:52:45 -04:00
|
|
|
Postgres version 9.4 or later is known to work.
|
|
|
|
|
2015-04-29 06:50:18 -04:00
|
|
|
Set up database
|
|
|
|
===============
|
|
|
|
|
2018-05-16 17:31:19 -04:00
|
|
|
Assuming your PostgreSQL database user is called ``postgres``, create a user
|
|
|
|
``synapse_user`` with::
|
|
|
|
|
2018-06-04 18:41:52 -04:00
|
|
|
su - postgres
|
|
|
|
createuser --pwprompt synapse_user
|
2018-05-16 17:31:19 -04:00
|
|
|
|
|
|
|
The PostgreSQL database used *must* have the correct encoding set, otherwise it
|
2015-04-29 06:50:18 -04:00
|
|
|
would not be able to store UTF8 strings. To create a database with the correct
|
|
|
|
encoding use, e.g.::
|
|
|
|
|
2018-06-04 18:41:52 -04:00
|
|
|
CREATE DATABASE synapse
|
|
|
|
ENCODING 'UTF8'
|
|
|
|
LC_COLLATE='C'
|
|
|
|
LC_CTYPE='C'
|
|
|
|
template=template0
|
|
|
|
OWNER synapse_user;
|
2015-04-29 06:50:18 -04:00
|
|
|
|
|
|
|
This would create an appropriate database named ``synapse`` owned by the
|
|
|
|
``synapse_user`` user (which must already exist).
|
|
|
|
|
2015-12-05 09:09:20 -05:00
|
|
|
Set up client in Debian/Ubuntu
|
|
|
|
===========================
|
2015-04-28 19:48:07 -04:00
|
|
|
|
|
|
|
Postgres support depends on the postgres python connector ``psycopg2``. In the
|
2015-04-27 09:53:35 -04:00
|
|
|
virtual env::
|
|
|
|
|
|
|
|
sudo apt-get install libpq-dev
|
|
|
|
pip install psycopg2
|
|
|
|
|
2015-12-05 09:09:20 -05:00
|
|
|
Set up client in RHEL/CentOs 7
|
|
|
|
==============================
|
|
|
|
|
|
|
|
Make sure you have the appropriate version of postgres-devel installed. For a
|
|
|
|
postgres 9.4, use the postgres 9.4 packages from
|
|
|
|
[here](https://wiki.postgresql.org/wiki/YUM_Installation).
|
|
|
|
|
|
|
|
As with Debian/Ubuntu, postgres support depends on the postgres python connector
|
|
|
|
``psycopg2``. In the virtual env::
|
|
|
|
|
|
|
|
sudo yum install postgresql-devel libpqxx-devel.x86_64
|
|
|
|
export PATH=/usr/pgsql-9.4/bin/:$PATH
|
|
|
|
pip install psycopg2
|
2015-04-27 09:53:35 -04:00
|
|
|
|
|
|
|
Synapse config
|
|
|
|
==============
|
|
|
|
|
2018-05-16 17:31:19 -04:00
|
|
|
When you are ready to start using PostgreSQL, edit the ``database`` section in
|
|
|
|
your config file to match the following lines::
|
2015-04-27 09:53:35 -04:00
|
|
|
|
2015-05-01 09:06:43 -04:00
|
|
|
database:
|
|
|
|
name: psycopg2
|
|
|
|
args:
|
|
|
|
user: <user>
|
|
|
|
password: <pass>
|
|
|
|
database: <db>
|
|
|
|
host: <host>
|
|
|
|
cp_min: 5
|
|
|
|
cp_max: 10
|
2015-04-27 09:53:35 -04:00
|
|
|
|
|
|
|
All key, values in ``args`` are passed to the ``psycopg2.connect(..)``
|
|
|
|
function, except keys beginning with ``cp_``, which are consumed by the twisted
|
|
|
|
adbapi connection pool.
|
2015-04-28 12:59:27 -04:00
|
|
|
|
|
|
|
|
|
|
|
Porting from SQLite
|
|
|
|
===================
|
|
|
|
|
2015-04-28 19:48:07 -04:00
|
|
|
Overview
|
|
|
|
~~~~~~~~
|
|
|
|
|
2015-08-27 08:01:38 -04:00
|
|
|
The script ``synapse_port_db`` allows porting an existing synapse server
|
|
|
|
backed by SQLite to using PostgreSQL. This is done in as a two phase process:
|
2015-04-28 12:59:27 -04:00
|
|
|
|
|
|
|
1. Copy the existing SQLite database to a separate location (while the server
|
|
|
|
is down) and running the port script against that offline database.
|
|
|
|
2. Shut down the server. Rerun the port script to port any data that has come
|
2015-04-28 19:48:07 -04:00
|
|
|
in since taking the first snapshot. Restart server against the PostgreSQL
|
2015-04-28 12:59:27 -04:00
|
|
|
database.
|
|
|
|
|
|
|
|
The port script is designed to be run repeatedly against newer snapshots of the
|
|
|
|
SQLite database file. This makes it safe to repeat step 1 if there was a delay
|
2015-04-28 19:48:07 -04:00
|
|
|
between taking the previous snapshot and being ready to do step 2.
|
2015-04-28 12:59:27 -04:00
|
|
|
|
|
|
|
It is safe to at any time kill the port script and restart it.
|
|
|
|
|
|
|
|
Using the port script
|
|
|
|
~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
|
|
|
|
Firstly, shut down the currently running synapse server and copy its database
|
2015-04-28 19:48:07 -04:00
|
|
|
file (typically ``homeserver.db``) to another location. Once the copy is
|
|
|
|
complete, restart synapse. For instance::
|
|
|
|
|
|
|
|
./synctl stop
|
|
|
|
cp homeserver.db homeserver.db.snapshot
|
|
|
|
./synctl start
|
2015-04-28 12:59:27 -04:00
|
|
|
|
2018-05-16 17:31:19 -04:00
|
|
|
Copy the old config file into a new config file::
|
|
|
|
|
|
|
|
cp homeserver.yaml homeserver-postgres.yaml
|
|
|
|
|
|
|
|
Edit the database section as described in the section *Synapse config* above
|
|
|
|
and with the SQLite snapshot located at ``homeserver.db.snapshot`` simply run::
|
2015-04-28 12:59:27 -04:00
|
|
|
|
2015-08-27 08:01:38 -04:00
|
|
|
synapse_port_db --sqlite-database homeserver.db.snapshot \
|
2015-05-08 08:50:03 -04:00
|
|
|
--postgres-config homeserver-postgres.yaml
|
2015-04-28 12:59:27 -04:00
|
|
|
|
|
|
|
The flag ``--curses`` displays a coloured curses progress UI.
|
|
|
|
|
|
|
|
If the script took a long time to complete, or time has otherwise passed since
|
|
|
|
the original snapshot was taken, repeat the previous steps with a newer
|
|
|
|
snapshot.
|
|
|
|
|
|
|
|
To complete the conversion shut down the synapse server and run the port
|
2015-04-28 13:09:20 -04:00
|
|
|
script one last time, e.g. if the SQLite database is at ``homeserver.db``
|
|
|
|
run::
|
2015-04-28 12:59:27 -04:00
|
|
|
|
2015-09-01 04:46:42 -04:00
|
|
|
synapse_port_db --sqlite-database homeserver.db \
|
2017-03-01 01:30:11 -05:00
|
|
|
--postgres-config homeserver-postgres.yaml
|
2015-04-28 12:59:27 -04:00
|
|
|
|
|
|
|
Once that has completed, change the synapse config to point at the PostgreSQL
|
2018-06-04 18:41:52 -04:00
|
|
|
database configuration file ``homeserver-postgres.yaml``::
|
2018-05-16 17:31:19 -04:00
|
|
|
|
|
|
|
./synctl stop
|
|
|
|
mv homeserver.yaml homeserver-old-sqlite.yaml
|
|
|
|
mv homeserver-postgres.yaml homeserver.yaml
|
|
|
|
./synctl start
|
|
|
|
|
|
|
|
Synapse should now be running against PostgreSQL.
|