Caliph Auction プロジェクトのインフラ用リポジトリです。以下の他リポジトリと連携します:
CaliphAuctionFront(Vue でビルドされたフロントエンド) – ビルド成果物のみこのサーバーへ配置CaliphAuctionBackend(ASP.NET Core / .NET 8) – 発行成果物のみこのサーバーへ配置CaliphAuctionAssets(画像・静的ファイル) –/cdnパスで参照される静的コンテンツCaliphAuctionInfrastructure(本リポジトリ) – サーバープロビジョニング (Ansible), GitHub Actions
本リポジトリでは「実行環境の用意 (nginx, .NET 8 Runtime, PostgreSQL)」のみを行い、アプリケーションのデプロイ (ファイル配置や再起動) は各アプリ側リポジトリのパイプラインで行う想定です。
- OS: Ubuntu 24.04 (VPS 単一サーバー)
- Web: nginx (リバースプロキシ)
- Backend: ASP.NET Core (.NET 8) Kestrel で 5000番ポートを listen
- DB: PostgreSQL (Ubuntu 標準リポジトリの meta package
postgresqlを使用 / バージョン固定しない) - Frontend: 事前ビルド済みの
distを/var/www/caliph-auction/frontに配置 - Assets:
/var/www/caliph-auction/cdn
/opt/caliph-auction/backend # Backend 発行成果物 (dll など) を配置
/var/www/caliph-auction/front # Vue ビルド成果物 (index.html 等)
/var/www/caliph-auction/cdn # 画像など静的ファイル
ansible/
ansible.cfg
site.yml
inventory/hosts.ini
group_vars/all.yml
roles/
common/ # 共通: ユーザー, UFW, 基本パッケージ
dotnet/ # .NET 8 ランタイム導入
postgres/ # PostgreSQL (Ubuntu 標準) 導入と初期設定 (バージョン自動検出は残す)
nginx/ # nginx インストールとリバプロ設定
backend_service/ # systemd ユニット (Kestrel) 作成
主要な変数:
app_user,app_group: 実行ユーザー/グループbackend_port: Kestrel ポート (デフォルト 5000)postgres_user,postgres_dbnginx_server_name: ドメイン (未設定なら_)
PostgreSQL の実バージョン (postgres_version_detected) は /etc/postgresql/*/main を探索して自動検出します。PGDG リポジトリ追加は行わず、Ubuntu が提供する安定版を利用します。より新しいメジャーを即時利用したい場合のみ今後 PGDG 追加を再検討してください。
group_vars/all.yml にはパスワードを保持しません。以下のいずれかの方法で注入します:
- GitHub Actions:
Secrets.POSTGRES_PASSWORDを環境変数経由で-e postgres_password=...として渡す (既に workflow 実装済) - ローカル実行:
ansible-playbook ... -e "postgres_password=YourStrongPassword" - (将来) Ansible Vault / 外部 Secret Manager
Playbook は postgres_password が未指定の場合 assert で失敗します。
例 (ローカルから):
ansible-playbook -i ansible/inventory/hosts.ini ansible/site.yml -e "postgres_password=StrongPass123" \
-u deploy --private-key=~/.ssh/your_key/→ フロントエンド (SPA,index.htmlフォールバック)/assets/→ 静的ファイル (キャッシュ 30日)/api/→ Backend へプロキシ (http://127.0.0.1:5000/api/)
本構成では TLS を前提としており、初回プロビジョニング時に以下を自動実行します:
roles/letsencryptでcertbot(webroot) により証明書取得- 80番ポート: ACME challenge 以外を 443 へリダイレクト
- 443番ポート: HSTS / セキュリティヘッダー適用済み
手順:
- DNS を対象ドメイン → VPS IP に正しく向ける
- 上記変数を編集 (メール/ドメイン)
- Playbook 実行
- 証明書は
/etc/letsencrypt/live/<ドメイン>/配下に配置され nginx が自動参照
証明書更新は certbot renew が systemd timer により自動実行 (Ubuntu デフォルト)。必要なら別ロールで明示的な更新タスク・再読み込みを追加可能。
roles/backend_service/templates/caliph-backend.service.j2 で作成。
ExecStart=/usr/bin/dotnet /opt/caliph-auction/backend/CaliphAuctionBackend.dll を想定。各 Backend リポジトリのデプロイ後に systemctl restart caliph-backend で再起動してください。
.github/workflows/provision.yml で以下を実施:
- リポジトリチェックアウト
- Python + Ansible セットアップ
- SSH 秘密鍵 (
SSH_PRIVATE_KEYシークレット ) をエージェント登録 Secrets.POSTGRES_PASSWORDを利用しansible-playbook実行 (workflow_dispatch 入力でパスワードを受け取らない)
SSH_PRIVATE_KEY: 対象VPSへ接続できる秘密鍵POSTGRES_PASSWORD: PostgreSQL ログイン用アプリユーザーパスワード- (将来)
SLACK_WEBHOOKなど通知系
Actions → Provision Infrastructure → Run workflow で:
hostにhosts.iniに記載したホスト名 (例:vps1) を入力し実行。パスワードは Secrets から自動注入されます。
- Backend リポジトリ: ビルド & 発行 → scp/rsync で
/opt/caliph-auction/backendへ配置 →systemctl restart caliph-backend - Frontend リポジトリ:
npm run build成果物を/var/www/caliph-auction/frontへ同期 - Assets リポジトリ: 画像追加時に
/var/www/caliph-auction/cdnへ同期 - これらはそれぞれのリポジトリの GitHub Actions から SSH or rsync で実行
- OCSP Stapling / 追加セキュリティヘッダー (Content-Security-Policy など)
- staging / production 分離 (
inventory/stg,inventory/prod) - 監視/ログ (Prometheus node exporter, fail2ban, logrotate 最適化)
- Secrets 管理を Ansible Vault / 外部 Secret Manager へ移行
- certbot 更新後の nginx reload hook (必要なら)
SSH 接続ができる状態で差分のみ確認:
ansible-playbook -i ansible/inventory/hosts.ini ansible/site.yml --check -e "postgres_password=Dummy"- PostgreSQL パスワードを平文でコミット/入力フォーム送信しない (Secrets 利用)
- 本番導入前に UFW / セキュリティグループで不要ポートを閉じる
PostgreSQL はデフォルト (ローカルのみ / 5432) のまま利用しています。リモート接続が必要になった場合のみ
postgresql.confとpg_hba.confを別途手動/ロール拡張で調整してください。
このリポジトリは「ソースコード閲覧・学習目的での公開」であり、一般的な OSS ライセンス (MIT / Apache など) ではありません。いわゆる Source-Available ポリシーです。
- 個人的または社内での学習・参考・評価
- 自身の環境でのビルド・実行・検証
- 一部コード断片 (短い抜粋) を引用した技術記事等への掲載 (出典明記が条件)
- 本リポジトリ全体または実質的主要部分の再頒布 (フォークを含む公的再公開)
- コードの改変版を公衆に提供 / ホスティング / SaaS として提供
- ライセンス互換を前提とした他 OSS への組み込み
- 商用目的 (利用・販売・再販) での使用
- 上記に該当しない利用 (教材化 / セミナー利用 / 研究引用 など) を希望する場合は事前に相談してください。
- いつでもライセンス/公開方針を変更・終了する可能性があります。
- Issue / PR は受け付けますが、マージ/反映は保証されません。
将来的に OSS ライセンスへ移行する場合は明示的に本節を置き換えます。それまでは本記述が優先します。
