Мне не удаётся снова запустить метод secondsite, поэтому теперь я рассматриваю вариант запуска двух моих сайтов в отдельных контейнерах на одном сервере.
Если у кого-то есть опыт работы с этим, напишите мне.
Мне не удаётся снова запустить метод secondsite, поэтому теперь я рассматриваю вариант запуска двух моих сайтов в отдельных контейнерах на одном сервере.
Если у кого-то есть опыт работы с этим, напишите мне.
Это в основном выполнимо на машине с decently sized. Вам как минимум понадобится обратный прокси для обработки SSL. И, возможно, используйте шаблон socketed вместо открытия портов.
Будет ли уместна сеть Docker?
Если вы знаете, что делаете, то да. Проблем быть не должно.
Я сделал это с помощью Traefik и nginx proxy. Это потребляет больше ресурсов, чем мультисайт. Вам всё равно нужно понять, как настроить PostgreSQL на работу с несколькими базами данных (если только вы не хотите запустить две копии PostgreSQL, что потребует ещё больше ресурсов).
У этого сервера 12 процессоров и 16 ГБ ОЗУ, и это не форумы с высокой нагрузкой, поэтому я не беспокоюсь о дополнительных ресурсах для запуска двух контейнеров с PostgreSQL одновременно.
Мне просто нужно понять, как запустить два контейнера одновременно: если я пересоберу один, другой останавливается.
Проблему с прокси в nginx я решу сам.
Вам нужно создать другой файл YML, например app2.yml, и изменить все настройки, которые конфликтуют с другими.
Привет, Джей,
Когда ты говоришь
ты имеешь в виду, что мне следует рассматривать два контейнера как единый сайт за разумным хостнеймом и с настройкой отказоустойчивости (то есть одинаковый DISCOURSE_HOSTNAME с балансировщиком нагрузки и проверками работоспособности перед ними), а не открывать порты обоих контейнеров напрямую?
Я предполагаю, что обе конфигурации могут просто подключиться к одной Docker-сети вместо привязки портов хоста, что позволит избежать некоторых очевидных конфликтов — это правильный подход?
И относительно секции volumes: должны ли точки монтирования (bind mounts) быть разными для каждого контейнера (например, отдельные /var/discourse/shared/app1 и /var/discourse/shared/app2), или есть разумный способ поделиться частью этого между ними?
Спасибо!
Погодите. Вы клонировали Discourse дважды? Нужно клонировать Discourse один раз, а затем создать несколько файлов YML в директории containers.
Возможно, стоит посмотреть Use Nginx Proxy Manager to manage multiple sites with Discourse, хотя я использовал jwilder/nginx-proxy - Docker Image. Вам просто нужно добавить несколько переменных ENV в ваш YML, чтобы настроить соединение, но всё равно придётся разобраться с множеством вещей, чтобы это работало.
У каждого сайта своё имя хоста. В этом и смысл всей этой затеи, верно?
Я настроил обратный прокси для общения с портом 80 в контейнере. Другие предпочитают использовать сокеты. Не следует открывать никакие порты.
Нет. Ни один из этих файлов не может быть общим.
Каждому сайту нужна своя база данных postgres (может находиться на том же сервере postgres, если вы знаете, как это сделать).
Каждому сайту нужен свой redis. Они не могут делить redis, что является одним из преимуществ настройки мультисайта.
Если вы хотите запустить два экземпляра postgres, просто измените имя хоста, настройки SMTP и пути к томам, а также удалите или закомментируйте шаблоны ssl и letsencrypt. Вы даже можете использовать discourse-setup, если переименуете app.yml, например, в hostname.yml, перед повторным запуском ./discourse-setup.
Не могли бы вы подробнее раскрыть этот момент? Я адаптировал оба примера ниже для конфигурации второго сайта вместо односайтовой
##########################################
# 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_NAME: discourse1
DISCOURSE_DB_SOCKET: ""
## External Redis
- DISCOURSE_REDIS_HOST: redis
+ DISCOURSE_REDIS_HOST: redis1
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_HOSTNAME: "year2physics.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_NAME: discourse2
DISCOURSE_DB_SOCKET: ""
## External Redis
- DISCOURSE_REDIS_HOST: redis
+ DISCOURSE_REDIS_HOST: redis2
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"
Вы даже можете использовать
discourse-setup, если переименуете app.yml, например, вhostname.yml, перед повторным запуском./discourse-setup.
Это звучит логично и, вероятно, объясняет, почему .\discourse-setup не работал с app.yml, а не с файлом yml, названным ожидаемым именем хоста?
У меня есть две отдельные копии Discourse, по крайней мере пока, что позволит мне немного поэкспериментировать с ними. Как я уже говорил ранее, эта система достаточно большая, а сайты достаточно маленькие, поэтому я не думаю, что дублирование чего-либо станет проблемой.
Похоже, я снова вернул всё в онлайн.
Как я уже говорил ранее, эта система достаточно велика, а сайты достаточно малы, поэтому я не считаю, что дублирование элементов является проблемой.
Дело не в месте. Это просто запутывает. Система спроектирована так, чтобы иметь один клон Discourse и все контейнеры в директории containers. Именно поэтому она называется «контейнеры».
Понял. Скорее всего, я исправлю это завтра, звучит как простая задача.