Entkoppelte Discourse-Anwendung – Verwaltetes Redis, verwaltetes Postgres und Digital Ocean Volume mit Discourse

Ich versuche, Discourse mit Redis auf einer Digital Ocean Managed Redis-Datenbank zu verbinden. Ich konnte PostgreSQL mit der Digital Ocean Managed PostgreSQL-Datenbank problemlos zum Laufen bringen, aber Redis wirft einen Fehler aus. Was können Sie daraus schließen?

    templates:
      - templates/web.template.yml
      - templates/web.ssl.template.yml
    # Verwenden Sie den Schlüssel 'links', um Container miteinander zu verknüpfen, also den 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 "Beginn der benutzerdefinierten Befehle"
      - exec: echo "Ende der benutzerdefinierten Befehle"

Siehe hier, ich habe hinzugefügt:

  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: ~

Aber ich erhalte diesen Fehler:

  I, [2021-02-13T04:05:48.508236 #1]  INFO -- : > cd /var/www/discourse && su discourse -c 'bundle exec rake db:migrate'
  Fehlerbericht fehlgeschlagen: Verbindung verloren (ECONNRESET) 2 Verbindung verloren (ECONNRESET) Abonnement fehlgeschlagen, erneuter Verbindungsversuch in 1 Sekunde. 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!

Ich habe vor einiger Zeit dafür gesorgt, dass wir mit allen verwalteten Diensten von Digital Ocean kompatibel sind. Der Redis-Dienst von Digital Ocean verlangt zwingend SSL, was wir damals noch nicht unterstützten.

Um ihren Redis-Dienst zum Laufen zu bringen, verwenden Sie:

  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 „Gefällt mir“

Danke @Falco ~~ funktioniert!!!

Mein nächster Schritt ist es, /var/discourse auf ein Digital Ocean Volume zu verschieben, das von den Discourse-Anwendungsservern gemeinsam genutzt werden kann. Würdest du einfach das Volume mounten und die Verzeichnisse symbolisch verlinken?

Meine Zielarchitektur ist ein Load Balancer, der auf mehrere Discourse-Server zugreift, mit DO Redis und PostGres sowie einem gemeinsamen DO Volume, das von den mehreren Discourse-Servern geteilt wird, anstatt eigene Volumes zu haben.

Was hältst du davon?

Warum?

Legen Sie alle statischen Assets und Benutzer-Uploads auf Digital Ocean Spaces ab, wie in Verwendung von Object Storage für Uploads (S3 & Klone) beschrieben. Dann müssen Ihre Anwendungsserver nichts gemeinsam nutzen.

Ein wichtiger Punkt: Bei mehreren App-Droplets, verwaltetem Redis, PostgreSQL und Object Storage nähert sich der Preis unserem Managed Hosting an :wink:

4 „Gefällt mir“

Danke, mein Forum verwendet keine Frontend-Templates. Ich habe eine in NodeJS entwickelte API und das Frontend ist VueJS. Ich nutze Discourse also nur zum Teilen und Speichern von Daten. Ich erlaube keine Bild-Uploads in meinem Forum.

Das ist also mein Anwendungsfall: Alle Discourse-Anwendungsserver können ein gemeinsames Dateivolumen hinter dem Load Balancer nutzen. Jeder Teil ist nun entkoppelt, außer dem /var/discourse-Volumen. Macht das Sinn?

Hey @Falco, ich habe es ziemlich einfach herausgefunden:

Erstelle zunächst das Volume in DO und stelle sicher, dass du deinen Droplet in den DO-Schritten damit verknüpfst. Verbinde dich dann per SSH mit deiner Discourse-Maschine:

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

Aktualisiere den Abschnitt „volumes":

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

Anschließend:

cd /home/discourse
sudo ./launcher rebuild app

Dein Discourse wird nun aus dem Volume bereitgestellt. Es können Snapshots erstellt und es kann hinter einem Load Balancer bereitgestellt werden, da alle Komponenten nun entkoppelt sind.

Viele Grüße!

2 „Gefällt mir“