ウェブサイト検索

Rocky Linux 9でDockerを使用してZulipチャットサーバーをインストールする方法


Rocky Linux 9でDockerを使用してZulipチャットサーバーをインストールする方法

このページで

  1. 前提条件
  2. ステップ1 - ファイアウォールを設定する
  3. ステップ2 - DockerとDocker Composeをインストールする
  4. ステップ3 - Nginxをインストールする
  5. ステップ4 - SSLをインストールする
  6. ステップ5 - SELinuxの設定
  7. ステップ6 - インストールのためにZulipを準備し、構成する
  8. ステップ7 - Zulipをインストールする
  9. ステップ8 - Nginxを設定する
  10. ステップ9 - Zulipインターフェースへのアクセス
  11. ステップ10 - Zulipサーバーコマンド
  12. ステップ11 - 送信メールのテスト
  13. ステップ12 - Zulipのアップグレード
  14. 結論

Zulipは、Microsoft Teams、Rocket Chat、またはSlackに似たオープンソースのチャットサーバーです。Pythonで書かれており、Django、PostgreSQL、およびJavaScriptを使用しています。Github、Jira、Stripe、Zendesk、Sentryなど、90以上のサードパーティプラグインとの統合が可能です。ZapierやIFTTTを使って統合を拡張できます。プライベートメッセージ、グループチャット、スレッド化された会話、カスタムチャンネル、ビデオ通話、ドラッグアンドドロップファイルアップロード、カスタム絵文字、Giphy統合、画像やツイートのプレビューなどの機能が備わっています。Zulipはすべてのプラットフォーム用のデスクトップおよびモバイルアプリが用意されており、プラットフォームに依存しません。

このチュートリアルでは、Rocky Linux 9 サーバーに Zulip Chat をインストールして設定する方法を教えます。

前提条件

    Rocky Linux 9を実行しているサーバー。

    100人未満のユーザーを想定する場合は、少なくとも2GBのRAMが必要です。100人以上のユーザーの場合は、4GBのRAMと2つのCPUを持つサーバーを用意してください。

    sudo権限を持つ非ルートユーザー。

    サーバーにポイントするように構成されたドメイン名、zulip.example.com。

    すべてが更新されています。

    sudo dnf update
    

    あなたのシステムに必要ないくつかのパッケージ。

    sudo dnf install wget curl nano unzip yum-utils policycoreutils-python-utils -y
    

    これらのパッケージの一部は、すでにあなたのシステムにインストールされている可能性があります。

ステップ1 - ファイアウォールを設定する

パッケージをインストールする前に、最初のステップはファイアウォールを設定してHTTPおよびHTTPS用のポートを開くことです。Rocky LinuxはFirewalldファイアウォールを使用します。ファイアウォールの状態を確認してください。

sudo firewall-cmd --state
running

ファイアウォールは異なるゾーンで動作し、パブリックゾーンは私たちが使用するデフォルトのゾーンです。ファイアウォールでアクティブなすべてのサービスとポートをリストアップしてください。

sudo firewall-cmd --zone=public --list-all

次の出力を表示する必要があります。

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:

ファイアウォールでHTTPおよびHTTPSポートを開いてください。

sudo firewall-cmd --zone=public --add-service=http
sudo firewall-cmd --zone=public --add-service=https

ファイアウォールの状態を再確認してください。

sudo firewall-cmd --zone=public --list-all

あなたは似たような出力を見るべきです。

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:

すべての変更を永久的に行い、変更を有効にするためにファイアウォールを再読み込みしてください。

sudo firewall-cmd --runtime-to-permanent
sudo firewall-cmd --reload

ステップ2 - DockerとDocker Composeをインストールする

公式のDockerリポジトリをインストールします。

sudo dnf install yum-utils
sudo dnf config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

Dockerをインストールしてください。

sudo dnf install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

Dockerデーモンを有効にして実行します。

sudo systemctl enable docker --now

Dockerサービスのステータスを確認してください。

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

Dockerコマンドを実行する際にsudoを使用しないように、システムユーザーをDockerグループに追加してください。

sudo usermod -aG docker $(whoami)

変更を有効にするために、ログアウトした後にサーバーに再度ログインしてください。

ステップ3 - Nginxをインストールする

運用環境では、Nginxプロキシを使用してSynapseサーバーを実行することが推奨されます。

Rocky Linux 9は古いバージョンのNginxを搭載しています。最新バージョンをインストールするには、公式のNginxリポジトリを使用する必要があります。

/etc/yum.repos.d/nginx.repo ファイルを作成して編集のために開いてください。

sudo nano /etc/yum.repos.d/nginx.repo

そのコードをそこに貼り付けてください。

[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

完了したら、Ctrl + Xを押してファイルを保存し、求められたときにYを入力してください。

Nginxのメインラインをインストールするので、それに対応するパッケージを有効にしてください。

sudo dnf config-manager --enable nginx-mainline

Nginxをインストールします。

sudo dnf install nginx -y

インストールを確認してください。

nginx -v
nginx version: nginx/1.25.3

Nginxサーバーサービスを有効にして開始します。

sudo systemctl enable nginx --now

サービスの状態を確認してください。

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"

ステップ4 - SSLをインストールする

SSL証明書を生成するためにCertbotをインストールする必要があります。それにはSnapdパッケージインストーラーを使用します。Rocky Linuxにはこれが含まれていないため、Snapdインストーラーをインストールしてください。これにはEPEL(Enterprise Linux用の追加パッケージ)リポジトリが必要です。

EPELリポジトリをインストールします。

sudo dnf install epel-release -y

Snapdパッケージをインストールします。

sudo dnf install snapd -y

スナップサービスを有効にして開始します。

sudo systemctl enable snapd --now

Snapコアパッケージをインストールし、Snapdのバージョンが最新であることを確認してください。

sudo snap install core && sudo snap refresh core

Snapdが動作するために必要なリンクを作成してください。

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

Certbotをインストールします。

sudo snap install --classic certbot

次のコマンドを使用して、Certbot コマンドが /usr/bin ディレクトリへのシンボリックリンクを作成することで実行できることを確認してください。

sudo ln -s /snap/bin/certbot /usr/bin/certbot

Certbotのバージョンを確認してください。

certbot --version
certbot 2.8.0

次のコマンドを実行してSSL証明書を生成します。

sudo certbot certonly --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email  -d zulip.example.com

上記のコマンドは、サーバーの/etc/letsencrypt/live/zulip.example.comディレクトリに証明書をダウンロードします。

ディフィー・ヘルマン群証明書を生成します。

sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096

Certbotの更新スケジューラーサービスを確認してください。

systemctl list-timers

snap.certbot.renew.serviceが実行されるようにスケジュールされたサービスの1つとして見つかります。

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

プロセスのドライランを実行して、SSL更新が正常に動作しているか確認してください。

sudo certbot renew --dry-run

エラーが見当たらなければ、すべて準備完了です。あなたの証明書は自動的に更新されます。

ステップ5 - SELinuxの設定

外部ホストへの接続を許可するポリシーを適用してください。

sudo setsebool -P httpd_can_network_connect 1

NginxがPostgreSQLへのアクセスを許可するようにポリシーを適用してください。

sudo setsebool -P httpd_can_network_connect_db 1

ステップ6 - インストールのためにZulipを準備し、構成する

まず、Zulipのための秘密鍵を作成します。生成された鍵を保存してください。後で必要になります。

openssl rand -base64 32
sLIeucGPMCNbR0LwcRhyXafXmputmtse6+EYU04+9JY=

Zulip Docker Composeファイルのためのディレクトリを作成し、それに切り替えてください。

mkdir ~/docker-zulip
cd ~/docker-zulip

環境ファイルを作成して編集のために開いてください。

nano .env

そのコードをそこに貼り付けてください。

[email 
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
[email 

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

作業が完了したら、Ctrl + Xを押してファイルを保存し、求められたときにYを入力してください。

定義したすべての変数を見ていきましょう。

  • ZULIP_ADMINISTRATOR - は、インストール中に作成された管理者アカウントの主なメールアドレスです。
  • EXTERNAL_HOST - は、私たちのZulipインストールに使用するドメイン名です。
  • ZULIP_AUTH_BACKENDS - ログイン方法を定義します。私たちは EmailAuthBackend を使用しているため、Zulip はメールアドレスとパスワードを求めます。他にも、Google、GitHub、および Apple の認証情報を使用してログインする認証方法があります。詳細については、Zulip のドキュメントおよびデフォルトの settings.py ファイルを参照してください。
  • ZULIP_PUSH_NOTIFICATION_BOUNCER_URL - はZulipがモバイルプッシュ通知を送信するために使用するURLです。10人以下のユーザーを持つ組織向けのZulipコミュニティ版では、プッシュ通知は無料です。要件によっては、あなたの組織が無制限のプッシュ通知を無料で受け取る資格があるかもしれません。詳細についてはZulipの請求に関するドキュメントを確認してください。
  • HTTPS無効 - ZulipのSSLを無効にするために、これをtrueに設定しました。コンテナの外で処理します。
  • SSL_CERTIFICATE_GENERATION - 私たちはZulipのSSLを無効にしたため、自己署名証明書を生成するように設定する必要があります。
  • EMAIL_HOST - メール通知を有効にするために必要なSMTPメールホストです。ここでは、チュートリアルのためにAmazon SESメールサービスを使用しています。
  • EMAIL_HOST_USER - SMTPメールユーザー名です。
  • EMAIL_PASSWORD - SMTPメールパスワード。
  • EMAIL_PORT - SMTPメールポート。
  • EMAIL_USE_SSL - SMTPホストがSSL認証をサポートしているかどうか。
  • EMAIL_USE_TLS - SMTPホストがTLS認証をサポートしているかどうか。
  • EMAIL_NOREPLY_ADD - 通知メールを送信するために使用されるノーリプライメールアドレスです。
  • ZULIP_GIT_URL - 我々はZulipのDockerイメージを使用していますが、カスタムイメージをビルドしたい場合は、Zulip GitリポジトリのURLを入力する必要があります。
  • ZULIP_GIT_REF - DockerイメージをビルドするためにGitリポジトリから使用するZulipのバージョン。
  • SECRET_KEY - Zulipが認証に必要な強力な秘密鍵です。以前に作成した鍵を入力してください。
  • POSTGRES_USER - PostgreSQLユーザーのユーザー名を選択してください。
  • POSTGRES_DB - PostgreSQLデータベースのデータベース名を選択してください。
  • POSTGRES_PASSWORD - PostgreSQLデータベース用に強力なパスワードを選択してください。
  • REDIS_PASSWORD - Redisデータベースのために強力なパスワードを選んでください。
  • MEMCACHED_PASSWORD - Memcachedサービスのために強力なパスワードを選択してください。
  • RABBITMQ_DEFAULT_USER - RabbitMQサービスのユーザー名を選択してください。
  • RABBITMQ_DEFAULT_PASS - RabbitMQサービスのために強力なパスワードを選択してください。

Docker Composeファイルを作成して編集のために開いてください。

nano docker-compose.yml

databaseサービスを定義するために、次のコードを追加します。

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

データベースサービスには以下のオプションが含まれています:

  • イメージ - これはDockerにzulip-postgresql:14のイメージを取得するよう指示します。最新のZulipのバージョンはPostgreSQL 16をサポートしていますが、対応するDockerイメージはPostgreSQL 14のみをサポートしています。
  • コンテナ名 - コンテナの名前を指定します。
  • 再起動 - これはコンテナの再起動ポリシーを定義します。手動で停止されない限り、コンテナは自動的に再起動するように設定されています。
  • 環境 - コンテナ用の環境変数を設定する必要があります。PostgreSQLデータベース、ユーザー名、およびパスワードを定義するために3つの変数を設定しました。
  • ボリューム - ここでは、コンテナ内のPostgreSQLデータディレクトリを指すpostgresql-14という名前のボリュームを作成します。
  • ネットワーク - これを使用して、他のコンテナからアクセスするために使用できる静的IPアドレスをコンテナに与えます。

次に、databaseサービスセクションの下に、memcachedサービスの定義を追加します。

  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

このmemcachedサービスには、特有の以下の定義が含まれています:

  • イメージ - ここでは、コンテナに memcached:alpine イメージを使用します。アルパインイメージは、必要最低限のものだけが含まれているため、イメージのサイズが小さく保たれます。
  • コマンド - ここでは、コンテナ作成後に実行されるいくつかのコマンドを実行して、Memcachedを設定し、Zulipの資格情報を設定します。これらのコマンドは、イメージによって宣言されたデフォルトのコマンドを上書きします。
  • 環境 - ここでは、Memcachedの設定ファイル、パスワードデータベースファイル、およびパスワードの場所を設定します。
  • ネットワーク - ここでは、DockerコンテナのためにユニークなプライベートIPアドレスを設定します。

次に、memcachedセクションの下にrabbitmqサービスの定義を追加してください。

  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サービスには、特有の以下の定義が含まれています。

  • 画像 - 前回と同様に、RabbitMQコンテナにはアルパインイメージを使用します。
  • 環境 - 環境セクションを使用して、RabbitMQのデフォルトのユーザー名とパスワードを設定します。
  • ボリューム - ここでは、コンテナ内のRabbitMQディレクトリを指すrabbitmqという名前のボリュームを作成します。
  • ネットワーク - 前と同じように、コンテナのためにユニークなIPアドレスを設定します。

次に、rabbitmqセクションの下にredisサービスの定義を追加します。

  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サービスには、次のような特有の定義が含まれています。

  • 画像 - ここではRedisコンテナのためにアルパインイメージを使用します。
  • コマンド - Redisのパスワードを設定し、それを使用してサーバーを起動するためにコマンドを使用します。
  • ボリューム - ここでは、コンテナ内のデータディレクトリを指す redis という名前のボリュームを作成します。
  • ネットワーク - 前と同じように、RedisコンテナのユニークなIPアドレスを設定します。

最後に、redis セクションの下に zulip サービスの定義を追加してください。

  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

zulip サービスには、以下の特有の定義が含まれています:

  • ポート - Zulipコンテナはプロセスの一部としてnginxを実行しています。ここでは、コンテナのポート80をホストサーバーのポート8080にマッピングしました。後で、コンテナの外でNginxをプロキシマネージャーとして設定するために使用します。
  • 環境 - ここでは、Zulipを設定するための環境変数を構成します。ほとんどの環境変数は、先に説明した.envファイルから取得されます。データベースホストはdatabaseコンテナサービスに設定され、ポートはデフォルトのPostgreSQLポート5432に設定されます。LOADBALANCER_IPS変数はDockerネットワークサブネットに設定されています。これは、リバースプロキシサーバーの背後でZulipを動作させるために必要です。MEMCACHED_LOCATIONは、デフォルトポート11211のmemcachedサービスに設定されています。同様に、RabbitMQとRedisホストもそれぞれのコンテナサービスを指すように設定されています。
  • ボリューム - ここでは、名前付きボリュームを設定し、それを/dataディレクトリに読み書きモードで設定します。
  • ulimits - ここでは、コンテナのユーザーのリソース使用に対するソフトリミットとハードリミットを設定します。
  • ネットワーク - 前と同様に、ZulipコンテナにユニークなIPアドレスを設定します。

そして最後に、次のコードを貼り付けます。

volumes:
  zulip:
  postgresql-14:
  rabbitmq:
  redis:
networks:
  network:
    driver: bridge
    ipam:
      config:
        - subnet: 10.5.0.0/16
          gateway: 10.5.0.1

ここでは、以前に作成したコンテナ用の名前付きボリュームを定義します。次に、すべてのコンテナを接続し、サブネットとゲートウェイIPアドレスを提供するブリッジネットワークを定義します。

完了したら、Ctrl + Xを押してファイルを保存し、完了したらプロンプトが表示された時にYを入力してください。

完成したDocker Composeファイルは以下のようになります。

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

ステップ7 - Zulipをインストールする

次のコマンドを使用してZulipコンテナを開始します。

docker compose up -d

以下のコマンドを使用してコンテナのステータスを確認してください。

docker ps

あなたは似たような出力を見るべきです。

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

同じことのために次のコマンドも使用できます。

docker compose ps

この場合、あなたの出力は次のようになります。

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

Zulipコンテナが動作を開始するまでに時間がかかります。以下のコマンドを使用して進捗を確認できます。

docker logs zulip --follow

コンテナをセットアップするために実行される長いコマンドのリストが表示されます。次の出力が表示されると、Zulipがインストールされたことを意味します。

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)

Ctrl + Cを押して画面を終了します。Zulipはインストールされています。ただし、Zulipを提供するためにNginxを設定する必要があります。

ステップ8 - Nginxを設定する

ファイル /etc/nginx/nginx.conf を編集のために開いてください。

sudo nano /etc/nginx/nginx.conf

include /etc/nginx/conf.d/*.conf;の前に次の行を追加してください。

server_names_hash_bucket_size 64;

Ctrl + X を押してファイルを保存し、プロンプトが表示されたら Y を入力します。

/etc/nginx/conf.d/zulip.conf ファイルを作成して編集のために開きます。

sudo nano /etc/nginx/conf.d/zulip.conf

そのコードをそこに貼り付けてください。

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;
    }
}

作業が完了したら、Ctrl + Xを押してファイルを保存し、求められたときにYを入力してください。

Nginxの設定ファイルの構文を確認してください。

sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Nginxサービスを再起動してください。

sudo systemctl restart nginx

ステップ9 - Zulipインターフェースへのアクセス

https://zulip.example.com/ をブラウザに訪問すると、以下の画面が表示されます。

新しい組織のリンクを使用すると、次のページに移動します。

ご覧のように、Zulipはフロントエンドから組織を作成することを許可していません。ターミナルに戻り、次のコマンドを実行して新しい組織ページのURLを作成してください。次のセクションでZulipコマンドの使い方について詳しく説明します。

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

ブラウザでURL https://zulip.example.com/new/cjjivovgcillw44z7gsnobkv を開くと、次のページに移動します。

あなたの組織名、組織タイプ、言語、メールIDを入力して、組織の作成を開始してください。組織を作成 ボタンをクリックして続行します。

次の画面でアカウントの設定を求められます。

名前を入力し、ログイン用のパスワードを選択して、サインアップボタンをクリックして続行してください。

完了すると、Zulipダッシュボードが開き、使用を開始できます。

ステップ10 - Zulipサーバーコマンド

時々、Zulipサーバーのコマンドを実行するために、コンテナシェルへのアクセスが必要になります。zulipユーザーとしてシェルにアクセスするには、以下のコマンドを使用してください。

docker compose exec -u zulip zulip bash

または、次のコマンドを使用できます。

docker exec -itu zulip zulip bash

コンテナ内でコマンドを実行するには、次のように単一のコマンドを使用して実行できます。

docker compose exec -u zulip zulip \
    /home/zulip/deployments/current/manage.py help <subcommand>

しかし、より簡単な方法があります。それはコマンドを実行するためのシェルスクリプトを作成することです。zulip_manage.shを作成して編集のために開きます。

nano zulip_manage.sh

そのコードをそこに貼り付けてください。

#!/bin/sh

docker compose exec -u zulip zulip /home/zulip/deployments/current/manage.py "$@"

Ctrl + X を押してファイルを保存し、促されたらYと入力します。

スクリプトを実行可能にしてください。

chmod +x zulip_manage.sh

Zulipサーバーを停止するには、以下のコマンドを使用してください。

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!

サーバーを再起動するには、以下のコマンドを使用してください。

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!

サーバーを同様の方法で再起動してください。

docker exec -u zulip zulip /home/zulip/deployments/current/scripts/restart-server

Zulipに付属するmanage.pyスクリプトを使用して達成できる管理タスクがたくさんあります。

次のコマンドを使ってスクリプトを実行できます。可能なすべての操作をリストするために、helpサブコマンドを使用します。

./zulip_manage.sh help
Type 'manage.py help <subcommand>' 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

Dockerのentrypoint.shファイルには、他にもいくつかのオプションが提供されています。以下のコマンドを実行して、それらを確認してください。

docker exec -it zulip bash /sbin/entrypoint.sh app:help

次の出力が表示されるはずです。

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

ステップ11 - 送信メールのテスト

あなたの送信メール設定をテストするために、次のコマンドを使用してテストメールを送信できます。

~/docker-zulip/zulip_manage.sh send_test_email [email 
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:
  * [email 
  * [email 

Successfully sent 2 emails to [email 

ステップ12 - Zulipのアップグレード

Zulipをアップグレードする最初のステップは、既存のコンテナを停止することです。

cd ~/docker-zulip
docker compose stop

docker-compose.ymlファイルを編集するために開いてください。

nano docker-compose.yml

ZulipのDockerHubタグページから最新のバージョンを確認してください。次のセクションのバージョンを修正します。

.....
zulip:
    image: "zulip/docker-zulip:8.2-0"
    restart: unless-stopped
    container_name: zulip
....

必要な他の変更を行ってください。それにはZulipの変更履歴とZulipのDocker GitHubリポジトリを参照する必要があります。

完了したら、Ctrl + X を押してファイルを保存し、プロンプトが表示されたらYを入力します。

コンテナを再起動してください。Zulipコンテナは変更を加えて再作成されます。

docker compose up -d

古い容器を取り除いてください。

docker compose rm

結論

これでRocky Linux 9サーバーにZulip Chatサーバーをインストールして設定するためのチュートリアルは終了です。詳細についてはZulipの公式ドキュメントを参照してください。質問がある場合は、下のコメントに投稿してください。

関連記事: