Wiki/Guides/Docker/08Matrix.md
2025-04-10 04:10:54 +02:00

8.1 KiB

title, description, published, date, tags, editor, dateCreated
title description published date tags editor dateCreated
08 Matrix true 2023-05-03T06:04:33.804Z markdown 2023-05-03T01:58:48.449Z

Matrix

WIP!

Conduit

WIP!

Synapse

Synapse is a Matrix server, It can be used for all sorts of things, but it is mainly used for private communication. I can certainly recommend it.

First we need to create a network

sudo docker network create --subnet=172.32.0.0/16 synapse

Now create the folder for the project

mkdir -p ~/docker/synapse

Now create the compose file

nano ~/docker/synapse/docker-compose.yml

Add in the following text

version: '3'

services: synapse: image: matrixdotorg/synapse:latest container_name: synapse restart: always volumes: - /data/synapse:/data networks: synapse: ipv4_address: 172.32.0.10

networks: synapse: external: true name: synapse ipam: config: - subnet: 172.32.0.0/16

Now we need to create the database user, database and set the privileges First the user

sudo docker exec -it -u postgres postgres psql create user synapse with encrypted password 'set your synapse user password here'; exit;

Now the database

sudo docker exec -it -u postgres postgres bash createdb --encoding=UTF8 --locale=C --template=template0 --owner=synapse synapse exit

And finally the permissions

sudo docker exec -it -u postgres postgres psql grant all privileges on database synapse to synapse; exit;

Now we need to run the synapse config generation

sudo docker run -it --rm -v "/data/synapse:/data" -e SYNAPSE_SERVER_NAME=example.com -e SYNAPSE_REPORT_STATS=yes matrixdotorg/synapse:latest generate

Now we are going to adjust the config file a bit

sudo nano /data/synapse/homeserver.yaml

Here we comment in the sqlite database and uncomment the postgres settings so it looks like this

database: name: psycopg2 txn_limit: 10000 args: user: synapse password: the password you set for the synapse user database: synapse host: 172.32.0.30 port: 5432 cp_min: 5 cp_max: 10 #database:

name: sqlite3

args:

database: /data/homeserver.db

We can now start the synapse container

sudo docker-compose -f ~/docker/synapse/docker-compose.yml up -d

Now we need to add nginx to the synapse network (notice we already added synapse to postgres)

nano ~/docker/nginx/docker-compose.yml

Add the following bits in the correct place

  - 8448:8448

  synapse:
    ipv4_address: 172.32.0.20

synapse: external: true name: synapse

Now we finally add the server block to the nginx config file

sudo nano /data/nginx/nginx.conf

Add in the following block

server { listen 443 ssl http2; listen [::]:443 ssl http2; ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

# For the federation port
listen 8448 ssl http2 default_server;
listen [::]:8448 ssl http2 default_server;

server_name example.com;

location ~ ^(/_matrix|/_synapse/client) {
    # note: do not add a path (even a single /) after the port in `proxy_pass`,
    # otherwise nginx will canonicalise the URI and cause signature verification
    # errors.
    proxy_pass http://synapse:8008;
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header Host $host;

    # Nginx by default only allows file uploads up to 1M in size
    # Increase client_max_body_size to match max_upload_size defined in homeserver.yaml
    client_max_body_size 50M;
}

}

The last thing we need to do is open up port 8448 in our router.

Now Synapse should be up and running, as a last step we need to add a user.

sudo docker exec -it synapse bash register_new_matrix_user -c /data/homeserver.yaml http://localhost:8008

Simply follow the steps, give a name, give a password, and say wether it is an admin yes or no.

Element

Element is a Web client for Matrix, You can use it to chat with other Matrix users

First we are going to create the network

sudo docker network create --subnet=172.33.0.0/16 element

Now we are going to create a folder for the compose file

mkdir ~/docker/element

Create the compose file

nano ~/docker/element/docker-compose.yml

Add in the following text

version: '3'

services: element: image: vectorim/element-web:latest container_name: element restart: always volumes: - /data/element/element-config.json:/app/config.json networks: element: ipv4_address: 172.33.0.10

networks: element: external: true name: element ipam: config: - subnet: 172.33.0.0/16

Now we need to create the element folder for the data

sudo mkdir /data/element/

Now we are going to create element the config file

sudo nano /data/element/element-config.json

Add in the following text

{ "default_server_config": { "m.homeserver": { "base_url": "https://example.com", "server_name": "example.com" }, "m.identity_server": { "base_url": "https://vector.im" } }, "brand": "Element", "integrations_ui_url": "https://scalar.vector.im/", "integrations_rest_url": "https://scalar.vector.im/api", "integrations_widgets_urls": [ "https://scalar.vector.im/_matrix/integrations/v1", "https://scalar.vector.im/api", "https://scalar-staging.vector.im/_matrix/integrations/v1", "https://scalar-staging.vector.im/api", "https://scalar-staging.riot.im/scalar/api" ], "hosting_signup_link": "https://element.io/matrix-services?utm_source=element-web&utm_medium=web", "bug_report_endpoint_url": "https://element.io/bugreports/submit", "uisi_autorageshake_app": "element-auto-uisi", "showLabsSettings": true, "piwik": { "url": "https://piwik.riot.im/", "siteId": 1, "policyUrl": "https://element.io/cookie-policy" }, "roomDirectory": { "servers": [ "matrix.org", "gitter.im", "libera.chat" ] }, "enable_presence_by_hs_url": { "https://matrix.org": false, "https://matrix-client.matrix.org": false }, "terms_and_conditions_links": [ { "url": "https://element.io/privacy", "text": "Privacy Policy" }, { "url": "https://element.io/cookie-policy", "text": "Cookie Policy" } ], "hostSignup": { "brand": "Element Home", "cookiePolicyUrl": "https://element.io/cookie-policy", "domains": [ "matrix.org" ], "privacyPolicyUrl": "https://element.io/privacy", "termsOfServiceUrl": "https://element.io/terms-of-service", "url": "https://ems.element.io/element-home/in-app-loader" }, "sentry": { "dsn": "https://029a0eb289f942508ae0fb17935bd8c5@sentry.matrix.org/6", "environment": "develop" }, "posthog": { "projectApiKey": "phc_Jzsm6DTm6V2705zeU5dcNvQDlonOR68XvX2sh1sEOHO", "apiHost": "https://posthog.hss.element.io" }, "features": { "feature_spotlight": true }, "map_style_url": "https://api.maptiler.com/maps/streets/style.json?key=fU3vlMsMn4Jb6dnEIFsx" }

Now we are going to add the network to the nginx compose file

nano ~/docker/nginx/docker-compose.yml

Add the following to the correct place

  element:
    ipv4_address: 172.33.0.20

element: external: true name: element

Now we only need to edit the nginx config file

sudo nano /data/nginx/nginx.conf

Add in the following location block between the synapse server

location / {
  proxy_pass http://element:80;
  proxy_set_header  Host $host;
  proxy_set_header  X-Real-IP $remote_addr;
  proxy_set_header  X-Forwarded-Proto https;
  proxy_set_header  X-Forwarded-For $remote_addr;
  proxy_set_header  X-Forwarded-Host $remote_addr;
}

Now finally restart the nginx container and start the element container.

sudo docker-compose -f ~/docker/nginx/docker-compose.yml up -d sudo docker-compose -f ~/docker/element/docker-compose.yml up -d

Element should be ready to use :)

Synapse Admin

WIP!