GuiderFöretag och övervakningTeamchatt med Mattermost

Kör teamchatten Mattermost med Podman utan root

Mattermost Team Edition på Debian 13, en chatt för ditt företag på din egen server med kanaler, direktmeddelanden, trådar och fildelning, i rootless Podman med PostgreSQL under en egen användare bakom Caddy, där den första administratören skapas innan chatten kommer ut på nätet.

Testad på Mattermost 11.11.1 på Debian 13 (trixie) på en server hos Melonslab Uppdaterad 14 oktober 2026

Rekommenderad server för guiden

SSD RAID 1 · ECC DDR4 · 10 Gbit

VC-P Alloy · 2 vCPU · 8 GB Minne · 60 GB Lagring

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

100 kr/mån

Beställ nu
På den här sidan

Det här sätter du upp

Mattermost är en chatt för ett företag eller ett team, ungefär som Slack: öppna och privata kanaler, direkt- och gruppmeddelanden, trådar, reaktioner, fildelning och sökning. Det finns appar för Windows, macOS, Linux, Android och iOS utöver webben, och webhooks och bottar som kopplar ihop den med andra system.

Mattermost görs av Mattermost, Inc., ett företag i Palo Alto i Kalifornien, och utvecklas öppet på GitHub. Team Edition är den kostnadsfria utgåvan med öppen källkod, och det är den guiden använder; de betalda utgåvorna lägger till funktioner som enkel inloggning och export för regelefterlevnad. En server utan licens tar upp till 250 aktiva användare och varnar från 200.

Här körs Mattermost som en pod under en egen användare som heter mattermost, med PostgreSQL för dess data, bakom Caddy från Podman-guiden.

Varje steg nedan har körts på en nyinstallerad Melonslab VC-P Alloy (2 vCPU, 8 GB) med Debian 13:

  • Mattermost 11.11.1 startade med PostgreSQL 17. Den första administratören och ett team skapades från kommandoraden innan Caddy sattes upp, och en registrering utifrån utan inbjudan nekades.
  • En andra användare gick med via teamets inbjudningslänk. Ett meddelande från en användare dök upp i den andras öppna webbläsare på en bråkdel av en sekund, utan omladdning, över websocketen genom Caddy.
  • En fil på 300 kB och en på 90 MB laddades upp genom Caddy och laddades ner oskadda av den andra användaren, och en bild fick en förhandsvisning. En fil på 110 MB nekades med storleksgränsen.
  • Inloggningar loggades med besökarens riktiga adress, över IPv4 och IPv6, och en förfalskad X-Forwarded-For-header ignorerades.
  • Tvåfaktorsautentisering fungerade med en tidsbaserad kod, som den en autentiseringsapp visar.
  • Gränssnittet och e-posten visades på svenska, både för en användare och som standard för nya användare.
  • Med e-posten riktad mot en testserver för e-post, över STARTTLS med inloggning, kom en återställning av lösenord, en inbjudan och en avisering om ett direktmeddelande fram. Utan e-post misslyckades återställningar och inbjudningar via e-post, som steg 8 beskriver.
  • Med inställningarna från steg 3 och Calls avstängt visade en avlyssning av serverns trafik inga externa anslutningar medan Mattermost kördes och användes, förutom en säkerhetskontroll vid första starten.
  • En uppdatering från Mattermost 11.10.2 till 11.11.1 behöll alla meddelanden och filer. Mattermost återställdes från en säkerhetskopia till en tom databas och tomma volymer, och allt startade igen av sig självt efter en omstart av servern.

Podden använde omkring 230 MB minne under användning, det mesta för Mattermost själv.

Innan du börjar

Du behöver:

  • en server uppsatt som i Podman-guiden, med Caddy igång;
  • en A-post och en AAAA-post för chat.example.com som pekar på din server.

Exemplen använder chat.example.com för Mattermost, you@example.com för din egen e-postadress och Example för ditt team. Byt ut dem genomgående.

1. Skapa användaren

Som root:

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

Allt fram till steg 5 körs som mattermost.

2. Skapa hemligheterna

pw=$(openssl rand -hex 24)
printf %s "$pw" | podman secret create mattermost-db-password -
printf 'postgres://mattermost:%s@127.0.0.1:5432/mattermost?sslmode=disable&connect_timeout=10' "$pw" | podman secret create mattermost-db-url -
unset pw

Båda innehåller databaslösenordet, en gång för PostgreSQL och en gång i adressen som Mattermost ansluter till. Podman lagrar dem, inte filerna nedan. sslmode=disable går bra här: databasen nås bara inne i podden.

3. Definiera podden

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

Skapa mattermost.pod:

[Pod]
PodName=mattermost
# Only Caddy, on this server, can reach Mattermost: the port is not open to the internet.
PublishPort=127.0.0.1:8065:8065

[Install]
WantedBy=default.target

Skapa mattermost-db.container:

[Container]
ContainerName=mattermost-db
Image=docker.io/library/postgres:17-alpine
Pod=mattermost.pod
Volume=mattermost-db:/var/lib/postgresql/data
Environment=POSTGRES_USER=mattermost POSTGRES_DB=mattermost
Secret=mattermost-db-password,type=env,target=POSTGRES_PASSWORD
HealthCmd=pg_isready -U mattermost
HealthInterval=10s
Notify=healthy
AutoUpdate=registry

[Service]
Restart=always

Och mattermost-app.container:

[Unit]
Requires=mattermost-db.service
After=mattermost-db.service

[Container]
ContainerName=mattermost-app
Image=docker.io/mattermost/mattermost-team-edition:11.11
Pod=mattermost.pod
Volume=mattermost-config:/mattermost/config
Volume=mattermost-data:/mattermost/data
Environment=MM_SERVICESETTINGS_SITEURL=https://chat.example.com
Environment=MM_SERVICESETTINGS_TRUSTEDPROXYIPHEADER=X-Forwarded-For
Environment=MM_SERVICESETTINGS_ENABLEMULTIFACTORAUTHENTICATION=true
Environment=MM_SQLSETTINGS_DRIVERNAME=postgres
Secret=mattermost-db-url,type=env,target=MM_SQLSETTINGS_DATASOURCE
Environment=MM_LOGSETTINGS_ENABLEDIAGNOSTICS=false MM_LOGSETTINGS_ENABLESENTRY=false
Environment=MM_ANNOUNCEMENTSETTINGS_ADMINNOTICESENABLED=false MM_ANNOUNCEMENTSETTINGS_USERNOTICESENABLED=false
Environment=MM_EMAILSETTINGS_PUSHNOTIFICATIONCONTENTS=generic
AutoUpdate=registry

[Service]
Restart=always

Vad inställningarna gör:

  • SITEURL är adressen som Mattermost sätter i länkar, inbjudningar och e-post. Den måste vara den publika https://-adressen.
  • TRUSTEDPROXYIPHEADER får Mattermost att ta besökarens adress från headern X-Forwarded-For, som Caddy sätter. Utan den loggas varje inloggning med serverns egen adress. Caddy ersätter en sådan header om en besökare skickar den, och bara Caddy når porten, så den går inte att förfalska.
  • ENABLEMULTIFACTORAUTHENTICATION låter användarna slå på tvåfaktorsautentisering (steg 6).
  • ENABLEDIAGNOSTICS och ENABLESENTRY stoppar användningsstatistiken och felrapporterna som Mattermost skickar till sina utvecklare, och de två NOTICES-raderna hindrar den från att hämta nyheter från notices.mattermost.com varje timme.
  • PUSHNOTIFICATIONCONTENTS=generic håller texten i meddelandena utanför aviseringarna till mobiler, som går via Mattermosts push-tjänst (steg 9).
  • Taggen 11.11 följer varje patchversion av Mattermost 11.11; steg 11 förklarar hur du går vidare till nästa version. PostgreSQL ligger kvar på 17: en ny huvudversion av PostgreSQL kräver en dump och en återställning.
  • Meddelanden, användare och kanaler ligger i databasen, uppladdade filer i volymen mattermost-data, och inställningar du ändrar i System Console i config.json i volymen mattermost-config.

Inställningar som anges här som MM_-rader går före System Console, som visar dem nedtonade. Vill du ändra en ändrar du filen.

Starta den:

systemctl --user daemon-reload
systemctl --user start mattermost-pod
systemctl --user enable --now podman-auto-update.timer

Vid första starten laddas avbilderna ner, omkring 1 GB på disk, och Mattermost behöver en halv minut för att sätta upp sin databas. Den är klar när det här skriver ut {"status":"OK"} på slutet:

curl -s http://127.0.0.1:8065/api/v4/system/ping

4. Skapa administratören och teamet

I en ny Mattermost blir den första som registrerar sig systemadministratör, så skapa ditt konto innan Mattermost går att nå från internet. Mattermosts kommandoradsverktyg, mmctl, kan göra det inne i containern:

pw=$(openssl rand -base64 18); echo "$pw"
podman exec mattermost-app mmctl --local user create --email you@example.com --username anna --password "$pw" --system-admin --email-verified
podman exec mattermost-app mmctl --local team create --name example --display-name Example
podman exec mattermost-app mmctl --local team users add example anna
unset pw

Den första raden skapar ett slumpat lösenord och skriver ut det: spara det i din lösenordshanterare. Sedan skapas kontot som systemadministratör, ett team skapas och du går med i det. --local pratar med Mattermost via en socket inne i containern, som avbilden slår på, så bara den som kan köra kommandon som mattermost kan använda det. Du kan byta lösenordet senare under Profile > Security.

Stäng sedan av Calls, Mattermosts röst- och videosamtal:

podman exec mattermost-app mmctl --local plugin disable com.mattermost.calls

Calls behöver en egen UDP-port och en STUN-server hos Mattermost, och det sätter den här guiden inte upp. Utan den här raden ser användarna knappar för samtal som inte kopplar fram.

Efter nästa omstart är Calls också borta ur mmctl --local plugin list: Mattermost packar upp sina medföljande plugins i containern vid varje start, och bara de som är påslagna. mmctl --local plugin enable com.mattermost.calls svarar då Plugin is not installed. För att slå på Calls igen senare, som mattermost:

echo '{"PluginSettings":{"PluginStates":{"com.mattermost.calls":{"Enable":true}}}}' | podman exec -i mattermost-app mmctl --local config patch /dev/stdin
systemctl --user restart mattermost-app

Vid starten installerar Mattermost Calls igen från sin avbild, och listan över plugins visar det som påslaget.

5. Sätt Caddy framför

Gå tillbaka till root med exit, byt till machinectl shell caddy@ och lägg till det här blocket sist i ~/Caddyfile:

chat.example.com {
    reverse_proxy 127.0.0.1:8065
}

Starta om Caddy med systemctl --user restart caddy och öppna https://chat.example.com. Välj View in Browser och logga in med anna och lösenordet från steg 4. Caddy skickar vidare websocketen som Mattermost använder för meddelanden i realtid av sig själv, och har ingen egen storleksgräns för uppladdningar.

6. Bjud in ditt team

Ingen kan registrera sig utan inbjudan: EnableOpenServer är avstängt från början, och en registrering utan inbjudan får svaret "This server does not allow open signups."

För att bjuda in folk öppnar du teammenyn, Example uppe till vänster, och väljer Invite people och Copy invite link. Skicka länken till dina kollegor: med den skapar de ett konto och går med i teamet. Den fungerar utan e-post, och alla som har den kan gå med, så dela den bara med dem du vill bjuda in.

Några inställningar som är bra att känna till, under System Console i produktmenyn uppe till vänster:

  • Site Configuration > Users and Teams > Max Users Per Team är 50. Höj det om ert team är större.
  • Environment > File Storage > Maximum File Size är 100 MB. En större fil nekas med "exceeds the maximum allowed 104857600 bytes".
  • User Management > Users listar alla konton, och där kan du inaktivera dem som slutar.

Varje användare kan slå på tvåfaktorsautentisering under Profile > Security > Multi-factor Authentication, med en autentiseringsapp.

7. Använd Mattermost på svenska

Mattermost är översatt till svenska. Varje användare väljer Svenska under Settings > Display > Language. På samma ställe vill de flesta i Sverige också sätta Clock Display till 24-hour clock.

För att göra svenska till standard för nya användare och för inloggningssidan lägger du som mattermost till den här raden i mattermost-app.container och startar om:

Environment=MM_LOCALIZATIONSETTINGS_DEFAULTSERVERLOCALE=sv MM_LOCALIZATIONSETTINGS_DEFAULTCLIENTLOCALE=sv
systemctl --user daemon-reload
systemctl --user restart mattermost-app

Konton som skapades före ändringen behåller sitt språk. E-post skickas på varje användares språk.

8. E-post

Mattermost skickar e-post för återställning av lösenord, inbjudningar via e-post och aviseringar om direktmeddelanden och omnämnanden till användare som inte är inne. Den här guiden sätter inte upp e-post, och utan den:

  • misslyckas Forgot your password? med "Failed to send password reset email successfully.", så du återställer lösenord åt dina användare själv (nedan);
  • misslyckas inbjudningar via e-post med "Email invitations are disabled."; inbjudningslänken från steg 6 fungerar fortfarande;
  • står det "Preview Mode: Email notifications have not been configured." i ett fält högst upp.

Inloggning och chatt fungerar som vanligt. För att sätta ett nytt lösenord åt en användare utan e-post kör du som mattermost:

podman exec mattermost-app mmctl --local user change-password bo --password 'a-new-password'

För att skicka e-post pekar du Mattermost mot din e-postleverantörs SMTP-server. Som mattermost sparar du SMTP-lösenordet som en hemlighet:

printf %s 'the-smtp-password' | podman secret create mattermost-mail-password -

Lägg sedan till de här raderna i mattermost-app.container, med din egen server, ditt konto och din avsändaradress:

Environment=MM_EMAILSETTINGS_SENDEMAILNOTIFICATIONS=true MM_SERVICESETTINGS_ENABLEEMAILINVITATIONS=true
Environment=MM_EMAILSETTINGS_SMTPSERVER=mail.example.com MM_EMAILSETTINGS_SMTPPORT=587 MM_EMAILSETTINGS_CONNECTIONSECURITY=STARTTLS
Environment=MM_EMAILSETTINGS_ENABLESMTPAUTH=true MM_EMAILSETTINGS_SMTPUSERNAME=chat@example.com
Environment=MM_EMAILSETTINGS_FEEDBACKEMAIL=chat@example.com MM_EMAILSETTINGS_FEEDBACKNAME=Chat
Secret=mattermost-mail-password,type=env,target=MM_EMAILSETTINGS_SMTPPASSWORD

Starta om som i steg 7 och kontrollera med System Console > Environment > SMTP > Test Connection. Port 587 med STARTTLS uppgraderar anslutningen till TLS; för port 465, som använder TLS från början, sätter du porten till 465 och CONNECTIONSECURITY till TLS. Vi testade inställningarna mot en testserver för e-post på samma server, inte via en riktig e-postleverantör.

9. Externa tjänster

Vi avlyssnade serverns DNS-uppslagningar och utgående anslutningar från första starten. Vid första starten slog Mattermost upp securityupdatecheck.mattermost.com (nedan), och Calls slog upp stun.global.calls.mattermost.com tills steg 4 stängde av det. Efter det, genom omstarter, en omstart av servern och vanlig användning, kom inga. Utan raderna från steg 3 kontaktade Mattermost också notices.mattermost.com och o94110.ingest.us.sentry.io vid varje start.

En del når fortfarande ut när det används:

  • När någon skriver en länk hämtar servern sidan för att visa en förhandsvisning. Site Configuration > Posts > Enable website link previews stänger av det.
  • Aviseringar till mobilen från Mattermosts appar i App Store och Google Play går via push-test.mattermost.com, en push-tjänst som Mattermost driver utan garantier för servrar utan licens, och vidare via Apple och Google. Med PUSHNOTIFICATIONCONTENTS=generic innehåller de avsändaren och kanalens namn, inte meddelandet. Vi har inte testat mobilapparna.
  • Mattermost frågar securityupdatecheck.mattermost.com efter säkerhetsrättningar, enligt sin dokumentation, och mejlar systemadministratörerna när en gäller din version. Vi såg det en gång, vid första starten. Environment > SMTP > Enable Security Alerts stänger av det.
  • Marketplace i produktmenyn hämtar listan över plugins från api.integrations.mattermost.com när en administratör öppnar den.

En utgående webhook eller ett snedstreckskommando som riktas mot en annan app på samma server, till exempel n8n, behöver en av lösningarna i steg 8 i Podman-guiden. Enligt Mattermosts dokumentation vägrar den privata adresser, som den en AddHost-rad ger, om de inte står under Environment > Developer > Allow untrusted internal connections to, så den andra lösningen är enklast här.

10. Säkerhetskopiera

Som mattermost:

umask 077
mkdir -p ~/backup
podman exec mattermost-db pg_dump -U mattermost mattermost > ~/backup/mattermost.sql
podman volume export mattermost-data > ~/backup/mattermost-data.tar
podman volume export mattermost-config > ~/backup/mattermost-config.tar

Säkerhetskopian innehåller meddelanden, användare och kanaler, uppladdade filer och inställningarna från System Console. Dumpen körs medan Mattermost fortsätter att fungera. umask 077 gör att bara mattermost kan läsa nya filer; podman volume export --output skulle strunta i den, och därför använder raderna >. Kopiera ~/backup till en annan maskin, till exempel med restic, och förvara den säkert: den innehåller alla meddelanden.

För att återställa, som mattermost, med säkerhetskopian i ~/backup:

systemctl --user stop mattermost-app
podman exec mattermost-db dropdb -U mattermost --force mattermost
podman exec mattermost-db createdb -U mattermost mattermost
podman exec -i mattermost-db psql -q -U mattermost mattermost < ~/backup/mattermost.sql
podman volume rm mattermost-data mattermost-config
podman volume create mattermost-data
podman volume create mattermost-config
podman volume import mattermost-data ~/backup/mattermost-data.tar
podman volume import mattermost-config ~/backup/mattermost-config.tar
systemctl --user start mattermost-app

På en ny server kör du steg 1 till 3 först och återställer sedan. Databaslösenordet finns inte i säkerhetskopian, så nya hemligheter går bra.

11. Uppdatera

En gång om dagen hämtar podman-auto-update.timer nya avbilder för Mattermost 11.11 och PostgreSQL 17 och startar om podden med dem. För att uppdatera direkt, som mattermost:

podman auto-update
podman image prune -f

Mattermost ger ut en ny version ungefär varje månad, med en egen tagg: versionsnumret utan den sista siffran, till exempel 11.11 för 11.11.1. För att gå över till en ny version tar du en säkerhetskopia, byter tagg i mattermost-app.container, med NEW ersatt av den nya taggen, och startar om:

sed -i 's/team-edition:11.11/team-edition:NEW/' ~/.config/containers/systemd/mattermost-app.container
systemctl --user daemon-reload
systemctl --user restart mattermost-app
podman image prune -a -f

Mattermost uppdaterar sin databas själv när den startar. Läs versionsinformationen före en ny huvudversion, som 12. podman image prune -a tar bort den gamla avbilden, omkring 680 MB, men behåller avbilderna som dina körande containrar använder. Utan -a blir den gamla avbilden kvar, eftersom den fortfarande har sin tagg 11.11. Vi gick från 11.10 till 11.11 på det här sättet, och teamet och datan fanns kvar.

Felsökning

Varje inloggning under Profile > Security > View Access History har serverns egen adress. MM_SERVICESETTINGS_TRUSTEDPROXYIPHEADER saknas i mattermost-app.container. Lägg till den, kör sedan daemon-reload och starta om mattermost-app.

En inställning är nedtonad i System Console. Den sätts av en MM_-rad i mattermost-app.container. Ändra den där och starta om.

Loggen säger "this plugin requires a professional license or higher" om Playbooks. Playbooks följer med Mattermost men kräver en betald licens. Meddelandet är ofarligt.

Kör det på din egen server

SSD RAID 1 · ECC DDR4 · 10 Gbit

VC-P Alloy

100 kr/mån

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