【ono-piano.com】Xserver VPSでチャットボットを公開する手順(実録メモ1): 2025/8/15

プログラム
  • Windowsローカルで開発したFastAPIアプリを、Ubuntu 24/25 VPSで常時稼働化
  • アプリ層:FastAPI(Uvicorn)127.0.0.1:8000 で待受
  • プロセス管理systemd によりOS起動時に自動起動・監視
  • 公開/逆プロキシNginx がインターネット(80/443)⇄アプリ(8000)を中継、SSE/WS安定化
  • HTTPS化:通信の暗号化とセキュリティ向上(例:https://chatbot.ono-piano.com

全体像(3レイヤー)

  1. アプリ層FastAPI(Uvicorn)127.0.0.1:8000 で待受
  2. プロセス管理systemd … OS起動時に自動でUvicornを起動・監視
  3. 公開/逆プロキシNginx … インターネット(80/443)⇄アプリ(8000) を中継(SSE/WS安定化)

1) 仮想環境 & 依存インストール

cd /srv/piano-chatbot
source venv/bin/activate         # (venv) が付けばOK
pip install -r requirements.txt

ポイント

  • 依存は仮想環境に入れる(OSと分離して事故を防止)。
  • which python / pip -V で venv 配下を指しているか確認。

2) 動作テスト(まずは素のUvicornで)

uvicorn app.main:app --host 0.0.0.0 --port 8000
  • ブラウザで http://<VPSのIP>:8000/health{"status":"ok"} なら合格
  • ここではまだ外部から8000番直叩き。のちほどNginxで80/443へ公開します。

3) systemd で自動起動&監視

systemd とは?
Linux のサービス管理者。起動順・再起動・ログ取りを担う「仕事人」です。PC再起動後も自動でアプリを立ち上げ続けます。

サービス定義を作成:

読み込み・有効化・起動・確認:

sudo systemctl daemon-reload
sudo systemctl enable --now piano-chatbot
sudo systemctl status piano-chatbot --no-pager
# ログ追尾
journalctl -u piano-chatbot -f

コツ

  • EnvironmentFile.env を読み込み(OPENAI_API_KEY 等を置く)。
  • 落ちたら自動再起動(Restart=always)。
  • デバッグ時は sudo systemctl stop piano-chatbot してから uvicorn --reload を使うとポート競合を防げます。

4) Nginx で 80 → 8000 を中継(SSE対応)

Nginx とは?
高速・堅牢なリバースプロキシ/ウェブサーバ。
SSEやWebSocketを安定させ、TLS終端(HTTPS)やバッファリング制御もお手のもの。

設定ファイル作成:

テスト:

# サーバ内
curl -I http://127.0.0.1/health
# 外部PCから
curl -I http://<VPSのIP>/health
# ログ確認
sudo tail -f /var/log/nginx/access.log /var/log/nginx/error.log

うまく行かない時は

  • sudo ufw status(VPS側ファイアウォール)で 80/443 を許可
  • Xserverのパケットフィルタ80/443 を開放(VPSパネル)
  • journalctl -u piano-chatbot -f と Nginx の error.log を両方見る

5) (任意)ドメイン&HTTPS化

  1. DNS で ono-piano.com の A レコードを VPSのIP に向ける
  2. Nginx の server_nameono-piano.com に変更
  3. Certbot で無料証明書:
sudo apt update && sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d ono-piano.com
sudo systemctl reload nginx
# 自動更新確認
sudo systemctl list-timers | grep certbot

以後、ユーザーは https://ono-piano.com/ でチャットボットにアクセスできます。
Nginx は 443/TLS を終端し、アプリへは引き続き 127.0.0.1:8000 で中継します。


6) 運用の基本コマンド

アプリ(systemd)

sudo systemctl status piano-chatbot --no-pager
sudo systemctl restart piano-chatbot
sudo systemctl stop piano-chatbot
journalctl -u piano-chatbot -f

Nginx

sudo nginx -t && sudo systemctl reload nginx
sudo tail -f /var/log/nginx/access.log /var/log/nginx/error.log

ファイアウォール(UFW)

sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw status

7) よくあるハマりどころ


8) もし VS Code Remote-SSH で開発するなら

  • サーバ側に VS Code Server が展開されます(~/.vscode-server
  • つながらない時は rm -rf ~/.vscode-server → 再接続で復旧することが多い
  • すでに systemd が 8000 を掴んでいるとローカルのデバッグが失敗する → 一時停止してから

まとめ

  • systemd が「常駐・自動起動・監視」。
  • Nginx が「公開・TLS・逆プロキシ(SSE/WSも安定)」。
  • アプリは 127.0.0.1:8000 に置き、外には 80/443 を出すのが王道。
  • 一度仕組みを作れば、再起動やデプロイのたびに手で起動し直す必要はありません。

コメント

タイトルとURLをコピーしました