194 lines
5.2 KiB
Markdown
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
|
|
```
|