Wiki/Guides/Docker/08Matrix.md

318 lines
8.1 KiB
Markdown
Raw Normal View History

2025-04-10 04:10:54 +02:00
---
title: 08 Matrix
description:
published: true
date: 2023-05-03T06:04:33.804Z
tags:
editor: markdown
dateCreated: 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!