多站点 Dockerfile 问题

我尝试通过阅读指南来应用它。app.yml 文件就是这样生成的。其中可能存在错误。我只是在使用 Docker。我想要实现:在虚拟服务器上运行两个站点。1. 站点名称:dursuncan.com,2. 站点名称:forum.tekno-byte.com。我该如何编辑 app.yml 文件?

   # ./launcher rebuild app

    WARNING: We are about to start downloading the Discourse base image
    This process may take anywhere between a few minutes to an hour, depending on your network speed

    Please be patient

    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 等其他 Web 服务器共享端口,
    ## 请参阅 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%。
      ## 将根据检测到的 RAM 自动由引导程序设置,您也可以覆盖
      #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

      ## 支持的并发 Web 请求数量?取决于内存和 CPU 核心数。
      ## 将根据检测到的 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 选项)启动,请取消注释
      ## (默认值为 "$hostname-$config")
      # DOCKER_USE_HOSTNAME: true

      ## TODO: 初始注册时将设为管理员和开发者的逗号分隔电子邮件列表
      ## 示例:'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'

      ## 此 Discourse 实例的 http 或 https CDN 地址(配置为拉取)
      ## 请参阅 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 "End of custom commands"

您需要两个这样的容器,并在其前方配置一个反向代理。将 app.yml 复制为 app2.yml 并进行编辑。如果它们可以使用相同的插件和邮件服务器,请参考 在同一台机器上运行其他网站与 Discourse使用 Let’s Encrypt 且无需反向代理的多站点配置

我在 LEMP 服务器上使用了第一种方法。是否可以通过 Docker 实现这种方法?在 Docker 之外安装 Nginx 服务器会影响性能吗?

可以。每个论坛都将拥有一个 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" 至少需要一个参数。
请查看 'docker rm --help'。

用法:docker rm [OPTIONS] CONTAINER [CONTAINER...]

删除一个或多个容器
rm: 无法删除 'cids/app_bootstrap.cid': 没有那个文件或目录
** 引导失败 ** 请向上滚动查看之前的错误消息,可能不止一条。
./discourse-doctor 可能有助于诊断问题。
root@dursun:/var/discourse# docker image rm 8e23824acd3c
错误:不存在该镜像:8e23824acd3c

app.yml

## 这是 Discourse Docker 容器的独立一体化模板
##
## 修改此文件后,您必须执行重建
## /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 等其他 Web 服务器共享端口,
## 请参阅 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%。
  ## 将根据检测到的 RAM 由引导程序自动设置,您也可以覆盖
  #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

  ## 支持多少并发 Web 请求?取决于内存和 CPU 核心数。
  ## 将根据检测到的 CPU 由引导程序自动设置,您也可以覆盖
  #UNICORN_WORKERS: 3

  ## TODO: 此 Discourse 实例将响应的域名
  ## 必填项。Discourse 无法仅使用 IP 地址运行。
  DISCOURSE_HOSTNAME: 'dursuncan.com'

  ## 如果您希望容器以与上述相同的主机名启动(-h 选项),请取消注释
  ## (默认值为 "$hostname-$config")
  # DOCKER_USE_HOSTNAME: true

  ## TODO: 初始注册时将设为管理员和开发者的逗号分隔邮箱列表
  ## 示例:'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    # (发送通知的地址)

  ## 如果您添加了 Let's Encrypt 模板,请取消注释以下行以获取免费 SSL 证书
  LETSENCRYPT_ACCOUNT_EMAIL: 'merhaba@dursuncan.com'

  ## 此 Discourse 实例的 http 或 https CDN 地址(配置为拉取)
  ## 请参阅 https://meta.discourse.org/t/14857 了解详情
  #DISCOURSE_CDN_URL: https://discourse-cdn.example.com
  
  ## Maxmind 地理位置 IP 查询的 IP 地址密钥
  ## 请参阅 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 "自定义命令结束"