我在看一些项目的部署文档时,有些人提到了 Foreman,看样子它是用来守护进程的。比如 puma/sidekiq/racecar 之类的进程挂了,foreman 可以自动把它们启动。
https://github.com/zendesk/racecar#deploying-consumers
If you're already deploying your Rails application using e.g. Capistrano, all you need to do to run your Racecar consumers in production is to have some process supervisor start the processes and manage them for you.
Foreman is a very straightford tool for interfacing with several process supervisor systems. You define your process types in a Procfile, e.g.
racecar-process-payments: bundle exec racecar ProcessPaymentsConsumer racecar-resize-images: bundle exec racecar ResizeImagesConsumer
熟悉 Linux 的朋友,可以讲一讲历史岁月吗?
Foreman 应该是最早受到了 Heroku 的影响(Heroku 是用 Procfile 管理用户项目所需服务的),开发的时候如果有一堆要起,用 Foreman 也比较方便。
我的理解是 foreman 是帮你一个指令起 application 所需的所有服务的东西,能统一配置环境啥的 没说可以管理 puma sidekiq 等服务挂不挂
守护进程的话我记得 ruby 是用 god , 但是 god 本身也需要跑在 daemon
systemd 的好处就是统一了各种语言,直接按规定的写
感觉 foreman 主要用于开发阶段 systemd 用于部署阶段
foreman 是开发环境用的,作者曾经在 heroku 工作,所以 Profile 和 heroku 的格式一样。
生产环境应该 export 到系统的管理配置,例如 upstart,stystemd http://ddollar.github.io/foreman/#EXPORT-FORMATS
foreman 诞生的时候 systemd 还没成为主流。
cap production foreman:export
Capfile
require 'capistrano/foreman'
lib/capistrano/tasks/foreman.rake
after 'deploy:finished' do
invoke 'foreman:export'
invoke 'foreman:restart'
end
拿走不谢
非常感谢你提供使用方法,但我问题是“为什么用 foreman?它和 systemd 的渊源是什么?”
此外我不打算使用它,有两点原因。
1. capistrano-puma 和 capistrano-sidekiq 都提供了脚本生成 systemd 文件,我感觉没有必要再引入一个 gem 做抽象。
cap production sidekiq:install
cap production puma:systemd:config
2. 我基本上不会在本地起守护进程,通常都是开一个新的 terminal 的 tab,然后运行 bundle exec sidekiq
你通常会在本地使用 foreman 吗?
按时间顺序,foreman 确实在 systemd 成熟之前,(那时候生产很多用 monit,sidekiq 还是自带 daemon,终于等到 systemd 成熟 sidekiq 等库在新版设计时候也去掉了自身的 daemon 机制,推荐用系统自带的机制);
linux 从原来的 init 机制,争议 systemd 是否管太多,切换到 systemd,再 systemd 支持 user level unit 等逐渐成熟,这个过程前有很多其它 daemon 方案,现在生产用 systemd 应该比较成熟了 (用容器是另一套方案)
foreman 方便本地开发(我本地会用),方便一键启关联服务,避免多终端看日志不方便等,好像 rails 7 默认的./bin/dev 执行的就是 forman start
现在开发环境已经需要四个进程,Rails,sidekiq,scss,esbuild,另开终端已经显得麻烦了。
Rails css/js-buundling 默认用 foreman 启动开发进程,因为 foreman 是 Ruby gem。
对我来说 docker 是更好的选择,开发环境用 docker compose,生产环境用 docekr swarm。
用 foreman:export 会在服务器生成各个 foreman 任务相关的 systemd 配置。
我的理解是,Rails 项目需要管理的进程除了 puma, sidekiq,可能还会有一系列用户编写的常驻进程,以 Procfile 的方式提供启动指令(比如监听 MQTT/RabbitMQ 的 worker)
本地用 foreman 的目的不是起守护进程,好处是 1.声明项目所有服务,是一个可执行的文档 2.统一 start stop 项目依赖的服务 3.开发环境和生产环境兼容
延伸一下这个问题。如果都已经使用 docker, 那么还有人在使用 rvm 管理 ruby veesion,或者 rvm-gemset 隔离 gem list 吗?
没有必要了吧。除非你打算把 docker 当虚拟机用。。。我见过在 docker 里先装 linux,再装 rbenv,再装 ruby 的情况(当然还有一大堆依赖),整个镜像大概 4G。完全不理解这样搞的好处。
我这边不太喜欢用 foreman 的原因是 我偶尔会在代码里加入 byebug 来进行调试
foreman 好像在遇到 byebug 的时候 没办法进行交互