123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383 |
- .. contents::
- Introduction
- ============
- Matrix is an ambitious new ecosystem for open federated Instant Messaging and
- VoIP. The basics you need to know to get up and running are:
- - Everything in Matrix happens in a room. Rooms are distributed and do not
- exist on any single server. Rooms can be located using convenience aliases
- like ``#matrix:matrix.org`` or ``#test:localhost:8448``.
- - Matrix user IDs look like ``@matthew:matrix.org`` (although in the future
- you will normally refer to yourself and others using a third party identifier
- (3PID): email address, phone number, etc rather than manipulating Matrix user IDs)
- The overall architecture is::
- client <----> homeserver <=====================> homeserver <----> client
- https://somewhere.org/_matrix https://elsewhere.net/_matrix
- ``#matrix:matrix.org`` is the official support room for Matrix, and can be
- accessed by any client from https://matrix.org/docs/projects/try-matrix-now.html or
- via IRC bridge at irc://irc.freenode.net/matrix.
- Synapse is currently in rapid development, but as of version 0.5 we believe it
- is sufficiently stable to be run as an internet-facing service for real usage!
- About Matrix
- ============
- Matrix specifies a set of pragmatic RESTful HTTP JSON APIs as an open standard,
- which handle:
- - Creating and managing fully distributed chat rooms with no
- single points of control or failure
- - Eventually-consistent cryptographically secure synchronisation of room
- state across a global open network of federated servers and services
- - Sending and receiving extensible messages in a room with (optional)
- end-to-end encryption[1]
- - Inviting, joining, leaving, kicking, banning room members
- - Managing user accounts (registration, login, logout)
- - Using 3rd Party IDs (3PIDs) such as email addresses, phone numbers,
- Facebook accounts to authenticate, identify and discover users on Matrix.
- - Placing 1:1 VoIP and Video calls
- These APIs are intended to be implemented on a wide range of servers, services
- and clients, letting developers build messaging and VoIP functionality on top
- of the entirely open Matrix ecosystem rather than using closed or proprietary
- solutions. The hope is for Matrix to act as the building blocks for a new
- generation of fully open and interoperable messaging and VoIP apps for the
- internet.
- Synapse is a reference "homeserver" implementation of Matrix from the core
- development team at matrix.org, written in Python/Twisted. It is intended to
- showcase the concept of Matrix and let folks see the spec in the context of a
- codebase and let you run your own homeserver and generally help bootstrap the
- ecosystem.
- In Matrix, every user runs one or more Matrix clients, which connect through to
- a Matrix homeserver. The homeserver stores all their personal chat history and
- user account information - much as a mail client connects through to an
- IMAP/SMTP server. Just like email, you can either run your own Matrix
- homeserver and control and own your own communications and history or use one
- hosted by someone else (e.g. matrix.org) - there is no single point of control
- or mandatory service provider in Matrix, unlike WhatsApp, Facebook, Hangouts,
- etc.
- We'd like to invite you to join #matrix:matrix.org (via
- https://matrix.org/docs/projects/try-matrix-now.html), run a homeserver, take a look
- at the `Matrix spec <https://matrix.org/docs/spec>`_, and experiment with the
- `APIs <https://matrix.org/docs/api>`_ and `Client SDKs
- <https://matrix.org/docs/projects/try-matrix-now.html#client-sdks>`_.
- Thanks for using Matrix!
- [1] End-to-end encryption is currently in beta: `blog post <https://matrix.org/blog/2016/11/21/matrixs-olm-end-to-end-encryption-security-assessment-released-and-implemented-cross-platform-on-riot-at-last>`_.
- Synapse Installation
- ====================
- .. _federation:
- * For details on how to install synapse, see `<INSTALL.md>`_.
- * For specific details on how to configure Synapse for federation see `docs/federate.md <docs/federate.md>`_
- Connecting to Synapse from a client
- ===================================
- The easiest way to try out your new Synapse installation is by connecting to it
- from a web client.
- Unless you are running a test instance of Synapse on your local machine, in
- general, you will need to enable TLS support before you can successfully
- connect from a client: see `<INSTALL.md#tls-certificates>`_.
- An easy way to get started is to login or register via Riot at
- https://riot.im/app/#/login or https://riot.im/app/#/register respectively.
- You will need to change the server you are logging into from ``matrix.org``
- and instead specify a Homeserver URL of ``https://<server_name>:8448``
- (or just ``https://<server_name>`` if you are using a reverse proxy).
- (Leave the identity server as the default - see `Identity servers`_.)
- If you prefer to use another client, refer to our
- `client breakdown <https://matrix.org/docs/projects/clients-matrix>`_.
- If all goes well you should at least be able to log in, create a room, and
- start sending messages.
- .. _`client-user-reg`:
- Registering a new user from a client
- ------------------------------------
- By default, registration of new users via Matrix clients is disabled. To enable
- it, specify ``enable_registration: true`` in ``homeserver.yaml``. (It is then
- recommended to also set up CAPTCHA - see `<docs/CAPTCHA_SETUP.rst>`_.)
- Once ``enable_registration`` is set to ``true``, it is possible to register a
- user via `riot.im <https://riot.im/app/#/register>`_ or other Matrix clients.
- Your new user name will be formed partly from the ``server_name``, and partly
- from a localpart you specify when you create the account. Your name will take
- the form of::
- @localpart:my.domain.name
- (pronounced "at localpart on my dot domain dot name").
- As when logging in, you will need to specify a "Custom server". Specify your
- desired ``localpart`` in the 'User name' box.
- ACME setup
- ==========
- For details on having Synapse manage your federation TLS certificates
- automatically, please see `<docs/ACME.md>`_.
- Security Note
- =============
- Matrix serves raw user generated data in some APIs - specifically the `content
- repository endpoints <https://matrix.org/docs/spec/client_server/latest.html#get-matrix-media-r0-download-servername-mediaid>`_.
- Whilst we have tried to mitigate against possible XSS attacks (e.g.
- https://github.com/matrix-org/synapse/pull/1021) we recommend running
- matrix homeservers on a dedicated domain name, to limit any malicious user generated
- content served to web browsers a matrix API from being able to attack webapps hosted
- on the same domain. This is particularly true of sharing a matrix webclient and
- server on the same domain.
- See https://github.com/vector-im/riot-web/issues/1977 and
- https://developer.github.com/changes/2014-04-25-user-content-security for more details.
- Upgrading an existing Synapse
- =============================
- The instructions for upgrading synapse are in `UPGRADE.rst`_.
- Please check these instructions as upgrading may require extra steps for some
- versions of synapse.
- .. _UPGRADE.rst: UPGRADE.rst
- Using PostgreSQL
- ================
- Synapse offers two database engines:
- * `SQLite <https://sqlite.org/>`_
- * `PostgreSQL <https://www.postgresql.org>`_
- By default Synapse uses SQLite in and doing so trades performance for convenience.
- SQLite is only recommended in Synapse for testing purposes or for servers with
- light workloads.
- Almost all installations should opt to use PostreSQL. Advantages include:
- * significant performance improvements due to the superior threading and
- caching model, smarter query optimiser
- * allowing the DB to be run on separate hardware
- * allowing basic active/backup high-availability with a "hot spare" synapse
- pointing at the same DB master, as well as enabling DB replication in
- synapse itself.
- For information on how to install and use PostgreSQL, please see
- `docs/postgres.rst <docs/postgres.rst>`_.
- .. _reverse-proxy:
- Using a reverse proxy with Synapse
- ==================================
- It is recommended to put a reverse proxy such as
- `nginx <https://nginx.org/en/docs/http/ngx_http_proxy_module.html>`_,
- `Apache <https://httpd.apache.org/docs/current/mod/mod_proxy_http.html>`_,
- `Caddy <https://caddyserver.com/docs/proxy>`_ or
- `HAProxy <https://www.haproxy.org/>`_ in front of Synapse. One advantage of
- doing so is that it means that you can expose the default https port (443) to
- Matrix clients without needing to run Synapse with root privileges.
- For information on configuring one, see `<docs/reverse_proxy.rst>`_.
- Identity Servers
- ================
- Identity servers have the job of mapping email addresses and other 3rd Party
- IDs (3PIDs) to Matrix user IDs, as well as verifying the ownership of 3PIDs
- before creating that mapping.
- **They are not where accounts or credentials are stored - these live on home
- servers. Identity Servers are just for mapping 3rd party IDs to matrix IDs.**
- This process is very security-sensitive, as there is obvious risk of spam if it
- is too easy to sign up for Matrix accounts or harvest 3PID data. In the longer
- term, we hope to create a decentralised system to manage it (`matrix-doc #712
- <https://github.com/matrix-org/matrix-doc/issues/712>`_), but in the meantime,
- the role of managing trusted identity in the Matrix ecosystem is farmed out to
- a cluster of known trusted ecosystem partners, who run 'Matrix Identity
- Servers' such as `Sydent <https://github.com/matrix-org/sydent>`_, whose role
- is purely to authenticate and track 3PID logins and publish end-user public
- keys.
- You can host your own copy of Sydent, but this will prevent you reaching other
- users in the Matrix ecosystem via their email address, and prevent them finding
- you. We therefore recommend that you use one of the centralised identity servers
- at ``https://matrix.org`` or ``https://vector.im`` for now.
- To reiterate: the Identity server will only be used if you choose to associate
- an email address with your account, or send an invite to another user via their
- email address.
- Password reset
- ==============
- If a user has registered an email address to their account using an identity
- server, they can request a password-reset token via clients such as Riot.
- A manual password reset can be done via direct database access as follows.
- First calculate the hash of the new password::
- $ ~/synapse/env/bin/hash_password
- Password:
- Confirm password:
- $2a$12$xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
- Then update the `users` table in the database::
- UPDATE users SET password_hash='$2a$12$xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
- WHERE name='@test:test.com';
- Synapse Development
- ===================
- Before setting up a development environment for synapse, make sure you have the
- system dependencies (such as the python header files) installed - see
- `Installing from source <INSTALL.md#installing-from-source>`_.
- To check out a synapse for development, clone the git repo into a working
- directory of your choice::
- git clone https://github.com/matrix-org/synapse.git
- cd synapse
- Synapse has a number of external dependencies, that are easiest
- to install using pip and a virtualenv::
- virtualenv -p python3 env
- source env/bin/activate
- python -m pip install --no-use-pep517 -e .[all]
- This will run a process of downloading and installing all the needed
- dependencies into a virtual env.
- Once this is done, you may wish to run Synapse's unit tests, to
- check that everything is installed as it should be::
- python -m twisted.trial tests
- This should end with a 'PASSED' result::
- Ran 143 tests in 0.601s
- PASSED (successes=143)
- Running the Integration Tests
- =============================
- Synapse is accompanied by `SyTest <https://github.com/matrix-org/sytest>`_,
- a Matrix homeserver integration testing suite, which uses HTTP requests to
- access the API as a Matrix client would. It is able to run Synapse directly from
- the source tree, so installation of the server is not required.
- Testing with SyTest is recommended for verifying that changes related to the
- Client-Server API are functioning correctly. See the `installation instructions
- <https://github.com/matrix-org/sytest#installing>`_ for details.
- Building Internal API Documentation
- ===================================
- Before building internal API documentation install sphinx and
- sphinxcontrib-napoleon::
- pip install sphinx
- pip install sphinxcontrib-napoleon
- Building internal API documentation::
- python setup.py build_sphinx
- Troubleshooting
- ===============
- Running out of File Handles
- ---------------------------
- If synapse runs out of file handles, it typically fails badly - live-locking
- at 100% CPU, and/or failing to accept new TCP connections (blocking the
- connecting client). Matrix currently can legitimately use a lot of file handles,
- thanks to busy rooms like #matrix:matrix.org containing hundreds of participating
- servers. The first time a server talks in a room it will try to connect
- simultaneously to all participating servers, which could exhaust the available
- file descriptors between DNS queries & HTTPS sockets, especially if DNS is slow
- to respond. (We need to improve the routing algorithm used to be better than
- full mesh, but as of March 2019 this hasn't happened yet).
- If you hit this failure mode, we recommend increasing the maximum number of
- open file handles to be at least 4096 (assuming a default of 1024 or 256).
- This is typically done by editing ``/etc/security/limits.conf``
- Separately, Synapse may leak file handles if inbound HTTP requests get stuck
- during processing - e.g. blocked behind a lock or talking to a remote server etc.
- This is best diagnosed by matching up the 'Received request' and 'Processed request'
- log lines and looking for any 'Processed request' lines which take more than
- a few seconds to execute. Please let us know at #synapse:matrix.org if
- you see this failure mode so we can help debug it, however.
- Help!! Synapse is slow and eats all my RAM/CPU!
- -----------------------------------------------
- First, ensure you are running the latest version of Synapse, using Python 3
- with a PostgreSQL database.
- Synapse's architecture is quite RAM hungry currently - we deliberately
- cache a lot of recent room data and metadata in RAM in order to speed up
- common requests. We'll improve this in the future, but for now the easiest
- way to either reduce the RAM usage (at the risk of slowing things down)
- is to set the almost-undocumented ``SYNAPSE_CACHE_FACTOR`` environment
- variable. The default is 0.5, which can be decreased to reduce RAM usage
- in memory constrained enviroments, or increased if performance starts to
- degrade.
- However, degraded performance due to a low cache factor, common on
- machines with slow disks, often leads to explosions in memory use due
- backlogged requests. In this case, reducing the cache factor will make
- things worse. Instead, try increasing it drastically. 2.0 is a good
- starting value.
- Using `libjemalloc <http://jemalloc.net/>`_ can also yield a significant
- improvement in overall memory use, and especially in terms of giving back
- RAM to the OS. To use it, the library must simply be put in the
- LD_PRELOAD environment variable when launching Synapse. On Debian, this
- can be done by installing the ``libjemalloc1`` package and adding this
- line to ``/etc/default/matrix-synapse``::
- LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.1
- This can make a significant difference on Python 2.7 - it's unclear how
- much of an improvement it provides on Python 3.x.
- If you're encountering high CPU use by the Synapse process itself, you
- may be affected by a bug with presence tracking that leads to a
- massive excess of outgoing federation requests (see `discussion
- <https://github.com/matrix-org/synapse/issues/3971>`_). If metrics
- indicate that your server is also issuing far more outgoing federation
- requests than can be accounted for by your users' activity, this is a
- likely cause. The misbehavior can be worked around by setting
- ``use_presence: false`` in the Synapse config file.
|