Qualcuno ha esperienza nell'esecuzione di due container Docker separati invece del metodo secondosite?

Non riesco più a far funzionare il metodo secondosite, quindi ora sto pensando di eseguire i miei due siti in container separati sullo stesso server.

Se qualcuno ha esperienza in merito, mi contatti.

È per lo più fattibile su una macchina di dimensioni discrete, avrai bisogno di un reverse proxy come minimo per gestire ssl. E forse usa il template socketed invece di esporre le porte.

2 Mi Piace

una rete Docker sarebbe appropriata?

Se sai quello che stai facendo, allora sì. Non dovrebbero esserci problemi.

2 Mi Piace

L’ho fatto con traefik e nginx proxy qualcosa. Utilizza più risorse rispetto al multisito. Devi comunque capire come far sì che postgres abbia più database (a meno che tu non voglia eseguire due copie di postgres, il che richiederà ancora più risorse).

1 Mi Piace

Questo server ha 12 processori e 16 GB e questi non sono forum ad alto volume, quindi non sono preoccupato per le risorse aggiuntive per avere due container che eseguono entrambi postgres.

Devi creare un altro file yml, come app2.yml e cambiare tutte le cose che sono in conflitto con l’altro.

Ciao Jay

Quando dici

intendi che dovrei trattare i due container come un unico sito dietro un hostname sensato e una configurazione di failover (cioè lo stesso DISCOURSE_HOSTNAME e un load balancer/health-check davanti), piuttosto che cercare di esporre entrambi i container direttamente?

Immagino che entrambe le configurazioni possano accettare il parametro di rete piuttosto che esporre le porte, il che aiuta con potenziali conflitti?

I bind delle mount dei volumi devono essere diversi per ciascun container?

Aspetta. Hai clonato Discourse due volte? Devi clonare Discourse una volta e poi avere più file yml nella directory dei container.

Forse dai un’occhiata a Use Nginx Proxy Manager to manage multiple sites with Discourse, anche se https://hub.docker.com/r/jwilder/nginx-proxy è quello che ho usato. Devi solo aggiungere alcune variabili d’ambiente al tuo YML per farlo connettere, ma ci sono ancora un sacco di cose che devi capire per farlo funzionare.

Ogni sito ha il proprio hostname. Questo è il punto di tutto questo, giusto?

Ho il reverse proxy che parla alla porta 80 del container. Altri preferiscono usare i socket. Non dovresti esporre alcuna porta.

No. Nessuno di questi file può essere condiviso.

Ogni sito necessita di un database postgres (può essere sullo stesso server postgres se sai come farlo).

Ogni sito necessita del proprio redis. Non possono condividere redis, che è uno dei vantaggi della configurazione multisito.

Se vuoi eseguire due postgres, cambia semplicemente hostname, smtp e percorsi dei volumi e rimuovi/commenta i template ssl e letsencrypt. Puoi anche usare discourse-setup se rinomini app.yml in, ad esempio, hostname.yml prima di eseguire nuovamente ./discourse-setup.

1 Mi Piace

potresti approfondire questo punto, ho adattato entrambi gli esempi qui sotto per adattarli a una configurazione di secondo sito anziché a un singolo sito

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

questo sembra buono, e probabilmente spiega perché .\discourse-setup non funzionava con un app.yml invece che il file yml avesse il nome dell’hostname previsto?

1 Mi Piace

Ho due copie separate di Discourse, almeno per ora, che mi permetteranno di giocarci un po’. Come ho detto prima, questo sistema è abbastanza grande e i siti sono abbastanza piccoli da non pensare che sia un problema duplicare le cose.

1 Mi Piace

Non è lo spazio. È solo confusionario. È progettato per avere un singolo clone di discourse e tutti i container nella directory dei container. Ecco perché si chiama containers.

Capito. Probabilmente lo sistemerò domani, sembra una correzione facile.

1 Mi Piace