@rosscdh とのサイドチャットから、彼の主な最終目標は Kubernetes 上の Discourse であることが明らかになりました。これは、ここではサポートされている構成ではありません。Docker/Kubernetes に関連する私たちのやり方については正当な批判もありますが、セルフホスティングの世界での使いやすさを考慮し、launcher でこのアプローチを選択しました。
このトピックを再オープンしましたが、礼儀正しく建設的な議論を続けてください。
@rosscdh とのサイドチャットから、彼の主な最終目標は Kubernetes 上の Discourse であることが明らかになりました。これは、ここではサポートされている構成ではありません。Docker/Kubernetes に関連する私たちのやり方については正当な批判もありますが、セルフホスティングの世界での使いやすさを考慮し、launcher でこのアプローチを選択しました。
このトピックを再オープンしましたが、礼儀正しく建設的な議論を続けてください。
でも、./launcher が開発された後で docker-compose が登場したんですよね。![]()
Kubernetes (k8s) や同様の環境で起動したい場合は、私はランチャーを使ってイメージをビルドし、どこかにプッシュしてから、k8s がそのイメージを起動するようにしています。ランチャーはアップグレード時にデータベースのマイグレーションなどを行う処理も行うため、その仕組みには注意が必要です。
ありがとうございます。
目標は、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 つだけあります。
添付画像をご覧ください:
docker-compose は「fig」というツールを基にしていると思います。