部署 Ruby on Rails
约定优于配置的 Ruby 框架,用 Puma、Kamal 或 Heroku,含资源管道和 Sidekiq。
平台高级
为什么
Rails 约定优于配置和丰富默认(ActiveRecord、ActionPack)实现快速开发。Kamal(原 MRSK)提供零停机 Docker 部署到任何服务器,无需 Kubernetes。
平台即服务采用率 2024 年增长 24%,团队从虚拟机管理转向 git push 部署。the cloud infrastructure market reached $330B in 2024, growing 22% year-over-year (Synergy Research),PaaS 层捕获了大多数新工作负载。
何时使用
Ruby Web 应用、MVP 和重视开发者幸福的团队用 Rails。VPS 部署选 Kamal;简单选 Heroku。
如何做
1. 构建 — bundle install --deployment,RAILS_ENV=production bundle exec rake assets:precompile
2. Puma — bundle exec puma -C config/puma.rb,多 worker Web 服务器
3. Kamal — kamal deploy,经 SSH 零停机 Docker 到 VPS
4. Heroku — git push heroku main,buildpack 自动构建
5. DB — 部署时 rails db:migrate(Heroku release 阶段)
6. Sidekiq — bundle exec sidekiq 异步任务,需 Redis
7. 环境 — RAILS_ENV=production,SECRET_KEY_BASE,DATABASE_URL
示例
# Dockerfile — Rails + Puma
FROM ruby:3.3-slim AS build
WORKDIR /app
COPY Gemfile Gemfile.lock ./
RUN bundle install --deployment
COPY . .
RUN RAILS_ENV=production bundle exec rake assets:precompile
FROM ruby:3.3-slim
WORKDIR /app
COPY --from=build /app /app
EXPOSE 3000
CMD ["bundle", "exec", "puma", "-C", "config/puma.rb"]
# config/puma.rb — 生产
workers ENV.fetch("WEB_CONCURRENCY", 2).to_i
threads_count = ENV.fetch("RAILS_MAX_THREADS", 5).to_i
threads threads_count, threads_count
preload_app!
# config/deploy.yml — Kamal
service: myapp
image: myuser/myapp
servers:
- 203.0.113.10
env:
clear:
RAILS_ENV: production
secret:
- DATABASE_URL
- SECRET_KEY_BASE
常见问题
- ⚠生产资源缺失 — 忘记 assets:precompile 或 config.assets.compile=false
- ⚠Puma 单 worker — 未用 WEB_CONCURRENCY,仅一个 CPU 核
- ⚠Sidekiq 任务静默失败 — Redis 未配置或 Sidekiq 进程未运行
最佳实践
- ✓VPS 零停机 Docker 部署用 Kamal — 比 Kubernetes 简单,无额外基础设施
- ✓Puma 设 preload_app! — 写时复制共享代码节省 worker 间内存
- ✓设置健康检查和优雅关闭 — 处理 SIGTERM 以在退出前排空进行中的请求