Cách cài đặt Zulip Chat Server bằng Docker trên Rocky Linux 9

theanh

Administrator
Nhân viên
Zulip là một máy chủ trò chuyện mã nguồn mở tương tự như Microsoft Teams, Rocket Chat hoặc Slack. Nó được viết bằng Python và sử dụng Django, PostgreSQL và JavaScript. Nó tích hợp với hơn 90 plugin của bên thứ ba, bao gồm Github, Jira, Stripe, Zendesk, Sentry, v.v. Bạn có thể mở rộng các tích hợp bằng cách kết nối chúng với Zapier và IFTTT. Nó đi kèm với các tính năng như nhắn tin riêng tư, trò chuyện nhóm, hội thoại theo chủ đề, kênh tùy chỉnh, cuộc gọi video, tải tệp kéo và thả, biểu tượng cảm xúc tùy chỉnh, tích hợp Giphy, xem trước hình ảnh và tweet, v.v. Zulip đi kèm với các ứng dụng dành cho máy tính để bàn và thiết bị di động cho mọi nền tảng, khiến nó không phụ thuộc vào nền tảng.

Hướng dẫn này hướng dẫn bạn cách cài đặt và cấu hình Zulip Chat trên máy chủ Rocky Linux 9.

Điều kiện tiên quyết​


  • Máy chủ chạy Rocky Linux 9.

  • Ít nhất 2GB RAM nếu bạn dự kiến có ít hơn 100 người dùng. Đối với 100+ người dùng, hãy mua máy chủ có RAM 4GB và 2 CPU.

  • Người dùng không phải root có quyền sudo.

  • Tên miền được định cấu hình để trỏ đến máy chủ, zulip.example.com.

  • Mọi thứ đều được cập nhật.
Mã:
$ sudo dnf update
[*]
Một số gói hệ thống của bạn cần.
Mã:
$ sudo dnf install wget curl nano unzip yum-utils policycoreutils-python-utils -y
Một số gói này có thể đã được cài đặt trên hệ thống của bạn.

Bước 1 - Cấu hình Tường lửa​

Trước khi cài đặt bất kỳ gói nào, bước đầu tiên là cấu hình tường lửa để mở cổng cho HTTP và HTTPS. Rocky Linux sử dụng Tường lửa Firewalld. Kiểm tra trạng thái của tường lửa.
Mã:
$ sudo firewall-cmd --state
running
Tường lửa hoạt động với nhiều vùng khác nhau và vùng công cộng là vùng mặc định mà chúng ta sẽ sử dụng. Liệt kê tất cả các dịch vụ và cổng đang hoạt động trên tường lửa.
Mã:
$ sudo firewall-cmd --zone=public --list-all
Nó sẽ hiển thị đầu ra sau.
Mã:
public target: default icmp-block-inversion: no interfaces: enp1s0 sources: services: cockpit dhcpv6-client ssh ports: protocols: forward: yes masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:
Mở các cổng HTTP và HTTPS trong tường lửa.
Mã:
$ sudo firewall-cmd --zone=public --add-service=http
$ sudo firewall-cmd --zone=public --add-service=https
Kiểm tra lại trạng thái của tường lửa.
Mã:
$ sudo firewall-cmd --zone=public --list-all
Bạn sẽ thấy một đầu ra.
Mã:
public target: default icmp-block-inversion: no interfaces: enp1s0 sources: services: cockpit dhcpv6-client http https ssh ports: protocols: forward: yes masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:
Thực hiện tất cả các thay đổi vĩnh viễn và tải lại tường lửa để kích hoạt các thay đổi.
Mã:
$ sudo firewall-cmd --runtime-to-permanent
$ sudo firewall-cmd --reload

Bước 2 - Cài đặt Docker và Docker Compose​

Cài đặt kho lưu trữ Docker chính thức.
Mã:
$ sudo dnf install yum-utils
$ sudo dnf config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo
Cài đặt Docker.
Mã:
$ sudo dnf install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Bật và chạy daemon Docker.
Mã:
$ sudo systemctl enable docker --now
Kiểm tra trạng thái của Docker dịch vụ.
Mã:
$ sudo systemctl status docker
? docker.service - Docker Application Container Engine Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; preset: disabled) Active: active (running) since Tue 2024-02-06 07:17:33 UTC; 5s ago
TriggeredBy: ? docker.socket Docs: https://docs.docker.com Main PID: 22302 (dockerd) Tasks: 10 Memory: 31.3M CPU: 198ms CGroup: /system.slice/docker.service ??22302 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
Thêm người dùng hệ thống của bạn vào nhóm Docker để tránh sử dụng sudo để chạy Docker lệnh.
Mã:
$ sudo usermod -aG docker $(whoami)
Đăng nhập lại vào máy chủ của bạn sau khi đăng xuất để kích hoạt thay đổi.

Bước 3 - Cài đặt Nginx​

Đối với môi trường sản xuất, bạn nên chạy máy chủ Synapse bằng proxy Nginx.

Rocky Linux 9 đi kèm với phiên bản Nginx cũ hơn. Bạn cần sử dụng kho lưu trữ Nginx chính thức để cài đặt phiên bản mới nhất.

Tạo và mở tệp /etc/yum.repos.d/nginx.repo để chỉnh sửa.
Mã:
$ sudo nano /etc/yum.repos.d/nginx.repo
Dán mã sau vào đó.
Mã:
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
Sau khi hoàn tất, hãy lưu tệp bằng cách nhấn Ctrl + X và nhập Y khi được nhắc.

Chúng tôi sẽ cài đặt dòng chính Nginx nên hãy kích hoạt gói cho nó.
Mã:
$ sudo dnf config-manager --enable nginx-mainline
Cài đặt Nginx.
Mã:
$ sudo dnf install nginx -y
Xác minh cài đặt.
Mã:
$ nginx -v
nginx version: nginx/1.25.3
Kích hoạt và khởi động dịch vụ máy chủ Nginx.
Mã:
$ sudo systemctl enable nginx --now
Kiểm tra trạng thái của service.
Mã:
$ sudo systemctl status nginx
? nginx.service - nginx - high performance web server Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; preset: disabled) Active: active (running) since Tue 2024-02-06 07:18:56 UTC; 5s ago Docs: http://nginx.org/en/docs/ Process: 22762 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS) Main PID: 22763 (nginx) Tasks: 5 (limit: 50339) Memory: 4.9M CPU: 16ms CGroup: /system.slice/nginx.service ??22763 "nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf" ??22764 "nginx: worker process" ??22765 "nginx: worker process" ??22766 "nginx: worker process" ??22767 "nginx: worker process"

Bước 4 - Cài đặt SSL​

Chúng ta cần cài đặt Certbot để tạo chứng chỉ SSL. Chúng ta sẽ sử dụng trình cài đặt gói Snapd cho việc đó. Vì Rocky Linux không đi kèm với nó, hãy cài đặt trình cài đặt Snapd. Yêu cầu kho lưu trữ EPEL (Gói bổ sung cho Enterprise Linux) để hoạt động.

Cài đặt kho lưu trữ EPEL.
Mã:
$ sudo dnf install epel-release -y
Cài đặt gói Snapd.
Mã:
$ sudo dnf install snapd -y
Bật và khởi động Snap dịch vụ.
Mã:
$ sudo systemctl enable snapd --now
Cài đặt gói lõi Snap và đảm bảo rằng phiên bản Snapd của bạn được cập nhật.
Mã:
$ sudo snap install core && sudo snap refresh core
Tạo các liên kết cần thiết cho Snapd tới làm việc.
Mã:
$ sudo ln -s /var/lib/snapd/snap /snap
$ echo 'export PATH=$PATH:/var/lib/snapd/snap/bin' | sudo tee -a /etc/profile.d/snapd.sh
Cài đặt Certbot.
Mã:
$ sudo snap install --classic certbot
Sử dụng lệnh sau để đảm bảo rằng lệnh Certbot có thể chạy được bằng cách tạo liên kết tượng trưng đến /usr/bin thư mục.
Mã:
$ sudo ln -s /snap/bin/certbot /usr/bin/certbot
Kiểm tra Certbot phiên bản.
Mã:
$ certbot --version
certbot 2.8.0
Chạy lệnh sau để tạo Chứng chỉ SSL.
Mã:
$ sudo certbot certonly --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [emailprotected] -d zulip.example.com
Lệnh trên sẽ tải xuống chứng chỉ vào /etc/letsencrypt/live/zulip.example.com thư mục trên máy chủ của bạn.

Tạo chứng chỉ nhóm Diffie-Hellman.
Mã:
$ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096
Kiểm tra trình lập lịch gia hạn Certbot dịch vụ.
Mã:
$ systemctl list-timers
Bạn sẽ thấy snap.certbot.renew.service là một trong những dịch vụ được lên lịch chạy.
Mã:
NEXT LEFT LAST PASSED UNIT ACTIVATES ----------------------------------------------------------------------------------------------------------------------------------
Tue 2024-02-06 07:30:00 UTC 6min left Tue 2024-02-06 07:20:11 UTC 3min 41s ago sysstat-collect.timer sysstat-collect.service
Tue 2024-02-06 08:22:43 UTC 58min left Tue 2024-02-06 07:22:39 UTC 1min 13s ago dnf-makecache.timer dnf-makecache.service
Tue 2024-02-06 09:36:00 UTC 2h 12min left - - snap.certbot.renew.timer snap.certbot.renew.service
Thực hiện chạy thử quy trình để kiểm tra xem quá trình gia hạn SSL có hoạt động tốt không.
Mã:
$ sudo certbot renew --dry-run
Nếu không thấy lỗi, bạn đã hoàn tất. Chứng chỉ của bạn sẽ tự động gia hạn.

Bước 5 - Cấu hình SELinux​

Áp dụng chính sách để cho phép kết nối đến các máy chủ bên ngoài.
Mã:
$ sudo setsebool -P httpd_can_network_connect 1
Áp dụng chính sách để cho phép Nginx cấp quyền truy cập vào PostgreSQL.
Mã:
$ sudo setsebool -P httpd_can_network_connect_db 1

Bước 6 - Chuẩn bị và cấu hình Zulip để cài đặt​

Đầu tiên, tạo khóa bí mật cho Zulip. Lưu khóa đã tạo vì chúng ta sẽ cần nó sau.
Mã:
$ openssl rand -base64 32
sLIeucGPMCNbR0LwcRhyXafXmputmtse6+EYU04+9JY=
Tạo một thư mục cho tệp Zulip Docker Compose và chuyển đến thư mục đó.
Mã:
$ mkdir ~/docker-zulip
$ cd ~/docker-zulip
Tạo và mở tệp môi trường cho chỉnh sửa.
Mã:
$ nano .env
Dán mã sau vào đó.
Mã:
[emailprotected]
EXTERNAL_HOST=zulip.example.com
ZULIP_AUTH_BACKENDS=EmailAuthBackend
ZULIP_PUSH_NOTIFICATION_BOUNCER_URL=https://push.zulipchat.com
DISABLE_HTTPS=true
SSL_CERTIFICATE_GENERATION=self-signed
EMAIL_HOST=email-smtp.us-west-2.amazonaws.com
EMAIL_HOST_USER=AMAZONSESUSERNAME
EMAIL_PASSWORD=AMAZONSESPASSWORD
EMAIL_PORT=465
EMAIL_USE_SSL=True
EMAIL_USE_TLS=False
[emailprotected]
ZULIP_GIT_URL=https://github.com/zulip/zulip.git
ZULIP_GIT_REF=8.2
SECRET_KEY=sLIeucGPMCNbR0LwcRhyXafXmputmtse6+EYU04+9JY=
POSTGRES_USER=zulip
POSTGRES_DB=zulip
POSTGRES_PASSWORD=REPLACE_WITH_SECURE_POSTGRES_PASSWORD
REDIS_PASSWORD=REPLACE_WITH_SECURE_REDIS_PASSWORD
MEMCACHED_PASSWORD=REPLACE_WITH_SECURE_MEMCACHED_PASSWORD
RABBITMQ_DEFAULT_USER=zulip
RABBITMQ_DEFAULT_PASS=REPLACE_WITH_SECURE_RABBITMQ_PASSWORD
Lưu tệp bằng cách nhấn Ctrl + X và nhập Y khi được nhắc sau khi hoàn tất.

Chúng ta hãy xem xét tất cả các biến mà chúng ta đã xác định.
  • ZULIP_ADMINISTRATOR - là địa chỉ email chính của tài khoản quản trị viên được tạo trong quá trình cài đặt.
  • EXTERNAL_HOST - là tên miền chúng ta sẽ sử dụng để cài đặt Zulip.
  • ZULIP_AUTH_BACKENDS - định nghĩa phương pháp đăng nhập. Chúng tôi đang sử dụng EmailAuthBackend có nghĩa là Zulip sẽ yêu cầu địa chỉ email và mật khẩu. Có những phương pháp xác thực khác sử dụng thông tin đăng nhập của Google, GitHub và Apple để đăng nhập. Bạn có thể tìm thêm thông tin trong tài liệu Zulip và tệp settings.py mặc định.
  • ZULIP_PUSH_NOTIFICATION_BOUNCER_URL - là URL Zulip sẽ sử dụng để gửi thông báo đẩy trên thiết bị di động. Đối với phiên bản cộng đồng của Zulip dành cho tổ chức có 10 người dùng trở xuống, thông báo đẩy là miễn phí. Tổ chức của bạn vẫn có thể đủ điều kiện để nhận thông báo đẩy không giới hạn miễn phí tùy thuộc vào yêu cầu. Kiểm tra tài liệu thanh toán của Zulip để biết chi tiết.
  • DISABLE_HTTPS - Chúng tôi đã đặt thành true để tắt SSL cho Zulip vì chúng tôi sẽ xử lý bên ngoài vùng chứa.
  • SSL_CERTIFICATE_GENERATION - Vì chúng tôi đã tắt SSL cho Zulip, chúng tôi cần đặt để tạo chứng chỉ tự ký.
  • EMAIL_HOST - Máy chủ email SMTP mà chúng tôi cần để bật thông báo qua email. Ở đây chúng tôi sử dụng dịch vụ Email Amazon SES cho hướng dẫn của mình.
  • EMAIL_HOST_USER - Tên người dùng email SMTP.
  • EMAIL_PASSWORD - Mật khẩu email SMTP.
  • EMAIL_PORT - Cổng email SMTP.
  • EMAIL_USE_SSL - Máy chủ SMTP có hỗ trợ xác thực SSL không.
  • EMAIL_USE_TLS - Máy chủ SMTP có hỗ trợ xác thực TLS không.
  • EMAIL_NOREPLY_ADD - Địa chỉ email không trả lời được sử dụng để gửi email thông báo.
  • ZULIP_GIT_URL - Chúng tôi đang sử dụng hình ảnh Zulip docker nhưng nếu bạn muốn xây dựng một hình ảnh tùy chỉnh, bạn cần nhập URL của kho lưu trữ Zulip Git.
  • ZULIP_GIT_REF - Phiên bản Zulip sử dụng từ kho lưu trữ Git để xây dựng hình ảnh docker.
  • KHÓA_BÍ MẬT - Khóa bí mật mạnh mà Zulip cần để xác thực. Nhập khóa mà chúng ta đã tạo trước đó.
  • POSTGRES_USER - Chọn tên người dùng cho người dùng PostgreSQL của bạn.
  • POSTGRES_DB - Chọn tên cơ sở dữ liệu cho cơ sở dữ liệu PostgreSQL của bạn.
  • POSTGRES_PASSWORD - Chọn mật khẩu mạnh cho cơ sở dữ liệu PostgreSQL.
  • REDIS_PASSWORD - Chọn mật khẩu mạnh cho cơ sở dữ liệu Redis.
  • MEMCACHED_PASSWORD - Chọn mật khẩu mạnh cho dịch vụ Memcached.
  • RABBITMQ_DEFAULT_USER - Chọn tên người dùng cho dịch vụ RabbitMQ.
  • RABBITMQ_DEFAULT_PASS - Chọn mật khẩu mạnh cho dịch vụ RabbitMQ.
Tạo và mở tệp Docker compose cho chỉnh sửa.
Mã:
$ nano docker-compose.yml
Thêm mã sau để xác định database dịch vụ.
Mã:
services: database: image: "zulip/zulip-postgresql:14" container_name: zulip-db restart: unless-stopped environment: POSTGRES_DB: ${POSTGRES_DB} POSTGRES_USER: ${POSTGRES_USER} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} volumes: - "postgresql-14:/var/lib/postgresql/data:rw" networks: network: ipv4_address: 10.5.0.2
Dịch vụ database bao gồm các tùy chọn sau:
  • image - Điều này yêu cầu Docker kéo hình ảnh zulip-postgresql:14. Mặc dù phiên bản mới nhất của Zulip hỗ trợ PostgreSQL 16, nhưng hình ảnh docker tương ứng chỉ hỗ trợ PostgreSQL 14.
  • container_name - chỉ định tên cho container.
  • restart - điều này xác định chính sách khởi động lại container. Chúng tôi đã đặt container tự động khởi động lại trừ khi nó được dừng thủ công.
  • environment - Bạn cần đặt biến môi trường cho container. Chúng tôi đã thiết lập ba biến xác định cơ sở dữ liệu PostgreSQL, tên người dùng và mật khẩu.
  • volumes - Tại đây, chúng tôi tạo một volume có tên là postgresql-14 trỏ đến thư mục dữ liệu PostgreSQL trong vùng chứa.
  • networks - chúng tôi sử dụng điều này để cung cấp cho vùng chứa một địa chỉ IP tĩnh có thể được sử dụng để truy cập nó từ các vùng chứa khác.
Tiếp theo, bên dưới database phần dịch vụ, thêm định nghĩa cho memcached dịch vụ.
Mã:
memcached: image: "memcached:alpine" restart: unless-stopped container_name: zulip-memcached command: - "sh" - "-euc" - | echo 'mech_list: plain' > "$$SASL_CONF_PATH" echo "zulip@$$HOSTNAME:$$MEMCACHED_PASSWORD" > "$$MEMCACHED_SASL_PWDB" echo "zulip@localhost:$$MEMCACHED_PASSWORD" >> "$$MEMCACHED_SASL_PWDB" exec memcached -S environment: SASL_CONF_PATH: "/home/memcache/memcached.conf" MEMCACHED_SASL_PWDB: "/home/memcache/memcached-sasl-db" MEMCACHED_PASSWORD: ${MEMCACHED_PASSWORD} networks: network: ipv4_address: 10.5.0.3
Dịch vụ memcached chứa các định nghĩa sau đây dành riêng cho dịch vụ:
  • hình ảnh - Ở đây chúng ta sẽ sử dụng memcached:alpine ảnh cho container. Ảnh alpine giữ kích thước ảnh nhỏ vì nó chỉ đi kèm với những thành phần thiết yếu.
  • lệnh - Ở đây chúng ta sẽ chạy một số lệnh được chạy sau khi tạo container để cấu hình Memcached và thiết lập thông tin xác thực Zulip. Các lệnh này cũng ghi đè lên các lệnh mặc định được hình ảnh khai báo.
  • môi trường - Tại đây, chúng tôi đặt vị trí của tệp cấu hình Memcached, tệp cơ sở dữ liệu mật khẩu và mật khẩu.
  • mạng - Tại đây, chúng tôi đặt một địa chỉ IP riêng duy nhất cho vùng chứa docker.
Tiếp theo, thêm định nghĩa cho dịch vụ rabbitmq bên dưới memcached phần.
Mã:
rabbitmq: image: "rabbitmq:alpine" restart: unless-stopped container_name: zulip-rabbitmq environment: RABBITMQ_DEFAULT_USER: ${RABBITMQ_DEFAULT_USER} RABBITMQ_DEFAULT_PASS: ${RABBITMQ_DEFAULT_PASS} volumes: - "rabbitmq:/var/lib/rabbitmq:rw" networks: network: ipv4_address: 10.5.0.4
rabbitmq dịch vụ chứa các định nghĩa sau đây dành riêng cho nó:
  • image - Tương tự như trước, chúng ta sẽ sử dụng hình ảnh alpine cho vùng chứa RabbitMQ.
  • environment - Chúng ta sử dụng phần environment để đặt tên người dùng và mật khẩu mặc định của RabbitMQ.
  • volumes - Tại đây, chúng ta tạo một ổ đĩa có tên là rabbitmq trỏ đến thư mục RabbitMQ trong vùng chứa.
  • mạng - Giống như trước, chúng tôi đặt một địa chỉ IP duy nhất cho vùng chứa.
Tiếp theo, thêm định nghĩa cho dịch vụ redis bên dưới rabbitmq phần.
Mã:
redis: image: "redis:alpine" restart: unless-stopped container_name: zulip-redis command: - "sh" - "-euc" - | echo "requirepass '$$REDIS_PASSWORD'" > /etc/redis.conf exec redis-server /etc/redis.conf environment: REDIS_PASSWORD: ${REDIS_PASSWORD} volumes: - "redis:/data:rw" networks: network: ipv4_address: 10.5.0.5
redis dịch vụ chứa các định nghĩa sau đây dành riêng cho nó:
  • image - Ở đây chúng ta sẽ sử dụng hình ảnh alpine cho vùng chứa Redis.
  • command - Chúng ta sẽ sử dụng các lệnh để cấu hình mật khẩu Redis và khởi động máy chủ bằng mật khẩu đó.
  • volumes - Ở đây chúng ta tạo một ổ đĩa được đặt tên là redis trỏ đến thư mục dữ liệu trong vùng chứa.
  • mạng - Giống như trước, chúng tôi đặt một địa chỉ IP duy nhất cho vùng chứa Redis.
Cuối cùng, thêm định nghĩa cho dịch vụ zulip bên dưới Phần redis.
Mã:
zulip: image: "zulip/docker-zulip:8.2-0" restart: unless-stopped container_name: zulip ports: - "8080:80" environment: DB_HOST: "database" DB_HOST_PORT: "5432" DB_USER: ${POSTGRES_USER} DISABLE_HTTPS: ${DISABLE_HTTPS} SSL_CERTIFICATE_GENERATION: ${SSL_CERTIFICATE_GENERATION} LOADBALANCER_IPS: 10.5.0.0/16 SETTING_MEMCACHED_LOCATION: "memcached:11211" SETTING_RABBITMQ_HOST: "rabbitmq" SETTING_REDIS_HOST: "redis" SECRETS_email_password: ${EMAIL_PASSWORD} SECRETS_rabbitmq_password: ${RABBITMQ_DEFAULT_PASS} SECRETS_postgres_password: ${POSTGRES_PASSWORD} SECRETS_memcached_password: ${MEMCACHED_PASSWORD} SECRETS_redis_password: ${REDIS_PASSWORD} SECRETS_secret_key: ${SECRET_KEY} SETTING_EXTERNAL_HOST: ${EXTERNAL_HOST} SETTING_ZULIP_ADMINISTRATOR: ${ZULIP_ADMINISTRATOR} SETTING_EMAIL_HOST: ${EMAIL_HOST} SETTING_EMAIL_HOST_USER: ${EMAIL_HOST_USER} SETTING_EMAIL_PORT: ${EMAIL_PORT} SETTING_EMAIL_USE_SSL: ${EMAIL_USE_SSL} SETTING_EMAIL_USE_TLS: ${EMAIL_USE_TLS} ZULIP_AUTH_BACKENDS: ${ZULIP_AUTH_BACKENDS} SETTING_NOREPLY_EMAIL_ADDRESS: ${EMAIL_NOREPLY_ADD} # Uncomment this when configuring the mobile push notifications service # SETTING_PUSH_NOTIFICATION_BOUNCER_URL: ${ZULIP_PUSH_NOTIFICATION_BOUNCER_URL} volumes: - "zulip:/data:rw" ulimits: nofile: soft: 1000000 hard: 1048576 networks: network: ipv4_address: 10.5.0.6
Dịch vụ zulip chứa các định nghĩa sau đây dành riêng cho dịch vụ này:
  • cổng - Container Zulip chạy nginx như một phần của quy trình. Ở đây chúng tôi đã ánh xạ cổng 80 của container tới cổng 8080 trên máy chủ lưu trữ. Chúng ta sẽ sử dụng nó sau để cấu hình Nginx như một trình quản lý proxy bên ngoài container.
  • môi trường - Ở đây chúng ta cấu hình các biến môi trường để cấu hình Zulip. Hầu hết các biến môi trường được chọn từ tệp .env mà chúng ta đã giải thích trước đó. Máy chủ cơ sở dữ liệu được đặt thành dịch vụ container database và cổng là cổng PostgreSQL mặc định 5432. Biến LOADBALANCER_IPS được đặt thành mạng con docker network. Điều này là bắt buộc để Zulip hoạt động từ phía sau máy chủ proxy ngược. MEMCACHED_LOCATION được đặt thành dịch vụ memcached với cổng mặc định là 11211. Tương tự như vậy, chúng tôi đã đặt máy chủ RabbitMQ và Redis trỏ đến các dịch vụ chứa tương ứng của chúng.
  • volumes - Ở đây, chúng tôi đặt một volume được đặt tên và đặt nó thành /data thư mục ở chế độ đọc-ghi.
  • ulimits -Tại đây, chúng tôi đặt giới hạn mềm và giới hạn cứng cho việc sử dụng tài nguyên của người dùng cho vùng chứa.
  • mạng -Giống như trước, chúng tôi đặt một địa chỉ IP duy nhất cho vùng chứa Zulip.
Và cuối cùng, dán nội dung sau code.
Mã:
volumes: zulip: postgresql-14: rabbitmq: redis:
networks: network: driver: bridge ipam: config: - subnet: 10.5.0.0/16 gateway: 10.5.0.1
Tại đây, chúng tôi định nghĩa các ổ đĩa được đặt tên mà chúng tôi đã tạo trước đó cho các container của mình. Tiếp theo, chúng tôi định nghĩa mạng cầu nối để kết nối tất cả các container và cung cấp địa chỉ IP của mạng con và cổng.

Sau khi hoàn tất, hãy lưu tệp bằng cách nhấn Ctrl + X và nhập Y khi được nhắc sau khi hoàn tất.

Tệp Docker compose đã hoàn thành sẽ trông như sau.
Mã:
services: database: image: "zulip/zulip-postgresql:14" restart: unless-stopped environment: POSTGRES_DB: ${POSTGRES_DB} POSTGRES_USER: ${POSTGRES_USER} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} volumes: - "postgresql-14:/var/lib/postgresql/data:rw" networks: network: ipv4_address: 10.5.0.2 memcached: image: "memcached:alpine" restart: unless-stopped command: - "sh" - "-euc" - | echo 'mech_list: plain' > "$$SASL_CONF_PATH" echo "zulip@$$HOSTNAME:$$MEMCACHED_PASSWORD" > "$$MEMCACHED_SASL_PWDB" echo "zulip@localhost:$$MEMCACHED_PASSWORD" >> "$$MEMCACHED_SASL_PWDB" exec memcached -S environment: SASL_CONF_PATH: "/home/memcache/memcached.conf" MEMCACHED_SASL_PWDB: "/home/memcache/memcached-sasl-db" MEMCACHED_PASSWORD: ${MEMCACHED_PASSWORD} networks: network: ipv4_address: 10.5.0.3 rabbitmq: image: "rabbitmq:alpine" restart: unless-stopped environment: RABBITMQ_DEFAULT_USER: ${RABBITMQ_DEFAULT_USER} RABBITMQ_DEFAULT_PASS: ${RABBITMQ_DEFAULT_PASS} volumes: - "rabbitmq:/var/lib/rabbitmq:rw" networks: network: ipv4_address: 10.5.0.4 redis: image: "redis:alpine" restart: unless-stopped command: - "sh" - "-euc" - | echo "requirepass '$$REDIS_PASSWORD'" > /etc/redis.conf exec redis-server /etc/redis.conf environment: REDIS_PASSWORD: ${REDIS_PASSWORD} volumes: - "redis:/data:rw" networks: network: ipv4_address: 10.5.0.5 zulip: image: "zulip/docker-zulip:8.1-0" restart: unless-stopped #build: # context: . # args: # ZULIP_GIT_URL: ${ZULIP_GIT_URL} # ZULIP_GIT_REF: ${ZULIP_GIT_REF} # Set this up if you plan to use your own CA certificate bundle for building # CUSTOM_CA_CERTIFICATES: ${ZULIP_CUSTOM_CA_CERTIFICATES} ports: - "8080:80" environment: DB_HOST: 10.5.0.2 DB_HOST_PORT: "5432" DB_USER: ${POSTGRES_USER} DISABLE_HTTPS: ${DISABLE_HTTPS} LOADBALANCER_IPS: 10.5.0.6 SSL_CERTIFICATE_GENERATION: ${SSL_CERTIFICATE_GENERATION} SETTING_MEMCACHED_LOCATION: "memcached:11211" SETTING_RABBITMQ_HOST: "rabbitmq" SETTING_REDIS_HOST: "redis" SECRETS_email_password: ${EMAIL_PASSWORD} SECRETS_rabbitmq_password: ${RABBITMQ_DEFAULT_PASS} SECRETS_postgres_password: ${POSTGRES_PASSWORD} SECRETS_memcached_password: ${MEMCACHED_PASSWORD} SECRETS_redis_password: ${REDIS_PASSWORD} SECRETS_secret_key: ${SECRET_KEY} SETTING_EXTERNAL_HOST: ${EXTERNAL_HOST} SETTING_ZULIP_ADMINISTRATOR: ${ZULIP_ADMINISTRATOR} SETTING_EMAIL_HOST: ${EMAIL_HOST} SETTING_EMAIL_HOST_USER: ${EMAIL_HOST_USER} SETTING_EMAIL_PORT: ${EMAIL_PORT} SETTING_EMAIL_USE_SSL: ${EMAIL_USE_SSL} SETTING_EMAIL_USE_TLS: ${EMAIL_USE_TLS} ZULIP_AUTH_BACKENDS: ${ZULIP_AUTH_BACKENDS} SETTING_NOREPLY_EMAIL_ADDRESS: ${EMAIL_NOREPLY_ADD} # Uncomment this when configuring the mobile push notifications service # SETTING_PUSH_NOTIFICATION_BOUNCER_URL: ${ZULIP_PUSH_NOTIFICATION_BOUNCER_URL} volumes: - "zulip:/data:rw" ulimits: nofile: soft: 1000000 hard: 1048576 networks: network: ipv4_address: 10.5.0.6
volumes: zulip: postgresql-14: rabbitmq: redis:
networks: network: driver: bridge ipam: config: - subnet: 10.5.0.0/16 gateway: 10.5.0.1

Bước 7 - Cài đặt Zulip​

Khởi động vùng chứa Zulip bằng lệnh sau.
Mã:
$ docker compose up -d
Kiểm tra trạng thái của vùng chứa bằng lệnh sau lệnh.
Mã:
$ docker ps
Bạn sẽ thấy đầu ra tương tự.
Mã:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fea5d02f53d7 rabbitmq:alpine "docker-entrypoint.s…" 2 minutes ago Up 2 minutes 4369/tcp, 5671-5672/tcp, 15691-15692/tcp, 25672/tcp zulip-rabbitmq
01cb77f16c1a zulip/zulip-postgresql:14 "docker-entrypoint.s…" 2 minutes ago Up 2 minutes 5432/tcp zulip-db
f5b6523a3a8c zulip/docker-zulip:8.2-0 "/sbin/entrypoint.sh…" 2 minutes ago Up 2 minutes 443/tcp, 0.0.0.0:8080->80/tcp, :::8080->80/tcp zulip
c0a358209b09 redis:alpine "docker-entrypoint.s…" 2 minutes ago Up 2 minutes 6379/tcp zulip-redis
27be352a0a35 memcached:alpine "docker-entrypoint.s…" 2 minutes ago Up 2 minutes 11211/tcp zulip-memcached
Bạn cũng có thể sử dụng lệnh sau cho tương tự.
Mã:
$ docker compose ps
Trong trường hợp này, đầu ra của bạn sẽ trông như sau.
Mã:
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
zulip zulip/docker-zulip:8.2-0 "/sbin/entrypoint.sh…" zulip About a minute ago Up About a minute 443/tcp, 0.0.0.0:8080->80/tcp, :::8080->80/tcp
zulip-db zulip/zulip-postgresql:14 "docker-entrypoint.s…" database About a minute ago Up About a minute 5432/tcp
zulip-memcached memcached:alpine "docker-entrypoint.s…" memcached About a minute ago Up About a minute 11211/tcp
zulip-rabbitmq rabbitmq:alpine "docker-entrypoint.s…" rabbitmq About a minute ago Up About a minute 4369/tcp, 5671-5672/tcp, 15691-15692/tcp, 25672/tcp
zulip-redis redis:alpine "docker-entrypoint.s…" redis About a minute ago Up About a minute 6379/tcp
Bộ chứa Zulip sẽ mất một thời gian để bắt đầu hoạt động. Bạn có thể theo dõi tiến trình bằng lệnh sau.
Mã:
$ docker logs zulip --follow
Bạn sẽ thấy một danh sách dài các lệnh được chạy để thiết lập bộ chứa. Khi bạn thấy kết quả đầu ra sau, điều đó có nghĩa là Zulip đã được cài đặt.
Mã:
2024-02-21 09:02:55,310 INFO success: go-camo entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
2024-02-21 09:02:55,311 INFO success: smokescreen entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
2024-02-21 09:02:55,311 INFO success: zulip-django entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
2024-02-21 09:02:55,311 INFO success: zulip-tornado entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
2024-02-21 09:02:55,311 INFO success: zulip_deliver_scheduled_emails entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
2024-02-21 09:02:55,311 INFO success: zulip_deliver_scheduled_messages entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
2024-02-21 09:02:55,311 INFO success: process-fts-updates entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
2024-02-21 09:02:55,311 INFO success: cron entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
2024-02-21 09:02:55,311 INFO success: nginx entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
2024-02-21 09:02:55,311 INFO success: zulip_events_deferred_work entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
2024-02-21 09:02:55,311 INFO success: zulip_events_digest_emails entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
2024-02-21 09:02:55,311 INFO success: zulip_events_email_mirror entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
2024-02-21 09:02:55,312 INFO success: zulip_events_embed_links entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
2024-02-21 09:02:55,312 INFO success: zulip_events_embedded_bots entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
2024-02-21 09:02:55,312 INFO success: zulip_events_invites entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
2024-02-21 09:02:55,312 INFO success: zulip_events_email_senders entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
2024-02-21 09:02:55,312 INFO success: zulip_events_missedmessage_emails entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
2024-02-21 09:02:55,312 INFO success: zulip_events_missedmessage_mobile_notifications entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
2024-02-21 09:02:55,312 INFO success: zulip_events_outgoing_webhooks entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
2024-02-21 09:02:55,312 INFO success: zulip_events_user_activity entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
2024-02-21 09:02:55,312 INFO success: zulip_events_user_activity_interval entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
2024-02-21 09:02:55,312 INFO success: zulip_events_user_presence entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
Nhấn Ctrl + C để thoát khỏi màn hình. Zulip đã được cài đặt. Tuy nhiên, chúng ta vẫn cần cấu hình Nginx để phục vụ Zulip.

Bước 8 - Cấu hình Nginx​

Mở tệp /etc/nginx/nginx.conf để chỉnh sửa.
Mã:
$ sudo nano /etc/nginx/nginx.conf
Thêm dòng sau vào trước dòng include /etc/nginx/conf.d/*.conf;.
Mã:
server_names_hash_bucket_size 64;
Lưu tệp bằng cách nhấn Ctrl + X và nhập Y khi được nhắc.

Tạo và mở tệp /etc/nginx/conf.d/zulip.conf để chỉnh sửa.
Mã:
$ sudo nano /etc/nginx/conf.d/zulip.conf
Dán mã sau vào đó.
Mã:
server { listen 80; listen [::]:80; location / { return 301 https://$host$request_uri; }
}
server { listen 443 ssl; listen [::]:443 ssl; http2 on; server_name zulip.example.com; ssl_certificate /etc/letsencrypt/live/zulip.example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/zulip.example.com/privkey.pem; ssl_trusted_certificate /etc/letsencrypt/live/zulip.example.com/chain.pem; ssl_session_timeout 1d; ssl_session_cache shared:MozSSL:10m; ssl_session_tickets off; ssl_prefer_server_ciphers on; ssl_stapling on; ssl_stapling_verify on; ssl_dhparam /etc/ssl/certs/dhparam.pem; resolver 1.1.1.1 1.0.0.1 [2606:4700:4700::1111] [2606:4700:4700::1001] 8.8.8.8 8.8.4.4 [2001:4860:4860::8888] [2001:4860:4860::8844] valid=60s; resolver_timeout 2s; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384; tcp_nopush on; gzip on; location / { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Host $host; proxy_http_version 1.1; proxy_buffering off; proxy_read_timeout 20m; proxy_pass http://127.0.0.1:8080; }
}
Lưu tệp bằng cách nhấn Ctrl + X và nhập Y khi được nhắc sau khi hoàn tất.

Xác minh cú pháp tệp cấu hình Nginx.
Mã:
$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Khởi động lại Nginx dịch vụ.
Mã:
$ sudo systemctl restart nginx

Bước 9 - Truy cập Giao diện Zulip​

Truy cập https://zulip.example.com/ trong trình duyệt của bạn và màn hình sau sẽ xuất hiện.


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22492%22%3E%3C/svg%3E


Sử dụng liên kết Tổ chức mới ở trên cùng sẽ đưa bạn đến trang sau.


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22623%22%3E%3C/svg%3E


Như bạn thấy, Zulip không cho phép bạn tạo tổ chức từ giao diện người dùng. Quay lại terminal và chạy lệnh sau để tạo URL trang tổ chức mới. Chúng ta sẽ nói thêm về cách sử dụng lệnh Zulip trong phần tiếp theo.
Mã:
$ docker compose exec -u zulip zulip /home/zulip/deployments/current/manage.py generate_realm_creation_link
Please visit the following secure single-use link to register your
new Zulip organization: https://zulip.example.com/new/svvss33z4qmwewmanbbcalen
Mở URL https://zulip.example.com/new/cjjivovgcillw44z7gsnobkv trong trình duyệt của bạn và bạn sẽ được đưa đến trang sau.


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22690%22%20height=%22750%22%3E%3C/svg%3E


Nhập tên tổ chức, loại tổ chức, ngôn ngữ và ID email của bạn để bắt đầu tạo tổ chức. Nhấp vào nút Tạo tổ chức để tiếp tục.

Bạn sẽ được yêu cầu thiết lập tài khoản trên màn hình tiếp theo.


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22599%22%20height=%22750%22%3E%3C/svg%3E


Nhập tên của bạn, chọn mật khẩu để đăng nhập và nhấp vào nút Đăng ký để tiếp tục.

Sau khi hoàn tất, bảng điều khiển Zulip sẽ mở ra và bạn có thể bắt đầu sử dụng.


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22461%22%3E%3C/svg%3E

Bước 10 - Lệnh Zulip Server​

Thỉnh thoảng, để chạy lệnh Zulip Server, bạn sẽ cần truy cập vào shell container. Để truy cập shell với tư cách là người dùng zulip, hãy sử dụng lệnh sau.
Mã:
$ docker compose exec -u zulip zulip bash
Hoặc bạn có thể sử dụng lệnh sau lệnh.
Mã:
$ docker exec -itu zulip zulip bash
Để chạy lệnh bên trong vùng chứa, bạn có thể chạy lệnh đó bằng một lệnh duy nhất như sau.
Mã:
$ docker compose exec -u zulip zulip \ /home/zulip/deployments/current/manage.py help
Tuy nhiên, có một phương pháp đơn giản hơn để thực hiện. Chúng ta có thể tạo một tập lệnh shell để chạy lệnh. Tạo và mở zulip_manage.sh để chỉnh sửa.
Mã:
$ nano zulip_manage.sh
Dán mã sau vào nó.
Mã:
#!/bin/sh
docker compose exec -u zulip zulip /home/zulip/deployments/current/manage.py "$@"
Lưu tệp bằng cách nhấn Ctrl + X và nhập Y khi được nhắc.

Làm cho tập lệnh có thể thực thi.
Mã:
$ chmod +x zulip_manage.sh
Để dừng máy chủ Zulip, hãy sử dụng lệnh sau.
Mã:
$ docker exec -u zulip zulip /home/zulip/deployments/current/scripts/stop-server
process-fts-updates: stopped
zulip-django: stopped
zulip-tornado: stopped
zulip-workers:zulip_events_deferred_work: stopped
zulip-workers:zulip_events_digest_emails: stopped
zulip-workers:zulip_events_email_mirror: stopped
zulip-workers:zulip_events_email_senders: stopped
zulip-workers:zulip_events_embed_links: stopped
zulip-workers:zulip_events_embedded_bots: stopped
zulip-workers:zulip_events_invites: stopped
zulip-workers:zulip_events_missedmessage_emails: stopped
zulip-workers:zulip_events_missedmessage_mobile_notifications: stopped
zulip-workers:zulip_events_outgoing_webhooks: stopped
zulip-workers:zulip_events_user_activity: stopped
zulip-workers:zulip_events_user_activity_interval: stopped
zulip-workers:zulip_events_user_presence: stopped
zulip_deliver_scheduled_emails: stopped
zulip_deliver_scheduled_messages: stopped
Zulip stopped successfully!
Để khởi động lại máy chủ, hãy sử dụng lệnh sau lệnh.
Mã:
$ docker exec -u zulip zulip /home/zulip/deployments/current/scripts/start-server
2024-02-21 09:18:52,932 start-server: Running syntax and database checks
System check identified no issues (28 silenced).
2024-02-21 09:18:54,944 start-server: Starting Tornado process
zulip-tornado: started
2024-02-21 09:18:56,089 start-server: Starting django server
zulip-django: started
2024-02-21 09:18:58,133 start-server: Starting workers
process-fts-updates: started
zulip-workers:zulip_events_deferred_work: started
zulip-workers:zulip_events_digest_emails: started
zulip-workers:zulip_events_email_mirror: started
zulip-workers:zulip_events_email_senders: started
zulip-workers:zulip_events_embed_links: started
zulip-workers:zulip_events_embedded_bots: started
zulip-workers:zulip_events_invites: started
zulip-workers:zulip_events_missedmessage_emails: started
zulip-workers:zulip_events_missedmessage_mobile_notifications: started
zulip-workers:zulip_events_outgoing_webhooks: started
zulip-workers:zulip_events_user_activity: started
zulip-workers:zulip_events_user_activity_interval: started
zulip-workers:zulip_events_user_presence: started
zulip_deliver_scheduled_emails: started
zulip_deliver_scheduled_messages: started
2024-02-21 09:19:19,571 start-server: Done!
Zulip started successfully!
Khởi động lại máy chủ theo cách tương tự.
Mã:
$ docker exec -u zulip zulip /home/zulip/deployments/current/scripts/restart-server
Có rất nhiều tác vụ quản lý mà bạn có thể thực hiện bằng cách sử dụng manage.py tập lệnh đi kèm với Zulip.

Bạn có thể chạy tập lệnh bằng lệnh sau. Chúng ta sẽ sử dụng lệnh phụ help để liệt kê tất cả các thao tác có thể thực hiện.
Mã:
$ ./zulip_manage.sh help
Type 'manage.py help ' for help on a specific subcommand.
Available subcommands:
[analytics] check_analytics_state clear_analytics_tables clear_single_stat populate_analytics_db update_analytics_counts
[django] dbshell makemigrations migrate shell showmigrations
[zerver] add_users_to_streams archive_messages audit_fts_indexes backup bulk_change_user_name change_password change_realm_subdomain change_user_email change_user_role check_redis checkconfig compilemessages convert_gitter_data convert_mattermost_data convert_rocketchat_data convert_slack_data create_default_stream_groups create_realm create_realm_internal_bots create_stream create_user deactivate_realm deactivate_user delete_old_unclaimed_attachments delete_realm delete_user deliver_scheduled_emails deliver_scheduled_messages edit_linkifiers email_mirror enqueue_digest_emails enqueue_file export export_search export_single_user export_usermessage_batch fetch_tor_exit_nodes fill_memcached_caches generate_realm_creation_link get_migration_status import list_realms logout_all_users makemessages merge_streams process_queue promote_new_full_members purge_queue query_ldap rate_limit reactivate_realm realm_domain register_server remove_users_from_stream reset_authentication_attempt_count restore_messages runtornado scrub_realm send_custom_email send_password_reset_email send_realm_reactivation_email send_test_email send_to_email_mirror send_webhook_fixture_message send_welcome_bot_message show_admins soft_deactivate_users sync_ldap_user_data transfer_uploads_to_s3 unarchive_stream
Tệp entrypoint.sh của Docker cũng cung cấp một số tùy chọn khác. Chạy lệnh sau để xem chúng.
Mã:
$ docker exec -it zulip bash /sbin/entrypoint.sh app:help
Bạn sẽ thấy đầu ra sau.
Mã:
Available commands:
> app:help - Show this help menu and exit
> app:version - Container Zulip server version
> app:managepy - Run Zulip's manage.py script (defaults to "shell")
> app:backup - Create backups of Zulip instances
> app:restore - Restore backups of Zulip instances
> app:certs - Create self-signed certificates
> app:run - Run the Zulip server
> [COMMAND] - Run given command with arguments in shell

Bước 11 - Kiểm tra Email gửi đi​

Để kiểm tra cấu hình email gửi đi của bạn, bạn có thể gửi một email thử nghiệm bằng lệnh sau.
Mã:
$ ~/docker-zulip/zulip_manage.sh send_test_email [emailprotected]
If you run into any trouble, read: https://zulip.readthedocs.io/en/latest/production/email.html#troubleshooting
The most common error is not setting `ADD_TOKENS_TO_NOREPLY_ADDRESS=False` when
using an email provider that doesn't support that feature.
Sending 2 test emails from: * [emailprotected] * [emailprotected]
Successfully sent 2 emails to [emailprotected]

Bước 12 - Nâng cấp Zulip​

Bước đầu tiên trong quá trình nâng cấp Zulip sẽ dừng các container hiện có.
Mã:
$ cd ~/docker-zulip
$ docker compose stop
Mở tệp docker-compose.yml để chỉnh sửa.
Mã:
$ nano docker-compose.yml
Kiểm tra phiên bản mới nhất có sẵn từtrang Thẻ DockerHub của Zulip. Sửa đổi phiên bản trong phần sau.
Mã:
.....
zulip: image: "zulip/docker-zulip:8.2-0" restart: unless-stopped container_name: zulip
....
Thực hiện bất kỳ thay đổi nào khác mà bạn cần. Bạn sẽ cần tham khảo nhật ký thay đổi của Zulipkho lưu trữ GitHub Docker của Zulip để biết thêm thông tin.

Sau khi hoàn tất, hãy lưu tệp bằng cách nhấn Ctrl + X và nhập Y khi được nhắc.

Khởi động lại các vùng chứa. Container Zulip sẽ được tạo lại với những thay đổi.
Mã:
$ docker compose up -d
Xóa mọi container cũ.
Mã:
$ docker compose rm

Kết luận​

Đây là phần kết thúc hướng dẫn của chúng tôi về cách cài đặt và cấu hình máy chủ Zulip Chat trên máy chủ Rocky Linux 9. Bạn có thể theo dõi tài liệu chính thức của Zulip để khám phá chi tiết. Nếu bạn có bất kỳ câu hỏi nào, hãy đăng chúng trong phần bình luận bên dưới.
 
Back
Bên trên