# 如何把專案部署到Railway上 - 筆記 ###### tags: `deployment` `Node.js` `database` `MySQL` :::warning :bulb: 本站筆記已同步更新到我的[個人網站](https://simplydevs.netlify.app/)囉! 歡迎參觀與閱讀,體驗不同的視覺感受! ::: [TOC] :::warning :bangbang: 2023/08 更新:Railway自2023年8月1日起[取消免費方案](https://blog.railway.app/p/pricing-and-plans-migration-guide-2023),最低收費Hobby Plan每個月5美元,各方案詳細收費標準可參考[官網](https://railway.app/pricing)。 ::: ## 專案簡介 用Node.js完成的互動式社交網站Simple Twitter,搭配關聯式資料庫MySQL(v8.0),採前後端分離開發,這次要部署的是後端repo。  <h4 style="text-align: center">專案前台登入操作示範</h4> ## Web Service部署 1. 先創一個[Railway](https://railway.app/)帳號 1. 完成後到**Dashboard**中按 **+ New Project** 1. 選擇要建立的project,這邊先介紹部署專案repo,所以先選 **Deploy from GitHub repo** --> **Configure GitHub App**,這邊會詢問GitHub的授權和要部署的repo,依個人需求選擇即可 1. GitHub授權完成後在 **New Project** 的區塊可以找到要部署的repo (如果沒看到可以重複3的步驟,就會看到剛剛選的repo),點進去可以看到 **Deploy Now** 和 **Add variables** (設置環境變數),這裡可以先把 **.env** 檔案中的環境變數填進去(這個步驟很重要,error常常是環境變數沒設定好發生的:fearful:)  3. 環境變數設定完,按**Deploy Now**就會開始部署  6. 部署完成點進 **View Logs** 看看是否有錯誤,如下圖Deploy Logs沒有error就成功啦!  7. 如果有錯誤可以檢查: - 環境變數是否正確:**Variables**中的環境變數和.env檔案中的環境變數是否一致 - **Settings** 中的設置,例如Start command是不是和啟動專案的command一樣,特別要注意檔案名稱,例如是node app.js 還是 node index.js 等等 - 在**Settings** 中也可以設置Automatic Deployments,如果GitHub上的檔案有更新會自動重新部署;另外也可以自動產生Domain或設定客製化Domain  ## MySQL 資料庫部署 Railway提供了4種資料庫的部署,PostgreSQL、Redis、MongoDB、MySQL,這個專案使用的是MySQL: - 點進Dashboard,找到剛剛部署好的專案點進去(注意是點進剛剛的專案再新增資料庫,不是直接在工作區新增一個資料庫,可以想成專案repo和資料庫是同捆包),按右上角的 **+New** --> **Database** --> **Add MySQL** - 很快的Railway幫我們新增了一個MySQL資料庫,點進資料庫找到**Connect**,有資料庫的連線資訊  - 打開MySQL WorkBench,新增一個連線,把這些資訊填進去,然後test connection,無誤的話可以順利進到資料庫工作區 - 這時候突然想到,還沒有把專案跟這個雲端資料庫連線,所以打開VScode來修改一下: ```node.js=17 # config.json "production": { "use_env_variable": "DB_URL" }, ``` ```node.js=3 # .env DB_URL=your_db_url ``` - 修改完再push到GitHub,注意Railway是否有自動重新部署,若沒有記得手動更新 - 資料庫現在是空的,我們要建立Schema並且把種子資料寫進去,這裡希望也可以用sequelize的指令操作,因此先下載[railway cli](https://docs.railway.app/develop/cli),詳細安裝方式請看railway的文件,<span style="color: darkred; font-weight:bold">注意如果是以npm安裝要先升級Node.js的版本到16,不然無法安裝!!</span> - 以下簡單寫一下CLI操作方式,**詳細都請參閱[官方文件](https://docs.railway.app/develop/cli)**: 1. 安裝完Railway CLI,終端機輸入 `railway login` 或`railway login --browserless`依照指示登入Railway 2. 和剛剛建立的專案連結,輸入後可以選擇專案和環境(預設是production): ``` # Link to a project railway link ``` 3. Railway提供了可以在本地使用和Railway專案相同環境變數進行開發的指令: ```Node.js=1 # Run <cmd> locally with the same environment variables as your Railway project railway run <cmd> # Run your Node.js project with your remote environment variables railway run npm start ``` - 現在要來進行資料的migration,在終端機使用熟悉的sequelize指令(先確認已切換到production模式): `railway run npx sequelize db:migrate`  出現了錯誤,呼叫Google大神,找到了[這篇文章](https://stackoverflow.com/questions/52815608/er-not-supported-auth-mode-client-does-not-support-authentication-protocol-requ) 在MySQL Workbench或MySQL CLI執行以下SQL query: `ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'password'` :::danger :warning: 注意!這裡的`root`和`password`要改成Railway雲端資料庫的user和password,才有權限操作資料庫,不然會出現另一個錯誤`ERROR: Access denied for user '<wrong_username>'@'<your_ip>' (using password: YES)` (密碼或使用者名稱不對都無法操作資料庫,可以參考[這篇文](https://stackoverflow.com/questions/17975120/access-denied-for-user-rootlocalhost-using-password-yes-no-privileges))  ::: - 再執行一次資料migration,這次就成功了;同理寫入種子資料:`railway run npx sequelize db:seed:all` - 回到Railway確認資料是否正確寫入:  點進table看看:   都沒問題囉,到這裡就完成了!:tada::tada::tada: ## 其他功能 這裡補充幾個Railway很方便的功能: - 在專案中可以直接用reference的方式引入環境變數(包含資料庫變數),連複製貼上都不用,真貼心 :heart_eyes:  - 設置shared variables:如果有多個專案要共用的環境變數,可以設置成shared variables,在其他專案也可以用reference的方式引入,相當方便!  - 可以邀請協作者編輯專案,但協作者無法看到環境變數,如果要分享讀取環境變數的權限可以使用token,協作者用CLI的指令讀取,詳細參考[文件](https://docs.railway.app/deploy/integrations#project-tokens) (此功能請小心使用): `RAILWAY_TOKEN=XXXX railway run`  ## 小結 沒有了Heroku這個方便~~免費~~的服務只好尋找替代品,本來試著部署在[Render](https://render.com/),雖然Render操作起來也非常之簡單易懂,無奈目前免費服務不提供MySQL資料庫部署(PostgreSQL是可以的,但90天到期後自動刪除資料庫),所以選擇了Railway,雖然功能或許沒有GCP或AWS強大,但對於個人小專案已經足夠,目前免費方案提供每月500小時或5美元的額度。**(2023/08 更新:Railway自2023年8月1日起[取消免費方案](https://blog.railway.app/p/pricing-and-plans-migration-guide-2023),最低收費Hobby Plan每個月5美元,各方案詳細收費標準可參考[官網](https://railway.app/pricing)。)** Railway的服務相對新,部署的時候遇到問題參考資料也不是很多,只能靠官方文件和自己摸索,希望這篇文能幫助到需要使用Railway服務的人! ::: success :crescent_moon: 本站內容僅為個人學習記錄,如有錯誤歡迎留言告知、交流討論! :::
×
Sign in
Email
Password
Forgot password
or
Sign in via Google
Sign in via Facebook
Sign in via X(Twitter)
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
Continue with a different method
New to HackMD?
Sign up
By signing in, you agree to our
terms of service
.