Det här sätter du upp
Zulip är en chatt för ett företag eller ett team, ungefär som Slack, med en skillnad: varje meddelande i en kanal hör till ett ämne. En kanal som sales rymmer många korta samtal, som Q4 offers eller Acme contract, vart och ett i en egen tråd, så att man kan komma ikapp i en fråga utan att läsa allt. Det finns också direktmeddelanden, omnämnanden, fildelning, sökning, användargrupper och appar för Windows, macOS, Linux, Android och iOS utöver webben.
Zulip görs av Kandra Labs, Inc., ett företag i San Francisco, och utvecklas öppet på GitHub. Det är öppen källkod under Apache 2.0-licensen, och servern du kör själv har alla funktioner, utan gräns för antalet användare. Det du eventuellt betalar för är push-tjänsten för mobiler (steg 11) och support. Zulip Cloud, där Kandra Labs kör servern åt dig, är gratis med sökning begränsad till de senaste 10 000 meddelandena, och kostar från 6,67 dollar per användare och månad för Standard, enligt prislistan den 14 oktober 2026.
Zulips egen containeravbild, ghcr.io/zulip/zulip-server, kör allt Zulip behöver utom fyra tjänster, som får var sin container: PostgreSQL för datan, RabbitMQ för köerna med bakgrundsjobb, Redis för gränser mot överbelastning och memcached som cache. Här körs alla fem som en pod under en egen användare som heter zulip, bakom Caddy från Podman-guiden. Enligt Zulips dokumentation stöds inte avbilden i Docker utan root. I våra tester gick den utan root i Podman, med gränsen för öppna filer från steg 3.
Varje steg nedan har körts på en nyinstallerad Melonslab VC-P Alloy (2 vCPU, 8 GB) med Debian 13:
- Zulip 12.3 startade med PostgreSQL 14, RabbitMQ 4.2, Redis och memcached. Organisationen skapades med en engångslänk, och en registrering utan inbjudan nekades med "You need an invitation to join this organization."
- Användare gick med via inbjudan per e-post och via en inbjudningslänk, som medlem, moderator, administratör och gäst. Gästen såg bara den kanal hen var inbjuden till, kunde inte gå med i andra och såg, efter en inställning, bara personerna i den kanalen.
- Ett meddelande som nämnde en användare dök upp i den användarens öppna webbläsare en halv sekund efter att det skickades, genom Caddy. Direktmeddelanden, omnämnande av en användargrupp, sökning och ett redigerat meddelande med sin tidigare version i redigeringshistoriken fungerade.
- En fil på 90 MB laddades upp och laddades ner oskadd av en annan användare, en besökare utan inloggning skickades till inloggningssidan och en gäst utanför kanalen fick "403". En fil på 110 MB nekades med "exceeds the maximum file size for attachments (100 MB)".
- Zulip loggade besökarens riktiga adress, över IPv4 och IPv6, och ignorerade en förfalskad
X-Forwarded-For-header. E-posten om ny inloggning visade också den riktiga adressen. - Med e-posten riktad mot en testserver för e-post, över STARTTLS med inloggning, kom inbjudningar, bekräftelser av nya konton, en avisering om ett direktmeddelande och varningar om nya inloggningar fram.
- En inkommande webhook skrev ett larm från en övervakning, och en bot skrev ett meddelande via API:t.
- Gränssnittet visades på svenska, både för en användare och som standard för nya användare. Bara ungefär en tiondel är översatt (steg 9).
- En avlyssning av serverns trafik visade inga externa anslutningar från Zulip medan den startade och användes.
- En uppdatering från Zulip 12.2 till 12.3 behöll alla meddelanden och filer. En säkerhetskopia återställdes till en nyuppsatt Zulip med alla användare, meddelanden och filer, och allt startade igen av sig självt efter en omstart av servern.
Första starten tog omkring fem minuter, det mesta för att ladda ner 3,6 GB avbilder. Podden använde omkring 2,3 GB minne i vila och 2,5 GB under användning, det mesta för Zulips egna processer. Det är mer än våra andra chattguider, och skälet till att guiden föreslår en server med 8 GB: Zulip vill ha minst 2 GB och anpassar sig efter hela serverns minne, något som steg 3 tar ner från omkring 4 GB.
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.comsom pekar på din server; - ett e-postkonto som kan skicka via din e-postleverantörs SMTP-server, till exempel
chat@example.com. Zulip behöver e-post för att bjuda in folk (steg 6).
Exemplen använder chat.example.com för Zulip, chat@example.com för dess e-postkonto, 203.0.113.10 för serverns IPv4-adress, som ip -brief address show eth0 visar, och Example för din organisation. Byt ut dem genomgående.
1. Skapa användaren
Som root:
useradd -m -s /bin/bash zulip
loginctl enable-linger zulip
machinectl shell zulip@
Allt fram till steg 4 körs som zulip.
2. Skapa hemligheterna
for s in db memcached rabbitmq redis; do
openssl rand -hex 24 | tr -d '\n' | podman secret create zulip-$s-password -
done
Det här är lösenorden som Zulip använder för PostgreSQL, memcached, RabbitMQ och Redis. Podman lagrar dem, inte filerna nedan. Zulip skapar sina egna nycklar vid första starten och sparar dem i sin datavolym.
3. Definiera podden
mkdir -p ~/.config/containers/systemd
cd ~/.config/containers/systemd
Skapa zulip.pod:
[Pod]
PodName=zulip
# Only Caddy, on this server, can reach Zulip: the port is not open to the internet.
PublishPort=127.0.0.1:8179:80
[Install]
WantedBy=default.target
Skapa zulip-db.container:
[Container]
ContainerName=zulip-db
Image=docker.io/zulip/zulip-postgresql:14
Pod=zulip.pod
Volume=zulip-db:/var/lib/postgresql/data
Environment=POSTGRES_USER=zulip POSTGRES_DB=zulip
Secret=zulip-db-password,type=env,target=POSTGRES_PASSWORD
HealthCmd=pg_isready -U zulip
HealthInterval=10s
Notify=healthy
AutoUpdate=registry
[Service]
Restart=always
Skapa zulip-memcached.container:
[Container]
ContainerName=zulip-memcached
Image=docker.io/library/memcached:alpine
Pod=zulip.pod
Secret=zulip-memcached-password
Environment=SASL_CONF_PATH=/home/memcache/memcached.conf MEMCACHED_SASL_PWDB=/home/memcache/sasl-db
Exec=sh -euc 'echo "mech_list: plain" > $$SASL_CONF_PATH; echo "zulip@localhost:$$(cat /run/secrets/zulip-memcached-password)" > $$MEMCACHED_SASL_PWDB; exec memcached -S'
AutoUpdate=registry
[Service]
Restart=always
Skapa zulip-rabbitmq.container:
[Container]
ContainerName=zulip-rabbitmq
Image=docker.io/library/rabbitmq:4.2
Pod=zulip.pod
Volume=zulip-rabbitmq:/var/lib/rabbitmq
Environment=RABBITMQ_DEFAULT_USER=zulip
Secret=zulip-rabbitmq-password,type=env,target=RABBITMQ_DEFAULT_PASS
AutoUpdate=registry
[Service]
Restart=always
Skapa zulip-redis.container:
[Container]
ContainerName=zulip-redis
Image=docker.io/library/redis:alpine
Pod=zulip.pod
Volume=zulip-redis:/data
Secret=zulip-redis-password
Exec=sh -euc 'exec docker-entrypoint.sh redis-server --requirepass "$$(cat /run/secrets/zulip-redis-password)"'
AutoUpdate=registry
[Service]
Restart=always
Och zulip-app.container:
[Unit]
Requires=zulip-db.service zulip-memcached.service zulip-rabbitmq.service zulip-redis.service
After=zulip-db.service zulip-memcached.service zulip-rabbitmq.service zulip-redis.service
[Container]
ContainerName=zulip-app
Image=ghcr.io/zulip/zulip-server:12.3-0
Pod=zulip.pod
Volume=zulip-data:/data
Environment=SETTING_EXTERNAL_HOST=chat.example.com SETTING_ZULIP_ADMINISTRATOR=chat@example.com
Environment=LOADBALANCER_IPS=203.0.113.10
Environment=CONFIG_application_server__queue_workers_multiprocess=False
Environment=SETTING_ENABLE_GRAVATAR=False SETTING_NAVIGATION_TOUR_VIDEO_URL=None
Environment=AUTO_BACKUP_ENABLED=False
Secret=zulip-db-password,target=/run/secrets/zulip__postgres_password
Secret=zulip-memcached-password,target=/run/secrets/zulip__memcached_password
Secret=zulip-rabbitmq-password,target=/run/secrets/zulip__rabbitmq_password
Secret=zulip-redis-password,target=/run/secrets/zulip__redis_password
Ulimit=nofile=524288:524288
[Service]
Restart=always
TimeoutStartSec=300
Vad inställningarna gör:
EXTERNAL_HOSTär adressen som Zulip sätter i länkar, inbjudningar och e-post, utanhttps://.ZULIP_ADMINISTRATORär adressen användarna ser när Zulip ber dem kontakta administratörerna, och dit den skickar rapporter om serverfel, så använd en brevlåda som någon läser. Samma adress som Zulip skickar e-post från (steg 6) gör e-postleverantörer nöjda.LOADBALANCER_IPSär adressen som Zulip litar på när den får veta besökarens riktiga adress och att anslutningen var HTTPS. Caddys anslutningar kommer in i podden från serverns egen IPv4-adress, som Podman-guiden förklarar, så det är den du anger. Utan den nekar Zulip varje sida med "Internal server error".queue_workers_multiprocess=Falsekör Zulips bakgrundsjobb i en process i stället för en var. Zulip ser hela serverns minne och skulle annars anpassa sig som om den var ensam på servern: på det sättet använde den omkring 4 GB i våra tester, och 2,3 GB med den här raden. Zulip gör samma val själv på servrar med mindre än 4 GB.ENABLE_GRAVATAR=FalseochNAVIGATION_TOUR_VIDEO_URL=Nonestoppar två saker som laddas utifrån i användarnas webbläsare: profilbilder från Gravatar och en välkomstvideo från Zulips servrar. Steg 12 har detaljerna.AUTO_BACKUP_ENABLED=Falsestoppar de dagliga databasdumparna som avbilden annars sparar i datavolymen för alltid. Steg 13 tar säkerhetskopiorna i stället.Secret=-raderna lägger lösenorden där Zulips avbild letar efter dem. De fyra andra containrarna läser samma hemligheter. I filerna för memcached och Redis är$$hur en unit-fil skriver$.Ulimithöjer antalet filer som Zulip får ha öppna, eftersom varje ansluten webbläsare håller en. Zulips egen installation ber om fler än en användare utan root kan ge, och det här är så många det går.- De fyra hjälpcontainrarna lyssnar bara inne i podden, där inget annat når dem. De uppdateras av sig själva; Zulip uppdaterar du genom att byta tagg (steg 14).
zulip/zulip-postgresqlär PostgreSQL 14 med de ordlistor som Zulips sökning använder, gjord av Zulip. - Meddelanden, användare och inställningar ligger i databasen. Uppladdade filer och nycklarna som Zulip skapade vid första starten ligger i volymen
zulip-data.
Starta den:
systemctl --user daemon-reload
systemctl --user start zulip-pod
systemctl --user enable --now podman-auto-update.timer
Vid första starten laddas omkring 3,6 GB avbilder ner, och sedan behöver Zulip några minuter för att sätta upp sig. Varje senare start av zulip-app tar ungefär en och en halv minut. Den är klar när det här skriver ut {"result":"success","msg":""}:
curl -s http://127.0.0.1:8179/health
4. 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:8179
}
Starta om Caddy med systemctl --user restart caddy och öppna https://chat.example.com. Zulip visar "No organization found": det finns ingen än. Caddy skickar vidare de långlivade anslutningar som Zulip använder för meddelanden i realtid av sig själv, och har ingen egen storleksgräns för uppladdningar.
Det är säkert att ha Zulip på nätet innan organisationen finns. Ingen kan skapa en utan en länk från nästa steg: https://chat.example.com/new/ svarar "Organization creation link required".
5. Skapa organisationen
Gå tillbaka till root med exit och byt till machinectl shell zulip@. Skapa en engångslänk:
podman exec -u zulip zulip-app /home/zulip/deployments/current/manage.py generate_realm_creation_link
Öppna länken den skriver ut, https://chat.example.com/new/..., i webbläsaren. Fyll i Organization name, sätt Organization type till Business och ange din e-postadress under Your email. Create organization tar dig till ditt eget konto: ditt namn, ett lösenord och hur du hörde talas om Zulip, sedan Sign up. Nu är du organisationens ägare, och Zulip öppnas.
Länken fungerar en gång. Lämnar du sidan halvvägs skapar du en ny.
6. E-post
Zulip skickar e-post för inbjudningar, för länken som bekräftar ett nytt konto, för återställning av lösenord, för varningar om nya inloggningar och för aviseringar om meddelanden man missat. Utan e-post säger Zulip "Password reset sent!" och att inbjudningar har skickats, men inget lämnar servern, och ingen kan heller gå med via en inbjudningslänk. Sätt därför upp e-post innan du bjuder in någon.
Som zulip sparar du SMTP-lösenordet för ditt e-postkonto som en hemlighet:
printf %s 'the-smtp-password' | podman secret create zulip-mail-password -
Lägg sedan till de här raderna i zulip-app.container, före Ulimit=, med din leverantörs server och ditt konto:
Environment=SETTING_EMAIL_HOST=mail.example.com SETTING_EMAIL_PORT=587 SETTING_EMAIL_USE_TLS=True
Environment=SETTING_EMAIL_HOST_USER=chat@example.com SETTING_NOREPLY_EMAIL_ADDRESS=chat@example.com SETTING_ADD_TOKENS_TO_NOREPLY_ADDRESS=False
Secret=zulip-mail-password,target=/run/secrets/zulip__email_password
Port 587 med EMAIL_USE_TLS=True använder STARTTLS; för port 465, som använder TLS från början, sätter du porten till 465 och byter SETTING_EMAIL_USE_TLS=True mot SETTING_EMAIL_USE_SSL=True. NOREPLY_EMAIL_ADDRESS med ADD_TOKENS_TO_NOREPLY_ADDRESS=False skickar allt från kontots egen adress, vilket de flesta leverantörer kräver. Starta om och skicka ett test:
systemctl --user daemon-reload
systemctl --user restart zulip-app
podman exec -u zulip zulip-app /home/zulip/deployments/current/manage.py send_test_email you@example.com
Det slutar med "Successfully sent 2 emails" när det fungerar, eller med serverns svar när det inte gör det. Zulip kontrollerar leverantörens certifikat. Vi testade inställningarna mot en testserver för e-post på samma server, inte via en riktig e-postleverantör.
7. Bjud in ditt team
Från början krävs en inbjudan för att gå med: https://chat.example.com/register/ säger "You need an invitation to join this organization." För att bjuda in folk öppnar du kugghjulsmenyn uppe till höger och väljer Invite users:
- Email invitation skickar en länk till varje adress du skriver in. Välj roll under Users join as och kanaler under Channels they should join.
- Invitation link skapar en länk som vem som helst kan registrera sig med, med den roll och de kanaler du väljer. Var och en bekräftar sin adress via e-post, och Zulip skickar högst fem sådana mejl om dagen för registreringar från samma IP-adress. För ett helt kontor använder du inbjudningar per e-post.
Varje användare har en roll:
- Owner får göra allt, även utse andra ägare. Du är den första.
- Administrator sköter organisationen, dess användare och inställningar.
- Moderator är en medlem med extra rättigheter som du kan ställa in, till exempel att flytta andras meddelanden till ett annat ämne.
- Member är den vanliga rollen.
- Guest ser bara de kanaler hen läggs till i, och kan inte gå med i eller skapa andra. Använd den för kunder och partner.
För att bjuda in en gäst till en kanal väljer du Guests under Users join as, kryssar ur Default channels for this organization och väljer kanalen. En gäst ser ändå namnen på alla i organisationen i användarlistan. För att bara visa personerna i gästens kanaler öppnar du Organization settings i kugghjulsmenyn och sätter, under Organization permissions, Guests, Who can view all other users in the organization till Admins, moderators and members.
Organization settings > Users listar alla konton, och där kan du byta roll eller inaktivera den som slutar.
8. Kanaler, ämnen och meddelanden
Zulip börjar med tre kanaler: general, sandbox och Zulip, de två sista med tips för nya användare. Create a channel i vänsterspalten lägger till en. Under Who can access this channel väljer du Public för en kanal som alla i organisationen kan gå med i, eller Private för en som bara dess medlemmar ser.
Varje meddelande i en kanal behöver ett ämne. När du skriver visar skrivrutan kanalen och ett ämne, till exempel sales > Q4 offers: välj ett befintligt ämne för att svara, eller skriv ett nytt för att starta ett samtal. Vänsterspalten listar ämnena under varje kanal, och Inbox visar det du inte har läst, ämne för ämne.
Några saker att känna till:
- New direct message längst ner skriver till en person eller en liten grupp, utanför kanalerna.
@**Bo Berg**nämner en person, och hen ser meddelandet under Mentions. Zulip fyller i namnet när du skriver@.- Gemet i skrivrutan laddar upp en fil, upp till 100 MB. Filer kan bara öppnas av den som kan se meddelandet: andra skickas till inloggningssidan.
- Search högst upp söker i texten i alla meddelanden du kan se. En sökning på
thursdayhittade ett meddelande med "Thursday". - För att redigera ditt meddelande håller du muspekaren över det och väljer pennan, Edit message. Redigerade meddelanden märks EDITED, och ett klick på det visar alla tidigare versioner.
- Group settings i kugghjulsmenyn skapar användargrupper, som
sales-team.@*sales-team*nämner alla i gruppen.
9. Använd Zulip på svenska
Zulip har en svensk översättning, men bara omkring 9 % av den är klar i Zulip 12.3: menyerna är en blandning av svenska och engelska, och e-posten är på engelska. Varje användare väljer Svenska under Personal settings > Preferences > Language i kugghjulsmenyn. På samma ställe vill de flesta i Sverige också sätta Time format till 24-timmarsklocka.
För att göra svenska till standard för nya användare öppnar du Organization settings > Organization settings och sätter Language for automated messages and invitation emails till Svenska. Under Default user settings kan du sätta 24-timmarsklocka för nya användare. Användare som redan har ett konto behåller sitt språk.
10. Webhooks och bottar
Zulip har färdiga integrationer för över 130 tjänster, listade under Integrations i kugghjulsmenyn, och var och en har en beskrivning av hur du gör. Många verktyg för övervakning och larm kan också skicka webhooks i Slacks format, och dem tar Zulip emot:
- Gå till Personal settings > Bots > Add a new bot, välj Incoming webhook som Bot type och ge den ett namn, till exempel
Monitoring. Zulip visar dess API-nyckel. - Peka verktyget mot
https://chat.example.com/api/v1/external/slack_incoming?api_key=THE-KEY&stream=general&topic=alerts.
Ett test med curl, som ett övervakningsverktyg skulle skicka det, skrev "Backup job on db1 failed at 03:00" i general under ämnet alerts:
curl -s "https://chat.example.com/api/v1/external/slack_incoming?api_key=THE-KEY&stream=general&topic=alerts" \
-H "Content-Type: application/json" -d '{"text":"Backup job on db1 failed at 03:00"}'
För dina egna skript väljer du Generic bot i stället. Den får en e-postadress, till exempel report-bot@chat.example.com, och en API-nyckel, och kan göra det en användare kan via Zulips API:
curl -s -u "report-bot@chat.example.com:THE-KEY" https://chat.example.com/api/v1/messages \
-d type=stream -d to=general -d topic="daily report" --data-urlencode "content=12 new orders yesterday."
Zulips API-dokumentation, i kugghjulsmenyn, visar samma anrop i Python och JavaScript. Håll botarnas nycklar lika hemliga som lösenord: den som har en kan skriva som boten.
Ett verktyg på samma server, till exempel Uptime Kuma, når Zulip via dess publika namn bara med en av lösningarna i steg 8 i Podman-guiden, på verktygets sida.
11. Mobilappar och push-aviseringar
Zulips appar för Android och iOS, och dess skrivbordsappar, loggar in på https://chat.example.com precis som en webbläsare. Vi har inte testat dem.
Aviseringar till mobilen är en annan sak. Apple och Google låter bara den som gjort en app skicka aviseringar till den, så en Zulip du kör själv skickar dem via Zulips push-tjänst, Mobile Push Notification Service, på push.zulipchat.com, som drivs av Kandra Labs. Det här fann vi i Zulips dokumentation och prislista den 14 oktober 2026:
- Tjänsten är gratis för organisationer med upp till 10 användare. Större behöver ett betalt paket för servern du kör själv: Basic för 3,50 dollar per användare och månad, eller Business för 6,67 dollar per användare och månad vid årsbetalning, från 25 användare. Ideella föreningar, projekt med öppen källkod, forskning och liknande kan få det gratis. De betalda paketen lägger inte till något annat i programvaran; Business och Enterprise ger också support.
- Med Zulip 12 och en aktuell app krypteras aviseringarna hela vägen från din server till mobilen. Tjänsten, Apple och Google ser enheten, när en avisering skickas och hur stor den är, men inte meddelandet, avsändaren, kanalen eller ämnet.
- En registrerad server skickar sitt värdnamn, adressen i
ZULIP_ADMINISTRATORoch, för varje organisation, grundläggande uppgifter som namn och inloggningssätt, typ, när den skapades och antalet användare i varje roll. Som standard skickar den också användningsstatistik: hur många meddelanden som skickas och läses, och hur många användare som är aktiva.
För att använda tjänsten lägger du till den här raden i zulip-app.container och startar om som i steg 6. Den andra inställningen stänger av användningsstatistiken:
Environment=SETTING_ZULIP_SERVICE_PUSH_NOTIFICATIONS=True SETTING_ZULIP_SERVICE_SUBMIT_USAGE_STATISTICS=False
Registrera sedan servern:
podman exec -it -u zulip zulip-app /home/zulip/deployments/current/manage.py register_server
Den listar vad den kommer att skicka och ber dig godkänna Zulips användarvillkor. Vi körde den fram till den frågan och svarade nej, så push-aviseringar har inte testats. Under Organization settings > Organization settings håller Require end-to-end encryption for push notifications meddelandetexten borta från aviseringar till äldre appar som inte kan avkryptera.
Utan tjänsten visar apparna nya meddelanden när de öppnas, men mobilen får inga aviseringar.
12. Externa tjänster
Vi avlyssnade serverns DNS-uppslagningar och utgående anslutningar från första starten, genom omstarter, en omstart av servern och vanlig användning. Förutom nedladdningen av avbilderna från docker.io och ghcr.io kontaktade Zulip inget utanför, och en webbläsare som använde den laddade inget från andra webbplatser. Vid varje start försöker konfigurationsverktyget i Zulips avbild nå 169.254.169.254, adressen där molnleverantörer svarar på frågor om en server. Den finns inte på internet, och inget svarade.
Utan raderna från steg 3 hämtar användarnas webbläsare profilbilder och organisationens ikon från Gravatar, som drivs av Automattic i USA, och skickar då en hash av varje e-postadress, och nya användares välkomstvideo från static.zulipchat.com.
En del når ut när det används:
- När någon skriver en länk till en bild hämtar servern bilden för att visa en förhandsvisning. Läsarnas webbläsare får den från din server, inte från den andra webbplatsen. I vårt test hämtade servern en bild från
www.debian.orgnär meddelandet skickades. Show previews of linked images and videos under Organization settings > Organization settings stänger av det. - Show previews of linked websites, på samma ställe, är avstängt från början. Påslaget hämtar servern varje länkad sida.
- Knapparna för video och samtal i skrivrutan skapar ett samtal på
meet.jit.si, Jitsis publika server, som drivs av 8x8 i USA. Call provider på samma ställe stänger av dem, eller pekar dem mot din egen Jitsi Meet med en egen adress. - Push-aviseringar går via
push.zulipchat.com, när du slår på dem (steg 11).
13. Säkerhetskopiera
Som zulip:
umask 077
mkdir -p ~/backup
podman exec zulip-db pg_dump -U zulip zulip > ~/backup/zulip.sql
podman volume export zulip-data > ~/backup/zulip-data.tar
Säkerhetskopian innehåller meddelanden, användare, kanaler och inställningar, uppladdade filer och Zulips egna nycklar, utan vilka uppladdningar och inloggningar inte fungerar på en återställd server. Dumpen körs medan Zulip fortsätter att fungera. umask 077 gör att bara zulip kan läsa de nya filerna. 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 zulip, med säkerhetskopian i ~/backup:
systemctl --user stop zulip-app
podman exec zulip-db dropdb -U zulip --force zulip
podman exec zulip-db createdb -U zulip zulip
podman exec -i zulip-db psql -q -U zulip zulip < ~/backup/zulip.sql > /dev/null
podman volume rm zulip-data
podman volume create zulip-data
podman volume import zulip-data ~/backup/zulip-data.tar
systemctl --user start zulip-app
På en ny server kör du steg 1 till 4 först och återställer sedan. Lösenorden från steg 2 tas inte från säkerhetskopian: Zulip använder de nya hemligheterna när den startar. Vi återställde en säkerhetskopia på det här sättet till en nyuppsatt Zulip, och alla användare kunde logga in med sina gamla lösenord, med sina meddelanden, grupper och filer.
14. Uppdatera
En gång om dagen hämtar podman-auto-update.timer nya avbilder för PostgreSQL 14, RabbitMQ 4.2, Redis och memcached, och startar om podden när någon har ändrats. Då är Zulip borta i ungefär en och en halv minut.
Zulip själv har ingen tagg som följer nya versioner: varje avbild har en egen tagg, till exempel 12.3-0, som listas på Zulips sida med versioner. För att uppdatera tar du en säkerhetskopia, byter tagg i zulip-app.container och startar om:
podman pull ghcr.io/zulip/zulip-server:12.4-0
sed -i 's/zulip-server:12.3-0/zulip-server:12.4-0/' ~/.config/containers/systemd/zulip-app.container
systemctl --user daemon-reload
systemctl --user restart zulip-app
podman image prune -f
Zulip uppdaterar sin databas själv när den startar. Att hämta avbilden först gör att Zulip bara är borta under omstarten. Läs versionsinformationen före en ny huvudversion, som 13.
Zulips PostgreSQL-avbild är PostgreSQL 14, som inte får rättningar från sina utvecklare efter november 2026, och Zulip hade inte gett ut någon nyare när vi skrev det här. Databasen går bara att nå inne i podden. När en nyare avbild kommer flyttar du till den med en säkerhetskopia och en återställning till en tom zulip-db-volym.
Felsökning
Varje sida säger "Internal server error", och podman exec zulip-app tail /var/log/zulip/errors.log säger "Reverse proxy misconfiguration". LOADBALANCER_IPS saknas eller anger fel adress. Det ska vara serverns IPv4-adress, inte 127.0.0.1. Rätta den i zulip-app.container, kör sedan daemon-reload och starta om zulip-app.
Caddy svarar 502 i en minut eller två. Zulip startar fortfarande. podman logs -f zulip-app visar hur långt den har kommit.
"Organization creation link expired or invalid". Länken från steg 5 har använts, även om du inte gjorde klart. Skapa en ny.
Zulip säger att en inbjudan eller en återställning av lösenord har skickats, men inget kommer fram. E-post är inte uppsatt, eller så nekar leverantören. send_test_email från steg 6 visar leverantörens svar, och podman exec zulip-app tail /var/log/zulip/send_email.log listar vad Zulip försökte skicka.
"Rate limit exceeded" när folk registrerar sig med inbjudningslänken. Zulip skickar högst fem bekräftelsemejl om dagen för registreringar från samma IP-adress. Bjud in resten via e-post.