Stack providing self-hosted Matrix server with client. Default Sqlite database is switched to Postgres.
- portainer/portainer-ce:latest
- matrixdotorg/synapse:latest
- postgres:14
- vectorim/element-web:latest
- RPI 3B+
- SSD
Generate Synapse server configuration.
docker run -it --rm \
-v "/var/docker_data/matrix:/data" \
-e SYNAPSE_SERVER_NAME=matrix.YOUR_DOMAIN.com \
-e SYNAPSE_REPORT_STATS=no \
matrixdotorg/synapse:latest generateCreate Element config file.
sudo nano /var/docker_data/element-config.ymlCopy this into file and fix domain name.
{
"default_server_config": {
"m.homeserver": {
"base_url": "https://matrix.YOUR_DOMAIN.com",
"server_name": "matrix.YOUR_DOMAIN.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://[email protected]/6",
"environment": "develop"
},
"posthog": {
"projectApiKey": "phc_Jzsm6DTm6V2705zeU5dcNvQDlonOR68XvX2sh1sEOHO",
"apiHost": "https://posthog.element.io"
},
"features": {
"feature_spotlight": true
},
"map_style_url": "https://api.maptiler.com/maps/streets/style.json?key=fU3vlMsMn4Jb6dnEIFsx"
}Go to /var/docker_data/matrix and edit homeserver.yaml.
Comment database settings for sqlite3.
Add settings for Postgres database.
database:
name: psycopg2
args:
user: synapse
password: SUPERSECRETLONGPASSWORD
database: synapse
host: postgres
cp_min: 5
cp_max: 10And then start containers.
docker-compose up -dUse Portainer to check state of containers. Setting up database by Synapse takes some time.
When everything is ok and running without error setup first user.
Enter into synapse container.
docker exec -it synapse /bin/bashRegister new matrix user.
register_new_matrix_user -c /data/homeserver.yaml http://127.0.0.1:8008Follow on screen prompts.
Now is everything prepared. Go to Element on your domain and login.
For self-hosted Matrix server and Element can be used Nginx as reverse proxy.
Synapse Nginx config example.
server {
listen 80;
server_name matrix.YOUR_DOMAIN.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
listen 8448 ssl http2 default_server;
listen [::]:8448 ssl http2 default_server;
server_name matrix.YOUR_DOMAIN.com;
ssl on;
ssl_certificate /etc/letsencrypt/live/YOUR_DOMAIN.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/YOUR_DOMAIN.com/privkey.pem; # managed by Certbot
location /.well-known/matrix/client {
return 200 '{"m.server": {"base_url": "matrix.YOUR_DOMAIN.com:443"}}';
default_type application/json;
add_header Access-Control-Allow-Origin *;
}
location /.well-known/matrix/server {
default_type application/json;
add_header Access-Control-Allow-Origin *;
return 200 '{"m.server":"matrix.YOUR_DOMAIN.com:443"}';
}
location / {
proxy_pass http://192.168.0.123:8008;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
Element Nginx config example.
server {
listen 80;
server_name element.YOUR_DOMAIN.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name element.YOUR_DOMAIN.com;
ssl on;
ssl_certificate /etc/letsencrypt/live/YOUR_DOMAIN.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/YOUR_DOMAIN.com/privkey.pem; # managed by Certbot
location / {
proxy_pass http://192.168.0.123:80;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}