Hat jemand Erfahrung mit zwei separaten Docker-Containern anstelle der Secondsite-Methode?

Ich kann die secondsite-Methode nicht wieder zum Laufen bringen und ziehe daher in Betracht, meine beiden Websites in separaten Containern auf demselben Server auszuführen.

Wenn jemand damit Erfahrung hat, kann er mir gerne eine Nachricht schicken.

Es ist größtenteils auf einem anständig großen Rechner machbar. Sie benötigen mindestens einen Reverse-Proxy, um SSL zu handhaben. Und vielleicht die Socket-Vorlage anstelle der Port-Weiterleitung verwenden.

2 „Gefällt mir“

Wäre ein Docker-Netzwerk angebracht?

Wenn Sie wissen, was Sie tun, dann ja. Es sollte kein Problem geben.

2 „Gefällt mir“

Ich habe es mit Traefik und Nginx Proxy gemacht. Es verbraucht mehr Ressourcen als Multisite. Sie müssen immer noch verstehen, wie Sie PostgreSQL dazu bringen, mehrere Datenbanken zu haben (es sei denn, Sie möchten zwei Kopien von PostgreSQL ausführen, was noch mehr Ressourcen erfordert).

1 „Gefällt mir“

Dieser Server hat 12 Prozessoren und 16 GB RAM, und dies sind keine Hochvolumen-Foren, daher mache ich mir keine Sorgen über die zusätzlichen Ressourcen, um zwei Container zu haben, die beide PostgreSQL ausführen.

Du musst eine weitere yml-Datei erstellen, wie z.B. app2.yml, und alles ändern, was mit der anderen kollidiert.

Hallo Jay

Wenn Sie sagen

meinen Sie damit, dass ich die beiden Container als eine einzige Website hinter einem sinnvollen Hostnamen und einer Failover-Einrichtung behandeln soll (d. h. denselben DISCOURSE_HOSTNAME und einen Load Balancer/Health-Check davor), anstatt zu versuchen, beide Container direkt verfügbar zu machen?

Ich stelle mir vor, dass beide Konfigurationen den Netzwerkparameter annehmen können, anstatt Ports verfügbar zu machen, was bei möglichen Konflikten hilft?

Müssen die Volume-Bindungen für jeden Container unterschiedlich sein?

Moment. Hast du Discourse zweimal geklont? Du möchtest Discourse einmal klonen und dann mehrere yml-Dateien im Container-Verzeichnis haben.

Schau dir vielleicht Use Nginx Proxy Manager to manage multiple sites with Discourse an, obwohl https://hub.docker.com/r/jwilder/nginx-proxy das ist, was ich verwendet habe. Du musst nur einige ENV-Variablen zu deinem YML hinzufügen, damit es sich verbinden kann, aber es gibt immer noch eine ganze Reihe von Dingen, die du verstehen musst, damit es funktioniert.

Jede Seite hat ihren eigenen Hostnamen. Das ist der Sinn der Sache, oder?

Ich lasse den Reverse-Proxy mit Port 80 auf dem Container sprechen. Andere ziehen es vor, Sockets zu verwenden. Du solltest keine Ports freigeben.

Nein. Keine dieser Dateien kann geteilt werden.

Jede Seite benötigt eine PostgreSQL-Datenbank (kann auf demselben PostgreSQL-Server sein, wenn du weißt, wie das geht).

Jede Seite benötigt ihren eigenen Redis. Sie können Redis nicht teilen, was ein Vorteil der Multisite-Einrichtung ist.

Wenn du zwei PostgreSQLs ausführen möchtest, ändere einfach den Hostnamen, SMTP und die Pfade der Volumes und entferne/kommentiere die SSL- und LetsEncrypt-Vorlagen aus. Du kannst sogar discourse-setup verwenden, wenn du app.yml vor dem erneuten Ausführen von ./discourse-setup beispielsweise in hostname.yml umbenennst.

1 „Gefällt mir“

Könnten Sie diesen Punkt näher erläutern? Ich habe beide Beispiele unten angepasst, um sie an eine Konfiguration für eine zweite Website anstelle einer einzelnen Website anzupassen.

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

Das klingt gut und erklärt wahrscheinlich, warum .\\discourse-setup nicht mit einer app.yml funktionierte, anstatt dass die yml-Datei den beabsichtigten Hostnamen trug?

1 „Gefällt mir“

Ich habe vorerst zwei separate Kopien von Discourse, mit denen ich ein wenig herumspielen kann. Wie ich bereits sagte, ist dieses System groß genug und die Websites sind klein genug, dass ich es nicht für problematisch halte, Dinge zu duplizieren.

1 „Gefällt mir“

Es geht nicht um den Platz. Es ist einfach verwirrend. Es ist so konzipiert, dass es einen einzigen Discourse-Klon und alle Container im Verzeichnis „container“ gibt. Deshalb heißt es „container“.

Verstanden. Ich werde es wahrscheinlich morgen beheben, das klingt nach einer einfachen Lösung.

1 „Gefällt mir“