Ruby Ruby Girls Rails 项目传统部署流程分享,自学 web app 开发并已经上线💐

AixCoder · 2025年12月10日 · 45 次阅读

废话前言 (文章比较长,稍后再用 markdown 语法来优化排版) 参考了https://ruby-china.org/topics/25774这篇文章,因为发布的时间太旧了,所以结合当下的情况优化了部署流程

hello,近期自学了 Rails 开发,借助 AI 也已经实现了 web app 的上线。

分享一下小白部署 app 的经验,高手可直接跳过啦

因为没啥服务端的开发经验,没用过 Linux 服务器啥,但是有一点编程的基础。 所以初次部署 app 时还是有点费劲的 但是创作出了第一个 web app,也算是走出了全栈项目的第一大步。

前几天查找了论坛的部署教程,发现的确有些教程太旧了 所以想着这次记下 app 部署的环节,哪怕是像我这样的小白也能看得懂。

希望能给各位想学 Ruby 的小伙伴带来帮助,创作的乐趣远远大于刷手机 当你把你写的 app 部署上线了,属于编程的乐趣会让你开心好一阵子

核心理念:介绍在 Ubuntu25.10 上,用 sqlite3 + Puma + Nginx 部署 Rails 应用,以学习为主没有用更现代化的自动部署软件,而是直接在 Linux 宿主机上从零搭建生产环境。 这个方式稳稳妥妥的能用好几年,主要还是为了学习。 虽然现在有了 AI,不自己练习几遍,你永远是学不会的。 本地开发环境:Mac OS,Ruby 3.2.9 + Rails 7.2.3

宏观架构 (The Big Picture) 请求流向: User (Browser) -> Nginx (80/443) -> Unix Socket / Port -> Puma (App Server) -> Rails App

部署流程图(是在谷歌云上部署的,国内用户的参考阿里云服务器,流程大同小异) ┌─────────────────────────────────────────────────────────────────┐ │ Rails 应用部署完整流程 │ │ (1GB Google Cloud VM) │ └─────────────────────────────────────────────────────────────────┘ 开始 │ ▼ ┌──────────────────────────────────────────────────────────────────┐ │ 阶段 1: 本地准备工作 │ │ ┌────────────────────────────────────────────────────────┐ │ │ │ 1.1 确保代码已提交到 Git │ │ │ │ git add . && git commit -m "Ready to deploy" │ │ │ │ │ │ │ │ 1.2 推送到 GitHub/GitLab │ │ │ │ git push origin main │ │ │ │ │ │ │ │ 1.3 准备环境变量清单 │ │ │ │ - SECRET_KEY_BASE │ │ │ │ - DATABASE_PASSWORD │ │ │ │ - 其他敏感信息 │ │ │ └────────────────────────────────────────────────────────┘ │ └──────────────────────────────────────────────────────────────────┘ │ ▼ ┌──────────────────────────────────────────────────────────────────┐ │ 阶段 2: 连接到 Google Cloud VM │ │ ┌────────────────────────────────────────────────────────┐ │ │ │ 2.1 获取 VM 外部 IP 地址 │ │ │ │ GCP 控制台 → Compute Engine → VM 实例 │ │ │ │ 记录:外部 IP = XXX.XXX.XXX.XXX │ │ │ │ │ │ │ │ 2.2 通过 SSH 连接 │ │ │ │ ssh [email protected] │ │ │ │ 或使用 GCP 控制台的 SSH 按钮 │ │ │ └────────────────────────────────────────────────────────┘ │ └──────────────────────────────────────────────────────────────────┘ │ ▼ ┌──────────────────────────────────────────────────────────────────┐ │ 阶段 3: 配置服务器环境 (首次需要) │ │ ┌────────────────────────────────────────────────────────┐ │ │ │ 3.1 更新系统 │ │ │ │ sudo apt update && sudo apt upgrade -y │ │ │ │ │ │ │ │ 3.2 安装基础工具 │ │ │ │ sudo apt install -y curl git build-essential │ │ │ │ │ │ │ │ 3.3 创建 Swap (重要!) │ │ │ │ sudo fallocate -l 1G /swapfile │ │ │ │ sudo chmod 600 /swapfile │ │ │ │ sudo mkswap /swapfile && sudo swapon /swapfile │ │ │ │ │ │ │ │ 3.4 安装 Ruby (rbenv) │ │ │ │ git clone https://github.com/rbenv/rbenv.git │ │ │ │ # ... (详细步骤见下方) │ │ │ │ │ │ │ │ 3.5 安装数据库 (PostgreSQL 或 SQLite) │ │ │ │ sudo apt install -y postgresql libpq-dev │ │ │ │ │ │ │ │ 3.6 安装 Nginx │ │ │ │ sudo apt install -y nginx │ │ │ └────────────────────────────────────────────────────────┘ │ └──────────────────────────────────────────────────────────────────┘ │ ▼ ┌──────────────────────────────────────────────────────────────────┐ │ 阶段 4: 部署应用代码 │ │ ┌────────────────────────────────────────────────────────┐ │ │ │ 4.1 创建项目目录 │ │ │ │ sudo mkdir -p /var/www │ │ │ │ sudo chown $USER:$USER /var/www │ │ │ │ │ │ │ │ 4.2 克隆项目 │ │ │ │ cd /var/www │ │ │ │ git clone https://github.com/.git你的项目 │ │ │ │ cd 你的项目名 │ │ │ │ │ │ │ │ 4.3 安装 Gem 依赖 │ │ │ │ bundle config set --local deployment 'true' │ │ │ │ bundle install │ │ │ │ │ │ │ │ 4.4 配置环境变量 │ │ │ │ nano .env │ │ │ │ # 填入 SECRET_KEY_BASE 等 │ │ │ │ │ │ │ │ 4.5 设置数据库 │ │ │ │ RAILS_ENV=production rails db:create │ │ │ │ RAILS_ENV=production rails db:migrate │ │ │ │ │ │ │ │ 4.6 预编译资源 │ │ │ │ RAILS_ENV=production rails assets:precompile │ │ │ └────────────────────────────────────────────────────────┘ │ └──────────────────────────────────────────────────────────────────┘ │ ▼ ┌──────────────────────────────────────────────────────────────────┐ │ 阶段 5: 配置 Puma 服务 │ │ ┌────────────────────────────────────────────────────────┐ │ │ │ 5.1 创建 Systemd 服务文件 │ │ │ │ sudo nano /etc/systemd/system/rails.service │ │ │ │ │ │ │ │ 5.2 启动服务 │ │ │ │ sudo systemctl daemon-reload │ │ │ │ sudo systemctl enable rails │ │ │ │ sudo systemctl start rails │ │ │ │ │ │ │ │ 5.3 检查状态 │ │ │ │ sudo systemctl status rails │ │ │ └────────────────────────────────────────────────────────┘ │ └──────────────────────────────────────────────────────────────────┘ │ ▼ ┌──────────────────────────────────────────────────────────────────┐ │ 阶段 6: 配置 Nginx 反向代理 │ │ ┌────────────────────────────────────────────────────────┐ │ │ │ 6.1 创建 Nginx 配置 │ │ │ │ sudo nano /etc/nginx/sites-available/rails │ │ │ │ │ │ │ │ 6.2 启用配置 │ │ │ │ sudo ln -s /etc/nginx/sites-available/rails \ │ │ │ │ /etc/nginx/sites-enabled/ │ │ │ │ sudo rm /etc/nginx/sites-enabled/default │ │ │ │ │ │ │ │ 6.3 测试并重启 Nginx │ │ │ │ sudo nginx -t │ │ │ │ sudo systemctl restart nginx │ │ │ └────────────────────────────────────────────────────────┘ │ └──────────────────────────────────────────────────────────────────┘ │ ▼ ┌──────────────────────────────────────────────────────────────────┐ │ 阶段 7: 配置防火墙 │ │ ┌────────────────────────────────────────────────────────┐ │ │ │ 7.1 在 GCP 控制台配置防火墙规则 │ │ │ │ VPC 网络 → 防火墙 → 创建防火墙规则 │ │ │ │ - 允许 tcp:80 (HTTP) │ │ │ │ - 允许 tcp:443 (HTTPS) │ │ | | 其实在创建虚拟机的时候,把 https 和 http 流量入口都打开,应该就可以了 │ └────────────────────────────────────────────────────────┘ │ └──────────────────────────────────────────────────────────────────┘ │ ▼ ┌──────────────────────────────────────────────────────────────────┐ │ 阶段 8: 测试访问 │ │ ┌────────────────────────────────────────────────────────┐ │ │ │ 8.1 在浏览器中访问 │ │ │ │ http://你的云服务器外部IP │ │ │ │ │ │ │ │ 8.2 验证网站正常显示│ └─────────────────── ─────────────────────────────────────┘ │ └──────────────────────────────────────────────────────────────────┘ │ ▼ 部署完成!🎉

阶段 1: 本地准备工作 本地先修改代码 生产环境下,暂时先运行用 http 访问 在项目里/config/environments/production.rb 改动代码:config.force_ssl = false

1.1 代码提交到 github,如果不想公开你的代码,记得选私有的代码仓库 1.2 生成生产环境密钥(非常重要!)

在本地 Rails 项目目录运行,生成密钥

rails secret

复制输出的密钥,稍后会用到

例如:3a5b8c9d7e6f1a2b3c4d5e6f7a8b9c0d...

阶段 2: 创建并连接到 Google 云服务器 创建云服务器 区域选择离你比较近的,比如选择香港

操作系统我设定的是 Ubuntu-2510 网络--防火墙--记得开启 http 和 https

创建好了服务器,你的 web app 便有了一个新家 开发的时候,你的 web app 是运行在自己电脑上的嘛 现在有了台云端计算机,并且也给新电脑安装好了操作系统 Ubuntu

接下来用 ssh 链接到云服务器 如果你不会 ssh 链接到你的云服务器 那么赶紧打开 AI 工具,问 AI 如何用传统的 ssh 链接到云服务器

阶段 3,配置云服务器环境(第一次部署必须的) ssh 连接上云服务器后,你就相当于来到了一个新家 新家(新电脑)上啥也没有 3.1 --你在终端先执行

更新系统

sudo apt-get update

3.2-----#在进行一些必要的工具的安装(Ruby的项目要能运行,得建立在这些必要的软件包之上) sudo apt-get install git curl zlib1g-dev build-essential \ libssl-dev libreadline-dev libyaml-dev libsqlite3-dev sqlite3 \ libxml2-dev libxslt1-dev libcurl4-openssl-dev libffi-dev \ libvips

以上这些软件包通常是编译和运行 Ruby on Rails 应用所需的基础依赖。 在部署 Rails 应用之前,安装这些可以确保后续安装 Ruby、编译原生扩展等过程顺利进行。 就如同你来到了你的新家,你得给家里通水通电,完成最基础的装修工作。这样后续 Rails 应用程序(小家电等)来了,能正常的工作。

3.3---# 创建 1GB Swap(可能重要!,如果你买的便宜的云服务器,只有少量的运行内存,那么建议开启虚拟内存,1 个 GB 不够就来 2GB hhh) sudo fallocate -l 1G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

验证 Swap 虚拟内存

free -h

3.4----安装 Ruby sudo apt-get install -y ruby-full

在 Ubuntu 的软件仓库中,ruby-full 通常会安装当前 Ubuntu 版本所提供的最新稳定版 Ruby 这个安装方式很快就能帮助新手安装完 Ruby,避免其他因为网络问题导致的安装失败

或者你有需要指定使用某个版本的 Ruby,尝试用 rbenv 或者其他的工具来安装 Ruby

安装 rbenv

git clone https://github.com/rbenv/rbenv.git ~/.rbenv echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc echo 'eval "$(rbenv init -)"' >> ~/.bashrc source ~/.bashrc

安装 ruby-build

git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build

安装 Ruby 3.2.0(根据你的项目版本调整)

rbenv install 3.2.0 rbenv global 3.2.0

安装后查看 Ruby 的版本号

ruby -v

安装完 Ruby 后,别忘了安装 Bundler

Bundler 是 Ruby 项目中的一个重要工具,它用于管理项目依赖

进一步安装 gem install bundler

3.5--安装数据库 我的项目用的 sqlite3 sudo apt install -y sqlite3 libsqlite3-dev(前面做基础装修的时候已经安装了,所以可以跳过)

PostgreSQL(根据你项目的需要) sudo apt install -y postgresql postgresql-contrib libpq-dev

创建数据库用户

sudo -u postgres createuser -s $USER

创建数据库

sudo -u postgres createdb myapp_production

3.6----安装 Nginx sudo apt install -y nginx

Nginx 就像航站楼:

  1. 检查机票(验证请求)
  2. 指引去哪个登机口(路由请求)
  3. 处理行李托运(SSL/压缩)
  4. 紧急疏散(负载均衡)

阶段 4: 部署应用代码(开始搬家,把你的代码搬到云服务器上,在云端运行你写的 app)

创建项目目录

sudo mkdir -p /var/www sudo chown $USER:$USER /var/www

克隆项目

cd /var/www git clone https://github.com//你的项目.git你的用户名 cd 你的项目名

安装依赖(不安装开发环境的 gem)

bundle config set --local deployment 'true' bundle config set --local without 'development test' bundle install

创建环境变量文件

nano .env .env 文件内容:

粘贴以下内容,替换实际值

Rails 环境

RAILS_ENV=production RAILS_SERVE_STATIC_FILES=true

密钥(使用之前生成的)

SECRET_KEY_BASE=复制你之前生成的密钥

数据库配置(SQLite)

DATABASE_URL=sqlite3:db/production.sqlite3

或 根据你项目的需要的是 PostgreSQL

DATABASE_URL=postgresql://用户名:密码@localhost/myapp_production

Puma 配置(1GB 优化)

RAILS_MAX_THREADS=5 WEB_CONCURRENCY=2

日志级别

RAILS_LOG_LEVEL=info

允许的主机(重要!)

ALLOWED_HOSTS=你的 VM 外部 IP

保存并退出(Ctrl + O 是保存,Ctrl+X 退出文件)

数据库设置

RAILS_ENV=production bundle exec rails db:create RAILS_ENV=production bundle exec rails db:migrate

预编译资源

RAILS_ENV=production bundle exec rails assets:precompile

测试启动(可选)

RAILS_ENV=production bundle exec rails server -b 0.0.0.0 -p 3000 这里就能在终端看到你的项目跑起来了,看看有没有错误吧

按 Ctrl+C 停止 Rails 项目

阶段 5: 配置 Puma 服务 相当于给你的 Rails 应用安装的"自动启动和监控管家":

创建 Systemd 服务文件 sudo nano /etc/systemd/system/rails.service 粘贴以下内容:

[Unit] Description=Rails Application (Puma) After=network.target

[Service] Type=simple User=你的用户名 WorkingDirectory=/var/www/你的项目名 EnvironmentFile=/var/www/你的项目名/.env ExecStart= /实际的 bundle 路径 exec puma -C config/puma.rb Restart=always RestartSec=10 StandardOutput=append:/var/www/你的项目名/log/puma.log StandardError=append:/var/www/你的项目名/log/puma_error.log

[Install] WantedBy=multi-user.target

替换内容: 你的用户名:运行 whoami 查看 你的项目名:你的项目目录名 注意:ExecStart 处填写你云服务器上 bundle 的安装路径,这里填错了会导致项目跑不起来

检查 bundle 命令路径

which bundle

输出可能是:

/home/ubuntu/.rbenv/shims/bundle ✓ 正确

或 /usr/local/bin/bundle

或 /usr/bin/bundle

配置完成,保存并退出

重新加载 systemd

sudo systemctl daemon-reload

启用服务(开机自启)

sudo systemctl enable rails

启动服务

sudo systemctl start rails

查看状态

sudo systemctl status rails

如果有错误,查看日志

sudo journalctl -u rails -n 50

阶段 6: 配置 Nginx sudo nano /etc/nginx/sites-available/rails

upstream puma { server 127.0.0.1:3000 fail_timeout=0; }

server { listen 80; server_name 你的云服务器外部 IP;

root /var/www/你的项目名/public;

# 静态文件 location ~ ^/(assets|packs)/ { gzip_static on; expires max; add_header Cache-Control public; }

try_files $uri/index.html $uri @puma;

location @puma { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_set_header X-Forwarded-Proto $scheme; proxy_redirect off; proxy_pass http://puma; }

error_page 500 502 503 504 /500.html; client_max_body_size 10M; keepalive_timeout 10; }

替换内容: 你的 VM 外部 IP: 你的实际 IP 你的项目名:你的项目目录名 保存配置并退出

启用配置

sudo ln -s /etc/nginx/sites-available/rails /etc/nginx/sites-enabled/

删除默认配置

sudo rm /etc/nginx/sites-enabled/default

测试配置

sudo nginx -t

重启 Nginx

sudo systemctl restart nginx

查看状态

sudo systemctl status nginx

阶段 7: 配置 云服务器 防火墙 在 GCP 控制台操作: 打开 GCP 控制台 导航到 VPC 网络 → 防火墙 点击 创建防火墙规则 创建 HTTP 规则: 名称:allow-http 目标:网络中的所有实例 来源 IP 范围:0.0.0.0/0 协议和端口:tcp:80

阶段 8: 测试访问 🎉 http://你的云服务器外部IP

暂无回复。
需要 登录 后方可回复, 如果你还没有账号请 注册新账号