Discourseアプリケーションの分離 - Managed Redis、Managed Postgres、およびDigital Ocean VolumeとDiscourse

Discourse を DigitalOcean のマネージド Redis データベースに接続しようとしています。Postgres は DigitalOcean のマネージド Postgres データベースで正常に動作していますが、Redis でエラーが発生します。このエラーの原因は何だと考えられますか?

    templates:
      - templates/web.template.yml
      - templates/web.ssl.template.yml
    # Use 'links' key to link containers together, aka use Docker --link flag.
    expose:
      - '80:80'
      - '443:443'
    params:
      db_default_text_search_config: pg_catalog.english
      db_shared_buffers: 512MB
    env:
      LANG: en_US.UTF-8
      UNICORN_WORKERS: 8
    
      # https://github.com/discourse/discourse/blob/master/config/discourse_defaults.conf
      DISCOURSE_HOSTNAME: blah.example.com
      DISCOURSE_DEVELOPER_EMAILS: email@example.com
      DISCOURSE_SMTP_ADDRESS: smtp.mailgun.org
      DISCOURSE_SMTP_PORT: 587
      DISCOURSE_SMTP_USER_NAME: blah@mail.com
      DISCOURSE_SMTP_PASSWORD: 9cd16e-aff2d1b9-36c86fff
      DISCOURSE_DB_NAME: defaultdb
      DISCOURSE_DB_USERNAME: doadmin
      DISCOURSE_DB_PASSWORD: gp5m224
      DISCOURSE_DB_HOST: private-digitalocean-stage-discuss-postgres-do-user-.ondigitalocean.com
      DISCOURSE_DB_PORT: 25060
      DISCOURSE_REDIS_USERNAME: default
      DISCOURSE_REDIS_PASSWORD: dex3mf
      DISCOURSE_REDIS_HOST: private-digitalocean-stage-discuss-redis-do-user-966537-0.b.db.ondigitalocean.com
      DISCOURSE_REDIS_PORT: 25061
      DISCOURSE_REDIS_CLIENT_ID: ~
    volumes:
      - volume:
          host: /var/discourse/shared/standalone
          guest: /shared
      - volume:
          host: /var/discourse/shared/standalone/log/var-log
          guest: /var/log
    hooks:
      after_code:
        - exec:
            cd: $home/plugins
            cmd:
              - 'git clone https://github.com/discourse/docker_manager.git'
    run:
      - exec: echo "Beginning of custom commands"
      - exec: echo "End of custom commands"

ここに追加しました:

  DISCOURSE_REDIS_USERNAME: default
  DISCOURSE_REDIS_PASSWORD: dex3mf
  DISCOURSE_REDIS_HOST: private-digitalocean-stage-discuss-redis-do-user-.db.ondigitalocean.com
  DISCOURSE_REDIS_PORT: 25061
  DISCOURSE_REDIS_CLIENT_ID: ~

しかし、以下のエラーが発生します:

  I, [2021-02-13T04:05:48.508236 #1]  INFO -- : > cd /var/www/discourse && su discourse -c 'bundle exec rake db:migrate'
  Failed to report error: Connection lost (ECONNRESET) 2 Connection lost (ECONNRESET) subscribe failed, reconnecting in 1 second. Call stack /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.5/lib/redis/client.rb:275:in `rescue in io'
    /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.5/lib/redis/client.rb:267:in `io'
    /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.5/lib/redis/client.rb:279:in `read'
    /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.5/lib/redis/client.rb:131:in `block in call'
    /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.5/lib/redis/client.rb:248:in `block (2 levels) in process'
    /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.5/lib/redis/client.rb:389:in `ensure_connected'
    /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.5/lib/redis/client.rb:238:in `block in process'
    /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.5/lib/redis/client.rb:325:in `logging'
    /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.5/lib/redis/client.rb:237:in `process'
    /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.5/lib/redis/client.rb:131:in `call'
    /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.5/lib/redis/client.rb:113:in `block in connect'
    /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.5/lib/redis/client.rb:313:in `with_reconnect'
    /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.5/lib/redis/client.rb:111:in `connect'
    /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.5/lib/redis/client.rb:294:in `with_socket_timeout'
    /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.5/lib/redis/client.rb:144:in `call_loop'
    /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.5/lib/redis/subscribe.rb:44:in `subscription'
    /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.5/lib/redis/subscribe.rb:14:in `subscribe'
    /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.5/lib/redis.rb:3507:in `_subscription'
    /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.5/lib/redis.rb:2326:in `block in subscribe'
    /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.5/lib/redis.rb:69:in `block in synchronize'
    /usr/local/lib/ruby/2.7.0/monitor.rb:202:in `synchronize'
    /usr/local/lib/ruby/2.7.0/monitor.rb:202:in `mon_synchronize'
    /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.5/lib/redis.rb:69:in `synchronize'
    /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.5/lib/redis.rb:2325:in `subscribe'
    /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/message_bus-3.3.4/lib/message_bus/backends/redis.rb:287:in `global_subscribe'
    /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/message_bus-3.3.4/lib/message_bus.rb:766:in `global_subscribe_thread'
    /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/message_bus-3.3.4/lib/message_bus.rb:714:in `block in new_subscriber_thread'
    rake aborted!

以前、Digital Ocean のすべてのマネージドサービスとの互換性を確保するよう努めました。彼らの Redis は SSL が必須ですが、当時はそれをサポートしていませんでした。

彼らの Redis を動作させるには、以下を使用してください。

  DISCOURSE_REDIS_HOST: falcoland-redis-do-user-435229-0.a.db.ondigitalocean.com
  DISCOURSE_REDIS_PASSWORD: vp39d0dpy8dxn68n
  DISCOURSE_REDIS_PORT: 25061
  DISCOURSE_REDIS_USE_SSL: true
「いいね!」 4

@Falco さん、ありがとうございます!~~ 動作しました!!!

次のステップは、/var/discourse を Discourse アプリケーションサーバー間で共有できる Digital Ocean ボリュームに移行することです。ボリュームをマウントし、ディレクトリをシンボリックリンクするだけでよろしいでしょうか?

私の目標アーキテクチャは、ロードバランサーから複数の Discourse サーバー、DO 製の Redis と PostGres、そして各サーバーが独自ボリュームを持つ代わりに複数の Discourse サーバーが共有する 1 つの共有 DO ボリュームという構成です。

どう思いますか?

なぜですか?

すべての静的アセットとユーザーのアップロードファイルを アップロード用オブジェクトストレージの利用 (S3 およびクローン) に従って Digital Ocean Spaces に配置してください。そうすれば、アプリケーションサーバー間で何かを共有する必要がなくなります。

一つ注意点として、複数のアプリドロプレット、マネージド Redis、PostgreSQL、およびオブジェクトストレージを使用すると、価格が マネージドホスティング とほぼ同等になってしまいます :wink:

「いいね!」 4

ありがとうございます。私のフォーラムはフロントエンドテンプレートを使用していません。NodeJSでAPIを構築し、フロントエンドにはVueJSを使用しています。そのため、Discourseはデータの共有と保存にのみ利用しています。また、私のフォーラムでは画像のアップロードを許可していません。

したがって、私のユースケースは以下の通りです。すべてのDiscourseアプリケーションサーバーが、ロードバランサーの背後にある単一のファイルボリュームを共有します。各コンポーネントは、/var/discourseボリュームを除いて、現在はすべて疎結合になっています。ご理解いただけますか?

@Falco さん、簡単に解決方法が分かりました:

まず、DO でボリュームを作成し、DO の手順でドロプレットをそのボリュームにリンクします。その後、Discourse マシンに SSH で接続します。

mv /var/discourse /var/discourse.bak
mkdir /home/discourse
mount /dev/sda /home/discourse
mv /var/discourse.bak/* /home/discourse
nano /home/discourse/containers/app.yml

volumes セクションを更新します:

volumes:
  - volume:
      host: /home/discourse/shared/standalone
      guest: /shared
  - volume:
      host: /home/discourse/shared/standalone/log/var-log
      guest: /var/log

その後、

cd /home/discourse
sudo ./launcher rebuild app

これで Discourse はボリュームから提供されるようになり、スナップショットの取得やロードバランサーの背後でのデプロイが可能になります。すべてのコンポーネントが分離されたためです。

では、よろしくお願いいたします!

「いいね!」 2