mesimasi Logo

ブログ(サーバーサイド編)

ブログ(サーバーサイド編)_thumbnail

前回 wordpressのブログをNext.jsとGoに移行したという記事を書きました.特にサーバーサイドの話を今回書きたいと思います.

コードはGithubに上がっています.

技術構成

Goで書いています.

  • Gin
  • Gorm
  • go-migrate
  • mock
  • blackfriday(Markdown パース用)
  • zap (ログ)

ER図

データベースの中身です. blog-schema 投稿とタグ・管理者ユーザーを管理するだけのかなりシンプルな構造です. データベースの最新の状態をドキュメントとして保持するために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...

利用規約

copyright ©めしまし All Rights Reserved.