Created by: ston1th 2020-11-09 23:49:40
Updated by: ston1th 2021-08-30 17:47:01
Visibility: Public

Matrix Home Server

Dendrite

Install Postgresql: Install Guide

Create db user and databases:

su - _postgresql

createuser -U postgres -P dendrite
for db in mediaapi syncapi roomserver signingkeyserver federationsender appservice keyserver userapi_accounts userapi_devices naffka; do
  createdb -U postgres -O dendrite $db
done
echo "host all dendrite 127.0.0.1/32 md5" >>/var/postgresql/data/pg_hba.conf
rcctl reload postgresql

Create system user and directories:

groupadd _dendrite
useradd -g _dendrite -d /var/dendrite -s /sbin/nologin _dendrite
mkdir -p /var/dendrite/media_store /var/log/dendrite
chown -R _dendrite:_dendrite /var/dendrite /var/log/dendrite

Generate Matrix Key:

generate-keys --private-key /var/dendrite/matrix_key.pem
chown root:_dendrite /var/dendrite/matrix_key.pem
chmod 640 /var/dendrite/matrix_key.pem

Generate Dendrite Config:

domain="example.com"
pass="my_db_password"

generate-config | sed -e "s/server_name: localhost/server_name: $domain/" \
  -e 's/\[::\]/0.0.0.0/g' \
  -e 's/localhost/127.0.0.1/g' \
  -e "s,file:\(.*\).db,postgres://dendrite:$pass@127.0.0.1/\1?sslmode=disable,g" \
  -e 's,\./media_store,/var/dendrite/media_store,' \
  -e 's,matrix_key.pem,/var/dendrite/matrix_key.pem,' \
  > /var/dendrite/dendrite.yaml
chmod 640 /var/dendrite/dendrite.yaml
chown root:_dendrite /var/dendrite/dendrite.yaml

Create rc file:

cat <<'EOF'> /etc/rc.d/dendrite
#!/bin/sh

daemon="/usr/local/sbin/dendrite-monolith-server"
daemon_user="_dendrite"
rc_bg=YES

. /etc/rc.d/rc.subr

rc_cmd $1
EOF
chmod 555 /etc/rc.d/dendrite
rcctl enable dendrite
rcctl set dendrite flags -config /var/dendrite/dendrite.yaml
rcctl start dendrite

Nginx well-known config:

  server_name example.com;
  ...
  location /.well-known/matrix/client {
    return 200 '{"m.homeserver":{"base_url":"https://matrix.example.com"}}';
    add_header Content-Type application/json;
    add_header Access-Control-Allow-Origin *;
  }
  location /.well-known/matrix/server {
    return 200 '{"m.server":"matrix.example.com:443"}';
  }

Nginx Proxy:

server {
  listen 443 ssl http2;
  server_name matrix.example.com;
  ...
  location /_matrix {
    proxy_pass http://192.168.0.100:8008;
    proxy_http_version 1.1;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
  }
}

Create a user

create-account --config /var/dendrite/dendrite.yaml -ask-pass -username <user>

Database Cleanup

su - _postgresql
for db in mediaapi syncapi roomserver signingkeyserver federationsender appservice keyserver userapi_accounts userapi_devices naffka; do
  psql -U postgres -c "drop database $db"
done