Alguém tem experiência rodando dois containers Docker separados em vez do método secondsite?

Não consigo fazer o método secondsite funcionar novamente, então agora estou pensando em executar meus dois sites em contêineres separados no mesmo servidor.

Se alguém tiver experiência com isso, me envie uma mensagem.

É em grande parte viável em uma máquina de tamanho decente, você precisará de um proxy reverso no mínimo para lidar com SSL. E talvez usar o template com soquete em vez de expor portas.

2 curtidas

Uma rede Docker seria apropriada?

Se você sabe o que está fazendo, então sim. Não deve haver nenhum problema.

2 curtidas

Eu consegui com traefik e nginx proxy algo. Ele usa mais recursos do que multisite. Você ainda precisa entender como fazer o postgres ter vários bancos de dados (a menos que você queira executar duas cópias do postgres, o que exigirá ainda mais recursos).

1 curtida

Este servidor tem 12 processadores e 16 Gig e estes não são fóruns de alto volume, então não estou preocupado com os recursos extras para ter dois contêineres executando postgres.

Você precisa criar outro arquivo yml, como app2.yml e alterar todas as coisas que entram em conflito com o outro.

Olá Jay

Quando você diz

você quer dizer que devo tratar os dois contêineres como um único site atrás de um hostname sensato e configuração de failover (ou seja, o mesmo DISCOURSE_HOSTNAME e um balanceador de carga/verificação de integridade na frente), em vez de tentar expor ambos os contêineres diretamente?

Imagino que ambas as configurações possam aceitar o parâmetro de rede em vez de expor portas, o que ajuda com conflitos potenciais?

As montagens de volume precisam ser diferentes para cada contêiner?

Espere. Você clonou o Discourse duas vezes? Você quer clonar o Discourse uma vez e depois ter vários arquivos yml no diretório containers.

Talvez dê uma olhada em Use Nginx Proxy Manager to manage multiple sites with Discourse, embora https://hub.docker.com/r/jwilder/nginx-proxy seja o que eu usei. Você só precisa adicionar algumas variáveis de ambiente ao seu YML para que ele se conecte, mas ainda há um monte de coisas que você tem que entender para fazer funcionar.

Cada site tem seu próprio nome de host. Esse é o ponto de tudo isso, certo?

Eu tenho o proxy reverso falando com a porta 80 no contêiner. Outros preferem usar sockets. Você não deve expor nenhuma porta.

Não. Nenhum desses arquivos pode ser compartilhado.

Cada site precisa de um banco de dados postgres (pode estar no mesmo servidor postgres se você souber como fazer isso).

Cada site precisa de seu próprio redis. Eles não podem compartilhar redis, o que é uma vantagem da configuração multisite.

Se você quiser executar dois postgres, basta alterar o nome do host, smtp e os caminhos dos volumes e remover/comentar os templates ssl e letsencrypt. Você pode até usar discourse-setup se renomear app.yml para, digamos, hostname.yml antes de executar ./discourse-setup novamente.

1 curtida

você poderia expandir este ponto, adaptei ambos os exemplos abaixo para se adequar a uma configuração de segundo site em vez de um único site

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

isso parece bom, e provavelmente explica por que .\\discourse-setup não estava funcionando com um app.yml em vez do arquivo yml ter o nome do hostname pretendido?

1 curtida

Tenho duas cópias separadas do Discourse, pelo menos por enquanto, que podem me permitir brincar um pouco com elas. Como eu disse antes, este sistema é grande o suficiente e os sites são pequenos o suficiente para que eu não ache que seja um problema duplicar as coisas.

1 curtida

Não é o espaço. É apenas confuso. Ele foi projetado para ter um único clone do Discourse e todos os contêineres no diretório de contêineres. É por isso que ele é chamado de contêineres.

Entendido. Provavelmente vou consertar amanhã, parece um conserto fácil.

1 curtida