¿Alguien tiene experiencia ejecutando dos contenedores Docker separados en lugar del método secondsite?

No puedo hacer que el método secondsite funcione de nuevo, así que ahora estoy considerando ejecutar mis dos sitios en contenedores separados en el mismo servidor.

Si alguien tiene experiencia con esto, envíeme un mensaje.

Es mayormente factible en una máquina de tamaño decente. Necesitarás un proxy inverso como mínimo para manejar ssl. Y quizás usar la plantilla con socket en lugar de exponer puertos.

2 Me gusta

¿Sería apropiada una red de Docker?

Si sabes lo que haces, entonces sí. No debería haber ningún problema.

2 Me gusta

Lo he hecho con Traefik y Nginx Proxy, algo. Utiliza más recursos que multisitio. Todavía tienes que entender cómo hacer que PostgreSQL tenga varias bases de datos (a menos que quieras ejecutar dos copias de PostgreSQL, lo que requerirá aún más recursos).

1 me gusta

Este servidor tiene 12 procesadores y 16 Gigabytes y estos no son foros de alto volumen, así que no me preocupa el uso de recursos adicionales para tener dos contenedores ejecutando postgres.

Necesitas hacer otro archivo yml, como app2.yml y cambiar todas las cosas que entran en conflicto con el otro.

Hola Jay

Cuando dices

¿quieres decir que debo tratar los dos contenedores como un solo sitio detrás de un nombre de host sensato y una configuración de conmutación por error (es decir, el mismo DISCOURSE_HOSTNAME y un balanceador de carga/verificación de estado delante), en lugar de intentar exponer ambos contenedores directamente?

Imagino que ambas configuraciones pueden tomar el parámetro de red en lugar de exponer puertos, ¿lo que ayuda con un posible conflicto?

¿Las vinculaciones de volumen necesitan ser diferentes para cada contenedor?

Espera. ¿Clonaste Discourse dos veces? Quieres clonar Discourse una vez y luego tener varios archivos yml en el directorio de contenedores.

Quizás echa un vistazo a Use Nginx Proxy Manager to manage multiple sites with Discourse, aunque https://hub.docker.com/r/jwilder/nginx-proxy es el que he usado. Solo necesitas agregar algunas variables de entorno a tu YML para que se conecte, pero todavía hay un montón de cosas que tienes que entender para que funcione.

Cada sitio tiene su propio nombre de host. Ese es el propósito de todo esto, ¿verdad?

Tengo el proxy inverso hablando con el puerto 80 en el contenedor. Otros prefieren usar sockets. No debes exponer ningún puerto.

No. Ninguno de esos archivos se puede compartir.

Cada sitio necesita una base de datos postgres (puede estar en el mismo servidor postgres si sabes cómo hacerlo).

Cada sitio necesita su propio redis. No pueden compartir redis, lo cual es una ventaja de la configuración multisitio.

Si quieres ejecutar dos postgres, simplemente cambia el nombre de host, smtp y las rutas de los volúmenes y elimina/comenta las plantillas ssl y letsencrypt. Incluso puedes usar discourse-setup si cambias el nombre de app.yml a, por ejemplo, hostname.yml antes de ejecutar ./discourse-setup nuevamente.

1 me gusta

¿Podrías ampliar este punto? He adaptado ambos ejemplos a continuación para que se ajusten a una configuración de segundo sitio en lugar de un solo sitio.

##########################################
# 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"

esto suena bien, y probablemente explica por qué .\discourse-setup no funcionaba con un app.yml en lugar de que el archivo yml tuviera el nombre del host deseado?

1 me gusta

Tengo dos copias separadas de Discourse, al menos por ahora, que me permitirán jugar un poco con ellas. Como dije antes, este sistema es lo suficientemente grande y los sitios son lo suficientemente pequeños como para que no creo que sea un problema duplicar cosas.

1 me gusta

No es el espacio. Es simplemente confuso. Está diseñado para tener un único clon de discourse y todos los contenedores en el directorio de contenedores. Por eso se llama contenedores.

Entendido. Probablemente lo arregle mañana, parece una solución fácil.

1 me gusta