- 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レイヤー)
- アプリ層:FastAPI(Uvicorn)…
127.0.0.1:8000で待受 - プロセス管理:systemd … OS起動時に自動でUvicornを起動・監視
- 公開/逆プロキシ: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化
- DNS で
ono-piano.comの A レコードを VPSのIP に向ける - Nginx の
server_nameをono-piano.comに変更 - 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 を出すのが王道。
- 一度仕組みを作れば、再起動やデプロイのたびに手で起動し直す必要はありません。


コメント