多站点 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"
1 个赞

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

4 个赞

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

1 个赞

可以。每个论坛都将拥有一个 Docker 镜像。

外部反向代理也可以是一个 Docker 容器。

影响不大。

1 个赞

我安装了 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 "自定义命令结束"
1 个赞