# **Heroku難民漂流記之移居<span>fly.io</span>**
###### tags: `fly.io` `deploy` `Heroku` `部署`
> 有鑑於heroku取消了免費的服務,只能另覓他處。
---
# fly.io
> 目前使用fly,主要也是免費且方便部署。

## 在fly.io建立專案
> https://fly.io/docs/hands-on/
> 照著裡面的步驟,一步一步完成。
以下步驟皆在terminal完成(以MacOS為例),其他作業系統請參考[官網](https://hackmd.io/@littlehsun/r1RK0QDwj)。
1. 安裝`flyctl`
如果有homebrew的話,執行:
```
brew install flyctl
```
沒有就執行:
```
curl -L https://fly.io/install.sh | sh
```
2. 註冊
```
flyctl auth signup
```
會彈出瀏覽器視窗,可以直接連結GitHub或是用email建立帳號。
3. 登入
```
flyctl auth login
```
一樣會彈出視窗,登入完成後會到terminal。
前置作業完成了,可以開時進行專案部署了!
如果沒有現成的專案,是要從頭開始的話,可以下載[fly的官方範例](https://github.com/fly-apps/python-hellofly-flask),再加以修改。
先進入專案資料夾
```terminal
cd {project_folder}
```
4. 啟動一個專案
```
flyctl launch
```

如果原本有`Procfile`檔,會問是否要overwrite,選No就好。

輸入專案的名稱。

選擇喜歡的伺服器,比較近的應該是香港跟東京。

如果沒有要使用資料庫,就選`No`,要使用的話要研究一下收費標準。

執行完成後,會發現`{project_folder}`資料夾中多了一個`fly.toml`檔,這是fly的參數檔案,原則上可以不用去動,詳細參數調整可以參考[fly.io官網](https://fly.io/docs/reference/configuration/)。
要注意的是,如果從範例下載的`Procfile`檔,原本為`web: gunicorn server:app`記得改成自己的專案名稱以及執行方式。
5. 完成前面的步驟後,開始部署:
```
flyctl deploy
```

這時候如果打開[Dashboard](https://fly.io/dashboard/personal)會看到多了一個`fly-builder-#####`,那是執行deploy用的,完成後隔一段時間會自己關閉。
順利的話,等待執行完成,專案也就成功部署了!
BUT,如果很不幸的,執行了`flyctl deploy`後,發現卡在

一直沒有跳出`Building image with Buildpacks`,那就`ctrl+c`停止deploy,執行下面的指令([參考](https://community.fly.io/t/first-steps-with-nodejs-tutorial/4715/2)):
Install the prerelease:
```
curl -L https://fly.io/install.sh | sh -s pre
```
Then:
```
fly wireguard websockets enable
```
完成後再次執行`flyctl deploy`即可。
6. 可以執行`flyctl status`查看專案狀況。
其中`{hostname}`便是webhook所需要的網域,通常webhook網址會是`{hostname}/callback`,這邊就看個人程式內的設定了。
## 直接從heroku同步
> 最偷懶的方式就是直接從heroku同步到fly

如果原本使用heroku,可以直接用fly內建的轉換功能:
https://fly.io/launch/heroku
- 優點:簡單快速,選擇好要同步的專案等待同步完成即可。
- 缺點:要更新專案得從heroku端進行。
---