ざっくりというと Web サイト(not Web アプリケーション)を作ったときに、公開はまだなんだけど共有したいなっていうのをなんとかする良さげソリューションがないような気がして自作した。
sters/onstatic: onstatic is static page hosting controller.
ビルドされたバイナリを動かしさえすればどこでも出来る。 都合によって CGI 対応をしたので、恐らく FTP 的なことしか出来ないようなレンタルサーバーでも使えるはず。少なくとも Apache で CGI するように設定したら動く。
使う手順はこんな具合。
- /registerにリクエストし、Git リポジトリをクローンできる URL をアプリケーションに登録する
- アプリケーション内でローカル git リポジトリの準備と SSH キーが生成、保存される。公開鍵がレスポンスになるので、メモしておく
- 公開鍵をクローンできるように登録
- /pullへリクエストすると 2 で保存した秘密鍵を使って 1 で指定したリポジトリを取りに行く
- リポジトリ名をハッシュ化したものがレスポンスされる
- アプリケーション URL/ハッシュ値/ファイルパス 的な URL でアクセスできるようになる
- リポジトリを更新したら /pullを呼べば git pull をしてくれる
GitHub であれば DeployKey に登録してしまうのがお手軽。書き込みすることは想定していないし。
実装は go-git を使っていて、中で git クライアントな振る舞いをしている。
src-d/go-git: A highly extensible Git implementation in pure Go.
この中で使っている billy.Filesystem がすごい便利だった。ファイル操作するテストとか書くのちょっとつらそうだなあと思ったけれど、インターフェース化されていて memfs な実装もあった。
src-d/go-billy: The missing interface filesystem abstraction for Go
アプリケーションサーバへのアクセスは、一定のフィルタしたあとに http.FileServer.ServeHTTP をしている。
onstatic/handler.go at master · sters/onstatic
その他、GitHub Actionsを使ってみたりなどした。リリース作るのがほぼ設定いらずの簡単サクッといけるの便利。
でもって、静的ファイルをシュッと共有できて便利になったのだった
1 バイナリでただのアプリケーションサーバなので nginx でプロキシしたり、認証挟んだり、いろいろ便利、かもしれない。
まあ Netlify 的なものなどでいいといえばいい。
Netlify: All-in-one platform for automating modern web projects.