🪶

FastAPI でAPI鯖を環境構築した際の備忘録

に公開

FastAPI × PostgreSQL 環境を Docker で構築した際の備忘録。

🧩 使用技術・ライブラリ

  • FastAPI
  • Postgresql
  • Docker
  • alembic:マイグレーションツール
  • sqlalchemy:PythonでDBを操作するORMライブラリ

📁 プロジェクト構成

─── project
    ├── Dockerfile
    ├── docker-compose.yml
    ├── requirements.txt
    └── fastapi
        └── main.py

基本的な構成は参考記事と同じ

⚙️ Docker 関連ファイル群

docker-compose.yml

https://github.com/torikara-code/fastapi-postgres-async/blob/main/docker-compose.yml

① 環境変数の外部化

.env ファイルから
POSTGRES_USER, POSTGRES_PASSWORD, APP_HOST_PORT などを読み込むようにして、
機密情報をコードに直書きしない構成に変更。

② DBヘルスチェックの追加

pg_isready コマンドを使い、DBが接続可能になるまで自動で待機するように設定。
これにより、FastAPIがDB未起動状態でエラーになる問題を防げる。

③ depends_on の改善

depends_oncondition: service_healthy を指定して、
DBがヘルスチェックに成功してから FastAPI が起動するようにした。
確実にDBが使用可能になってからFASTAPIが起動する


DockerFile

https://github.com/torikara-code/fastapi-postgres-async/blob/main/Dockerfile

  • イメージサイズを小さくする試み
  • 最後に entrypoint.sh を実行
  • 最後にentrypoint.shを実行し、docker-compose起動時にalembic upgrade headコマンドを自動実行

requirement.txt

https://github.com/torikara-code/fastapi-postgres-async/blob/main/requirements.txt

  • 非同期マイグレーション向けライブラリを調査して追加
  • 他使いそうなライブラリ追加
  • 参考元記事は同期マイグレーション前提だったため、非同期に移行する必要がありかなり労力を要した

config/entrypoinst.sh

https://github.com/torikara-code/fastapi-postgres-async/blob/main/config/entrypoint.sh

  • DB 起動後に alembic upgrade head を実行
  • DB起動待ち処理はDocker Compose 側でもヘルスチェックしているため冗長かもしれないが、一応
  • これにより、FastAPI コンテナ内で手動マイグレーションが不要となる

⚙️ Alembic マイグレーション・DB操作関連ファイル

文字に起こすと長そうなので、参考元のみ記載。
この方のリポジトリを参考に非同期DB処理を実装。感謝
参考:async-fastapi-sqlalchemy

  • 結果としてユーザー CRUD 処理を実装できた

https://github.com/torikara-code/fastapi-postgres-async/blob/main/fastapi/api/user/views.py

API の基本 CRUD が完成した時点で環境構築は一旦終了。
JWT 認証などは後ほどアプリケーション側で実装予定。
次のステップのフロントエンドとの統合に進みたい。

成果物

https://github.com/torikara-code/fastapi-postgres-async/tree/main

Discussion