GuiderChatt och e-postMatrix-chattserver

Kör en Matrix-server med Podman utan root

Din egen Matrix-chattserver på Debian 13, med Synapse och PostgreSQL i rootless Podman under en egen användare, adresser som @du:example.com och federation med resten av Matrix.

Testad på Synapse 1.161 på Debian 13 (trixie) på en server hos Melonslab Uppdaterad 25 september 2026

Rekommenderad server för guiden

VC-S Micro · 2 vCPU · 8 GB Minne · 250 GB Lagring

Månadsvis, ingen bindningstid 7 dagars öppet köp

90 kr/mån

Beställ nu
På den här sidan

Det här sätter du upp

Matrix är ett öppet chattnätverk. Precis som med e-post kan vem som helst köra en server, och människor på olika servrar pratar med varandra som om de vore på samma server. Här består din server av två containrar i en pod, under en egen användare som heter matrix:

  • Synapse, referensservern för Matrix,
  • PostgreSQL, dess databas.

Caddy, som du satte upp i Podman-guiden, sköter HTTPS framför den. Adresserna ser ut som @anna:example.com, medan själva servern körs på matrix.example.com, så att example.com kan fortsätta vara din webbplats.

Varje steg nedan har körts på en nyinstallerad VC-P Alloy (2 vCPU, 8 GB) hos Melonslab med Debian 13. Federationstestet från Matrix godkände servern över IPv4 och IPv6, en användare på testservern gick med i ett publikt rum på matrix.org och tog emot dess meddelanden, och allt startade igen av sig självt efter en omstart av servern. Med servern ansluten till det rummet använde Synapse och PostgreSQL under 200 MB minne. Röst- och videosamtal kräver mer resurser och sätts upp i samtalsguiden.

Innan du börjar

Du behöver:

  • en server uppsatt som i Podman-guiden, med Caddy igång;
  • en domän, till exempel example.com, med en A-post och en AAAA-post för matrix.example.com som pekar på din server;
  • ett sätt att publicera två små filer på https://example.com, antingen via Caddy på den här servern eller där din webbplats ligger (steg 6).

Exemplen använder example.com. Byt genomgående ut det mot ditt eget.

1. Skapa användaren

Som root:

useradd -m -s /bin/bash matrix
loginctl enable-linger matrix
machinectl shell matrix@

Allt fram till steg 6 körs som matrix.

2. Skapa Synapses konfiguration

podman run --rm -v matrix-data:/data \
  -e SYNAPSE_SERVER_NAME=example.com -e SYNAPSE_REPORT_STATS=no \
  docker.io/matrixdotorg/synapse:latest generate

Det skapar en volym, matrix-data, med Synapses konfiguration, dess hemligheter och serverns signeringsnyckel, som är dess identitet i Matrix-nätverket. Servernamnet blir en del av varje adress och kan inte ändras senare, så välj det med omsorg.

3. Skapa databaslösenordet

pw=$(openssl rand -hex 24)
printf %s "$pw" | podman secret create matrix-db-password -
printf 'database:\n  name: psycopg2\n  args:\n    user: synapse\n    password: "%s"\n    dbname: synapse\n    host: 127.0.0.1\n' "$pw" | podman secret create synapse-database -
unset pw

Den första hemligheten går till PostgreSQL. Den andra är databasdelen av Synapses konfiguration, som Synapse läser som en fil, så lösenordet skrivs inte in i någon av filerna nedan.

4. Definiera podden

mkdir -p ~/.config/containers/systemd ~/matrix

Skapa ~/.config/containers/systemd/matrix.pod:

[Pod]
PodName=matrix
# Only Caddy, on this server, can reach Synapse: the port is not open to the internet.
PublishPort=127.0.0.1:8082:8008

[Install]
WantedBy=default.target

Skapa ~/.config/containers/systemd/matrix-db.container:

[Container]
ContainerName=matrix-db
Image=docker.io/library/postgres:18-alpine
Pod=matrix.pod
Volume=matrix-db:/var/lib/postgresql
Environment=POSTGRES_USER=synapse POSTGRES_DB=synapse
Environment="POSTGRES_INITDB_ARGS=--encoding=UTF-8 --lc-collate=C --lc-ctype=C"
Secret=matrix-db-password,type=env,target=POSTGRES_PASSWORD
AutoUpdate=registry

[Service]
Restart=always

Synapse kräver en databas med sorteringsordningen C, som POSTGRES_INITDB_ARGS ställer in när databasen skapas första gången.

Skapa ~/.config/containers/systemd/matrix-synapse.container:

[Unit]
After=matrix-db.service

[Container]
ContainerName=matrix-synapse
Image=docker.io/matrixdotorg/synapse:latest
Pod=matrix.pod
Volume=matrix-data:/data
Volume=%h/matrix/synapse.yaml:/config/synapse.yaml:ro
Secret=synapse-database,type=mount,target=/config/database.yaml,uid=991,gid=991,mode=0400
Exec=run --config-path /data/homeserver.yaml --config-path /config/synapse.yaml --config-path /config/database.yaml
AutoUpdate=registry

[Service]
Restart=always

Och ~/matrix/synapse.yaml, dina egna inställningar:

public_baseurl: https://matrix.example.com/

Synapse läser de tre konfigurationsfilerna i tur och ordning, och en inställning i en senare fil ersätter samma inställning i en tidigare. På så sätt hamnar dina ändringar utanför den genererade filen: här den publika adressen och bytet från den inbyggda SQLite-databasen till PostgreSQL. Synapse släpps med några veckors mellanrum, och latest med AutoUpdate håller den uppdaterad; den uppdaterar sin databas själv när den startar.

5. Starta den

systemctl --user daemon-reload
systemctl --user start matrix-pod
podman logs -f matrix-synapse

När loggen visar Synapse now listening on TCP port 8008 trycker du Ctrl+C. En varning strax innan, om att Synapse inte kunde lyssna på 0.0.0.0, är ofarlig: den lyssnar på [::], som även täcker IPv4.

6. Sätt Caddy framför

Gå tillbaka till root med exit och byt till Caddys användare:

machinectl shell caddy@

Lägg till det här blocket sist i ~/Caddyfile:

matrix.example.com {
    reverse_proxy /_matrix/* 127.0.0.1:8082
    reverse_proxy /_synapse/client/* 127.0.0.1:8082
}

Bara de sökvägar som Matrix-appar och andra servrar använder skickas vidare, så Synapses admingränssnitt går bara att nå från själva servern.

Nu till de två filerna på https://example.com. De talar om för andra servrar och appar att Matrix-servern för example.com är matrix.example.com. Om example.com pekar på den här servern lägger du till:

example.com {
    header /.well-known/matrix/* Content-Type application/json
    header /.well-known/matrix/* Access-Control-Allow-Origin *
    respond /.well-known/matrix/server `{"m.server": "matrix.example.com:443"}`
    respond /.well-known/matrix/client `{"m.homeserver": {"base_url": "https://matrix.example.com"}}`
}

Om example.com redan har ett block i Caddyfile lägger du de fyra raderna i det blocket i stället: Caddy godtar inte två block för samma adress. Om din webbplats körs någon annanstans publicerar du samma två filer där, på /.well-known/matrix/server och /.well-known/matrix/client, med samma två headers.

Starta om Caddy, vilket kort avbryter alla webbplatser den serverar:

systemctl --user restart caddy

7. Skapa ditt konto

Gå tillbaka till root med exit, byt till användaren matrix med machinectl shell matrix@ och kör:

podman exec -it matrix-synapse register_new_matrix_user -c /data/homeserver.yaml http://localhost:8008

Den frågar efter användarnamn och lösenord, och om kontot ska vara admin. Ingen kan registrera sig på servern på egen hand, så skapa konton åt andra på samma sätt.

Logga in med en Matrix-app, till exempel Element från element.io: ange example.com som server, så hittar appen matrix.example.com själv. I Element är privata chattar end-to-end-krypterade som standard.

8. Kontrollera federationen

Öppna https://federationtester.matrix.org, ange example.com och kontrollera att den rapporterar att allt fungerar. Gå sedan med i ett publikt rum på en annan server från din app. Första gången du går med i ett stort rum kan det ta några minuter, eftersom din server hämtar rummets historik.

9. Håll den uppdaterad

Slå på Podmans dagliga uppdateringar för den här användaren:

systemctl --user enable --now podman-auto-update.timer

10. Säkerhetskopiera

mkdir -p ~/backup
podman exec matrix-db pg_dump -U synapse synapse > ~/backup/synapse-db.sql
podman volume export matrix-data --output ~/backup/matrix-data.tar

Det sparar databasen i en egen fil och konfigurationen, signeringsnyckeln och uppladdade filer i ett arkiv. Kopiera sedan ~/backup till en annan maskin och förvara kopian säkert: den som har signeringsnyckeln kan uppträda som din server.

Felsökning

Federationstestet rapporterar ett problem med .well-known. Öppna https://example.com/.well-known/matrix/server i en webbläsare; den ska visa JSON-texten från steg 6.

Synapse avbryter starten med ett meddelande om databasens sorteringsordning (collation). Databasen skapades utan sorteringsordningen C, och POSTGRES_INITDB_ARGS gäller bara för en tom volym. På en ny server stoppar du podden, raderar databasen med podman volume rm matrix-db och startar igen.

Synapse meddelar att konfigurationsfilen inte finns. Steg 2 har inte körts som den här användaren, eller så har volymen i steg 2 och i matrix-synapse.container olika namn.

Samtal och mer

Röst- och videosamtal kräver en egen samtalstjänst. Samtalsguiden lägger till en på den här servern, för Elements appar och för äldre appar. Hermes Agent kan ansluta till den som en AI-assistent du chattar med.

Med din Matrix-server på en server hos Melonslab lagras dina konton, rum och meddelanden i Sverige, på en server du själv styr över, där svensk lag och EU-rätt gäller.

Kör det på din egen server

VC-S Micro

90 kr/mån

vCPU
2
Minne
8 GB
Lagring
250 GB
Trafik
10 TB
Standard
HDD · RAID 10
  • Full root-åtkomst
  • Nativt /64 IPv6
  • RAID-skyddad lagring
  • Malmö, Sverige
  • Månadsvis, ingen bindningstid
  • 7 dagars öppet köp
Alla guider