本文介绍在 Ubuntu 25.10 上使用 sqlite3 + Puma + Nginx 部署 Rails 应用的完整流程。本文以学习为目的,不使用现代化的自动部署工具,而是直接在 Linux 宿主机上从零搭建生产环境。
这种方式稳定可靠,足以应对多年的使用需求。尽管当前 AI 工具辅助开发已成为常态,但亲自动手实践仍是掌握技能的关键。
####本地开发环境
参考文章: Ruby China 上的相关教程
由于原文章发布时间较早,本文结合当前技术环境优化了部署流程
近期自学了 Rails 开发,借助 AI 辅助实现了应用的部署上线。作为服务端开发的新手,初次部署应用时确实遇到了一些挑战,但成功发布第一个 Web 应用是全栈开发道路上的一大步。
希望通过本文的分享,能够帮助更多 Ruby/Rails 初学者。亲手将自己开发的应用部署上线,这种创造带来的成就感远超刷手机的短暂快乐,也是持续学习的重要动力。
用户浏览器 → Nginx (80/443 端口) → Unix Socket/端口 → Puma (应用服务器) → Rails 应用
┌─────────────────────────────────────────────────────────────────┐
│ 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 修改生产环境配置
在项目中的 /config/environments/production.rb 文件中,临时允许 HTTP 访问:
config.force_ssl = false
1.2 代码提交到 GitHub
1.3 生成生产环境密钥(非常重要!)
复制输出的密钥(示例:3a5b8c9d7e6f1a2b3c4d5e6f7a8b9c0d...),稍后会用到。
2.1 创建云服务器
2.2 通过 SSH 连接到服务器 ssh username@你的服务器 IP 地址 提示:如果不熟悉 SSH 连接,可以使用 Google Cloud Console 的 SSH 按钮或咨询 AI 工具获取帮助。
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
# 创建 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
# 安装 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
# 安装 Bundler(Ruby 依赖管理工具)
gem install bundler
# 安装 SQLite3(如项目使用)
sudo apt install -y sqlite3 libsqlite3-dev
# 或安装 PostgreSQL(如项目使用)
sudo apt install -y postgresql postgresql-contrib libpq-dev
#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
# 创建数据库
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 停止测试
粘贴以下内容(根据实际情况修改):
[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 获取
# 重新加载 systemd 配置
sudo systemctl daemon-reload
# 启用开机自启
sudo systemctl enable rails
# 启动服务
sudo systemctl start rails
# 查看服务状态
sudo systemctl status rails
# 如有错误,查看日志
sudo journalctl -u rails -n 50
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;
}
# 启用站点配置
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
注意:在创建虚拟机时已开启 HTTP/HTTPS 流量入口的,此步骤应该可跳过。 在 Google Cloud Console 中操作:
http://你的云服务器外部IP 如一切正常,您将看到您的 Rails 应用已成功上线!
希望你上线顺利 中途需要注意的几个点:
如果你的项目没跑起来,也不要急。好好跟 AI 对话,把你查到的错误日志、或者查看到的状态码都发给 AI 分析,基本上都能通过。