+++ date = "2022-08-31" tags = ["heroku","fly","northflank"] title = "fly.ioとnorthflankの感想" slug = "heroku-fly-northflank" +++ [heroku](https://www.heroku.com/)の移行先として挙げられる[fly.io](https://fly.io), [northflank](https://northflank.com/)の感想になります。 [https://news.ycombinator.com/item?id=32599398](https://news.ycombinator.com/item?id=32599398) `fly.io`が個人的には合っていると思いました。 fly.ioはdockerで動かしますが、goなどのbuild, deployが非常に快適でわかりやすかったです。mastodonはredisが入っているため動かすには工夫が必要ですが、go, rust, phoenixなどはそれらが必要ない場合が多く、go, rustはsingle-binaryなので、fly.tomlも書きやすい。 ### gitea 例えば、giteaはfly.ioで簡単に動きました。dockerを利用するので当たり前かもしれませんが、herokuでは相当の工夫が必要でした。 ```sh # create a directory to store fly.io application config mkdir gitea-on-fly # enter into the newly created directory cd gitea-on-fly # tell fly.io you wish to create a new application in the amsterdam region (there are many other regions you could pick too) # pick any name for the app that you'd like, in the example we are using `gitea-on-fly` flyctl launch --name gitea-on-fly --no-deploy --region ams # give the newely create application persistant storage, so your data persists between app updates flyctl volumes create gitea_data --size 1 --region ams --app gitea-on-fly ``` ```toml:fly.toml app = "gitea-on-fly" kill_timeout = 5 [build] image = "gitea/gitea:latest" # latest is the most recent stable release [env] GITEA__database__DB_TYPE="sqlite3" GITEA__database__PATH="/data/gitea/gitea.db" GITEA__server__DOMAIN="gitea-on-fly.fly.dev" GITEA__server__SSH_DOMAIN="gitea-on-fly.fly.dev" GITEA__server__ROOT_URL="https://gitea-on-fly.fly.dev" GITEA__security__INSTALL_LOCK="true" # Don't show installer # GITEA__service__DISABLE_REGISTRATION="true" # TODO: uncomment once you have created your first user # persist data [[mounts]] destination = "/data" source = "gitea_data" # ssh traffic [[services]] internal_port = 22 protocol = "tcp" [[services.ports]] port = 22 # https traffic [[services]] internal_port = 3000 protocol = "tcp" [[services.ports]] handlers = ["http"] force_https = true port = 80 [[services.ports]] handlers = ["tls", "http"] port = 443 ``` ```sh $ flyctl deploy $ flyctl open ``` https://blog.gitea.io/2022/04/running-gitea-on-fly.io/ #### cloudflare + fly.io + gitea(ssh) cloudflare : `dns -> cname -> disable proxy(dns only)` ```sh # add key $ ssh-keygen -t ed25519 -f ~/.ssh/xxx $ cat ~/.ssh/xxx|pbcopy # gitea -> account -> ssh -> key -> paste $ ssh -vT git@xxx.fly.dev $ ssh -vT git@example.com ``` ```sh $ git remote add ssh git@xxx.fly.dev:syui/repo.git $ git remote add origin git@example.com:syui/repo.git $ git remote add http https://example.com/syui/repo.git ``` ```sh:.git/config.txt [core] repositoryformatversion = 0 filemode = true bare = false logallrefupdates = true ignorecase = true precomposeunicode = true [remote "ssh"] url = git@xxx.fly.dev:user/repo.git fetch = +refs/heads/*:refs/remotes/origin/* [remote "origin"] url = git@example.com:user/repo.git fetch = +refs/heads/*:refs/remotes/origin/* [remote "http"] url = https://example.com/user/repo.git fetch = +refs/heads/*:refs/remotes/http/* [branch "main"] remote = origin merge = refs/heads/main ``` ```sh $ git push ssh main $ git push origin main $ git push http main ``` ### ent-ogent fly.ioではent-ogentも簡単でした。 https://entgo.io/ja/blog/2022/02/15/generate-rest-crud-with-ent-and-ogen/ ```toml:fly.toml app = "ent-ogent" kill_signal = "SIGINT" kill_timeout = 5 [build] builder = "paketobuildpacks/builder:base" buildpacks = ["gcr.io/paketo-buildpacks/go"] [env] PORT = "8080" [processes] api = "bin/t" [[services]] internal_port = 8080 processes = ["api"] protocol = "tcp" [[services.ports]] force_https = true handlers = ["http"] port = 80 [[services.ports]] handlers = ["tls", "http"] port = 443 ``` ただし、freeで運用するとなると、fly.ioはvmが3つまでです。 そこでnorthflankを試してみることにしました。 northflankはwebUIをポチポチやってればできます。大体はわかると思います。 goの場合、buildpackを選択し、build-contextを`/`にしました。 - addons : postgresを追加し、connectionを確認します。のちにenvのDATABASE_URLに入れます。いくつかenvが設定されるのでコードのほうを変更してもいい。 - services/port&dns : custom domainでcnameします。verifyしたら、後にselectします。 - services/cmd-overide : binaryを指定します。/bin/t - services/environment : DATABASE_URLを追加します。postgres-connection - services/builds : ここでコードをbuildします。 - services/instances(continer) : logはここから確認します。 ちなみに、northflank/cliも使ってみましたが、使いづらい印象があります。 ```sh $ yarn global add @northflank/cli $ northflank login $ sudo northflank forward addon --addonId postgres ```