https://www.youtube.com/watch?v=-cEn_83zRFw
Summary:
Progress is our path,
Complexity builds the bridge,
Simplicity waits.
Rails 8.0 Beta 1: No PaaS Required https://rubyonrails.org/2024/9/27/rails-8-beta1-no-paas-required
Notes from the Opening Keynote by David Heinemeier Hansson at Rails World 2024 https://kyrylo.org/rails/2024/09/27/notes-from-the-opening-keynote-by-david-heinemeier-hansson-at-rails-world-2024.html
Rails 8 的思路还是不错的。一方面减少外部依赖:Solid Cache 如果真如 DHH 所述的那样,性能和 Redis 不相上下,那应用里多个 sqlite 文件做缓存真是一个很好的解决策略;Solid Queue 终于弥补了 Rails 没有默认 Queue 的问题;Thruster 可以在但应用场景下替换 Apache / Nginx。另一方面解决实际痛点,Kamal 2 的 5 分钟 Demo 还是很惊艳的。
Kamal 2,昨晚折腾了一晚上没部署起来。本地虚拟机测试的好得很,一上线部署就无法启动,不断的重启。查了各种资料,折腾到我早上 10 点了,改回 kamal 1.9 部署了。
刚开始没搞 Thruster,在 3000 启动服务,失败。后来给项目加了 Thruster,在 80 启动,继续失败。没脾气了,今天继续。
感谢一下啊,用 docker logs 容器id
,这个方法对我帮助很大。
在反复尝试下,我终于成功了。现在说明下碰到的问题:
国内这网络环境,Docker
用Kamal
是装不上去的。镜像也是不可能拉取下来的。请先用 SSH 连上服务器,自己把Docker
配置好
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
vim /etc/docker/daemon.json
{
"registry-mirrors": [
"https://docker.rainbond.cc"
]
}
sudo systemctl daemon-reload
sudo systemctl restart docker
thruster
是必须安装的,Let's Encrypt 的 SSL 证书需要在这里实现。
gemfile
里增加
gem "thruster", require: false
增加/bin/thrust
文件
#!/usr/bin/env ruby
require "rubygems"
require "bundler/setup"
load Gem.bin_path("thruster", "thrust")
Dockerfile
,最底下改为
EXPOSE 80
CMD ["./bin/thrust", "./bin/rails", "server"]
使用了以后,会在80端口
启动项目。
打开production.rb
,强制 SSL 需要关闭,如果开启无法启动容器。
config.force_ssl = false
虽然在config/deploy.yml
中,增加了 SSL 相关配置,但是启动会失败。
proxy:
ssl: true
host: clwy.cn
猜测可能是由于初次刚启动,thruster
申请的证书还没成功运行,项目就强制 HTTPS 了,导致kamal
检测失败。
不能用ip
,更不能用localhost
。kamal2
,创建了个叫做kamal
的网络,并把所有容器都加入进去了。
进入服务器上,docker ps
,可以看到自己运行的容器
redis
,那你代码中的地址,就应该是redis://clwy-redis:6379/0
clwy-db
Kamal 2
的变更较大,请想升级的朋友们,一定要做好测试。我先用虚拟机测(使用局域网桥接 ip),然后又搞了个临时服务器测试,最终才部署到正式服务器。
同时,我使用Kamal 2
,利用在deploy.yml
中的配置,已将其他服务已经更新到最新版本了
相对于Kamal 1
,最大的特点是部署速度变快了。之前用Kamal 1
,初次部署需要一个小时以上,它会反复的安装gem
,而且越安装越慢。之后再部署,只要不改gemfile
,仅修改代码,部署需要 10 分钟左右。
使用Kamal 2
,初次部署,大致 5 ~ 6 分钟左右。
Rails 增加了一个配置在应用层忽略 SSL,让前面的代理处理,避免重定向:
# Assume all access to the app is happening through a SSL-terminating reverse proxy.
# Can be used together with config.force_ssl for Strict-Transport-Security and secure cookies.
# config.assume_ssl = true
Kamal 2 新增了 kamal proxy 处理 SSL,不用 thruster 处理证书(而且它在代理后,处理不了部分证书校验)。不过 thruster 还可以用来处理文件传输之类,所以在 Rails 8 默认的 dockerfile 内。
Kamal 1 部署一个小时应该是 docker 缓存没做好,而且网络有问题。以前我部署一个应用也是 5~6 分钟。
感谢指正。
1 反复安装是什么毛病就不清楚了,我没有对默认 dockerfile 做很大的修改。2 的 dockerfile 与 1 的基本没差别。但是 2 里,再也没出现反复安装 gem 的情况了。
1 里,我还有个问题,会卡死在 RubyZip 3.0,必须安装 ruby 3.2.4,或以下版本才行。
2 里,我已经升到 3.3.5 最新版了,并开启了 yjit。
总而言之,言而总之。用 2 就对了,这次的版本对单机部署也很友好。之前在 1 里。为了实现单机部署,额外自己加了好多配置。
Solid 系列看起来很不错,只是 sidekiq 配合 redis 已经很成熟的方案了,现有用户迁移需求不大。
kamal 部署工具并没有让布署变得更简单,docker 是个大坑。能看到 rails 在减少部署复杂度方面做的努力,但布署真的是一件复杂的事情,靠工具没办法做到一劳永逸,只有用上了 heroku、vercel 那样专门公司做的服务才能让布署变的享受起来。
看出来了,Rails 8 的整体方向应该是提升 DX,减少依赖降低新手入门门槛(毕竟新开发者越来越少了)。
kamal 目前文档太少了,用的人也少,遇上很多莫名其妙的问题无从下手,自己做一些定制化配置也麻烦,kamal1,kamal2 都尝试过,最终还是放弃了,还不如用 capistrano 或 ansible 部署。
虽然 DHH 还是代表 rails 官方,但我觉得太多存量的 rails 应用似乎并没有啥特别大的理由用 solid 系列新 gem 替换已有的成熟方案,无论如何欢迎 rails 8 的发布。