Stories

Detail Return Return

前端學 Ruby:唐詩項目部署優化 - Stories Detail

前言

本篇文章和 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.tomlDockerfile 等文件

fly launch完成

我們不着急部署,先將數據庫導入

數據庫導入

上一步在執行的時候已經幫我們創建了數據庫,文檔裏已經描述瞭如何連接 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項目
user avatar linlinma Avatar freeman_tian Avatar qingzhan Avatar zourongle Avatar jilodream Avatar imba97 Avatar kohler21 Avatar tanggoahead Avatar hyfhao Avatar beckyyyy Avatar shuyuanutil Avatar esunr Avatar
Favorites 47 users favorite the story!
Favorites

Add a new Comments

Some HTML is okay.