Matrix è uno standard (protocollo) open source per VoIP, messaggistica istantanea e videochiamate, ovvero comunicazione in tempo reale. Fornisce la crittografia end-to-end insieme al supporto per i bridge verso varie altre alternative di messaggistica come Slack, IRC, Telegram o qualsiasi altro client XMPP. Può funzionare anche con connessioni a bassa larghezza di banda.
In questo tutorial, ti mostrerò come installare l'homeserver Synapse di Matrix usando i contenitori Docker.
Cos'è un homeserver Matrix?
Matrix di per sé è solo una specifica e ci sono molte implementazioni del protocollo Matrix disponibili pubblicamente.
Gli homeserver sono fondamentalmente tutte quelle implementazioni distribuite su un server, a cui puoi accedere tramite qualsiasi client Matrix come Element.
La domanda che potrebbe sorgere è:perché creare homeserver privati se alcuni sono già disponibili pubblicamente?
Bene, per cominciare, puoi condividere il tuo server domestico privato tra i tuoi amici, familiari o colleghi e usarlo come mezzo di comunicazione quotidiano. A meno che non ti impegni in una conversazione con un utente di un altro server domestico, tutti i dati saranno al sicuro nel tuo server.
Questo ti dà il controllo su ogni aspetto che gli homeserver pubblici non sono in grado di fornire.
Deplying-synapse Matrix implementazione homserver utilizzando i contenitori Docker
In questo tutorial userò Synapse, una popolare implementazione dell'homeserver Matrix. Scritto in Python, Synapse è sviluppato dal core team di Matrix.
Noi di Linux Handbook preferiamo la finestra mobile alla distribuzione nativa, quindi le sezioni seguenti tratteranno la distribuzione di sinapsi eseguita utilizzando Docker.
Prerequisito
- Un sistema/server Linux. Ti consigliamo di utilizzare Linode per distribuire rapidamente un server Linux nel cloud.
- Un dominio funzionante e accesso ai suoi record DNS (a meno che tu non voglia configurarlo su localhost)
- Dovresti avere installato sia docker che docker-compose. Puoi seguire la nostra guida sull'installazione di Docker e Docker Compose su CentOS.
- Credo che tu abbia una conoscenza dei comandi essenziali di Linux e che tu non abbia paura di usare il terminale per modificare i file di configurazione.
- La conoscenza di base di Docker ti aiuterà, ma puoi seguire il tutorial anche senza di essa.
Passaggio 1:imposta il proxy inverso
Prima di sporcarti le mani con Synapse, devi innanzitutto configurare il tuo container proxy inverso e il suo contenitore Let's Encrypt per i certificati TLS (Vuoi https, fidati di me).
Configurazione del contenitore del proxy inverso
In un ambiente di produzione, non utilizzi docker run ...
, usi docker-compose
. Quindi, configuriamo il jwilder/nginx-proxy
come proxy inverso.
Crea una directory denominata proxy inverso e passa a questa directory appena creata:
mkdir reverse-proxy && cd reverse-proxy
Ora apri il tuo editor di testo preferito, crea un file chiamato docker-compose.yml
e aggiungi i seguenti contenuti:
version: "3.3"
services:
proxy:
image: "jwilder/nginx-proxy"
container_name: "proxy"
volumes:
- "certs:/etc/nginx/certs"
- "vhost:/etc/nginx/vhost.d"
- "html:/usr/share/nginx/html"
- "/run/docker.sock:/tmp/docker.sock:ro"
networks: ["server"]
restart: "always"
ports:
- "80:80"
- "443:443"
Quindi qui, prima definisci il tuo servizio, chiamato proxy
. Le caratteristiche chiave da tenere a mente sono:
- I volumi certs, vhost e html verranno condivisi tra
jwilder/nginx-proxy
ejrcs/letsencrypt-nginx-proxy-companion
contenitori. - Il socket docker è montato in sola lettura su
/tmp/docker.sock
. - Utilizza una rete diversa dalla rete bridge predefinita.
- Le porte 80 e 443 sono associate, rispettivamente per http e https.
Configura Letencrypt-nginx-proxy-companion
Aggiungi quanto segue alla fine dello stesso file di composizione
letsencrypt:
image: "jrcs/letsencrypt-nginx-proxy-companion"
container_name: "letsencrypt"
volumes:
- "certs:/etc/nginx/certs"
- "vhost:/etc/nginx/vhost.d"
- "html:/usr/share/nginx/html"
- "/run/docker.sock:/var/run/docker.sock:ro"
environment:
NGINX_PROXY_CONTAINER: "proxy"
networks: ["server"]
restart: "always"
depends_on: ["proxy"]
Qui hai un altro servizio definito, chiamatoletsencrypt. Esaminiamo anche questo:
- Anche qui tutti i volumi del servizio precedente sono montati nelle stesse posizioni.
- Il socket docker è vincolato in sola lettura a
/var/run/docker.sock
. - La variabile d'ambiente
NGINX_PROXY_CONTAINER
è impostato sul nome del contenitore del contenitore del proxy inverso, che nel nostro caso è "proxy". - Condivide la stessa rete di "server".
Alla fine di queste due descrizioni dei servizi, aggiungi le definizioni dei volumi e la definizione della rete, come di seguito:
networks:
server:
external: true
volumes:
certs:
vhost:
html:
Due cose importanti da notare qui:
- Utilizzerai un file di composizione separato per Synapse. In questo modo, avrai una distribuzione modulare e sarai in grado di interrompere facilmente un servizio, senza influire sugli altri, distribuendo il proxy inverso e il compagno utilizzando un file YAML diverso.
- La rete è esterna. Questo per evitare qualsiasi problema con altri contenitori che non condividono la stessa rete a causa di come
docker-compose
denomina i suoi volumi e reti quando viene lasciato viene creato automaticamente. Quindi questo ci porta a creare la rete. Usa il comandodocker network create server
per creare la rete.
Ora che tutto è fatto, salva il file ed esci dall'editor.
Ora è il momento di avviare il tuo server proxy inverso.
docker-compose up -d
Passaggio 2:imposta Synapse
Ora è il momento di iniziare finalmente a concentrarti sulla parte buona. Quindi la distribuzione di sinapsi è davvero un processo in due fasi.
Innanzitutto, è necessario per generare una configurazione, quindi riordinare la configurazione e distribuire il nostro server home.
Iniziamo con l'ottenere il file di composizione.
Genera configurazione
Crea una directory separata denominata "synapse" e passa ad essa.
mkdir synapse && cd synapse
Crea un file chiamato docker-compose.yml
e aprilo, conosci il trapano, giusto?
Assicurati di utilizzare i valori corretti per sub.domain.com
nel file yml qui:
version: "3.3"
services:
synapse:
image: "matrixdotorg/synapse:latest"
container_name: "synapse"
volumes:
- "./data:/data"
environment:
VIRTUAL_HOST: "sub.domain.com"
VIRTUAL_PORT: 8008
LETSENCRYPT_HOST: "sub.domain.com"
SYNAPSE_SERVER_NAME: "sub.domain.com"
SYNAPSE_REPORT_STATS: "yes"
networks: ["server"]
networks:
server:
external: true
Questo è un file di composizione standard a quanto pare, ma di seguito vengono spiegate ancora un paio di opzioni straordinarie:
- Stai usando un montaggio bind invece di un volume, questo perché il file di configurazione verrà generato lì e devi modificarlo. Puoi sicuramente usare i volumi, ma poi dovrai modificare il file che si trova in
/var/lib/docker/volumes/<name>/_data
. - Le variabili d'ambiente
VIRTUAL_HOST
&LETSENCRYPT_HOST
sono per i contenitori letencrypt e reverse proxy, che genereranno le modifiche alla configurazione necessarie insieme ai certificati, senza che tu intervenga manualmente. - Assicurati
SYNAPSE_SERVER_NAME
punta all'FQDN del tuo server Synapse (insieme al sottodominio). - Imposta
VIRUAL_PORT
a 8008. Il contenitore della sinapsi espone la porta HTTP 8008 per consentire ai suoi client di comunicare con essa. - Infine, assicurati che questo container utilizzi la stessa rete del container proxy inverso, altrimenti i container non saranno in grado di comunicare, il che a sua volta interromperà l'intero processo.
Conferma di aver aggiunto l'IP del server al record A del tuo DNS e un record CNAME punta al sottodominio esatto.
Crea un data
directory ed eseguire il comando seguente
docker-compose run --rm synapse generate
Questo genererà il file di configurazione all'interno di ./data, chiamato "homeserver.yaml".
Configura sinapsi
Ci sono molte opzioni configurabili in homeserver.yaml
file, che non rientrano nell'ambito di questo tutorial. Ti suggerisco di esaminare i commenti in quel file e leggere qui.
Per ora, assicurati solo delle seguenti modifiche:
- Il
server_name
variabile è impostata sul sottodominio di tua scelta, come impostato nella variabile di ambienteSYNAPSE_SERVER_NAME
. - TLS è impostato su false. Stai utilizzando un proxy inverso, quindi TLS viene gestito tramite il tuo server web. Lascia stare il porto.
- Assicurati
enable_registration
è impostato su true, in modo che tu possa registrarti e utilizzare il tuo server home.
Salva il file ed esci.
Distribuire l'homeserver Synapse Matrix
Ora che tutto è a posto, puoi avviare la sinapsi usando un comando semplice come
docker-compose up -d
Ora il tuo server domestico è pronto per essere utilizzato. Se visiti il sottodominio in un browser web, dovresti vedere un messaggio come questo:
Utilizzo di PostgreSQL per il database [opzionale]
Per impostazione predefinita, synapse utilizza SQLite per il suo database. Ora va bene per i test e l'uso occasionale, ma per un caso d'uso più importante, consiglio di utilizzare PostgreSQL.
Aggiungi PostgreSQL per comporre il file in sinapsi
Vai alla directory delle sinapsi se non ci sei già e apri docker-compose.yml
. Aggiungi le seguenti righe a questo file di composizione.
postgresql:
image: postgres:latest
restart: always
environment:
POSTGRES_PASSWORD: somepassword
POSTGRES_USER: synapse
POSTGRES_DB: synapse
POSTGRES_INITDB_ARGS: "--encoding='UTF8' --lc-collate='C' --lc-ctype='C'"
volumes:
- "postgresdata:/var/lib/postgresql/"
networks: ["server"]
Il POSTGRES_INITDB_ARGS
variabile è molto necessaria. Imposta le regole di confronto, ctype e codifica usate per il database postgres. Questi sono assolutamente necessari per il funzionamento delle sinapsi. Aggiungi il volume alla sezione dei volumi:
volumes:
postgresdata:
Configura sinapsi
Ora devi far sapere a sinapsi del database postgresql. Puoi farlo modificando il vecchio homeserver.yaml
file. Apri quel file e scopri le seguenti righe:
database:
name: sqlite3
args:
database: /path/to/homeserver.db
Rimuovili perché non ne abbiamo più bisogno. Aggiungi invece quanto segue:
database:
name: psycopg2
args:
user: synapse
password: somepassword
host: postgresql
database: synapse
cp_min: 5
cp_max: 10
Il nome del database è psycopg2, che è un adattatore PostgreSQL per Python.
Guarda da vicino, vedrai le somiglianze tra questo e le variabili di ambiente che hai impostato per il contenitore postgresql.
Per quanto riguarda l'host, poiché stai usando docker-compose
e una rete personalizzata, synapse sarà in grado di risolvere automaticamente il nome del servizio. Non devi preoccuparti di questo.
Salva il file ed esci.
Distribuisci
Ebbene, cosa resta da fare davvero? Distribuiscilo.
docker-compose up -d
Verifica la distribuzione dell'homeserver Synapse Matrix
Il tuo homeserver è pronto. Proviamolo. Matrix è solo un protocollo, Synapse è solo un'implementazione. Hai bisogno di un client Matrix per poterlo utilizzare come uno strumento di messaggistica.
Ecco un elenco di vari client Matrix disponibili. Element è probabilmente uno dei client Matrix più popolari che puoi utilizzare.
Quando hai installato il client Matrix, eseguilo. Crea un account qui.
Nella pagina di registrazione, compila tutti i dettagli e sull'homeserver, inserisci il sottodominio che avevi utilizzato in precedenza. Clicca su Registrati.
Ora hai una distribuzione Synapse perfettamente funzionante che puoi utilizzare con la tua famiglia o i tuoi amici senza doversi preoccupare di dove sono archiviati i tuoi dati o cose del genere.
Configurazione della federazione in Synapse con Docker [opzionale]
La federazione è fondamentalmente la capacità di comunicare con gli utenti su un server home diverso.
Ad esempio, se il tuo userid è @coolguy:coolserver.me potrai invitare qualcuno come @Greatme:awesome.us in una stanza del tuo homeserver.
Allo stesso modo, puoi anche unirti alle stanze ospitate su altri server domestici.
Se hai già la sinapsi in esecuzione, non è necessario arrestare i contenitori. Devi solo apportare modifiche al tuo contenitore proxy NGINX. Questo consiste in non più di tre semplici e brevi passaggi.
Ci sono un paio di modi per far funzionare Federation, ma tra questi, quello che ho trovato estremamente facile da seguire e che richiede modifiche minime alla configurazione esistente, si chiama delega della porta.
Per impostazione predefinita, ogni server di matrice tenta di raggiungere un altro server di matrice tramite la porta 8443. Il processo seguente indica sostanzialmente agli altri server di utilizzare una porta diversa. Poiché https funziona già nella porta 443, delegherai semplicemente la porta di comunicazione della matrice predefinita a 443.
Passaggio 1:crea un file di configurazione per il nostro proxy inverso
Entra nella directory del proxy inverso di Nginx. Crea un file, chiamato synapse-federation
. Aggiungi il seguente testo a questo file:
location /.well-known/matrix/server {
return 200 '{"m.server": "$VIRTUAL_HOST:443"}';
}
Cambia $VIRTUAL_HOST
al suo valore appropriato, che è fondamentalmente il dominio in cui viene servita l'istanza di matrice (impostato in base al file di composizione docker di sinapsi).
Passaggio 2:modifica docker-compose.yml
Apri il tuo docker-compose.yml
file e aggiungi un'altra voce all'array dei volumi:
- ./synapse-federation:/etc/nginx/vhost.d/$VIRTUAL_HOST
Di nuovo, cambia $VIRTUAL_HOST
al valore appropriato.
Fase 3:riavvia il server proxy
Ora devi riavviare il server proxy.
docker-compose up -d proxy
Questo ricreerà il contenitore del proxy inverso. Non devi preoccuparti della perdita di alcuna configurazione precedente, a meno che tu non abbia modificato qualcosa manualmente dopo la distribuzione. La configurazione è dinamica, quindi andrà tutto bene.
Verifica le modifiche
Puoi testare le modifiche in due modi.
Prova a entrare in una stanza virtuale come #servers:matrix.org
. Esegui il comando seguente, se hai jq
installato:
curl https://federationtester.matrix.org/api/report?server_name=$VIRTUAL_HOST --silent | jq -r '.FederationOK'
Oppure usa questo più hack-y:
curl https://federationtester.matrix.org/api/report?server_name=$VIRTUAL_HOST --silent | awk '/FederationOK/ {print $2}'
Questo dovrebbe produrre "vero". E ovviamente cambia $VIRTUAL_HOST
al dominio che serve la tua istanza di sinapsi.
È stato utile?
Spero che questo ti sia stato utile tanto quanto l'esperienza lo è stata per me. Se vuoi più articoli come questo, sentiti libero di commentare in basso. In caso di problemi, lascia un commento e cercherò di aiutarti.