Skip to content
返回部署

部署 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 以在退出前排空进行中的请求

常见问题解答