diff options
Diffstat (limited to 'docs/INSTALL.md')
-rw-r--r-- | docs/INSTALL.md | 331 |
1 files changed, 331 insertions, 0 deletions
diff --git a/docs/INSTALL.md b/docs/INSTALL.md new file mode 100644 index 00000000..184b777d --- /dev/null +++ b/docs/INSTALL.md @@ -0,0 +1,331 @@ +# Installing Dendrite + +Dendrite can be run in one of two configurations: + +* **Polylith mode**: A cluster of individual components, dealing with different + aspects of the Matrix protocol (see [WIRING.md](WIRING.md)). Components communicate with each other using internal HTTP APIs and [Apache Kafka](https://kafka.apache.org). This will almost certainly be the preferred model + for large-scale deployments. + +* **Monolith mode**: All components run in the same process. In this mode, + Kafka is completely optional and can instead be replaced with an in-process + lightweight implementation called [Naffka](https://github.com/matrix-org/naffka). This will usually be the preferred model for low-volume, low-user + or experimental deployments. + +Regardless of whether you are running in polylith or monolith mode, each Dendrite component that requires storage has its own database. Both Postgres +and SQLite are supported and can be mixed-and-matched across components as +needed in the configuration file. + +Be advised that Dendrite is still developmental and it's not recommended for +use in production environments yet! + +## Requirements + +Dendrite requires: + +* Go 1.13 or higher +* Postgres 9.5 or higher (if using Postgres databases, not needed for SQLite) + +If you want to run a polylith deployment, you also need: + +* Apache Kafka 0.10.2+ + +## Building up a monolith deploment + +Start by cloning the code: + +```bash +git clone https://github.com/matrix-org/dendrite +cd dendrite +``` + +Then build it: + +```bash +go build -o bin/dendrite-monolith-server ./cmd/dendrite-monolith-server +go build -o bin/generate-keys ./cmd/generate-keys +``` + +## Building up a polylith deployment + +Start by cloning the code: + +```bash +git clone https://github.com/matrix-org/dendrite +cd dendrite +``` + +Then build it: + +```bash +./build.sh +``` + +Install and start Kafka (c.f. [scripts/install-local-kafka.sh](scripts/install-local-kafka.sh)): + +```bash +KAFKA_URL=http://archive.apache.org/dist/kafka/2.1.0/kafka_2.11-2.1.0.tgz + +# Only download the kafka if it isn't already downloaded. +test -f kafka.tgz || wget $KAFKA_URL -O kafka.tgz +# Unpack the kafka over the top of any existing installation +mkdir -p kafka && tar xzf kafka.tgz -C kafka --strip-components 1 + +# Start the zookeeper running in the background. +# By default the zookeeper listens on localhost:2181 +kafka/bin/zookeeper-server-start.sh -daemon kafka/config/zookeeper.properties + +# Start the kafka server running in the background. +# By default the kafka listens on localhost:9092 +kafka/bin/kafka-server-start.sh -daemon kafka/config/server.properties +``` + +On macOS, you can use [Homebrew](https://brew.sh/) for easier setup of Kafka: + +```bash +brew install kafka +brew services start zookeeper +brew services start kafka +``` + +## Configuration + +### SQLite database setup + +Dendrite can use the built-in SQLite database engine for small setups. +The SQLite databases do not need to be preconfigured - Dendrite will +create them automatically at startup. + +### Postgres database setup + +Assuming that Postgres 9.5 (or later) is installed: + +* Create role, choosing a new password when prompted: + + ```bash + sudo -u postgres createuser -P dendrite + ``` + +* Create the component databases: + + ```bash + for i in account device mediaapi syncapi roomserver serverkey federationsender publicroomsapi appservice naffka; do + sudo -u postgres createdb -O dendrite dendrite_$i + done + ``` + +(On macOS, omit `sudo -u postgres` from the above commands.) + +### Server key generation + +Each Dendrite server requires unique server keys. + +Generate the self-signed SSL certificate for federation: + +```bash +test -f server.key || openssl req -x509 -newkey rsa:4096 -keyout server.key -out server.crt -days 3650 -nodes -subj /CN=localhost +``` + +Generate the server signing key: + +``` +test -f matrix_key.pem || ./bin/generate-keys -private-key matrix_key.pem +``` + +### Configuration file + +Create config file, based on `dendrite-config.yaml`. Call it `dendrite.yaml`. Things that will need editing include *at least*: + +* The `server_name` entry to reflect the hostname of your Dendrite server +* The `database` lines with an updated connection string based on your + desired setup, e.g. replacing `component` with the name of the component: + * For Postgres: `postgres://dendrite:password@localhost/component` + * For SQLite on disk: `file:component.db` or `file:///path/to/component.db` + * Postgres and SQLite can be mixed and matched. +* The `use_naffka` option if using Naffka in a monolith deployment + +There are other options which may be useful so review them all. In particular, +if you are trying to federate from your Dendrite instance into public rooms +then configuring `key_perspectives` (like `matrix.org` in the sample) can +help to improve reliability considerably by allowing your homeserver to fetch +public keys for dead homeservers from somewhere else. + +## Starting a monolith server + +It is possible to use Naffka as an in-process replacement to Kafka when using +the monolith server. To do this, set `use_naffka: true` in your `dendrite.yaml` configuration and uncomment the relevant Naffka line in the `database` section. +Be sure to update the database username and password if needed. + +The monolith server can be started as shown below. By default it listens for +HTTP connections on port 8008, so you can configure your Matrix client to use +`http://localhost:8008` as the server. If you set `--tls-cert` and `--tls-key` +as shown below, it will also listen for HTTPS connections on port 8448. + +```bash +./bin/dendrite-monolith-server --tls-cert=server.crt --tls-key=server.key +``` + +## Starting a polylith deployment + +The following contains scripts which will run all the required processes in order to point a Matrix client at Dendrite. Conceptually, you are wiring together to form the following diagram: + +``` + + /media +---------------------------+ + +----------->+------------->| dendrite-media-api-server | + ^ ^ +---------------------------+ + | | :7774 + | | + | | + | | /directory +----------------------------------+ + | | +--------->| dendrite-public-rooms-api-server |<========++ + | | | +----------------------------------+ || + | | | :7775 | || + | | | +<-----------+ || + | | | | || + | | | /sync +--------------------------+ || + | | +--------->| dendrite-sync-api-server |<================++ + | | | | +--------------------------+ || + | | | | :7773 | ^^ || +Matrix +------------------+ | | | | || client_data || +Clients --->| client-api-proxy |-------+ +<-----------+ ++=============++ || + +------------------+ | | | || || + :8008 | | CS API +----------------------------+ || || + | +--------->| dendrite-client-api-server |==++ || + | | +----------------------------+ || + | | :7771 | || + | | | || + | +<-----------+ || + | | || + | | || + | | +----------------------+ room_event || + | +---------->| dendrite-room-server |===============++ + | | +----------------------+ || + | | :7770 || + | | ++==========================++ + | +<------------+ || + | | | VV + | | +-----------------------------------+ Matrix + | | | dendrite-federation-sender-server |------------> Servers + | | +-----------------------------------+ + | | :7776 + | | + +---------->+ +<-----------+ + | | +Matrix +----------------------+ SS API +--------------------------------+ +Servers --->| federation-api-proxy |--------->| dendrite-federation-api-server | + +----------------------+ +--------------------------------+ + :8448 :7772 + + + A --> B = HTTP requests (A = client, B = server) + A ==> B = Kafka (A = producer, B = consumer) +``` + +### Client proxy + +This is what Matrix clients will talk to. If you use the script below, point +your client at `http://localhost:8008`. + +```bash +./bin/client-api-proxy \ +--bind-address ":8008" \ +--client-api-server-url "http://localhost:7771" \ +--sync-api-server-url "http://localhost:7773" \ +--media-api-server-url "http://localhost:7774" \ +--public-rooms-api-server-url "http://localhost:7775" \ +``` + +### Federation proxy + +This is what Matrix servers will talk to. This is only required if you want +to support federation. + +```bash +./bin/federation-api-proxy \ +--bind-address ":8448" \ +--federation-api-url "http://localhost:7772" \ +--media-api-server-url "http://localhost:7774" \ +``` + +### Client API server + +This is what implements message sending. Clients talk to this via the proxy in +order to send messages. + +```bash +./bin/dendrite-client-api-server --config=dendrite.yaml +``` + +### Room server + +This is what implements the room DAG. Clients do not talk to this. + +```bash +./bin/dendrite-room-server --config=dendrite.yaml +``` + +### Sync server + +This is what implements `/sync` requests. Clients talk to this via the proxy +in order to receive messages. + +```bash +./bin/dendrite-sync-api-server --config dendrite.yaml +``` + +### Media server + +This implements `/media` requests. Clients talk to this via the proxy in +order to upload and retrieve media. + +```bash +./bin/dendrite-media-api-server --config dendrite.yaml +``` + +### Public room server + +This implements `/directory` requests. Clients talk to this via the proxy +in order to retrieve room directory listings. + +```bash +./bin/dendrite-public-rooms-api-server --config dendrite.yaml +``` + +### Federation API server + +This implements federation requests. Servers talk to this via the proxy in +order to send transactions. This is only required if you want to support +federation. + +```bash +./bin/dendrite-federation-api-server --config dendrite.yaml +``` + +### Federation sender + +This sends events from our users to other servers. This is only required if +you want to support federation. + +```bash +./bin/dendrite-federation-sender-server --config dendrite.yaml +``` + +### Appservice server + +This sends events from the network to [application +services](https://matrix.org/docs/spec/application_service/unstable.html) +running locally. This is only required if you want to support running +application services on your homeserver. + +```bash +./bin/dendrite-appservice-server --config dendrite.yaml +``` + +### Key server + +This manages end-to-end encryption keys (or rather, it will do when it's +finished). + +```bash +./bin/dendrite-key-server --config dendrite.yaml +``` |