前言
本篇文章和 Ruby 關係不大,只是涉及到部署問題
前文花了不少時間從零到部署唐詩項目,當時因為篇幅問題留下了不少的坑
例如可以採用 docker-compose 來代替兩個容器互相訪問、使用 shell 命令在本地部署,本文並未對其進行改造,因為傳統部署 Ruby on Rails 的弊端很明顯,需要運維經驗。為快速部署 Rails 引用,筆者尋覓到了 fly.io。本文將在唐詩項目基礎上將其部署到 fly.io 上
回顧唐詩 API
- 隨機出現一首詩:/poetry/random
- 用詩的題目查詢:/poetry/title/靜夜思
- 列出這個詩人的所有詩:/poetry/author/李白
- 列出這個詩人的這首詩:/poetry/author/張若虛/title/春江花月夜
如何啓動
先將項目中的 tangpoetry.sql 導入到 postgresql 數據庫。可以使用 pgAdmin 也可以使用命令行 psql 導入數據
再 rails s 啓動項目
檢查本地啓動沒問題後,開始部署項目
部署項目
官方 Rails 部署教程 已經寫的很清楚了,可以按照上面的做一遍練練手
這裏我們按照親身體驗 Fly.io 來手把手體驗 Fly.io
安裝 flyctl
安裝方式可以參考官方文檔:https://fly.io/docs/hands-on/install-flyctl/
因為筆者是 window,可運行以下命令安裝
pwsh -Command "iwr https://fly.io/install.ps1 -useb | iex"
# 或者
powershell -Command "iwr https://fly.io/install.ps1 -useb | iex"
如果執行 flyctl version 不報錯,就説明安裝成功了
flyctl version
# flyctl.exe v0.1.32 windows/amd64
註冊 fly.io
如果這是您第一次使用 Fly.io,則需要註冊一個帳户
fly auth signup
註冊完之後,登錄 fly.io
登錄 fly.io
如果您已經擁有 Fly.io 帳户,則只需使用 flyctl 登錄即可
fly auth login
啓動應用程序
先進入我們的 tangpoetry API 項目,在命令行中敲入:
fly launch # 創建我們的應用
命令行會提示幾個問題:
Creating app in D:\workspace\ruby\tangpoetry
Scanning source code
Detected a Rails app
? Choose an app name (leave blank to generate one):
? Choose a region for deployment: Hong Kong, Hong Kong (hkg)
? Would you like to set up a Postgresql database now? Yes
? Select configuration: Development - Single node, 1x shared CPU, 256MB RAM, 1GB disk
? Would you like to set up an Upstash Redis database now? No
? Create .dockerignore from 1 .gitignore files? No
這裏的 app name 將來會是項目的名字,具有唯一性。後面是否創建 postgresql 數據庫,筆者直接選擇創建數據庫,fly.io 創建完數據庫後,給在界面上給出數據庫的用户名密碼等信息。Redis 不需要不用部署
當命令執行完畢,fly 會創建fly.toml 和 Dockerfile 等文件
我們不着急部署,先將數據庫導入
數據庫導入
上一步在執行的時候已經幫我們創建了數據庫,文檔裏已經描述瞭如何連接 fly postgres,這裏有個坑,比如起初用psql postgres://{username}:{password}@{hostname}:{port}/{database}?options 這種方式連接fly 數據庫時就是連接不通。因為 fly.io 做過限制,Fly Postgres 的數據庫是內部網絡,默認情況下是不會公開,所以是連接不上的。我們可以分配 ip 地址,但是這個需要錢,一個月2美元
當你想分配公共的 ip 地址時:
fly ips allocate-v4 --app <pg-app-name>
# Looks like you're accessing a paid feature. Dedicated IPv4 addresses now cost $2/mo. Are you ok with this?
所以用外部連接的方式行不通,筆者這裏採用的是fly proxy 將服務器端口轉發到本地服務上
唐詩項目的執行如下:
fly proxy 5433 -a tangpoetry-db
因為本地已經開了 5432 的端口,故用 5433 代替
轉發的終端就開着,另起一個終端來進行之後的命令
再通過 psql 連接就能通了
psql "postgres://postgres:<password>@localhost:5433"
將根目錄中的 tangpoetry.sql 導入到 fly postgres 數據庫中,查看有數據後,我們進入 config/database.yml ,修改 production 的配置
production:
<<: *default
database: postgres
username: postgres
password: <%= ENV["DB_PASSWORD"] %>
host: <%= ENV["DB_HOST"] %>
將數據庫密碼和主機寫進 fly secrets 中
flyctl secrets set DB_PASSWORD=DB_PASSWORD
flyctl secrets set DB_PASSWORD=DB_HOST
部署
fly deploy # 部署
筆者這裏沒有用默認的 Dockerfile,因為就是跑不通,後來自己寫了個 Dockerfile 才部署成功
訪問:https://tangpoetry.fly.dev/poetry/random ,能訪問成功了,我們成功了
別的有用的flyctl 命令
- 創建 postgresql 數據庫:
fly pg create - 查看 postgresql 數據庫列表:
fly pg list - 通過 ssh 進入您的虛擬機:
fly ssh console - 查看應用狀態:
flyctl status - 查看應用信息:
flyctl info - 查看應用列表:
flyctl apps list - 查看應用的IP:
flyctl ips list - 銷燬某個應用:
flyctl apps destroy <appname>
總結
正所謂:別人笑我太瘋癲,我笑他人看不穿。這個項目正是無語至極之作品
項目地址:https://github.com/johanazhu/tangpoetry
預覽地址:https://tangpoetry.fly.dev/
參考資料
- 在 Fly.io 部署 Rails 應用
系列文章
- 前端學Ruby:前言
- 前端學 Ruby:安裝Ruby、Rails
- 前端學 Ruby:熟悉 Ruby 語法
- 前端學 Ruby:熟悉Rails
- 前端學 Ruby:唐詩API項目