Проблемы с Dockerfile для мультисайтов

Я попытался применить это, прочитав руководства. Вот как выглядит файл app.yml. Возможно, есть ошибки. Я использую только Docker. Моя цель: запустить два сайта на виртуальном сервере. 1. имя сайта: dursuncan.com, 2. имя сайта: forum.tekno-byte.com. Как мне отредактировать файл app.yml?

   # ./launcher rebuild app

    WARNING: Мы собираемся начать загрузку базового образа Discourse
    Этот процесс может занять от нескольких минут до часа в зависимости от скорости вашей сети

    Пожалуйста, будьте терпеливы

    2.0.20210415-1332: Pulling from discourse/base
    Digest: sha256:b3b1eb6d859d683f26ad2a02e0efabcd502a63ab07b8211e4c425aa7ba7dd3a4
    Status: Downloaded newer image for discourse/base:2.0.20210415-1332
    docker.io/discourse/base:2.0.20210415-1332
    Ensuring launcher is up to date
    Fetching origin
    Launcher is up-to-date
    Stopping old container
    + /usr/bin/docker stop -t 60 app
    app
    cd /pups && git pull && git checkout v1.0.3 && /pups/bin/pups --stdin
    docker: Error response from daemon: could not get container for postgres: No such container: postgres.
    See 'docker run --help'.
    cat: cids/app_bootstrap.cid: No such file or directory
    "docker rm" requires at least 1 argument.
    See 'docker rm --help'.

    Usage:  docker rm [OPTIONS] CONTAINER [CONTAINER...]

    Remove one or more containers
    rm: cannot remove 'cids/app_bootstrap.cid': No such file or directory
    ** FAILED TO BOOTSTRAP ** please scroll up and look for earlier error messages, there may be more than one.
    ./discourse-doctor may help diagnose the problem.
    ## это шаблон контейнера Discourse Docker «всё в одном», автономный
    ##
    ## После внесения изменений в этот файл вы ОБЯЗАНЫ выполнить пересборку
    ## /var/discourse/launcher rebuild app
    ##
    ## БУДЬТЕ *ОЧЕНЬ* ОСТОРОЖНЫ ПРИ РЕДАКТИРОВАНИИ!
    ## YAML-ФАЙЛЫ ЧРЕЗВЫЧАЙНО ЧУВСТВИТЕЛЬНЫ К ОШИБКАМ В ПРОБЕЛАХ ИЛИ ВЫРАВНИВАНИИ!
    ## Посетите http://www.yamllint.com/, чтобы проверить этот файл при необходимости

    templates:
      - "templates/postgres.template.yml"
      - "templates/redis.template.yml"
      - "templates/web.template.yml"
      - "templates/web.ratelimited.template.yml"
      - "templates/cron.template.yml"
    ## Раскомментируйте эти две строки, если хотите добавить Lets Encrypt (https)
      - "templates/sshd.template.yml"  
      - "templates/web.ssl.template.yml"
      - "templates/web.letsencrypt.ssl.template.yml"

    ## Какие TCP/IP-порты должен открывать этот контейнер?
    ## Если вы хотите, чтобы Discourse использовал порт совместно с другим веб-сервером, например Apache или nginx,
    ## см. https://meta.discourse.org/t/17247 для деталей
    expose:
    #  - "80"
       - "80:80"
       - "2222:22"
       - "443:443"
    #  - "80:80"   # http
    #  - "443:443" # https

    links:
       - link:
           name: postgres
           alias: postgres

    #docker_args:
    #   - "--net chain"

    params:
      db_default_text_search_config: "pg_catalog.english"

      ## Установите db_shared_buffers максимум на 25% от общего объёма памяти.
      ## будет установлено автоматически при загрузке на основе обнаруженной оперативной памяти, или вы можете переопределить
      #db_shared_buffers: "256MB"

      ## может улучшить производительность сортировки, но увеличивает использование памяти на подключение
      #db_work_mem: "40MB"

      ## Какую ревизию Git должен использовать этот контейнер? (по умолчанию: tests-passed)
      #version: tests-passed

    env:
      LC_ALL: en_US.UTF-8
      LANG: en_US.UTF-8
      LANGUAGE: en_US.UTF-8
      # DISCOURSE_DEFAULT_LOCALE: en

      ## Сколько одновременных веб-запросов поддерживается? Зависит от памяти и количества ядер CPU.
      ## будет установлено автоматически при загрузке на основе обнаруженных процессоров, или вы можете переопределить
      #UNICORN_WORKERS: 3

      ## TODO: Доменное имя, на которое будет реагировать этот экземпляр Discourse
      ## Обязательно. Discourse не будет работать с чистым IP-адресом.
      DISCOURSE_HOSTNAME: 'dursuncan.com'
      # VIRTUAL_HOST: 'dursuncan.com,www.dursuncan.com'
      # LETSENCRYPT_HOST: 'dursuncan.com,www.dursuncan.com'
      # LETSENCRYPT_EMAIL: 'merhaba@dursuncan.com'

      ## Раскомментируйте, если хотите, чтобы контейнер запускался с тем же
      ## именем хоста (-h option), что указано выше (по умолчанию "$hostname-$config")
      # DOCKER_USE_HOSTNAME: true

      ## TODO: Список email-адресов через запятую, которые станут администраторами и разработчиками
      ## при первой регистрации, например 'user1@example.com,user2@example.com'
      DISCOURSE_DEVELOPER_EMAILS: 'poyrazdursuncan@gmail.com'

      ## TODO: SMTP-сервер, используемый для проверки новых учётных записей и отправки уведомлений
      ## SMTP-адрес, имя пользователя и пароль обязательны
      ## ВНИМАНИЕ: символ '#' в пароле SMTP может вызвать проблемы!
      DISCOURSE_SMTP_ADDRESS: smtp.eu.mailgun.org
      DISCOURSE_SMTP_PORT: 587
      DISCOURSE_SMTP_USER_NAME: postmaster@mg.dursuncan.com
      DISCOURSE_SMTP_PASSWORD: '***'
      DISCOURSE_SMTP_ENABLE_START_TLS: true
      DISCOURSE_SMTP_DOMAIN: dursuncan.com
      #DISCOURSE_NOTIFICATION_EMAIL: noreply@discourse.example.com    # (адрес, с которого отправляются уведомления)

      ## Если вы добавили шаблон Lets Encrypt, раскомментируйте ниже, чтобы получить бесплатный SSL-сертификат
      LETSENCRYPT_ACCOUNT_EMAIL: 'merhaba@dursuncan.com'

      ## Адрес CDN http или https для этого экземпляра Discourse (настроен на извлечение)
      ## см. https://meta.discourse.org/t/14857 для деталей
      #DISCOURSE_CDN_URL: https://discourse-cdn.example.com
      
      ## Ключ лицензии Maxmind для поиска по IP-адресам
      ## см. https://meta.discourse.org/t/-/137387/23 для деталей
      #DISCOURSE_MAXMIND_LICENSE_KEY: 1234567890123456

      DISCOURSE_DB_HOST: some-host
      DISCOURSE_DB_NAME: "{{config}}_discourse"

    labels:
      monitor: "true"
      app_name: "{{config}}_discourse"

    ## Контейнер Docker не имеет состояния; все данные хранятся в /shared
    volumes:
      - volume:
          host: /var/discourse/shared/standalone
          guest: /shared
      - volume:
          host: /var/discourse/shared/standalone/log/var-log
          guest: /var/log

    ## Плагины размещаются здесь
    ## см. https://meta.discourse.org/t/19157 для деталей
    hooks:          
      after_postgres:
         - exec: sudo -u postgres createdb b_discourse || exit 0
         - exec:
              stdin: |
                grant all privileges on database b_discourse to discourse;
              cmd: sudo -u postgres psql b_discourse
              raise_on_fail: false

         - exec: /bin/bash -c 'sudo -u postgres psql b_discourse <<< "alter schema public owner to discourse;"'
         - exec: /bin/bash -c 'sudo -u postgres psql b_discourse <<< "create extension if not exists hstore;"'
         - exec: /bin/bash -c 'sudo -u postgres psql b_discourse <<< "create extension if not exists pg_trgm;"'

      after_code:
        - exec:
            cd: $home/plugins
            cmd:
              - mkdir -p plugins
              - git clone https://github.com/discourse/docker_manager.git
      before_bundle_exec:
        - file:
            path: $home/config/multisite.yml
            contents: |
             secondsite:
               adapter: postgresql
               database: b_discourse
               pool: 25
               timeout: 5000
               db_id: 2
               host_names:
                 - b.discourse.example.com

      after_bundle_exec:
        - exec: cd /var/discourse && sudo -E -u discourse bundle exec rake multisite:migrate

    ## Любые пользовательские команды для запуска после сборки
    run:
      - exec:
            cd: var/discourse
            hook: my_hook
            cmd:
              - echo 1
      ## Если вы хотите установить адрес «От» для вашего первого регистрационного письма, раскомментируйте и измените:
      ## После получения первого регистрационного письма закомментируйте строку обратно. Выполнять нужно только один раз.
      #- exec: rails r "SiteSetting.notification_email='info@unconfigured.discourse.org'"
      - exec: echo "Конец пользовательских команд"

Вам понадобятся два таких контейнера и обратный прокси перед ними. Скопируйте app.yml в app2.yml и отредактируйте его. Запуск других сайтов на той же машине, что и Discourse или, возможно, Настройка мультисайта с Let’s Encrypt и без обратного прокси, если они могут использовать одни и те же плагины и почтовый сервер.

Я использовал первый метод на LEMP-серверах. Можно ли реализовать этот метод через Docker? Влияет ли установка сервера Nginx вне Docker на производительность?

Да. Для каждого форума будет свой образ Docker.

Внешний обратный прокси-сервер также может быть контейнером Docker.

Незначительно.

Я установил Nginx. Настроил параметры. Отредактировал файл app.yml. Процесс пересборки завершается неудачей. В чём может быть проблема?

./launcher rebuild app
Проверка актуальности лаунчера
Получение данных из origin
Лаунчер актуален
cd /pups && git pull && git checkout v1.0.3 && /pups/bin/pups --stdin
docker: недопустимый формат ссылки: имя репозитория должно быть в нижнем регистре.
См. 'docker run --help'.
cat: cids/app_bootstrap.cid: Нет такого файла или каталога
"docker rm" требует как минимум 1 аргумент.
См. 'docker rm --help'.

Использование:  docker rm [ОПЦИИ] КОНТЕЙНЕР [КОНТЕЙНЕР...]

Удаление одного или нескольких контейнеров
rm: невозможно удалить 'cids/app_bootstrap.cid': Нет такого файла или каталога
** СБОЙ ПРИ ИНИЦИАЛИЗАЦИИ ** Пожалуйста, прокрутите вверх и поищите более ранние сообщения об ошибках; их может быть несколько.
./discourse-doctor может помочь в диагностике проблемы.
root@dursun:/var/discourse# docker image rm 8e23824acd3c
Ошибка: Образ не найден: 8e23824acd3c

app.yml

## Это шаблон контейнера Discourse «всё в одном» для автономной работы
##
## После внесения изменений в этот файл вы ОБЯЗАНЫ выполнить пересборку
## /var/discourse/launcher rebuild app
##
## БУДЬТЕ *ОЧЕНЬ* ОСТОРОЖНЫ ПРИ РЕДАКТИРОВАНИИ!
## YAML-ФАЙЛЫ ЧРЕЗВЫЧАЙНО ЧУВСТВИТЕЛЬНЫ К ОШИБКАМ В ПРОБЕЛАХ И ВЫРАВНИВАНИИ!
## При необходимости проверьте этот файл на сайте http://www.yamllint.com/

# Базовые шаблоны; можно сократить, включив меньше функциональности из шаблонов контейнеров:
  #- "templates/sshd.template.yml"
  #- "templates/web.socketed.template.yml"
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  - "templates/web.ratelimited.template.yml"
  - "templates/web.socketed.template.yml"

## Какие TCP/IP-порты должен открывать этот контейнер?
## Если вы хотите, чтобы Discourse использовал тот же порт, что и другой веб-сервер, например Apache или nginx,
## см. https://meta.discourse.org/t/17247 для деталей
# Какие порты открывать?
# expose: закомментируйте весь раздел, поставив # перед каждой строкой
# - "80:80"   # http
# - "443:443" # https

params:
  db_default_text_search_config: "pg_catalog.english"

  ## Установите db_shared_buffers максимум в 25% от общего объёма памяти.
  ## Значение автоматически устанавливается при инициализации на основе обнаруженной оперативной памяти, либо вы можете переопределить его
  #db_shared_buffers: "256MB"

  ## Может улучшить производительность сортировки, но увеличивает использование памяти на соединение
  #db_work_mem: "40MB"

  ## Какую ревизию Git должен использовать этот контейнер? (по умолчанию: tests-passed)
  #version: tests-passed

env:
  LC_ALL: en_US.UTF-8
  LANG: en_US.UTF-8
  LANGUAGE: en_US.UTF-8
  # DISCOURSE_DEFAULT_LOCALE: en

  ## Сколько одновременных веб-запросов поддерживается? Зависит от объёма памяти и количества ядер CPU.
  ## Значение автоматически устанавливается при инициализации на основе обнаруженных процессоров, либо вы можете переопределить его
  #UNICORN_WORKERS: 3

  ## TODO: Доменное имя, на которое будет отвечать этот экземпляр Discourse
  ## Обязательно. Discourse не будет работать с чистым IP-адресом.
  DISCOURSE_HOSTNAME: 'dursuncan.com'

  ## Раскомментируйте, если хотите, чтобы контейнер запускался с тем же
  ## именем хоста (опция -h), что указано выше (по умолчанию "$hostname-$config")
  # DOCKER_USE_HOSTNAME: true

  ## TODO: Список email-адресов через запятую, которые станут администраторами и разработчиками
  ## при первой регистрации, например 'user1@example.com,user2@example.com'
  DISCOURSE_DEVELOPER_EMAILS: 'poyrazdursuncan@gmail.com'

  ## TODO: SMTP-сервер для проверки новых учётных записей и отправки уведомлений
  ## Адрес, имя пользователя и пароль SMTP обязательны
  ## ВНИМАНИЕ: символ '#' в пароле SMTP может вызвать проблемы!
  DISCOURSE_SMTP_ADDRESS: smtp.eu.mailgun.org
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: postmaster@mg.dursuncan.com
  DISCOURSE_SMTP_PASSWORD: '---------'
  DISCOURSE_SMTP_ENABLE_START_TLS: true
  DISCOURSE_SMTP_DOMAIN: dursuncan.com
  #DISCOURSE_NOTIFICATION_EMAIL: noreply@discourse.example.com    # (адрес для отправки уведомлений)

  ## Если вы добавили шаблон Lets Encrypt, раскомментируйте ниже, чтобы получить бесплатный SSL-сертификат
  LETSENCRYPT_ACCOUNT_EMAIL: 'merhaba@dursuncan.com'

  ## Адрес http или https CDN для этого экземпляра Discourse (настроен на подгрузку)
  ## см. https://meta.discourse.org/t/14857 для деталей
  #DISCOURSE_CDN_URL: https://discourse-cdn.example.com
  
  ## Ключ IP-адреса для геопоиска MaxMind
  ## см. https://meta.discourse.org/t/-/137387/23 для деталей
  #DISCOURSE_MAXMIND_LICENSE_KEY: 1234567890123456

## Контейнер Docker не сохраняет состояние; все данные хранятся в /shared
volumes:
  - volume:
      host: /var/discourse/shared/standalone
      guest: /shared
  - volume:
      host: /var/discourse/shared/standalone/log/var-log
      guest: /var/log

## Плагины размещаются здесь
## см. https://meta.discourse.org/t/19157 для деталей

hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/docker_manager.git

## Любые пользовательские команды для запуска после сборки
run:
  - exec: echo "Начало пользовательских команд"
  ## Если вы хотите установить адрес «От» для вашей первой регистрации, раскомментируйте и измените:
  ## После получения первого письма о регистрации раскомментируйте строку обратно. Выполнять нужно только один раз.
  #- exec: rails r "SiteSetting.notification_email='info@unconfigured.discourse.org'"
  - exec: echo "Конец пользовательских команд"