Applicazione Discourse Disaccoppiata - Redis Gestito, Postgres Gestito e Volume Digital Ocean con Discourse

Sto cercando di connettere Discourse a Redis su Digital Ocean Managed Redis Database. Sono riuscito a far funzionare correttamente PostgreSQL con Digital Ocean Managed Postgres Database, ma Redis mi restituisce un errore. Cosa ne pensi?

    templates:
      - templates/web.template.yml
      - templates/web.ssl.template.yml
    # Usa la chiave 'links' per collegare i container, ovvero usa il flag Docker --link.
    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 "Inizio dei comandi personalizzati"
      - exec: echo "Fine dei comandi personalizzati"

Vedi qui, ho aggiunto:

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

Ma ottengo questo errore:

  I, [2021-02-13T04:05:48.508236 #1]  INFO -- : > cd /var/www/discourse && su discourse -c 'bundle exec rake db:migrate'
  Impossibile segnalare l'errore: Connessione persa (ECONNRESET) 2 Connessione persa (ECONNRESET) sottoscrizione fallita, riconnessione tra 1 secondo. Stack di chiamate /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!

Un tempo ho lavorato per garantire la compatibilità con tutti i servizi gestiti di Digital Ocean. Il loro Redis impone l’uso obbligatorio di SSL, cosa che all’epoca non supportavamo.

Per far funzionare il loro Redis, utilizza:

  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 Mi Piace

Grazie @Falco ~~ funziona!!!

Il mio prossimo passo è spostare /var/discourse su un volume di Digital Ocean che i server dell’applicazione Discourse possano condividere. Dovresti semplicemente montare il volume e creare collegamenti simbolici per le directory?

La mia architettura target è Bilanciatore di Carico → più server Discourse con DO Redis e PostGres, e un unico volume DO condiviso da più server Discourse invece di avere volumi propri.

Cosa ne pensi?

Perché?

Posiziona tutte le risorse statiche e i caricamenti degli utenti su Digital Ocean Spaces seguendo Utilizzo dello storage oggetti per i caricamenti (S3 e cloni) e i tuoi server applicativi non avranno bisogno di condividere nulla.

Una cosa da tenere a mente è che con più droplet applicativi, Redis gestito, PostgreSQL e storage oggetti, il prezzo si avvicina molto al nostro hosting gestito :wink:

4 Mi Piace

Grazie, il mio forum non utilizza i template del frontend. Ho un’API costruita in NodeJS e il frontend è in VueJS. Quindi sto usando Discourse solo per condividere e memorizzare i dati. Non consento il caricamento di immagini nel mio forum.

Quindi questo è il mio caso d’uso: tutti i server dell’applicazione Discourse possono condividere un unico volume di file dietro il bilanciatore di carico. Ogni componente è ora disaccoppiato, tranne il volume /var/discourse. Ha senso?

Ehi @Falco, l’ho capito abbastanza facilmente:

Per prima cosa, crea il volume su DO e assicurati di collegare il tuo droplet ad esso seguendo le istruzioni di DO, poi
connettiti via SSH alla tua macchina Discourse

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

Aggiorna la sezione volumes:

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

poi,

cd /home/discourse
sudo ./launcher rebuild app

Ora il tuo Discourse è servito dal volume, può creare snapshot e essere distribuito dietro un load balancer, dato che tutte le parti sono ora disaccoppiate.

ciao!

2 Mi Piace