ブログ(サーバーサイド編)
前回 wordpressのブログをNext.jsとGoに移行したという記事を書きました.特にサーバーサイドの話を今回書きたいと思います.
コードはGithubに上がっています.
技術構成
Goで書いています.
- Gin
- Gorm
- go-migrate
- mock
- blackfriday(Markdown パース用)
- zap (ログ)
ER図
データベースの中身です.
投稿とタグ・管理者ユーザーを管理するだけのかなりシンプルな構造です.
データベースの最新の状態をドキュメントとして保持するためにtblsを使用しています.CIでドキュメントを生成し,コミットしていますが,BOT化した方がわかりやすくて良いかもしれません.DBとappのコンテナを起動しているのはappの起動時にスキーマがDBへ反映されるからです.
name: Tbls
on: pull_request
jobs:
tbls:
name: Renew DB schema
runs-on: ubuntu-latest
steps:
- uses: actions/[email protected]
- name: create blog-network
run: docker network create blog-network
- name: create empty .env.secret
run: touch .env.secret
- name: Start blog-server docker
run: docker-compose -f docker-compose.local.yml up -d --build db app
- name: Wait for db connection
run: sleep 10
- name: run tbls doc
run: docker run --rm --net=blog-network --env-file=.env.local -v $PWD:/work k1low/tbls doc -f
- name: Commit tbls changes
uses: EndBug/[email protected]
with:
author_name: tbls
author_email: 'なんか適当に'
message: 'Renew DB table docs'
add: 'docs/'
アーキテクチャ
relaym-serverをベースにパッケージをわけています. 一部自分の使いやすいように名前やパッケージ構成を変えています. usecaseをinterface挟んでいないのですが,interface挟んだ方がテスト書きやすいかもしれないな,という気持ちです.
テスト
ほとんど単体テストのみです. gomockを使って作成していますが,generateなどを使ってないのでそのうち導入します.さんぽしさんがgomockhandlerというのを作っていたのでこれを使ってみるかもです. 今までは既にテスト基盤が整っている状態でテストを書いていたので,自分で0から書くのは新鮮であり,悩むことが多かったです.
今でも悩んでいること
- repositoryの単体テストでtransactionを取ってrollbackするか,実際にDBに反映してtruncateするか
- 副作用のある機能のテストで副作用の結果をどうやって確認するか(例: 本当にレコードが削除されたのかなど)
環境構築
docker-composeを用いて開発環境も本番環境も立ち上がるようになっています.ただ,これだとせっかくマルチステージビルドにしている恩恵が受けられてない(多分).AppとNginxとDBを別サーバーにデプロイするならイメージだけpullして実行すれば良いんですが,節約のために1つのEC2サーバーにデプロイするので,docker-composeで管理するのが一番楽な気がしています.もっと良い方法があれば教えてください...
DBのマイグレーション
go-migrateを使用しました. でもDBのマイグレーションに求められていることってなんなんでしょう,「sqlファイルを変更してそれがDBに反映されること」であれば別にマイグレーションツールを使う必要はなくてsqlファイルをインポートすればいいだけなんですよね.正直それ以上の使い方ができてません,どういう運用スタイルを取っていくべきなのかもっと考えないとなぁ...という気持ちです.
タグ
Loading...