1
0
hugo/content/blog/2022-08-31-fly.md
2024-04-23 22:21:26 +09:00

194 lines
5.2 KiB
Markdown

+++
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
```