Matrix is een open standaard communicatieprotocol voor decentrale realtime communicatie. Matrix is geïmplementeerd als thuisservers die via internet worden gedistribueerd; daarom is er geen enkel punt van controle of falen. Matrix biedt een RESTful HTTP API voor het maken en beheren van de gedistribueerde chatservers, waaronder het verzenden en ontvangen van berichten, het uitnodigen en beheren van chatroomleden, het onderhouden van gebruikersaccounts en het bieden van geavanceerde chatfuncties zoals VoIP en videogesprekken, enz. Matrix stelt ook een veilige synchronisatie tussen thuisservers die over de hele wereld verspreid zijn.
Synapse is de implementatie van Matrix home server, geschreven door het Matrix-team. Het Matrix-ecosysteem bestaat uit het netwerk van vele federatieve thuisservers die over de hele wereld zijn verspreid. Een Matrix-gebruiker gebruikt een chatclient om verbinding te maken met de thuisserver, die op zijn beurt verbinding maakt met het Matrix-netwerk. Homeserver slaat de chatgeschiedenis en de inloggegevens van die specifieke gebruiker op.
Vereisten
In deze tutorial gebruiken we matrix.example.comde domeinnaam die wordt gebruikt voor Matrix Synapse. Vervang alle exemplaren van matrix.example.comdoor uw daadwerkelijke domeinnaam die u voor uw Synapse-thuisserver wilt gebruiken.
Update uw basissysteem met behulp van de handleiding CentOS 7 updaten . Zodra uw systeem is bijgewerkt, gaat u verder met het installeren van Python.
Matrix Synapse heeft Python 2.7 nodig om te werken. Python 2.7 wordt vooraf geïnstalleerd in alle CentOS-serverinstanties. U kunt de geïnstalleerde versie van Python controleren.
python -V
Je zou een vergelijkbare output moeten krijgen.
[user@vultr ~]$ python -V
Python 2.7.5
Het wijzigen van de standaardversie van Python kan de YUM-repository-manager kapot maken. Als u echter de meest recente versie van Python wilt, kunt u een alternatieve installatie uitvoeren zonder de standaard Python te vervangen.
Installeer de pakketten in de Development toolsgroep die nodig zijn voor het compileren van de installatiebestanden.
sudo yum groupinstall -y "Development tools"
Installeer nog een paar vereiste afhankelijkheden.
sudo yum -y install libtiff-devel libjpeg-devel libzip-devel freetype-devel lcms2-devel libwebp-devel tcl-devel tk-devel redhat-rpm-config python-virtualenv libffi-devel openssl-devel 
Installeer Python pip. Pip is de afhankelijkheidsmanager voor Python-pakketten.
wget https://bootstrap.pypa.io/get-pip.py
sudo python get-pip.py
Installeer Synapse
Creëer een virtuele omgeving voor uw Synapse-applicatie. Python virtuele omgeving wordt gebruikt om een geïsoleerde virtuele omgeving te creëren voor een Python-project. Een virtuele omgeving bevat zijn eigen installatiemappen en deelt geen bibliotheken met globale en andere virtuele omgevingen.
sudo virtualenv -p python2.7 /opt/synapse
Geef het eigendom van de directory aan de huidige gebruiker.
sudo chown -R $USER:$USER /opt/synapse/
Activeer nu de virtuele omgeving.
source /opt/synapse/bin/activate
Zorg ervoor dat u de nieuwste versie van pipen heeft setuptools.
pip install --upgrade pip 
pip install --upgrade setuptools
Installeer de nieuwste versie van Synapse met pip.
pip install https://github.com/matrix-org/synapse/tarball/master
Het uitvoeren van de bovenstaande opdracht zal enige tijd duren omdat het de nieuwste versie van Synapse en alle afhankelijkheden uit de Github-repository haalt en installeert.
PostgreSQL installeren en configureren
Synapse gebruikt SQLite als de standaarddatabase. SQLite slaat de gegevens op in een database die als een plat bestand op schijf wordt bewaard. Het gebruik van SQLite is heel eenvoudig, maar wordt niet aanbevolen voor productie omdat het erg traag is in vergelijking met PostgreSQL.
PostgreSQL is een relationeel databasesysteem voor objecten. U moet de PostgreSQL-repository toevoegen aan uw systeem, omdat de applicatie niet beschikbaar is in de standaard YUM-repository.
sudo rpm -Uvh https://download.postgresql.org/pub/repos/yum/9.6/redhat/rhel-7-x86_64/pgdg-centos96-9.6-3.noarch.rpm
Installeer de PostgreSQL-databaseserver.
sudo yum -y install postgresql96-server postgresql96-contrib
Initialiseer de database.
sudo /usr/pgsql-9.6/bin/postgresql96-setup initdb
Bewerk de /var/lib/pgsql/9.6/data/pg_hba.confom MD5-gebaseerde authenticatie in te schakelen.
sudo nano /var/lib/pgsql/9.6/data/pg_hba.conf
Zoek de volgende regels en verander peernaar trusten idnetnaar md5.
# TYPE  DATABASE        USER            ADDRESS                 METHOD
# "local" is for Unix domain socket connections only
local   all             all                                     peer
# IPv4 local connections:
host    all             all             127.0.0.1/32            idnet
# IPv6 local connections:
host    all             all             ::1/128                 idnet
Eenmaal bijgewerkt, zou de configuratie er als volgt uit moeten zien.
# TYPE  DATABASE        USER            ADDRESS                 METHOD
# "local" is for Unix domain socket connections only
local   all             all                                     trust
# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
# IPv6 local connections:
host    all             all             ::1/128                 md5
Start de PostgreSQL-server en schakel deze in om automatisch te starten bij het opstarten.
sudo systemctl start postgresql-9.6
sudo systemctl enable postgresql-9.6
Wijzig het wachtwoord voor de standaard PostgreSQL-gebruiker.
sudo passwd postgres
Log in.
sudo su - postgres
Maak een nieuwe PostgreSQL-gebruiker voor Synapse.
createuser synapse
PostgreSQL biedt de psqlshell om query's op de database uit te voeren. Schakel over naar de PostgreSQL-shell door te draaien.
psql
Stel een wachtwoord in voor de nieuw aangemaakte gebruiker voor de Synapse-database.
ALTER USER synapse WITH ENCRYPTED password 'DBPassword';
Vervang het DBPassworddoor een sterk wachtwoord en noteer het, want we zullen het wachtwoord later gebruiken. Maak een nieuwe database voor de PostgreSQL-database.
CREATE DATABASE synapse ENCODING 'UTF8' LC_COLLATE='C' LC_CTYPE='C' template=template0 OWNER synapse;
Verlaat de psqlschelp.
\q
Schakel over naar de sudogebruiker van de huidige postgresgebruiker.
exit
U moet ook de pakketten installeren die Synapse nodig heeft om met de PostgreSQL-databaseserver te communiceren.
sudo yum -y install postgresql-devel libpqxx-devel.x86_64
source /opt/synapse/bin/activate
pip install psycopg2
Synapse configureren
Synapse heeft een configuratiebestand nodig voordat het kan worden gestart. Het configuratiebestand slaat de serverinstellingen op. Schakel over naar de virtuele omgeving en genereer de configuratie voor Synapse.
source /opt/synapse/bin/activate
cd /opt/synapse
python -m synapse.app.homeserver --server-name matrix.example.com --config-path homeserver.yaml --generate-config --report-stats=yes
Vervang matrix.example.comdoor uw werkelijke domeinnaam en zorg ervoor dat de servernaam kan worden omgezet in het IP-adres van uw Vultr-exemplaar. Geef op --report-stats=yesof u wilt dat de servers de rapporten genereren, geef --report-stats=noop om het genereren van rapporten en statistieken uit te schakelen.
Je zou een vergelijkbare output moeten zien.
(synapse)[user@vultr synapse]$ python -m synapse.app.homeserver --server-name matrix.example.com --config-path homeserver.yaml --generate-config --report-stats=yes
A config file has been generated in 'homeserver.yaml' for server name 'matrix.example.com' with corresponding SSL keys and self-signed certificates. Please review this file and customise it to your needs.
If this server name is incorrect, you will need to regenerate the SSL certificates
Standaard is de homeserver.yamlgeconfigureerd om een SQLite-database te gebruiken. We moeten het aanpassen om de PostgreSQL-database te gebruiken die we eerder hebben gemaakt.
Bewerk de nieuw gemaakte homeserver.yaml.
nano homeserver.yaml
Zoek de bestaande databaseconfiguratie die SQLite3 gebruikt. Geef commentaar op de regels zoals hieronder weergegeven. Voeg ook de nieuwe databaseconfiguratie voor PostgreSQL toe. Zorg ervoor dat u de juiste databasereferenties gebruikt.
# Database configuration
#database:
  # The database engine name
  #name: "sqlite3"
  # Arguments to pass to the engine
  #args:
    # Path to the database
    #database: "/opt/synapse/homeserver.db"
database:
    name: psycopg2
    args:
        user: synapse
        password: DBPassword
        database: synapse
        host: localhost
        cp_min: 5
        cp_max: 10
Registratie van een nieuwe gebruiker via een webinterface is standaard uitgeschakeld. Om registratie mogelijk te maken, kunt u instellen enable_registrationop True. U kunt ook een geheime registratiesleutel instellen, waarmee iedereen kan registreren die de geheime sleutel heeft, zelfs als registratie is uitgeschakeld.
enable_registration: False
registration_shared_secret: "YPPqCPYqCQ-Rj,ws~FfeLS@maRV9vz5MnnV^r8~pP.Q6yNBDG;"
Sla het bestand op en verlaat de editor. Nu moet u uw eerste gebruiker registreren. Voordat u echter een nieuwe gebruiker kunt registreren, moet u eerst de applicatie starten.
source /opt/synapse/bin/activate && cd /opt/synapse
synctl start
Je zou de volgende regels moeten zien.
2017-09-05 11:10:41,921 - twisted - 131 - INFO - - SynapseSite starting on 8008
2017-09-05 11:10:41,921 - twisted - 131 - INFO - - Starting factory <synapse.http.site.SynapseSite instance at 0x44bbc68>
2017-09-05 11:10:41,921 - synapse.app.homeserver - 201 - INFO - - Synapse now listening on port 8008
2017-09-05 11:10:41,922 - synapse.app.homeserver - 442 - INFO - - Scheduling stats reporting for 3 hour intervals
started synapse.app.homeserver('homeserver.yaml')
Registreer een nieuwe Matrix-gebruiker.
register_new_matrix_user -c homeserver.yaml https://localhost:8448
Je zou het volgende moeten zien.
(synapse)[user@vultr synapse]$ register_new_matrix_user -c homeserver.yaml https://localhost:8448
New user localpart [user]: admin
Password:
Confirm password:
Make admin [no]: yes
Sending registration request...
Success.
Voordat u tenslotte de Homeserver kunt gebruiken, moet u poort 8448 via de firewall toestaan. Poort 8448wordt gebruikt als de beveiligde federatiepoort. Homeservers gebruiken deze poort om veilig met elkaar te communiceren. Via deze poort kunt u ook de ingebouwde Matrix-webchatclient gebruiken.
sudo firewall-cmd --permanent --zone=public --add-port=8448/tcp
sudo firewall-cmd --reload
U kunt zich nu aanmelden bij de Matrix-webchatclient door naar https://matrix.example.com:8448uw favoriete browser te gaan. U ziet een waarschuwing over het SSL-certificaat omdat de gebruikte certificaten zelfondertekend zijn. We zullen deze webchat-client niet gebruiken omdat deze verouderd is en niet meer wordt onderhouden. Probeer gewoon te controleren of u kunt inloggen met het gebruikersaccount dat u zojuist hebt gemaakt.
Let's Encrypt Certificates instellen
In plaats van een zelfondertekend certificaat te gebruiken om de federatiepoort te beveiligen, kunnen we Let's Encrypt gratis SSL gebruiken. Let's Encrypt gratis SSL kan worden verkregen via de officiële Let's Encrypt-client genaamd Certbot.
Installeer Certbot.
sudo yum -y install certbot
Pas uw firewall-instelling aan om de standaard HTTPen HTTPSpoorten door de firewall te laten gaan. Certbot moet HTTPverbinding maken om de domeinautoriteit te verifiëren.
sudo firewall-cmd --permanent --zone=public --add-service=http
sudo firewall-cmd --permanent --zone=public --add-service=https
sudo firewall-cmd --reload
Om certificaten van Let's Encrypt CA te verkrijgen, moet u ervoor zorgen dat het domein waarvoor u de certificaten wilt genereren, naar de server is gericht. Als dit niet het geval is, breng dan de nodige wijzigingen aan in de DNS-records van uw domein en wacht tot de DNS zich verspreidt voordat u het certificaatverzoek opnieuw indient. Certbot controleert de domeinautoriteit voordat de certificaten worden verstrekt.
Gebruik nu de ingebouwde webserver in Certbot om de certificaten voor uw domein te genereren.
sudo certbot certonly --standalone -d matrix.example.com
De gegenereerde certificaten worden waarschijnlijk opgeslagen in /etc/letsencrypt/live/matrix.example.com/. Het SSL-certificaat wordt opgeslagen als fullchain.pemen de privésleutel wordt opgeslagen als privkey.pem.
Kopieer de certificaten.
sudo cp /etc/letsencrypt/live/matrix.example.com/fullchain.pem /opt/synapse/letsencrypt-fullchain.pem
sudo cp /etc/letsencrypt/live/matrix.example.com/privkey.pem /opt/synapse/letsencrypt-privkey.pem
U moet het pad naar de certificaten en sleutels uit het homeserver.yamlbestand wijzigen. Bewerk de configuratie.
nano /opt/synapse/homeserver.yaml
Zoek de volgende regels en pas het pad aan.
tls_certificate_path: "/opt/synapse/letsencrypt-fullchain.pem"
# PEM encoded private key for TLS
tls_private_key_path: "/opt/synapse/letsencrypt-privkey.pem"
Sla het bestand op en verlaat de editor. Start de Synapse-server opnieuw op, zodat de wijzigingen van kracht kunnen worden.
source /opt/synapse/bin/activate && cd /opt/synapse
synctl restart
Let's Encrypt-certificaten verlopen over 90 dagen, dus het wordt aanbevolen om automatische vernieuwing in te stellen voor de certificaten met cron-taken. Cron is een systeemservice die wordt gebruikt om periodieke taken uit te voeren.
Maak een nieuw script om certificaten te vernieuwen en kopieer de vernieuwde certificaten naar de Synapse-directory.
sudo nano /opt/renew-letsencypt.sh  
Vul het bestand in.
#!/bin/sh
/usr/bin/certbot renew --quiet --nginx
cp /etc/letsencrypt/live/matrix.example.com/fullchain.pem /opt/synapse/letsencrypt-fullchain.pem
cp /etc/letsencrypt/live/matrix.example.com/privkey.pem /opt/synapse/letsencrypt-privkey.pem
Geef de uitvoeringsmachtiging.
sudo chmod +x /opt/renew-letsencypt.sh
Open het cron-taakbestand.
sudo crontab -e
Voeg de volgende regel toe aan het einde van het bestand.
30 5 * * 1 /opt/renew-letsencypt.sh
De bovenstaande cron-taak wordt elke maandag om 05.30 uur uitgevoerd. Als het certificaat verloopt, wordt het automatisch verlengd.
Nu kunt u bezoeken https://matrix.example.com:8448. U zult zien dat er geen SSL-waarschuwing is voordat u verbinding maakt.
Stel Nginx in met Let's Encrypt
Naast de beveiligde federatiepoort 8448luistert Synapse ook naar de onbeveiligde clientpoort 8008. We zullen nu Nginx configureren als een omgekeerde proxy voor de Synapse-applicatie.
sudo yum -y install nginx
Maak een nieuw configuratiebestand.
sudo nano /etc/nginx/conf.d/synapse.conf
Vul het bestand met de volgende inhoud.
server {
    listen 80;
    server_name matrix.example.com;
    return 301 https://$host$request_uri;
}
server {
    listen 443;
    server_name matrix.example.com;
    ssl_certificate           /etc/letsencrypt/live/matrix.example.com/fullchain.pem;
    ssl_certificate_key       /etc/letsencrypt/live/matrix.example.com/privkey.pem;
    ssl on;
    ssl_session_cache  builtin:1000  shared:SSL:10m;
    ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;
    ssl_prefer_server_ciphers on;
    access_log    /var/log/nginx/synapse.access.log;
    location /_matrix {
      proxy_pass          http://localhost:8008;
      proxy_set_header X-Forwarded-For $remote_addr;
    }
  }
Start opnieuw op en schakel Nginx in om automatisch te starten tijdens het opstarten.
sudo systemctl restart nginx
sudo systemctl enable nginx
Ten slotte kunt u controleren of Synapse toegankelijk is via de reverse proxy.
curl https://matrix.example.com/_matrix/key/v2/server/auto
U zou vergelijkbare uitvoer moeten krijgen.
[user@vultr ~]$ curl https://matrix.example.com/_matrix/key/v2/server/auto
{"old_verify_keys":{},"server_name":"matrix.example.com","signatures":{"matrix.example.com":{"ed25519:a_ffMf":"T/Uq/UN5vyc4w7v0azALjPIJeZx1vQ+HC6ohUGkTSqiFI4WI/ojGpb2763arwSSQLr/tP/2diCi1KLU2DEnOCQ"}},"tls_fingerprints":[{"sha256":"eorhQj/kubI2PEQZyBZvGV7K1x3EcQ7j/AO2MtZMplw"}],"valid_until_ts":1504876080512,"verify_keys":{"ed25519:a_ffMf":{"key":"Gc1hxkpPmQv71Cvjyk+uzR5UtrpmgV/UwlsLtosawEs"}}}
De Systemd-service instellen
Het wordt aanbevolen om de Systemd-service te gebruiken om het Synapse-serverproces te beheren. Het gebruik van Systemd zorgt ervoor dat de server automatisch wordt gestart bij het opstarten van het systeem en storingen.
Maak een nieuw Systemd-servicebestand.
sudo nano /etc/systemd/system/matrix-synapse.service
Vul het bestand in.
[Unit]
Description=Matrix Synapse service
After=network.target
[Service]
Type=forking
WorkingDirectory=/opt/synapse/
ExecStart=/opt/synapse/bin/synctl start
ExecStop=/opt/synapse/bin/synctl stop
ExecReload=/opt/synapse/bin/synctl restart
Restart=always
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=synapse
[Install]
WantedBy=multi-user.target
Nu kunt u snel de Synapse-server starten.
sudo systemctl start matrix-synapse
Om de server te stoppen of opnieuw te starten met de volgende opdrachten.
sudo systemctl stop matrix-synapse
sudo systemctl restart matrix-synapse
U kunt de status van de service controleren.
sudo systemctl status matrix-synapse
Riot gebruiken
Matrix Synapse-server is nu geïnstalleerd en geconfigureerd op uw server. Omdat de ingebouwde webclient voor Matrix verouderd is, kunt u kiezen uit de verscheidenheid aan clienttoepassingen die beschikbaar zijn voor chatten. Riot is de populairste chatclient, die op bijna alle platforms beschikbaar is. U kunt de gehoste versie van Riot's webchatclient gebruiken of u kunt er ook een kopie van hosten op uw eigen server. Afgezien hiervan kunt u ook de desktop- en mobiele chatclients van Riot gebruiken, die beschikbaar zijn voor Windows, Mac, Linux, IOS en Android.
Als u uw eigen exemplaar van de Riot-webclient wilt hosten, kunt u verder lezen voor de instructies om Riot op uw server te installeren. Voor gehoste, desktop- en mobiele clients kunt u uw gebruikersnaam en wachtwoord gebruiken om rechtstreeks in te loggen op uw homeserver. Kies gewoon my Matrix IDuit het vervolgkeuzemenu van de Sign Inoptie en geef de gebruikersnaam en het wachtwoord op die u hebt gemaakt tijdens de registratie van een nieuwe gebruiker. Klik op de Custom serveren gebruik de domeinnaam van uw Synapse-instantie. Omdat we Nginx al hebben geconfigureerd, kunnen we deze gewoon gebruiken https://matrix.example.comals de thuisserver en https://matrix.orgals identiteitsserver-URL.
Voorbeeld van Riot Login
Stel Riot in op uw eigen server.
Riot is ook open source en gratis te hosten op uw eigen server. Het vereist geen database of afhankelijkheden. Aangezien we al een Nginx-server hebben, kunnen we deze op dezelfde server hosten.
Het domein of subdomein dat u gebruikt voor Synapse en Riot moet verschillend zijn om cross-site scripting te voorkomen. U kunt echter twee subdomeinen van hetzelfde domein gebruiken. In deze tutorial gebruiken we riot.example.comhet domein voor de Riot-applicatie. Vervang alle exemplaren van riot.example.comdoor uw werkelijke domein of subdomein voor de Riot-toepassing.
Download Riot op uw server.
cd /opt/
sudo wget https://github.com/vector-im/riot-web/releases/download/v0.12.3/riot-v0.12.3.tar.gz
De link naar de laatste versie vind je altijd op Riot's Github .
Pak het archief uit.
sudo tar -xzf riot-v*.tar.gz
Wijzig de naam van de directory voor gebruiksgemak.
sudo mv riot-v*/ riot/
Omdat we Certbot al hebben geïnstalleerd, kunnen we de certificaten direct genereren. Zorg ervoor dat het domein of subdomein dat u gebruikt naar de server is gericht.
sudo systemctl stop nginx
sudo certbot certonly --standalone -d riot.example.com
De gegenereerde certificaten worden waarschijnlijk in de /etc/letsencrypt/live/riot.example.com/directory opgeslagen .
Maak een virtuele host voor de Riot-applicatie.
sudo nano /etc/nginx/conf.d/riot.conf
Vul het bestand in.
server {
    listen 80;
    server_name riot.example.com;
    return 301 https://$host$request_uri;
}
server {
    listen 443;
    server_name riot.example.com;
    ssl_certificate           /etc/letsencrypt/live/riot.example.com/fullchain.pem;
    ssl_certificate_key       /etc/letsencrypt/live/riot.example.com/privkey.pem;
    ssl on;
    ssl_session_cache  builtin:1000  shared:SSL:10m;
    ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;
    ssl_prefer_server_ciphers on;
    root /opt/riot;
    index index.html index.htm;
    location / {
            try_files $uri $uri/ =404;
    }
    access_log    /var/log/nginx/riot.access.log;
  }
Kopieer het voorbeeldconfiguratiebestand.
sudo cp /opt/riot/config.sample.json /opt/riot/config.json
Bewerk nu het configuratiebestand om enkele wijzigingen aan te brengen.
sudo nano /opt/riot/config.json
Zoek de volgende regels.
"default_hs_url": "https://matrix.org",
"default_is_url": "https://vector.im",
Vervang de waarde van de standaard thuisserver-URL door de URL van uw Matrix-server. Voor de URL van de identiteitsserver kunt u de standaardoptie gebruiken, of u kunt de waarde ook aan de Matrix-identiteitsserver geven, namelijk https://matrix.org.
"default_hs_url": "https://matrix.example.com",
"default_is_url": "https://matrix.org",
Sla het bestand op en sluit af. Geef de bestanden de eigendom van de Nginx-gebruiker.
sudo chown -R nginx:nginx /opt/riot/
Start Nginx opnieuw op.
sudo systemctl restart nginx
Je hebt toegang tot Riot op https://riot.example.com. U kunt nu inloggen met de gebruikersnaam en het wachtwoord die u eerder heeft aangemaakt. U kunt verbinding maken via de standaardserver, aangezien we de standaardmatrixserver voor onze applicatie al hebben gewijzigd.
U heeft nu een Matrix Synapse-thuisserver in gebruik. Je hebt ook een gehoste kopie van Riot, die je kunt gebruiken om een bericht naar andere mensen te sturen met hun Matrix-ID, e-mailadres of mobiele nummer. Begin met het maken van een chatroom op uw server en nodig uw vrienden op Matrix uit om deel te nemen aan de chatroom die u heeft gemaakt.