与 @rosscdh 的一次侧面交流揭示了他的主要最终目标是在 Kubernetes 上运行 Discourse。这在此处并非受支持的配置。对于我们在 Docker/Kubernetes 相关方面的做法,确实存在合理的批评;然而,为了便于在自托管环境中使用,我们选择通过 launcher 采取这种方式。
我已重新开启此话题,但请保持文明和建设性。
与 @rosscdh 的一次侧面交流揭示了他的主要最终目标是在 Kubernetes 上运行 Discourse。这在此处并非受支持的配置。对于我们在 Docker/Kubernetes 相关方面的做法,确实存在合理的批评;然而,为了便于在自托管环境中使用,我们选择通过 launcher 采取这种方式。
我已重新开启此话题,但请保持文明和建设性。
不过在 ./launcher 开发出来之前,docker-compose 还没流行起来呢。![]()
如果你想在 k8s 或类似环境中启动,我的做法是用 launcher 构建镜像并将其推送到某个地方,然后让 k8s 来启动该镜像。Launcher 会执行一些操作,比如在升级时迁移数据库,因此你需要留意其工作原理。
谢谢你的反馈,
目标是让它更像 Docker 化,以便既能运行在 Kubernetes 上,也能通过 Docker 独立容器运行。
我成功使用 launcher 生成了一个超过 2GB 的镜像(包含 4 个插件,由于限制无法添加 6 个)。
我还用 Docker Compose 编排了它,现在它变成了一个清晰的运行手册。
我熟悉 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
## 支持多少并发 Web 请求?取决于内存和 CPU 核心数。
## 将根据检测到的 CPU 由 bootstrap 自动设置,你也可以覆盖
UNICORN_WORKERS: 3
## TODO: 此 Discourse 实例将响应的域名
DISCOURSE_HOSTNAME: discuss.monkey.tech:3001
DOCKER_USE_HOSTNAME: "true"
## 如果你希望容器启动时使用与上面指定的相同主机名(-h 选项)
## (默认为 "$hostname-$config"),请取消注释
#DOCKER_USE_HOSTNAME: true
## TODO: 初始注册时将设为管理员和开发者的逗号分隔邮箱列表
## 例如 'user1@example.com,user2@example.com'
DISCOURSE_DEVELOPER_EMAILS: 'me@example.com,you@example.com'
## TODO: 用于验证新账户和发送通知的 SMTP 邮件服务器
# 需要 SMTP 地址、用户名和密码
# 警告:SMTP 密码中的 '#' 字符可能会导致问题!
DISCOURSE_SMTP_ADDRESS: mailhog
#DISCOURSE_SMTP_PORT: 587
DISCOURSE_SMTP_USER_NAME: mailhog
DISCOURSE_SMTP_PASSWORD: password
#DISCOURSE_SMTP_ENABLE_START_TLS: true # (可选,默认为 true)
## 如果你添加了 Lets Encrypt 模板,请取消注释以下行以获取免费 SSL 证书
#LETSENCRYPT_ACCOUNT_EMAIL: me@example.com
## TODO: 配置与数据库的连接
# DISCOURSE_DB_SOCKET: ''
DISCOURSE_DB_HOST: postgres
DISCOURSE_DB_USERNAME: discourse
DISCOURSE_DB_PASSWORD: password
DISCOURSE_REDIS_HOST: redis
## 此 Discourse 实例的 http 或 https CDN 地址(配置为拉取)
## 详见 https://meta.discourse.org/t/14857
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 路由,nginx 也共享 assets:precompile 的输出。
下一步是只需设置一些调用镜像的指令,以“按需”预编译资产和运行 db:migrate,或者直接使用 exec 执行相同操作(因为这些项不常变化),并看看是否能将这个 2.6GB 的镜像体积减小。
感觉干净多了,如前所述,pup 功能是可行的;我也 appreciates 它提供的功能。我对构建方式(直接运行并使用 sudo 策略)有很多保留意见(这很少是我或我所认识的人的工作方式);通常镜像是独立构建并部署到其他地方的(如 kube、saltstack、nomad、docker-compose)。
我有一个潜在的 PR,用于添加 sample/kube.yml 和 applications/kubernetes.template.yml,因为有一些项目、覆盖项和设置需要禁用数据库和 Redis,然后在构建时实际禁用 Redis 和数据库,同时也禁用预编译。如果这感兴趣的话。
这是一次有趣的体验,感谢你的推动。
只有一个与 fixtures 相关的小奇怪问题(可能是由于多次调用 migrate 导致),
请查看附件图片
我认为 docker-compose 是基于一个名为 “fig” 的工具开发的。