1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

XServer に FastAPI + React + MySQL のサービスをデプロイしよう

Posted at

はじめに

私もそろそろ サービスオーナー一国一城の主 になろうかなと思い立ち、個人開発していたサービスである 日程調整📝 を XServer で公開しました。その際に実行した手順を記録します

日程調整📝 のご利用方法動画(Youtube)
日程調整📝 のご利用方法 の動画を Youtube で見る

↓ 技術スタックはこちら
スクリーンショット 2025-10-28 12.24.54.png

注意書き
XServer にサービスを公開することによって生じるセキュリティ上の危険性は0ではないと思います。ここから先はサイバーセキュリティに詳しい方と一緒に読まれることを推奨します

手順0: XServer 契約

↓ アカウントをお持ちでない方はまずこちらからご検討ください
エックスサーバー お申し込みフォーム

↓ 私は先輩のおすすめで左側を選択しました
スクリーンショット 2025-10-27 11.20.36.png

手順1: SSH の設定

SSH の設定を行います

↓ 参考にさせていただいたサイトはこちら
SSH接続する(Xserver from Win, Mac)

スクリーンショット 2025-10-26 18.56.36.png

  1. サーバー > SSH設定 を開き、「登録して秘密鍵をダウンロードする」をクリック(↑画像参照)
  2. /Users/いつもの自分のユーザー名/.ssh に、さきほどDLした秘密鍵を配置
  3. /Users/いつもの自分のユーザー名/.ssh/config に以下のコードブロックの内容を書き込む
  4. /Users/いつもの自分のユーザー名/.ssh/config で ssh xserver と入力
  5. yes/no/[fingerprint] の質問をされたら yes を入力
  6. 鍵の作成時に設定したパスフレーズを聞かれるので入力(設定しなかった場合は Enter)
/Users/いつもの自分のユーザー名/.ssh/config
Host xserver
    HostName <自分のサーバーID>.xsrv.jp
    User <自分のサーバーID>
    Port 10022
    IdentityFile ~/.ssh/<さきほどDLした秘密鍵の名前>.key

↓ <自分のサーバーID> というのは、画像の黄色部分に書かれています。XServer 作成時に自分で決めたものです
スクリーンショット 2025-10-28 9.57.37.png

手順2: MySQL の設定

次に MySQL の設定を行います

スクリーンショット 2025-10-28 12.38.17.png

  1. GUI からポチポチつくる
    XServer の MySQL 設定ページをまるっとコピペして ChatGPT に聞けば、DB の作成の仕方や、MySQL に接続するためにどのシークレットにどの値を入れればいいか教えてくれます(※無料版 ChatGPT をご利用の場合はデータが学習に利用されるため、シークレットを見せるのはNG です)

手順3: python 仮想環境の設定

次に python 仮想環境の設定を行います

↓ python 自体はもともと XServer にありそうですが、pip が使えないので python 仮想環境を作成していきます。なぜ使えないかというと、レンタルサーバーで sudo 権限がないからです(多分)
スクリーンショット 2025-10-28 10.06.44.png

↓ 参考にさせていただいたサイトはこちら
PythonのWebアプリをXserverで動かす(Flask編)
レンタルサーバー(Xserver)でFastAPIを動かす
【React × Python FastAPI】レンタルサーバー「ColorfulBox」でWebアプリをデプロイする方法

  1. サーバに SSH 接続する
  2. python 仮想環境を作って中に入る
# サーバに SSH 接続した状態から始める
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
bash Miniconda3-latest-Linux-x86_64.sh
source .bashrc
conda --version
python --version
conda create --name py312 python=3.12
conda activate py312
which python

これで py312 という仮想環境を作成し、中に入ることができました(3.12という数字はご利用の python に合わせてご変更ください)。ここからの作業は基本的に py312 内で行います

↓ ちなみに私のはこんな感じです
スクリーンショット 2025-10-28 10.13.31.png

手順4: 依存関係をインストール

次に依存関係のインストールを行います

スクリーンショット 2025-10-28 10.18.50.png

  1. ファイルマネージャを開く
  2. ~/<自分のサーバーID>.xsrv.jp/public_html/<任意のfastAPIディレクトリ名> を作成する
  3. 依存関係をインストール

↓ 2. のディレクトリを作成するっていうのは、CLI からは画像のようになっていれば OK です。ファイルマネージャ使わずに CLI から作成しても同じです
スクリーンショット 2025-10-28 10.24.10.png

↓ 依存関係のインストール方法は、自分はこれでやりました

# サーバーに SSH 接続し、仮想環境に入った状態から始める
cd ~/<自分のサーバーID>.xsrv.jp/public_html/<任意のfastAPIディレクトリ名>
pip install fastapi a2wsgi flup python-dotenv pymysql sqlalchemy  -t .
# ↑ ご利用の依存関係、バージョンに合わせ適宜ご変更ください

インストールが終わると、~/<自分のサーバーID>.xsrv.jp/public_html/<任意のfastAPIディレクトリ名> 配下に先ほどインストールしたもののファイルがたくさん作成されます

手順5: アクセスに関するファイルの設定

次にアクセスに関するファイルの設定を行います

  1. 指定の位置に以下の2つのファイルを設置する
  2. 権限を設定する(ファイルマネージャからでも、CLIからでも)
/home/<自分のサーバーID>/<自分のサーバーID>.xsrv.jp/public_html/<任意のfastAPIディレクトリ名>/<任意の英単語>.fcgi
#! /home/<自分のサーバーID>/miniconda3/envs/py312/bin/python
import os
import sys
# 標準エラーをファイルにリダイレクトしてエラーを確認できるようにする
sys.stderr = open('error.log', 'a')
import a2wsgi
from flup.server.fcgi import WSGIServer
from main import app
if __name__ == '__main__':
    os.environ.setdefault("PATH_INFO", "")
    wsgi_app = a2wsgi.ASGIMiddleware(app)
    WSGIServer(wsgi_app).run()

↑ #! /home/<自分のサーバーID>/miniconda3/envs/py312/bin/python の部分は、which pythonの実行結果と合わせる必要があります

スクリーンショット 2025-10-28 10.36.27.png

/home/<自分のサーバーID>/<自分のサーバーID>.xsrv.jp/public_html/<任意のfastAPIディレクトリ名>/.htaccess
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /<任意のfastAPIディレクトリ名>/

# 静的ファイルとディレクトリは除外
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

# FastAPI に処理を渡す
RewriteRule ^(.*)$ <任意の英単語>.fcgi/$1 [QSA,L]
</IfModule>
ファイル名 権限
<任意の英単語>.fcgi 755
.htaccess 644

ここは自分は結構、レンタルサーバというものの本質的な理解ができておらず難しかったです。AWS の ECS と色々勝手が違う感じがしました。
ChatGPT にたくさん聞いてしまいましたが、今後もっと勉強していきたいです。

手順6: プロジェクトに関するファイルの設定

次にプロジェクトに関するファイルの設定を行います。

  1. ファイルマネージャを開く
  2. ~/<自分のサーバーID>.xsrv.jp/public_html/<任意のfastAPIディレクトリ名> に移動
  3. main.py や database.py などのプロジェクトに関するファイルをアップロード
  4. (権限変更は不要だったはず)

ここまで済んだら http(s)://<自分のサーバーID>.xsrv/<任意のfastAPIディレクトリ名>/docs にアクセスし、FastAPI の docs が見られることを確認してください

はじめは全然うまくいかない
自分の場合はずっと 500 や 404 が出ていて、何回かディレクトリ消して作り直したりしました。XServer のキャッシュ機能が原因らしいです

FastAPI のディレクトリ構成
日程調整📝 はエンドポイント5個ぐらいの超小規模サービスなので、main.py と同階層に全ての .py ファイルを置いて開発していました。FastAPI のディレクトリ構成が複雑になると、ちょっと設定変わるのかもしれません

個人的つまづきポイント
❌ from . import models, schemas, crud
⭕️ import models, schemas, crud
この辺りは error.log を出せばどこで詰まってるか答え教えてくれるので、それを見ながら進めるのがオススメです

手順7: フロントの設定

次にフロントの設定を行います

  1. ローカルでreactのコンテナ内に入る
  2. npm run buildを実行(package.json で「"build": "vite build"」となっていることが前提)
  3. dist ディレクトリが作成されるので、その中のものを以下のようにXServerに配置
ローカル XServer
dist/index.html public_html/index.html
dist/vite.svg public_html/vite.svg
dist/assets/index-????.js public_html/assets/index-????.js
dist/assets/index-????.css public_html/assets/index-????.css

環境変数
React の環境変数はビルド時に埋め込まれるらしく、特に .env ファイルを置く必要はないです

個人的つまづきポイント

  • ローカルの環境変数が残るので、Docker のファイルとかを全部消してからコンテナを build up して npm run build しなければならない
  • はじめ getEnvか何か使っていたが、import.meta.env.VITE_ENVNAME; の形式で環境変数を読まなければならない

ここまで済んだら http(s)://<自分のサーバーID>.xsrv にアクセスし、フロントが表示されることを確認してください

はじめは全然うまくいかない
大丈夫です、console.log とかしてエラーを1つ1つ解決していけばできるようになります🔥

手順8: その他

HTTPS

GUI から SSL ON にできます
スクリーンショット 2025-10-28 12.16.26.png

キャッシュ

デフォルト ON だったのですが、設定どうしてもつまづいた時に OFF にしました。でも解決のキーファクターだったかは分からないし、基本的に触らないで済むならその方が良さそうです
スクリーンショット 2025-10-28 12.17.05.png

ドメイン名

というかサーバIDダサい気がしてきました(自分で決めておいてなんだけど…)

余談: AWS ECS でも公開しました

↓ お勉強目的で AWS ECS で公開しましたが、予算オーバーなので XServer に移動しました
スクリーンショット 2025-10-28 12.19.22.png

まとめ

先人たちの記事と有料版ChatGPTのおかげで、初心者ながらなんとか一般公開に辿り着きました…!
はじめはどうなることかと思いましたが、終わってみると楽しかったです。これからももっと、新しいことを学んでいきたいなと思いました

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?