コンテナ再起動 - discourse が再インストールを試みます

@rosscdh とのサイドチャットから、彼の主な最終目標は Kubernetes 上の Discourse であることが明らかになりました。これは、ここではサポートされている構成ではありません。Docker/Kubernetes に関連する私たちのやり方については正当な批判もありますが、セルフホスティングの世界での使いやすさを考慮し、launcher でこのアプローチを選択しました。

このトピックを再オープンしましたが、礼儀正しく建設的な議論を続けてください。

「いいね!」 2

でも、./launcher が開発された後で docker-compose が登場したんですよね。:wink:

Kubernetes (k8s) や同様の環境で起動したい場合は、私はランチャーを使ってイメージをビルドし、どこかにプッシュしてから、k8s がそのイメージを起動するようにしています。ランチャーはアップグレード時にデータベースのマイグレーションなどを行う処理も行うため、その仕組みには注意が必要です。

「いいね!」 1

ありがとうございます。

目標は、Docker のような構成にし、Kubernetes でも、スタンドアロンのコンテナとして Docker を直接使用しても実行できるようにすることです。

ランチャーを使用して、2GB 以上のサイズのイメージ(プラグイン 4 個、制限により 6 個は不可)を生成することに成功しました。

また、Docker Compose で構成することで、現在はクリーンな実行手順書(runbook)として機能しています。
GlobalSettings には慣れていますし、application.rb と routes.rb を少し修正して、カスタマイズをマウントするだけにするようにしました。

version: '3'

networks:
  discourse-net:

services:
  mailhog:
    image: mailhog/mailhog:latest
    networks:
      - discourse-net
    ports:
      - 8025:8025

  postgres:
    image: postgres:9.6
    networks:
      - discourse-net
    environment:
      POSTGRES_PASSWORD: password
      POSTGRES_USER: discourse
      POSTGRES_DB: discourse

  redis:
    image: redis:alpine
    networks:
      - discourse-net

  discourse:
    image: discourse-monkey:latest
    working_dir: /var/www/discourse
    command: bash /var/www/discourse/entrypoint.sh
    # ports:
    #   - 3000:3000 # use the nginx entrypoint
    networks:
      - discourse-net
    volumes:
      - ./entrypoint.sh:/var/www/discourse/entrypoint.sh
      - ./config/unicorn.rb:/var/www/discourse/config/unicorn.rb
      - ./config/application.rb:/var/www/discourse/config/application.rb
      - ./envs/production.rb:/var/www/discourse/config/environments/production.rb
      - ./overrides/routes.rb:/var/www/discourse/config/routes.rb
      - ./generated/public/assets:/var/www/discourse/public/assets
      - ./generated/public/images:/var/www/discourse/public/images
      - ./generated/public/uploads:/var/www/discourse/public/uploads
      - ./generated/public/javascripts:/var/www/discourse/public/javascripts
      - ./generated/public/svg-sprite:/var/www/discourse/public/svg-sprite

    environment:
      LANG: en_US.UTF-8
      DISCOURSE_DEFAULT_LOCALE: en
      RAILS_ENV: production
      ## How many concurrent web requests are supported? Depends on memory and CPU cores.
      ## will be set automatically by bootstrap based on detected CPUs, or you can override
      UNICORN_WORKERS: 3

      ## TODO: The domain name this Discourse instance will respond to
      DISCOURSE_HOSTNAME: discuss.monkey.tech:3001
      DOCKER_USE_HOSTNAME: "true"

      ## Uncomment if you want the container to be started with the same
      ## hostname (-h option) as specified above (default "$hostname-$config")
      #DOCKER_USE_HOSTNAME: true

      ## TODO: List of comma delimited emails that will be made admin and developer
      ## on initial signup example 'user1@example.com,user2@example.com'
      DISCOURSE_DEVELOPER_EMAILS: 'me@example.com,you@example.com'

      ## TODO: The SMTP mail server used to validate new accounts and send notifications
      # SMTP ADDRESS, username, and password are required
      # WARNING the char '#' in SMTP password can cause problems!
      DISCOURSE_SMTP_ADDRESS: mailhog
      #DISCOURSE_SMTP_PORT: 587
      DISCOURSE_SMTP_USER_NAME: mailhog
      DISCOURSE_SMTP_PASSWORD: password
      #DISCOURSE_SMTP_ENABLE_START_TLS: true           # (optional, default true)

      ## If you added the Lets Encrypt template, uncomment below to get a free SSL certificate
      #LETSENCRYPT_ACCOUNT_EMAIL: me@example.com

      ## TODO: configure connectivity to the databases
      # DISCOURSE_DB_SOCKET: ''
      DISCOURSE_DB_HOST: postgres
      DISCOURSE_DB_USERNAME: discourse
      DISCOURSE_DB_PASSWORD: password
      DISCOURSE_REDIS_HOST: redis

      ## The http or https CDN address for this Discourse instance (configured to pull)
      ## see https://meta.discourse.org/t/14857 for details
      DISCOURSE_CDN_URL: http://discuss.monkey.tech:3001
      DISCOURSE_SERVE_STATIC_ASSETS: "true"

      SKIP_ENFORCE_HOSTNAME: '0'
      ENABLE_ASSETS_PIPELINE: '0'
      ENABLE_DB_MIGRATE: '0'

      DISCOURSE_ENABLE_CORS: 'false'
      DISCOURSE_CORS_ORIGIN: '*'
      #SKIP_DB_AND_REDIS: '1'

  nginx:
    image: fholzer/nginx-brotli
    # command: /bin/sh -c "envsubst < /etc/nginx/conf.d/discourse.template.conf > /etc/nginx/conf.d/default.conf && nginx -g 'daemon off;'" 
    ports:
      - 3001:80
    depends_on:
      - discourse
    networks:
      - discourse-net
    volumes:
      - ./config/nginx.application.conf:/etc/nginx/conf.d/default.conf
      - ./generated/public:/var/www/discourse/public
      - ./generated/nginx/cache:/var/nginx/cache

完璧に動作しています。すべてのトラフィックは nginx を経由し、assets:precompile の出力も共有しています。

次のステップは、イメージに対してアセットのコンパイルと db:migrate を「オンデマンド」で呼び出すセットを準備するか、または exec を使用して同じことを行うことです(これらの項目は頻繁に変更されないため)。また、この 2.6GB のイメージサイズを削減できないか検討するかもしれません。

以前も述べたように、かなりクリーンな印象を受けます。pup の機能は問題なく、その提供価値も理解できます。ただし、ビルド時に実行し、sudo 戦略を使用する点については懸念がいくつかあります(これは私や私の知人が通常行う方法とは非常に稀に一致します)。通常、イメージは独立してビルドされ、Kubernetes、SaltStack、Nomad、Docker Compose などの別の場所でデプロイされます。

サンプルの kube.yml と applications/kubernetes.template.yml を追加する可能性のある PR を持っています。特定の項目、オーバーライド、設定を無効化してデータベースと Redis を無効化し、ビルド時にも実際に Redis とデータベースを無効化し、precompile も無効化するというものです。もし興味があればお声がけください。

興味深い体験でした。フォローアップいただきありがとうございます。

フィクスチャに関連する小さな奇妙な点(おそらく migrate を数回呼び出したことによるもの)が 1 つだけあります。
添付画像をご覧ください:

「いいね!」 3

docker-compose は「fig」というツールを基にしていると思います。

「いいね!」 1