Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

9 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

docker-go-gin-gorm

https://qiita.com/fujifuji1414/items/b95d3f0d5f79d77360cb

https://qiita.com/sedori/items/840e39a0cbf9d5bff006 を利用・参照させてもらった、Dockerで完結する認証付きWeb APIの開発テンプレートです

  • 構成物 : MySQL + Go + Gin + GORM + JWT + Air (ホットリロード用)

  • 各ソフトウェア・ライブラリのバージョンは基本 latest

  • 独自に足したもの

    • Makefileでの便利コマンド

    • JWTのハッシュアルゴリズムを RS512 (RSA-SHA256) にし、秘密鍵でJWT生成、公開鍵でJWT検証

    • 元記事どおり HS256 (HMAC-SHA256) と秘密鍵を利用する場合、ブランチ jwt-hs256 が使えます

連絡等はプロフィール記載のe-mailへお願いします


動作確認環境 (2025年12月)

  • macOS 15.6 (24G84)

  • GNU bash, version 5.3.3(1)-release (x86_64-apple-darwin23.6.0)

  • Docker version 29.0.0, build 3d4129b9ea

  • Docker Compse version v2.40.3-desktop.1

  • OpenSSL 3.6.0 1 Oct 2025 (Library: OpenSSL 3.6.0 1 Oct 2025)


最小限の使い方

  • カレントはリポジトリのルートでいいです

  • 利用者各位で RSA-SHA512 の秘密鍵 private_key.pem と公開鍵 public_key.pem を準備し、カレントに置いて下さい

    • OpenSSLによる作成コマンド例

      openssl genpkey -algorithm RSA -out private_key.pem
      openssl rsa -pubout -in private_key.pem -out public_key.pem
      
    • ファイル名が異なる場合、Dockerfileでコンテナへコピーする行を編集して下さい

      COPY private_key.pem /tmp/
      COPY public_key.pem /tmp/
      
  • make up を実行します

    • コンテナのビルドと起動が行われます

    • MySQLのテーブル作成はGinの初回起動時にGORMがします

  • APIとDBの準備を少し待ちます

    • make test-root404 page not found を返し、make tables の結果に users が出れば準備完了です
  • ユーザ名とパスワードをMakefileの冒頭に記入します

    username=yourname
    password=yoursecret
    
  • make test-register を実行します (ユーザ登録)

    • 正常なら以下のように成功レスポンスが返ります (パスワードは空白)

      HTTP/1.1 200 OK
      ...
      {"data": ... }
      
  • make test-login を実行します (ログインとJWT取得)

    • 正常ならAPIサーバでJWTを生成し、以下のように返します

      HTTP/1.1 200 OK
      ...
      {"token": ... }
      
  • JWTのトークンをMakefileの token= に記入します

  • make test-api を実行します (JWTでAPIコール)

    • APIサーバでJWTを検証し、正常ならユーザ登録時と同じレスポンスが返ります

      HTTP/1.1 200 OK
      ...
      {"data": ... }
      

便利コマンド

  • make clean-restart 全て破棄してやり直し

  • make logs-go APIサーバのログ表示

    • 正常な起動直後の様子が下記です

    • 中ほど building... で少し時間がかかります

      go-1  |
      go-1  |   __    _   ___
      go-1  |  / /\  | | | |_)
      go-1  | /_/--\ |_| |_| \_ v1.63.4, built with Go go1.25.5
      go-1  |
      go-1  | watching .
      go-1  | watching controllers
      go-1  | watching libraries
      go-1  | watching middlewares
      go-1  | watching models
      go-1  | watching utils
      go-1  | watching utils/token
      go-1  | building...
      go-1  | running...
      go-1  | [GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.
      go-1  |
      go-1  | [GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
      go-1  |  - using env:	export GIN_MODE=release
      go-1  |  - using code:	gin.SetMode(gin.ReleaseMode)
      go-1  |
      go-1  | [GIN-debug] POST   /api/register             --> go_gin_gorm/controllers.Register (3 handlers)
      go-1  | [GIN-debug] POST   /api/login                --> go_gin_gorm/controllers.Login (3 handlers)
      go-1  | [GIN-debug] GET    /api/admin/user           --> go_gin_gorm/controllers.CurrentUser (4 handlers)
      go-1  | [GIN-debug] [WARNING] You trusted all proxies, this is NOT safe. We recommend you to set a value.
      go-1  | Please check https://github.com/gin-gonic/gin/blob/master/docs/doc.md#dont-trust-all-proxies for details.
      go-1  | [GIN-debug] Listening and serving HTTP on :80
      
  • make test-root APIサーバの稼動チェック

    • 404 page not found が返れば正常
  • make tables MySQLのユーザテーブルの存在確認

    • users が表示されれば正常
  • make table-rows MySQLのユーザテーブルのレコード確認

  • make err-register-1 make err-register-2 ユーザ登録失敗のテスト

  • make err-login-1 make err-login-2 ログイン失敗テスト

  • make err-api-1 make err-api-2 APIコール時のJWT検証失敗テスト

    • Makefileにある dummy_token を使い、401 Unauthorized が返ります
  • その他若干のコマンドがMakefileにあります


設定

  • 同じ項目で複数ある記述箇所はまとめたいですが、とりあえず

  • JWTの有効期間

    • /app/.envTOKEN_HOUR_LIFESPAN
  • Gin

    • コンテナ内の待ち受けポート番号は下記2箇所に記載

      • 初期値 80

      • /app/main.go

      • /compose.yml

    • ホスト側ポート番号は下記2箇所に記載

      • 初期値 8008

      • /compose.yml

      • /MakefileHOST_PORT

  • MySQL

    • ユーザ名とパスワードは下記3箇所に記載

      • 初期値はともに dev

      • /compose.ymlMYSQL_USER MYSQL_PASSWORD

      • /app/.envDB_USER DB_PASS

      • /mysql_secret.txt コマンドにパスワードを含めない用

    • ホスト名 (=Docker Composeのサービス名) は下記3箇所に記載

      • 初期値 mysql

      • /compose.yml

      • /app.envDB_HOST

      • /MakefileDB_HOST

    • ポート番号はデフォルト (変更する場合は下記2ファイルに要反映)

      • /compose.yml

      • /app.envDB_PORT

    • データベース名は下記3箇所に記載

      • 初期値 first

      • /compose.ymlMYSQL_DATABASE

      • /app.envDB_NAME

      • /MakefileDB_NAME


TODO

  • コンテナ起動時、Airのbuildingが終わるまで待たせたい

  • 同じ設定項目の記述箇所をまとめたい


以上

About

Dockerで完結する認証付きWeb API開発テンプレ

Resources

Stars

0 stars

Watchers

0 watching

Forks

Contributors

Languages