Quelqu'un a-t-il de l'expérience avec l'exécution de deux conteneurs Docker distincts au lieu de la méthode second-site ?

Je n’arrive pas à refaire fonctionner la méthode secondsite, alors je cherche maintenant à exécuter mes deux sites dans des conteneurs séparés sur le même serveur.

Si quelqu’un a de l’expérience avec cela, envoyez-moi un message.

C’est tout à fait réalisable sur une machine de taille correcte. Vous aurez besoin au minimum d’un reverse proxy pour gérer le SSL. Et peut-être utiliser le modèle socketed au lieu d’exposer des ports.

2 « J'aime »

un réseau Docker serait-il approprié ?

Si vous savez ce que vous faites, alors oui. Il ne devrait y avoir aucun problème.

2 « J'aime »

Je l’ai fait avec Traefik et Nginx Proxy Manager. Il utilise plus de ressources que le multisite. Vous devez toujours comprendre comment faire en sorte que PostgreSQL ait plusieurs bases de données (sauf si vous voulez exécuter deux copies de PostgreSQL, ce qui nécessitera encore plus de ressources).

1 « J'aime »

Ce serveur possède 12 processeurs et 16 Go, et ce ne sont pas des forums à grand volume, donc je ne m’inquiète pas des ressources supplémentaires nécessaires pour avoir deux conteneurs exécutant tous deux PostgreSQL.

Vous devez créer un autre fichier yml, comme app2.yml et changer tout ce qui entre en conflit avec l’autre.

Salut Jay

Quand tu dis

veux-tu dire que je devrais traiter les deux conteneurs comme un seul site derrière un nom d’hôte judicieux et une configuration de basculement (c’est-à-dire le même DISCOURSE_HOSTNAME et un équilibreur de charge/contrôle d’état devant), plutôt que d’essayer d’exposer les deux conteneurs directement ?

J’imagine que les deux configurations peuvent prendre le paramètre réseau plutôt que d’exposer les ports, ce qui aide à résoudre les conflits potentiels ?

Les montages de volume doivent-ils être différents pour chaque conteneur ?

Attendez. Avez-vous cloné Discourse deux fois ? Vous voulez cloner Discourse une fois, puis avoir plusieurs fichiers yml dans le répertoire containers.

Peut-être regardez Use Nginx Proxy Manager to manage multiple sites with Discourse, bien que https://hub.docker.com/r/jwilder/nginx-proxy soit celui que j’ai utilisé. Il vous suffit d’ajouter quelques variables d’environnement à votre YML pour qu’il se connecte, mais il y a encore un tas de choses que vous devez comprendre pour que cela fonctionne.

Chaque site a son propre nom d’hôte. C’est le but de tout cela, n’est-ce pas ?

J’ai le proxy inverse qui parle au port 80 du conteneur. D’autres préfèrent utiliser des sockets. Vous ne devriez exposer aucun port.

Non. Aucun de ces fichiers ne peut être partagé.

Chaque site a besoin d’une base de données postgres (peut être sur le même serveur postgres si vous savez comment faire).

Chaque site a besoin de son propre redis. Ils ne peuvent pas partager redis, ce qui est l’un des avantages de la configuration multisite.

Si vous voulez exécuter deux postgres, changez simplement le nom d’hôte, le smtp et les chemins des volumes, et supprimez/commentez les modèles ssl et letsencrypt. Vous pouvez même utiliser discourse-setup si vous renommez app.yml en, par exemple, hostname.yml avant d’exécuter à nouveau ./discourse-setup.

1 « J'aime »

pourriez-vous développer ce point, j’ai adapté les deux exemples ci-dessous pour convenir à une configuration de second site plutôt qu’à un site unique

##########################################
# app1.yml  (web + sidekiq)
##########################################

templates:
  - "templates/web.template.yml"
  - "templates/web.ratelimited.template.yml"
  # - "templates/web.ssl.template.yml"
  # - "templates/web.letsencrypt.ssl.template.yml"

- docker_args: "--network=discourse-net"
+ docker_args: "--network=discourse-net-1"

expose:
  - "8001:80"

params:
  version: tests-passed

env:
  LC_ALL: en_US.UTF-8
  LANG: en_US.UTF-8
  LANGUAGE: en_US.UTF-8

  DISCOURSE_HOSTNAME: "physicsyear2.site"
  DISCOURSE_DEVELOPER_EMAILS: "tvgazebo5@gmail.com"

  DISCOURSE_SMTP_ADDRESS: smtp-relay.brevo.com
  DISCOURSE_SMTP_PORT: 2525
  DISCOURSE_SMTP_USER_NAME: "YOUR_BREVO_USERNAME"
  DISCOURSE_SMTP_PASSWORD: "YOUR_BREVO_PASSWORD"
  DISCOURSE_NOTIFICATION_EMAIL: "noreply@physicsyear2.site"

  ## External Postgres
  DISCOURSE_DB_HOST: pg
  DISCOURSE_DB_PORT: 5432
  DISCOURSE_DB_USERNAME: discourse
  DISCOURSE_DB_PASSWORD: "REPLACE_ME_discordb_strong"
  DISCOURSE_DB_NAME: discourse
  DISCOURSE_DB_SOCKET: ""

  ## External Redis
  DISCOURSE_REDIS_HOST: redis
  DISCOURSE_REDIS_PORT: 6379
  DISCOURSE_REDIS_PASSWORD: "REPLACE_ME_redis_strong"

  ## MUST be identical on app1 and app2
  SECRET_KEY_BASE: "REPLACE_ME_secret_key_base"

volumes:
  - volume:
-      host: /var/discourse/shared/web-only
+     host: /var/discourse/shared/web-only-1
      guest: /shared
  - volume:
-      host: /var/discourse/shared/web-only/log/var-log
+     host: /var/discourse/shared/web-only/log/var-log-1
      guest: /var/log

hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/docker_manager.git

run:
  - exec: echo "App1 starting — Sidekiq ENABLED"
  # Note: NO sidekiq/down file here → Sidekiq runs
  - exec: echo "App1 ready"



##########################################
# app2.yml  (web + sidekiq)
##########################################

templates:
  - "templates/web.template.yml"
  - "templates/web.ratelimited.template.yml"
  # - "templates/web.ssl.template.yml"
  # - "templates/web.letsencrypt.ssl.template.yml"

- docker_args: "--network=discourse-net"
+ docker_args: "--network=discourse-net-2"

expose:
  - "8002:80"

params:
  version: tests-passed

env:
  LC_ALL: en_US.UTF-8
  LANG: en_US.UTF-8
  LANGUAGE: en_US.UTF-8

  DISCOURSE_HOSTNAME: "physicsyear2.site"
  DISCOURSE_DEVELOPER_EMAILS: "ppyem3@gmail.com"

  DISCOURSE_SMTP_ADDRESS: smtp-relay.brevo.com
  DISCOURSE_SMTP_PORT: 2525
  DISCOURSE_SMTP_USER_NAME: "YOUR_BREVO_USERNAME"
  DISCOURSE_SMTP_PASSWORD: "YOUR_BREVO_PASSWORD"
  DISCOURSE_NOTIFICATION_EMAIL: "noreply@physicsyear2.site"

  ## External Postgres
  DISCOURSE_DB_HOST: pg
  DISCOURSE_DB_PORT: 5432
  DISCOURSE_DB_USERNAME: discourse
  DISCOURSE_DB_PASSWORD: "REPLACE_ME_discordb_strong"
  DISCOURSE_DB_NAME: discourse
  DISCOURSE_DB_SOCKET: ""

  ## External Redis
  DISCOURSE_REDIS_HOST: redis
  DISCOURSE_REDIS_PORT: 6379
  DISCOURSE_REDIS_PASSWORD: "REPLACE_ME_redis_strong"

  ## MUST be identical on app1 and app2
  SECRET_KEY_BASE: "REPLACE_ME_secret_key_base"

volumes:
  - volume:
-      host: /var/discourse/shared/web-only
+     host: /var/discourse/shared/web-only-2
      guest: /shared
  - volume:
-      host: /var/discourse/shared/web-only/log/var-log
+     host: /var/discourse/shared/web-only/log/var-log-2
      guest: /var/log

hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/docker_manager.git

run:
  - exec: echo "App2 starting — Sidekiq ENABLED"
  # IMPORTANT: we DO NOT create /etc/service/sidekiq/down here
  # so Sidekiq also runs in app2
  - exec: echo "App2 ready"

cela semble bien, et explique probablement pourquoi .\\discourse-setup ne fonctionnait pas avec un app.yml plutôt que le fichier yml portant le nom d’hôte prévu ?

1 « J'aime »

J’ai deux copies distinctes de Discourse, du moins pour l’instant, qui me permettront de jouer un peu avec elles. Comme je l’ai dit plus tôt, ce système est assez grand et les sites sont assez petits pour que je ne pense pas que ce soit un problème de dupliquer des choses.

1 « J'aime »

Ce n’est pas l’espace. C’est juste déroutant. Il est conçu pour avoir un seul clone de discourse et tous les conteneurs dans le répertoire des conteneurs. C’est pourquoi il s’appelle conteneurs.

Compris. Je vais probablement régler ça demain, ça semble être une solution facile.

1 « J'aime »