Application Discourse découplée - Redis géré, Postgres géré et volume Digital Ocean avec Discourse

Je tente de connecter Discourse à Redis sur la base de données Redis managée de Digital Ocean. J’ai réussi à faire fonctionner PostgreSQL correctement avec la base de données PostgreSQL managée de Digital Ocean, mais Redis me renvoie une erreur. Que pouvez-vous en déduire ?

    templates:
      - templates/web.template.yml
      - templates/web.ssl.template.yml
    # Utilisez la clé 'links' pour relier les conteneurs entre eux, c'est-à-dire utiliser le drapeau 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 "Début des commandes personnalisées"
      - exec: echo "Fin des commandes personnalisées"

Comme vous pouvez le voir, j’ai ajouté :

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

Mais je reçois cette erreur :

  I, [2021-02-13T04:05:48.508236 #1]  INFO -- : > cd /var/www/discourse && su discourse -c 'bundle exec rake db:migrate'
  Échec de la déclaration d'erreur : Connexion perdue (ECONNRESET) 2 Connexion perdue (ECONNRESET) échec de l'abonnement, reconnexion dans 1 seconde. Stack d'appels /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!

J’ai travaillé il y a quelque temps pour garantir notre compatibilité avec tous les services gérés de Digital Ocean. Leur service Redis impose SSL, ce que nous ne prenions pas en charge à l’époque.

Pour faire fonctionner leur Redis, utilisez :

  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 « J'aime »

Merci @Falco ~~ ça marche !!!

Ma prochaine étape consiste à déplacer /var/discourse vers un volume Digital Ocean que les serveurs d’application Discourse peuvent partager. Vous vous contenteriez de monter le volume et de créer des liens symboliques vers les répertoires ?

Mon architecture cible est : Équilibreur de charge → plusieurs serveurs Discourse avec DO Redis et PostGres, et un seul volume DO partagé par les multiples serveurs Discourse, plutôt que d’avoir leurs propres volumes.

Qu’en pensez-vous ?

Pourquoi ?

Placez tous les assets statiques et les téléchargements des utilisateurs sur Digital Ocean Spaces en suivant Utiliser le stockage objet pour les téléchargements (S3 et clones), et vos serveurs d’applications n’auront plus besoin de partager quoi que ce soit.

Une chose à garder à l’esprit : avec plusieurs droplets d’application, Redis managé, PostgreSQL et le stockage objet, le prix se rapproche assez de notre hébergement géré ;wink:}

4 « J'aime »

Merci, mon forum n’utilise pas les modèles frontend. J’ai une API développée en NodeJS et le frontend est en VueJS. J’utilise donc Discourse uniquement pour partager et stocker des données. Je ne autorise pas le téléchargement d’images sur mon forum.

Voici donc mon cas d’utilisation : tous les serveurs d’application Discourse peuvent partager un seul volume de fichiers derrière le équilibreur de charge. Chaque composant est désormais découplé, à l’exception du volume /var/discourse. Cela a du sens ?

Salut @Falco, j’ai trouvé assez facilement :

D’abord, créez le volume dans DO et assurez-vous de lier votre droplet à celui-ci dans les étapes de DO, puis
connectez-vous en SSH à votre machine 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

Mettez à jour la section volumes :

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

Ensuite,

cd /home/discourse
sudo ./launcher rebuild app

Maintenant, votre Discourse est servi depuis un volume, il peut prendre des instantanés et être déployé derrière un équilibreur de charge puisque toutes les parties sont maintenant découplées.

Salutations !

2 « J'aime »