マイページ(プライベートサイト)の第三版終わり、あるいは最近学んでいること

投稿日:

はじめに

マイページ(プライベートサイト)の第三版を作ろうとしていると言う記事も書いたのですが、次の構成が見えてきたので一旦まとめておきます。

技術スタック

VPSの2台目を契約して別のシステムを作ってたんですが、結局使わず、既存のマイページに統合する方針にしました。

  • データベース: PostgreSQL
  • バックエンド(テンプレート)
    • 言語: Python
    • パッケージマネージャ: pip → Poetry
    • フレームワーク: Django
    • アプリケーションサーバ: gunicorn
    • リンタ: flake8
    • フォーマッタ: black, isort
    • 単体テスト: pytest
    • カバレッジ: coverage.py, Codecov
  • バックエンド(API)
    • 言語: Python → TypeScript
    • フレームワーク: Strawberry GraphQL → Hono, GraphQL Yoga, Pothos
  • フロントエンド(Djangoテンプレート)
    • 言語: JavaScript
    • UIライブラリ
      • UIkit(+ jQuery)
      • Select2
      • Stimulus
      • tom-select(Select2の代わり)
  • フロントエンド(SPA→SSR)
    • 言語: TypeScript
    • パッケージマネージャ: pnpm
    • バンドラ: Vite
    • リンタ: ESLint
    • フォーマッタ: Prettier, sort-package-json
    • 単体テスト: Vitest
    • メタフレームワーク: Astro(SSR)
    • フロントエンドフレームワーク: React, SolidJS
    • UIコンポーネント
      • Tailwind CSS
      • shadcn/ui
      • shadcn-solid
  • 認証: Auth0
  • リバースプロキシ: Nginx → Traefik
  • タスクキュー: Redis → Valkey
  • 検索サーバ: Meilisearch
  • ワーカ: Pythonプッシュ通知: Node.js, web-push, SendGrid
  • スケジューラ: ofelia → cron + Google Cloud Scheduler
  • パッケージアップデート: dependabot(セキュリティのみ), Renovate
  • エラートラッキング: Sentry
  • ロギング: Fluent Bit + Google Cloud Logging
  • モニタリング: Telegraf + Google Cloud Monitoring
  • 開発環境: PyCharm, VS Code, Docker Compose
  • CI: CircleCI, GitHub Actions
  • ホスティング: ConoHa VPS

主な変更点

  • Strawberry GraphQL → Pothos GraphQLへ移行
    • なんとか終わらせたのですが、DjangoのModelに依存していたつくりだったのでほぼゼロからの書き直し。結構大変だった。
    • Strawberryに比べるとGraphQLを使っているメリットは感じづらい。
  • React → Astro + React + SolidJS
    • これまではDjangoのテンプレートにReactを入れてたんですが、その代わりにAstroを採用
    • アイランドアーキテクチャでReact + SolidJSを両方動く構成に
    • 最初はSSGだったが、生成されるHTML/JSが誰にでも見えるのが気になったのでSSRに変更
  • 継続的デプロイの採用(GitHub Actions + Ansible)
    • タグを打つとそのままデプロイしてくれるのでかなり楽に
  • Docker Compose v2対応
    • watch機能が出来たので変更がすぐ反映されるようになった
  • Nginx → Traefikに変更
    • 新規にサービスを入れるのが心理的に楽になりました。
    • とはいえ設定が難しいのでCaddyに移行するかも。
  • スケジューラはcronに戻した + webhook機能を作成
    • ofeliaを使ってたんですが、設定変更のためにデプロイするのは不便だったのでcron + Ansibleに変更
    • ただ直接コマンドを叩くのは微妙なので考えた結果、webhookを受けて中でDocker Engine APIを使って呼び出す方式に。これの何がいいかと言うと、HTTPSでURLを叩くだけで済むから。一般的なWebhookと同じくURLの一部がランダムに生成されるイメージです。
    • 1つのジョブはGoogle Cloud Schedulerに移したのですが、簡単にセットできたので仕組みとしてはこれでよかったと思います

今後やりたいこと

今のところ考えているのはこれくらいです。あとVPSの構成も見直すアイデアはあるので、ある程度固まったら書こうかなと。

  • 運用・監視をしっかりする
    • これまで避け続けてきた運用、監視ですが、ちゃんとやってみようかと。ログとモニタリングの設定はしています。
  • 自宅サーバ + Cloudflare Tunnelの導入
    • Difyを入れて外から繋げられるようにしていたんですが、もっとサーバを増やすことになるので仕組みを整えています。
    • Cloudflare Tunnelがちょうど良さそうなので設定中。
  • 検索サーバの充実
    • 個人でのアウトプットを溜めてたんですが、活かす機会がありませんでした。
    • LLMを使った開発も今後増えてきそうなので、RAG環境を作ろうかなと。
次の記事:
オープンソースカンファレンス2024 Ehimeに行ってきた #osc24eh
前の記事:
Django のクラスベースビューを完全に理解する(v5.1 対応)