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

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

Ubuntu 25.10 上部署 Rails 应用:从零到生产环境

概述

本文介绍在 Ubuntu 25.10 上使用 sqlite3 + Puma + Nginx 部署 Rails 应用的完整流程。本文以学习为目的,不使用现代化的自动部署工具,而是直接在 Linux 宿主机上从零搭建生产环境。

这种方式稳定可靠,足以应对多年的使用需求。尽管当前 AI 工具辅助开发已成为常态,但亲自动手实践仍是掌握技能的关键。

####本地开发环境

  • 操作系统: macOS
  • Ruby 版本: 3.2.9
  • Rails 版本: 7.2.3

参考文章: Ruby China 上的相关教程

由于原文章发布时间较早,本文结合当前技术环境优化了部署流程


前言

近期自学了 Rails 开发,借助 AI 辅助实现了应用的部署上线。作为服务端开发的新手,初次部署应用时确实遇到了一些挑战,但成功发布第一个 Web 应用是全栈开发道路上的一大步。

希望通过本文的分享,能够帮助更多 Ruby/Rails 初学者。亲手将自己开发的应用部署上线,这种创造带来的成就感远超刷手机的短暂快乐,也是持续学习的重要动力。


部署架构总览

请求流向

用户浏览器 → Nginx (80/443 端口) → Unix Socket/端口 → Puma (应用服务器) → Rails 应用

部署流程图(Google Cloud VM,1GB 内存)
┌─────────────────────────────────────────────────────────────────┐
│                     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: 本地准备工作

1.1 修改生产环境配置 在项目中的 /config/environments/production.rb 文件中,临时允许 HTTP 访问: config.force_ssl = false

1.2 代码提交到 GitHub

  • 将代码提交到 GitHub(如不想公开代码,请选择私有仓库)
  • 确保所有更改已提交并推送

1.3 生成生产环境密钥(非常重要!)

  • 在本地 Rails 项目目录运行以下命令: rails secret

复制输出的密钥(示例:3a5b8c9d7e6f1a2b3c4d5e6f7a8b9c0d...),稍后会用到。

阶段 2: 创建并连接到 Google 云服务器

2.1 创建云服务器

  • 区域选择:选择离您较近的区域(如香港)
  • 操作系统:Ubuntu 25.10
  • 网络配置:确保开启 HTTP 和 HTTPS 流量入口

2.2 通过 SSH 连接到服务器 ssh username@你的服务器 IP 地址 提示:如果不熟悉 SSH 连接,可以使用 Google Cloud Console 的 SSH 按钮或咨询 AI 工具获取帮助。

阶段 3: 配置服务器环境(首次部署必需)

  • 3.1 更新系统 sudo apt-get update
  • 3.2 安装必要工具包 这些软件包是编译和运行 Ruby on Rails 应用的基础依赖:

sudo apt-get install -y 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

  • 比喻:连接上云服务器就像搬进新家,需要先完成通水通电等基础装修,后续的应用程序(家电)才能正常工作。
  • 3.3 创建 Swap 虚拟内存(重要!)
# 创建 1GB Swap 文件(内存不足时可增加至 2GB)
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 方法二:使用 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 版本(根据项目需要调整)
rbenv install 3.2.0
rbenv global 3.2.0

#验证安装:
ruby -v
  • 3.5 安装 Bundler 和数据库
# 安装 Bundler(Ruby 依赖管理工具)
gem install bundler

# 安装 SQLite3(如项目使用)
sudo apt install -y sqlite3 libsqlite3-dev

# 或安装 PostgreSQL(如项目使用)
sudo apt install -y postgresql postgresql-contrib libpq-dev
  • 3.6 安装 Nginx sudo apt install -y nginx Nginx 比喻:如同机场航站楼,负责验证请求、路由转发、SSL/压缩处理和负载均衡。

阶段 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 config set --local without 'development test'
  bundle install
# 4.4 配置环境变量
# 创建 .env 文件:
  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

  • 4.5 数据库设置和资源预编译
# 创建数据库
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 停止测试

阶段 5: 配置 Puma 服务

  • 5.1 创建 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

需要替换的内容: 1.你的用户名:运行 whoami 查看 2.你的项目名:你的项目目录名 3./实际的bundle路径:运行 which bundle 获取

  • 5.2 启动并启用服务
# 重新加载 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 反向代理

6.1 创建 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;
}
  • 6.2 启用配置并重启 Nginx
# 启用站点配置
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

# 查看 Nginx 状态
sudo systemctl status nginx

阶段 7: 配置云服务器防火墙

注意:在创建虚拟机时已开启 HTTP/HTTPS 流量入口的,此步骤应该可跳过。 在 Google Cloud Console 中操作:

  • 1.导航到 VPC 网络 → 防火墙
  • 2.点击 创建防火墙规则
  • 3.配置 HTTP 规则: 名称:allow-http 目标:网络中的所有实例 来源 IP 范围:0.0.0.0/0 协议和端口:tcp:80

阶段 8: 测试访问 🎉

http://你的云服务器外部IP 如一切正常,您将看到您的 Rails 应用已成功上线!

希望你上线顺利 中途需要注意的几个点:

  • 1.环境变量配置完整准确
  • 2.Systemd 服务文件路径一定要正确
  • 3.Nginx 配置无误
  • 4.防火墙规则正确设置
  • 5.还有上线的时候一定要预编译 Rails 的资源文件,不然你的网页上图片会裂开(加载不了图片)hhh

如果你的项目没跑起来,也不要急。好好跟 AI 对话,把你查到的错误日志、或者查看到的状态码都发给 AI 分析,基本上都能通过。

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